@eclipse-docks/extension-duckdb 0.7.87 → 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-B40T7F65.js.map
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;AA0I5C,eAAO,MAAM,4BAA4B,EAAE,sBAK1C,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-B40T7F65.js"),
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-docks/extension-duckdb",
3
- "version": "0.7.87",
3
+ "version": "0.7.89",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -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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"}