@eclipse-docks/extension-duckdb 0.7.88 → 0.7.89
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.
|
@@ -132,6 +132,15 @@ var DuckdbSqlDatabase = class {
|
|
|
132
132
|
await this.current.enableExtension(id);
|
|
133
133
|
this.enabledExtensions.add(id);
|
|
134
134
|
}
|
|
135
|
+
async readVersion() {
|
|
136
|
+
try {
|
|
137
|
+
if (!this.current) return "";
|
|
138
|
+
const result = await this.current.runQuery("SELECT version()");
|
|
139
|
+
return String(result.rows[0]?.[0] ?? "");
|
|
140
|
+
} catch {
|
|
141
|
+
return "";
|
|
142
|
+
}
|
|
143
|
+
}
|
|
135
144
|
async close() {
|
|
136
145
|
if (!this.current) return;
|
|
137
146
|
await this.current.close();
|
|
@@ -214,4 +223,4 @@ function duckdb_extension_default() {
|
|
|
214
223
|
//#endregion
|
|
215
224
|
export { duckdb_extension_default as default };
|
|
216
225
|
|
|
217
|
-
//# sourceMappingURL=duckdb-extension-
|
|
226
|
+
//# sourceMappingURL=duckdb-extension-CkopoMAb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-extension-CkopoMAb.js","names":[],"sources":["../src/duckdb-catalog.ts","../src/duckdb-sqldatabase.ts","../src/duckdb-notebook-kernel.ts","../src/duckdb-extension.ts"],"sourcesContent":["import type { CatalogContribution } from \"@eclipse-docks/extension-catalog/api\";\nimport { registerCatalog } from \"@eclipse-docks/extension-catalog/api\";\n\nconst DUCKDB_CATALOG: CatalogContribution = {\n label: \"DuckDB\",\n icon: \"database\",\n contributionId: \"catalog.duckdb\",\n items: [\n {\n label: \"Basics\",\n icon: \"file-lines\",\n contributionId: \"catalog.duckdb.basics\",\n items: [\n { label: \"Hello DuckDB\", icon: \"file-code\", state: { url: new URL(\"./catalog/hello-duckdb.sql\", import.meta.url).href, filename: \"hello-duckdb.sql\" } },\n { label: \"Aggregations and filters\", icon: \"file-code\", state: { url: new URL(\"./catalog/aggregations.sql\", import.meta.url).href, filename: \"aggregations.sql\" } },\n ],\n },\n {\n label: \"Data types & functions\",\n icon: \"file-lines\",\n contributionId: \"catalog.duckdb.types\",\n items: [\n { label: \"Types and built-in functions\", icon: \"file-code\", state: { url: new URL(\"./catalog/types-and-functions.sql\", import.meta.url).href, filename: \"types-and-functions.sql\" } },\n ],\n },\n ],\n};\n\nexport function registerDuckdbCatalog(): void {\n registerCatalog(DUCKDB_CATALOG);\n}\n","import {\n duckdbService,\n DuckDBDatabase,\n} from './duckdb-service';\nimport type {\n SqlAdapterContribution,\n SqlConnectionInfo,\n SqlDatabase,\n SqlDatabaseExtensionInfo,\n} from '@eclipse-docks/extension-sqleditor';\n\nclass DuckdbSqlDatabase implements SqlDatabase {\n readonly engineId = 'duckdb';\n\n private current: DuckDBDatabase | null = null;\n private currentId: string | null = null;\n private enabledExtensions = new Set<string>();\n\n get currentConnectionId(): string | null {\n return this.currentId;\n }\n\n async listConnections(): Promise<SqlConnectionInfo[]> {\n const names = await duckdbService.listDatabases();\n const result: SqlConnectionInfo[] = [\n {\n id: null,\n label: 'In-memory',\n isDefault: true,\n },\n ...names.map((name) => ({\n id: name,\n label: name,\n })),\n ];\n return result;\n }\n\n async selectConnection(id: string | null): Promise<void> {\n if (this.current && this.currentId === id) return;\n if (this.current) {\n await this.current.close();\n this.current = null;\n }\n const db =\n id === null\n ? await duckdbService.open()\n : await duckdbService.open(id);\n this.current = db;\n this.currentId = db.name ?? null;\n }\n\n async runQuery(sql: string): Promise<{ columns: string[]; rows: unknown[][] }> {\n if (!this.current) {\n await this.selectConnection(null);\n }\n if (!this.current) {\n return { columns: [], rows: [] };\n }\n const result = await this.current.runQuery(sql);\n return { columns: result.columns, rows: result.rows };\n }\n\n async createConnection(): Promise<SqlConnectionInfo | null> {\n // Creation flow is handled in the generic editor via prompts specific to DuckDB today.\n // For now, rely on editor-level name prompts and duckdbService.open(name) followed by close().\n return null;\n }\n\n async deleteConnection(id: string): Promise<void> {\n if (!id) return;\n if (this.current && this.current.name === id) {\n await this.current.close();\n this.current = null;\n this.currentId = null;\n }\n await duckdbService.delete(id);\n }\n\n async listDbExtensions(): Promise<SqlDatabaseExtensionInfo[]> {\n if (!this.current) {\n await this.selectConnection(null);\n }\n if (!this.current) {\n return [];\n }\n\n try {\n const result = await this.current.runQuery(\n 'SELECT extension_name, installed, loaded, description FROM duckdb_extensions();',\n );\n const nameIndex = result.columns.indexOf('extension_name');\n if (nameIndex === -1) {\n return [];\n }\n const installedIndex = result.columns.indexOf('installed');\n const loadedIndex = result.columns.indexOf('loaded');\n const descriptionIndex = result.columns.indexOf('description');\n\n return result.rows.map<SqlDatabaseExtensionInfo>((row) => {\n const cells = row as unknown[];\n const id = String(cells[nameIndex] ?? '').trim();\n const installedValue =\n installedIndex >= 0 ? cells[installedIndex] : undefined;\n const loadedValue =\n loadedIndex >= 0 ? cells[loadedIndex] : undefined;\n const descriptionValue =\n descriptionIndex >= 0 ? cells[descriptionIndex] : undefined;\n const isInstalledFromDb =\n loadedValue === true ||\n loadedValue === 1 ||\n loadedValue === 't' ||\n loadedValue === 'true' ||\n installedValue === true ||\n installedValue === 1 ||\n installedValue === 't' ||\n installedValue === 'true';\n const isInstalled =\n isInstalledFromDb || this.enabledExtensions.has(id);\n\n return {\n id,\n label: id,\n description:\n typeof descriptionValue === 'string' ? descriptionValue : undefined,\n installed: isInstalled,\n };\n });\n } catch {\n return [];\n }\n }\n\n async enableDbExtension(id: string): Promise<void> {\n if (!this.current) return;\n await this.current.enableExtension(id);\n this.enabledExtensions.add(id);\n }\n\n async readVersion(): Promise<string> {\n try {\n if (!this.current) return '';\n const result = await this.current.runQuery('SELECT version()');\n return String((result.rows[0]?.[0] as string) ?? '');\n } catch {\n return '';\n }\n }\n\n async close(): Promise<void> {\n if (!this.current) return;\n await this.current.close();\n this.current = null;\n this.currentId = null;\n }\n}\n\nexport const duckdbSqlAdapterContribution: SqlAdapterContribution = {\n id: 'duckdb',\n label: 'DuckDB',\n icon: 'database',\n loader: async () => new DuckdbSqlDatabase(),\n};\n\n","import type {\n NotebookExecutionResult,\n NotebookKernel,\n NotebookKernelContribution,\n} from '@eclipse-docks/extension-notebook';\nimport { TARGET_NOTEBOOK_KERNELS } from '@eclipse-docks/extension-notebook';\nimport { duckdbSqlAdapterContribution } from './duckdb-sqldatabase';\nimport type { SqlDatabase } from '@eclipse-docks/extension-sqleditor';\n\nfunction formatResult(columns: string[], rows: unknown[][]): string {\n if (columns.length === 0 && rows.length === 0) return '';\n const pad = (s: string, w: number) => s.padEnd(w);\n const colWidths = columns.map((c, i) => {\n const maxVal = rows.reduce((m, r) => Math.max(m, String(r[i] ?? '').length), 0);\n return Math.max(c.length, maxVal, 1);\n });\n const sep = colWidths.map((w) => '-'.repeat(w)).join('-+-');\n const header = columns.map((c, i) => pad(c, colWidths[i])).join(' | ');\n const lineRows = rows.map((row) =>\n row.map((v, i) => pad(String(v ?? ''), colWidths[i])).join(' | ')\n );\n return [header, sep, ...lineRows].join('\\n');\n}\n\nclass DuckdbNotebookKernel implements NotebookKernel {\n readonly id = 'duckdb';\n readonly label = 'DuckDB';\n readonly language = 'sql';\n\n private db: SqlDatabase | null = null;\n\n private async getDb(): Promise<SqlDatabase> {\n if (!this.db) {\n this.db = await duckdbSqlAdapterContribution.loader();\n await this.db.selectConnection(null);\n }\n return this.db;\n }\n\n async getVersion(): Promise<string | undefined> {\n try {\n const db = await this.getDb();\n const result = await db.runQuery(\"SELECT version()\");\n return (result.rows[0]?.[0] as string) ?? undefined;\n } catch {\n return undefined;\n }\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n try {\n const db = await this.getDb();\n const result = await db.runQuery(code);\n const data = formatResult(result.columns, result.rows);\n return { data: data || undefined };\n } catch (err) {\n return {\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n close(): void {\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n }\n}\n\nexport const duckdbNotebookKernelContribution: NotebookKernelContribution = {\n id: 'duckdb',\n label: 'DuckDB',\n language: 'sql',\n loadKernel: async (): Promise<NotebookKernel> => new DuckdbNotebookKernel(),\n};\n","import { rootContext, contributionRegistry } from '@eclipse-docks/core';\nimport { TARGET_NOTEBOOK_KERNELS } from '@eclipse-docks/extension-notebook';\nimport { registerDuckdbCatalog } from './duckdb-catalog';\nimport { duckdbService } from './duckdb-service';\nimport { duckdbSqlAdapterContribution } from './duckdb-sqldatabase';\nimport { duckdbNotebookKernelContribution } from './duckdb-notebook-kernel';\n\nexport default function () {\n registerDuckdbCatalog();\n rootContext.put('duckdbService', duckdbService);\n contributionRegistry.registerContribution(\n 'system.sqladapters',\n duckdbSqlAdapterContribution,\n );\n contributionRegistry.registerContribution(\n TARGET_NOTEBOOK_KERNELS,\n duckdbNotebookKernelContribution,\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb-sqldatabase.d.ts","sourceRoot":"","sources":["../src/duckdb-sqldatabase.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,sBAAsB,EAIvB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"duckdb-sqldatabase.d.ts","sourceRoot":"","sources":["../src/duckdb-sqldatabase.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,sBAAsB,EAIvB,MAAM,oCAAoC,CAAC;AAoJ5C,eAAO,MAAM,4BAA4B,EAAE,sBAK1C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ extensionRegistry.registerExtension({
|
|
|
9
9
|
id: pkg.name,
|
|
10
10
|
name: t.EXT_DUCKDB_NAME,
|
|
11
11
|
description: t.EXT_DUCKDB_DESC,
|
|
12
|
-
loader: () => import("./duckdb-extension-
|
|
12
|
+
loader: () => import("./duckdb-extension-CkopoMAb.js"),
|
|
13
13
|
icon: "database",
|
|
14
14
|
dependencies: ["@eclipse-docks/extension-sqleditor"],
|
|
15
15
|
experimental: true
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb-extension-B40T7F65.js","names":[],"sources":["../src/duckdb-catalog.ts","../src/duckdb-sqldatabase.ts","../src/duckdb-notebook-kernel.ts","../src/duckdb-extension.ts"],"sourcesContent":["import type { CatalogContribution } from \"@eclipse-docks/extension-catalog/api\";\nimport { registerCatalog } from \"@eclipse-docks/extension-catalog/api\";\n\nconst DUCKDB_CATALOG: CatalogContribution = {\n label: \"DuckDB\",\n icon: \"database\",\n contributionId: \"catalog.duckdb\",\n items: [\n {\n label: \"Basics\",\n icon: \"file-lines\",\n contributionId: \"catalog.duckdb.basics\",\n items: [\n { label: \"Hello DuckDB\", icon: \"file-code\", state: { url: new URL(\"./catalog/hello-duckdb.sql\", import.meta.url).href, filename: \"hello-duckdb.sql\" } },\n { label: \"Aggregations and filters\", icon: \"file-code\", state: { url: new URL(\"./catalog/aggregations.sql\", import.meta.url).href, filename: \"aggregations.sql\" } },\n ],\n },\n {\n label: \"Data types & functions\",\n icon: \"file-lines\",\n contributionId: \"catalog.duckdb.types\",\n items: [\n { label: \"Types and built-in functions\", icon: \"file-code\", state: { url: new URL(\"./catalog/types-and-functions.sql\", import.meta.url).href, filename: \"types-and-functions.sql\" } },\n ],\n },\n ],\n};\n\nexport function registerDuckdbCatalog(): void {\n registerCatalog(DUCKDB_CATALOG);\n}\n","import {\n duckdbService,\n DuckDBDatabase,\n} from './duckdb-service';\nimport type {\n SqlAdapterContribution,\n SqlConnectionInfo,\n SqlDatabase,\n SqlDatabaseExtensionInfo,\n} from '@eclipse-docks/extension-sqleditor';\n\nclass DuckdbSqlDatabase implements SqlDatabase {\n readonly engineId = 'duckdb';\n\n private current: DuckDBDatabase | null = null;\n private currentId: string | null = null;\n private enabledExtensions = new Set<string>();\n\n get currentConnectionId(): string | null {\n return this.currentId;\n }\n\n async listConnections(): Promise<SqlConnectionInfo[]> {\n const names = await duckdbService.listDatabases();\n const result: SqlConnectionInfo[] = [\n {\n id: null,\n label: 'In-memory',\n isDefault: true,\n },\n ...names.map((name) => ({\n id: name,\n label: name,\n })),\n ];\n return result;\n }\n\n async selectConnection(id: string | null): Promise<void> {\n if (this.current && this.currentId === id) return;\n if (this.current) {\n await this.current.close();\n this.current = null;\n }\n const db =\n id === null\n ? await duckdbService.open()\n : await duckdbService.open(id);\n this.current = db;\n this.currentId = db.name ?? null;\n }\n\n async runQuery(sql: string): Promise<{ columns: string[]; rows: unknown[][] }> {\n if (!this.current) {\n await this.selectConnection(null);\n }\n if (!this.current) {\n return { columns: [], rows: [] };\n }\n const result = await this.current.runQuery(sql);\n return { columns: result.columns, rows: result.rows };\n }\n\n async createConnection(): Promise<SqlConnectionInfo | null> {\n // Creation flow is handled in the generic editor via prompts specific to DuckDB today.\n // For now, rely on editor-level name prompts and duckdbService.open(name) followed by close().\n return null;\n }\n\n async deleteConnection(id: string): Promise<void> {\n if (!id) return;\n if (this.current && this.current.name === id) {\n await this.current.close();\n this.current = null;\n this.currentId = null;\n }\n await duckdbService.delete(id);\n }\n\n async listDbExtensions(): Promise<SqlDatabaseExtensionInfo[]> {\n if (!this.current) {\n await this.selectConnection(null);\n }\n if (!this.current) {\n return [];\n }\n\n try {\n const result = await this.current.runQuery(\n 'SELECT extension_name, installed, loaded, description FROM duckdb_extensions();',\n );\n const nameIndex = result.columns.indexOf('extension_name');\n if (nameIndex === -1) {\n return [];\n }\n const installedIndex = result.columns.indexOf('installed');\n const loadedIndex = result.columns.indexOf('loaded');\n const descriptionIndex = result.columns.indexOf('description');\n\n return result.rows.map<SqlDatabaseExtensionInfo>((row) => {\n const cells = row as unknown[];\n const id = String(cells[nameIndex] ?? '').trim();\n const installedValue =\n installedIndex >= 0 ? cells[installedIndex] : undefined;\n const loadedValue =\n loadedIndex >= 0 ? cells[loadedIndex] : undefined;\n const descriptionValue =\n descriptionIndex >= 0 ? cells[descriptionIndex] : undefined;\n const isInstalledFromDb =\n loadedValue === true ||\n loadedValue === 1 ||\n loadedValue === 't' ||\n loadedValue === 'true' ||\n installedValue === true ||\n installedValue === 1 ||\n installedValue === 't' ||\n installedValue === 'true';\n const isInstalled =\n isInstalledFromDb || this.enabledExtensions.has(id);\n\n return {\n id,\n label: id,\n description:\n typeof descriptionValue === 'string' ? descriptionValue : undefined,\n installed: isInstalled,\n };\n });\n } catch {\n return [];\n }\n }\n\n async enableDbExtension(id: string): Promise<void> {\n if (!this.current) return;\n await this.current.enableExtension(id);\n this.enabledExtensions.add(id);\n }\n\n async close(): Promise<void> {\n if (!this.current) return;\n await this.current.close();\n this.current = null;\n this.currentId = null;\n }\n}\n\nexport const duckdbSqlAdapterContribution: SqlAdapterContribution = {\n id: 'duckdb',\n label: 'DuckDB',\n icon: 'database',\n loader: async () => new DuckdbSqlDatabase(),\n};\n\n","import type {\n NotebookExecutionResult,\n NotebookKernel,\n NotebookKernelContribution,\n} from '@eclipse-docks/extension-notebook';\nimport { TARGET_NOTEBOOK_KERNELS } from '@eclipse-docks/extension-notebook';\nimport { duckdbSqlAdapterContribution } from './duckdb-sqldatabase';\nimport type { SqlDatabase } from '@eclipse-docks/extension-sqleditor';\n\nfunction formatResult(columns: string[], rows: unknown[][]): string {\n if (columns.length === 0 && rows.length === 0) return '';\n const pad = (s: string, w: number) => s.padEnd(w);\n const colWidths = columns.map((c, i) => {\n const maxVal = rows.reduce((m, r) => Math.max(m, String(r[i] ?? '').length), 0);\n return Math.max(c.length, maxVal, 1);\n });\n const sep = colWidths.map((w) => '-'.repeat(w)).join('-+-');\n const header = columns.map((c, i) => pad(c, colWidths[i])).join(' | ');\n const lineRows = rows.map((row) =>\n row.map((v, i) => pad(String(v ?? ''), colWidths[i])).join(' | ')\n );\n return [header, sep, ...lineRows].join('\\n');\n}\n\nclass DuckdbNotebookKernel implements NotebookKernel {\n readonly id = 'duckdb';\n readonly label = 'DuckDB';\n readonly language = 'sql';\n\n private db: SqlDatabase | null = null;\n\n private async getDb(): Promise<SqlDatabase> {\n if (!this.db) {\n this.db = await duckdbSqlAdapterContribution.loader();\n await this.db.selectConnection(null);\n }\n return this.db;\n }\n\n async getVersion(): Promise<string | undefined> {\n try {\n const db = await this.getDb();\n const result = await db.runQuery(\"SELECT version()\");\n return (result.rows[0]?.[0] as string) ?? undefined;\n } catch {\n return undefined;\n }\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n try {\n const db = await this.getDb();\n const result = await db.runQuery(code);\n const data = formatResult(result.columns, result.rows);\n return { data: data || undefined };\n } catch (err) {\n return {\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n close(): void {\n if (this.db) {\n void this.db.close();\n this.db = null;\n }\n }\n}\n\nexport const duckdbNotebookKernelContribution: NotebookKernelContribution = {\n id: 'duckdb',\n label: 'DuckDB',\n language: 'sql',\n loadKernel: async (): Promise<NotebookKernel> => new DuckdbNotebookKernel(),\n};\n","import { rootContext, contributionRegistry } from '@eclipse-docks/core';\nimport { TARGET_NOTEBOOK_KERNELS } from '@eclipse-docks/extension-notebook';\nimport { registerDuckdbCatalog } from './duckdb-catalog';\nimport { duckdbService } from './duckdb-service';\nimport { duckdbSqlAdapterContribution } from './duckdb-sqldatabase';\nimport { duckdbNotebookKernelContribution } from './duckdb-notebook-kernel';\n\nexport default function () {\n registerDuckdbCatalog();\n rootContext.put('duckdbService', duckdbService);\n contributionRegistry.registerContribution(\n 'system.sqladapters',\n duckdbSqlAdapterContribution,\n );\n contributionRegistry.registerContribution(\n TARGET_NOTEBOOK_KERNELS,\n duckdbNotebookKernelContribution,\n );\n}\n"],"mappings":"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"}
|