@eclipse-docks/extension-duckdb 0.7.127 → 0.7.132
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/api.js +1 -1
- package/dist/{duckdb-extension-CkopoMAb.js → duckdb-extension-jR5Rc6cP.js} +2 -2
- package/dist/{duckdb-extension-CkopoMAb.js.map → duckdb-extension-jR5Rc6cP.js.map} +1 -1
- package/dist/{duckdb-service-BjJkjGgt.js → duckdb-service-C-0tk2wY.js} +1 -1
- package/dist/{duckdb-service-BjJkjGgt.js.map → duckdb-service-C-0tk2wY.js.map} +1 -1
- package/dist/{i18n.de-DcvaIwdb.js → i18n.de-DuUamDgP.js} +1 -1
- package/dist/{i18n.de-DcvaIwdb.js.map → i18n.de-DuUamDgP.js.map} +1 -1
- package/dist/{i18n.en-CEVgAB1e.js → i18n.en-CuROhwi7.js} +1 -1
- package/dist/{i18n.en-CEVgAB1e.js.map → i18n.en-CuROhwi7.js.map} +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as DuckDBService, r as duckdbService, t as DuckDBDatabase } from "./duckdb-service-
|
|
1
|
+
import { n as DuckDBService, r as duckdbService, t as DuckDBDatabase } from "./duckdb-service-C-0tk2wY.js";
|
|
2
2
|
export { DuckDBDatabase, DuckDBService, duckdbService };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as duckdbService } from "./duckdb-service-
|
|
1
|
+
import { r as duckdbService } from "./duckdb-service-C-0tk2wY.js";
|
|
2
2
|
import { contributionRegistry, rootContext } from "@eclipse-docks/core";
|
|
3
3
|
import { TARGET_NOTEBOOK_KERNELS } from "@eclipse-docks/extension-notebook";
|
|
4
4
|
import { registerCatalog } from "@eclipse-docks/extension-catalog/api";
|
|
@@ -223,4 +223,4 @@ function duckdb_extension_default() {
|
|
|
223
223
|
//#endregion
|
|
224
224
|
export { duckdb_extension_default as default };
|
|
225
225
|
|
|
226
|
-
//# sourceMappingURL=duckdb-extension-
|
|
226
|
+
//# sourceMappingURL=duckdb-extension-jR5Rc6cP.js.map
|
|
@@ -1 +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
|
+
{"version":3,"file":"duckdb-extension-jR5Rc6cP.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-service-BjJkjGgt.js","names":[],"sources":["../src/duckdb-service.ts"],"sourcesContent":["import { createLogger, workspaceService } from '@eclipse-docks/core';\nimport type { File } from '@eclipse-docks/core';\nimport * as DuckDBWasm from '@duckdb/duckdb-wasm';\nimport * as duckdb from '@duckdb/duckdb-wasm';\n\nconst logger = createLogger('DuckDBService');\n\nconst JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();\n\nconst IN_MEMORY_KEY = '__memory__';\nconst OPFS_DB_DIR = 'duckdb-databases';\nconst EXTENSION_NAME_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*$/;\nconst DB_NAME_REGEX = /^[a-zA-Z0-9_.-]+$/;\nconst WORKSPACE_PREFIX = '/workspace/';\n\nfunction pathFor(name: string): string {\n return `opfs://${OPFS_DB_DIR}/${name}.duckdb`;\n}\n\ntype AsyncDuckDB = duckdb.AsyncDuckDB;\ntype AsyncDuckDBConnection = Awaited<ReturnType<AsyncDuckDB['connect']>>;\ntype DuckDBDataProtocol = DuckDBWasm.DuckDBDataProtocol;\n\n/** Plain JS result: columns in order, rows as array of value arrays. */\nexport interface DuckDBQueryResult {\n columns: string[];\n rows: unknown[][];\n}\n\nfunction toPlainValue(v: unknown): unknown {\n if (v === null || v === undefined) return v;\n if (typeof v === 'bigint') return Number(v);\n if (v instanceof Date) return v.toISOString();\n if (typeof v === 'object' && v !== null && typeof (v as { toJSON: unknown }).toJSON === 'function') {\n return (v as { toJSON: () => unknown }).toJSON();\n }\n return v;\n}\n\nfunction tableToPlainArrays(table: { toArray?: () => unknown[] }): { columns: string[]; rows: unknown[][] } {\n const raw = table.toArray?.();\n const rowObjects = Array.isArray(raw) ? (raw as Record<string, unknown>[]) : [];\n if (rowObjects.length === 0) return { columns: [], rows: [] };\n const columns = Object.keys(rowObjects[0]);\n const rows = rowObjects.map((obj) => columns.map((col) => toPlainValue(obj[col])));\n return { columns, rows };\n}\n\nasync function ensureOPFSDatabaseDir(): Promise<void> {\n const root = await navigator.storage.getDirectory();\n await root.getDirectoryHandle(OPFS_DB_DIR, { create: true });\n}\n\nasync function createConnection(path: string | null): Promise<{\n db: AsyncDuckDB;\n conn: AsyncDuckDBConnection;\n worker: Worker;\n}> {\n const bundle = await duckdb.selectBundle(JSDELIVR_BUNDLES);\n const workerUrl = URL.createObjectURL(\n new Blob([`importScripts(\"${bundle.mainWorker}\");`], { type: 'text/javascript' }),\n );\n const worker = new Worker(workerUrl);\n URL.revokeObjectURL(workerUrl);\n const log = new duckdb.ConsoleLogger();\n const db = new duckdb.AsyncDuckDB(log, worker);\n await db.instantiate(bundle.mainModule, bundle.pthreadWorker);\n if (path) {\n await ensureOPFSDatabaseDir();\n await db.open({\n path,\n accessMode: duckdb.DuckDBAccessMode.READ_WRITE,\n });\n logger.info(`DuckDB-WASM opened: ${path} (read-write)`);\n }\n const conn = await db.connect();\n logger.info('DuckDB-WASM initialized');\n return { db, conn, worker };\n}\n\nasync function registerWorkspaceFilesForQuery(\n db: AsyncDuckDB,\n sql: string,\n alreadyRegistered: Set<string>,\n): Promise<void> {\n const literalRegex = /'\\/workspace\\/([^']+)'/g;\n const matches = new Map<string, string>();\n\n let match: RegExpExecArray | null;\n while ((match = literalRegex.exec(sql)) !== null) {\n const relPath = match[1];\n if (!matches.has(relPath)) {\n matches.set(relPath, `${WORKSPACE_PREFIX}${relPath}`);\n }\n }\n\n if (matches.size === 0) return;\n\n const workspaceRoot = await workspaceService.getWorkspace();\n if (!workspaceRoot) {\n throw new Error('Workspace is not available');\n }\n\n for (const [relPath, vfsPath] of matches) {\n if (alreadyRegistered.has(vfsPath)) {\n // Already registered for this database, skip.\n // If the underlying workspace file changes, users can reopen the connection.\n // This keeps query overhead low.\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const resource = await workspaceRoot.getResource(relPath);\n if (!resource) {\n throw new Error(`Workspace file not found: ${relPath}`);\n }\n\n const file = resource as File;\n const url = await file.getContents({ uri: true });\n\n if (typeof url !== 'string') {\n throw new Error(`Unable to obtain URL for workspace file: ${relPath}`);\n }\n\n await db.registerFileURL(vfsPath, url, DuckDBWasm.DuckDBDataProtocol.HTTP, false);\n alreadyRegistered.add(vfsPath);\n }\n}\n\n/**\n * Abstraction over a single DuckDB database. Use runQuery, enableExtension, close, or delete.\n */\nexport class DuckDBDatabase {\n private readonly key: string;\n private readonly registeredWorkspaceFiles = new Set<string>();\n\n constructor(\n readonly name: string | null,\n private db: AsyncDuckDB,\n private conn: AsyncDuckDBConnection,\n private worker: Worker,\n private onClose: (key: string) => void,\n private onDeleteFromOPFS?: (name: string) => Promise<void>,\n ) {\n this.key = name ?? IN_MEMORY_KEY;\n }\n\n async runQuery(sql: string): Promise<DuckDBQueryResult> {\n const trimmed = sql.trim();\n if (!trimmed) return { rows: [], columns: [] };\n\n try {\n await registerWorkspaceFilesForQuery(this.db, trimmed, this.registeredWorkspaceFiles);\n const table = await this.conn.query(trimmed);\n return tableToPlainArrays(table);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`Query failed: ${msg}`);\n throw new Error(`Query failed: ${msg}`);\n }\n }\n\n async enableExtension(extensionName: string): Promise<void> {\n if (!EXTENSION_NAME_REGEX.test(extensionName)) {\n throw new Error(`Invalid extension name: ${extensionName}`);\n }\n const installSql = `INSTALL ${extensionName}`;\n const loadSql = `LOAD ${extensionName}`;\n try {\n await this.conn.query(installSql);\n await this.conn.query(loadSql);\n logger.info(`DuckDB extension enabled: ${extensionName}`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`Failed to enable extension ${extensionName}: ${msg}`);\n throw new Error(`Failed to enable extension ${extensionName}: ${msg}`);\n }\n }\n\n async close(): Promise<void> {\n try {\n await this.conn.close();\n } catch (e) {\n logger.warn('Error closing DuckDB connection: ' + (e instanceof Error ? e.message : String(e)));\n }\n try {\n this.db.terminate();\n } catch (e) {\n logger.warn('Error terminating DuckDB: ' + (e instanceof Error ? e.message : String(e)));\n }\n this.onClose(this.key);\n }\n}\n\nexport class DuckDBService {\n private databases = new Map<string, DuckDBDatabase>();\n\n private keyFor(name: string | undefined): string {\n return name === undefined || name === '' ? IN_MEMORY_KEY : name;\n }\n\n /**\n * Open a database by name. Stored in OPFS as `duckdb-databases/<name>.duckdb`. Omit name for in-memory.\n * Returns the same abstraction if that database is already open.\n */\n async open(name?: string): Promise<DuckDBDatabase> {\n const key = this.keyFor(name);\n const existing = this.databases.get(key);\n if (existing) return existing;\n\n if (key !== IN_MEMORY_KEY && !DB_NAME_REGEX.test(name!)) {\n throw new Error(`Invalid database name: ${name}`);\n }\n\n const nameOrNull = name === undefined || name === '' ? null : name;\n const path = nameOrNull ? pathFor(nameOrNull) : null;\n const { db, conn, worker } = await createConnection(path);\n\n const dbObj = new DuckDBDatabase(\n nameOrNull,\n db,\n conn,\n worker,\n (k) => this.databases.delete(k),\n nameOrNull ? (n) => this.removeOPFSDatabase(n) : undefined,\n );\n this.databases.set(key, dbObj);\n return dbObj;\n }\n\n /**\n * List persisted database names (files in OPFS under duckdb-databases/, without .duckdb extension).\n */\n async listDatabases(): Promise<string[]> {\n try {\n const root = await navigator.storage.getDirectory();\n const dir = await root.getDirectoryHandle(OPFS_DB_DIR, { create: false });\n const names: string[] = [];\n for await (const [entryName, handle] of (dir as unknown as AsyncIterable<[string, FileSystemHandle]>)) {\n if (handle.kind === 'file' && entryName.endsWith('.duckdb')) {\n names.push(entryName.slice(0, -'.duckdb'.length));\n }\n }\n return names.sort();\n } catch (err: unknown) {\n if (err instanceof Error && err.name === 'NotFoundError') return [];\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`listDatabases failed: ${msg}`);\n return [];\n }\n }\n\n /**\n * Close the database if open and remove its file from OPFS. Name is the simple database name (e.g. `mydb`).\n */\n async delete(name: string): Promise<void> {\n if (!DB_NAME_REGEX.test(name)) {\n throw new Error(`Invalid database name: ${name}`);\n }\n const existing = this.databases.get(name);\n if (existing) await existing.close();\n await this.removeOPFSDatabase(name);\n }\n\n private async removeOPFSDatabase(name: string): Promise<void> {\n try {\n const root = await navigator.storage.getDirectory();\n const dir = await root.getDirectoryHandle(OPFS_DB_DIR, { create: false });\n await dir.removeEntry(`${name}.duckdb`);\n logger.info(`DuckDB removed: ${name}`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`Failed to delete database ${name}: ${msg}`);\n throw new Error(`Failed to delete database: ${msg}`);\n }\n }\n}\n\nexport const duckdbService = new DuckDBService();\n"],"mappings":";;;AAKA,IAAM,SAAS,aAAa,gBAAgB;AAE5C,IAAM,mBAAmB,WAAO,oBAAoB;AAEpD,IAAM,gBAAgB;AACtB,IAAM,cAAc;AACpB,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AAEzB,SAAS,QAAQ,MAAsB;AACrC,QAAO,UAAU,YAAY,GAAG,KAAK;;AAavC,SAAS,aAAa,GAAqB;AACzC,KAAI,MAAM,QAAQ,MAAM,KAAA,EAAW,QAAO;AAC1C,KAAI,OAAO,MAAM,SAAU,QAAO,OAAO,EAAE;AAC3C,KAAI,aAAa,KAAM,QAAO,EAAE,aAAa;AAC7C,KAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAQ,EAA0B,WAAW,WACtF,QAAQ,EAAgC,QAAQ;AAElD,QAAO;;AAGT,SAAS,mBAAmB,OAAgF;CAC1G,MAAM,MAAM,MAAM,WAAW;CAC7B,MAAM,aAAa,MAAM,QAAQ,IAAI,GAAI,MAAoC,EAAE;AAC/E,KAAI,WAAW,WAAW,EAAG,QAAO;EAAE,SAAS,EAAE;EAAE,MAAM,EAAE;EAAE;CAC7D,MAAM,UAAU,OAAO,KAAK,WAAW,GAAG;AAE1C,QAAO;EAAE;EAAS,MADL,WAAW,KAAK,QAAQ,QAAQ,KAAK,QAAQ,aAAa,IAAI,KAAK,CAAC,CAAC;EAC1D;;AAG1B,eAAe,wBAAuC;AAEpD,QADa,MAAM,UAAU,QAAQ,cAAc,EACxC,mBAAmB,aAAa,EAAE,QAAQ,MAAM,CAAC;;AAG9D,eAAe,iBAAiB,MAI7B;CACD,MAAM,SAAS,MAAM,WAAO,aAAa,iBAAiB;CAC1D,MAAM,YAAY,IAAI,gBACpB,IAAI,KAAK,CAAC,kBAAkB,OAAO,WAAW,KAAK,EAAE,EAAE,MAAM,mBAAmB,CAAC,CAClF;CACD,MAAM,SAAS,IAAI,OAAO,UAAU;AACpC,KAAI,gBAAgB,UAAU;CAC9B,MAAM,MAAM,IAAI,WAAO,eAAe;CACtC,MAAM,KAAK,IAAI,WAAO,YAAY,KAAK,OAAO;AAC9C,OAAM,GAAG,YAAY,OAAO,YAAY,OAAO,cAAc;AAC7D,KAAI,MAAM;AACR,QAAM,uBAAuB;AAC7B,QAAM,GAAG,KAAK;GACZ;GACA,YAAY,WAAO,iBAAiB;GACrC,CAAC;AACF,SAAO,KAAK,uBAAuB,KAAK,eAAe;;CAEzD,MAAM,OAAO,MAAM,GAAG,SAAS;AAC/B,QAAO,KAAK,0BAA0B;AACtC,QAAO;EAAE;EAAI;EAAM;EAAQ;;AAG7B,eAAe,+BACb,IACA,KACA,mBACe;CACf,MAAM,eAAe;CACrB,MAAM,0BAAU,IAAI,KAAqB;CAEzC,IAAI;AACJ,SAAQ,QAAQ,aAAa,KAAK,IAAI,MAAM,MAAM;EAChD,MAAM,UAAU,MAAM;AACtB,MAAI,CAAC,QAAQ,IAAI,QAAQ,CACvB,SAAQ,IAAI,SAAS,GAAG,mBAAmB,UAAU;;AAIzD,KAAI,QAAQ,SAAS,EAAG;CAExB,MAAM,gBAAgB,MAAM,iBAAiB,cAAc;AAC3D,KAAI,CAAC,cACH,OAAM,IAAI,MAAM,6BAA6B;AAG/C,MAAK,MAAM,CAAC,SAAS,YAAY,SAAS;AACxC,MAAI,kBAAkB,IAAI,QAAQ,CAKhC;EAGF,MAAM,WAAW,MAAM,cAAc,YAAY,QAAQ;AACzD,MAAI,CAAC,SACH,OAAM,IAAI,MAAM,6BAA6B,UAAU;EAIzD,MAAM,MAAM,MADC,SACU,YAAY,EAAE,KAAK,MAAM,CAAC;AAEjD,MAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,MAAM,4CAA4C,UAAU;AAGxE,QAAM,GAAG,gBAAgB,SAAS,KAAK,WAAW,mBAAmB,MAAM,MAAM;AACjF,oBAAkB,IAAI,QAAQ;;;;;;AAOlC,IAAa,iBAAb,MAA4B;CAI1B,YACE,MACA,IACA,MACA,QACA,SACA,kBACA;AANS,OAAA,OAAA;AACD,OAAA,KAAA;AACA,OAAA,OAAA;AACA,OAAA,SAAA;AACA,OAAA,UAAA;AACA,OAAA,mBAAA;kDARkC,IAAI,KAAa;AAU3D,OAAK,MAAM,QAAQ;;CAGrB,MAAM,SAAS,KAAyC;EACtD,MAAM,UAAU,IAAI,MAAM;AAC1B,MAAI,CAAC,QAAS,QAAO;GAAE,MAAM,EAAE;GAAE,SAAS,EAAE;GAAE;AAE9C,MAAI;AACF,SAAM,+BAA+B,KAAK,IAAI,SAAS,KAAK,yBAAyB;AAErF,UAAO,mBADO,MAAM,KAAK,KAAK,MAAM,QAAQ,CACZ;WACzB,KAAK;GACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAO,MAAM,iBAAiB,MAAM;AACpC,SAAM,IAAI,MAAM,iBAAiB,MAAM;;;CAI3C,MAAM,gBAAgB,eAAsC;AAC1D,MAAI,CAAC,qBAAqB,KAAK,cAAc,CAC3C,OAAM,IAAI,MAAM,2BAA2B,gBAAgB;EAE7D,MAAM,aAAa,WAAW;EAC9B,MAAM,UAAU,QAAQ;AACxB,MAAI;AACF,SAAM,KAAK,KAAK,MAAM,WAAW;AACjC,SAAM,KAAK,KAAK,MAAM,QAAQ;AAC9B,UAAO,KAAK,6BAA6B,gBAAgB;WAClD,KAAK;GACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAO,MAAM,8BAA8B,cAAc,IAAI,MAAM;AACnE,SAAM,IAAI,MAAM,8BAA8B,cAAc,IAAI,MAAM;;;CAI1E,MAAM,QAAuB;AAC3B,MAAI;AACF,SAAM,KAAK,KAAK,OAAO;WAChB,GAAG;AACV,UAAO,KAAK,uCAAuC,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,EAAE;;AAEjG,MAAI;AACF,QAAK,GAAG,WAAW;WACZ,GAAG;AACV,UAAO,KAAK,gCAAgC,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,EAAE;;AAE1F,OAAK,QAAQ,KAAK,IAAI;;;AAI1B,IAAa,gBAAb,MAA2B;;mCACL,IAAI,KAA6B;;CAErD,OAAe,MAAkC;AAC/C,SAAO,SAAS,KAAA,KAAa,SAAS,KAAK,gBAAgB;;;;;;CAO7D,MAAM,KAAK,MAAwC;EACjD,MAAM,MAAM,KAAK,OAAO,KAAK;EAC7B,MAAM,WAAW,KAAK,UAAU,IAAI,IAAI;AACxC,MAAI,SAAU,QAAO;AAErB,MAAI,QAAQ,iBAAiB,CAAC,cAAc,KAAK,KAAM,CACrD,OAAM,IAAI,MAAM,0BAA0B,OAAO;EAGnD,MAAM,aAAa,SAAS,KAAA,KAAa,SAAS,KAAK,OAAO;EAE9D,MAAM,EAAE,IAAI,MAAM,WAAW,MAAM,iBADtB,aAAa,QAAQ,WAAW,GAAG,KACS;EAEzD,MAAM,QAAQ,IAAI,eAChB,YACA,IACA,MACA,SACC,MAAM,KAAK,UAAU,OAAO,EAAE,EAC/B,cAAc,MAAM,KAAK,mBAAmB,EAAE,GAAG,KAAA,EAClD;AACD,OAAK,UAAU,IAAI,KAAK,MAAM;AAC9B,SAAO;;;;;CAMT,MAAM,gBAAmC;AACvC,MAAI;GAEF,MAAM,MAAM,OADC,MAAM,UAAU,QAAQ,cAAc,EAC5B,mBAAmB,aAAa,EAAE,QAAQ,OAAO,CAAC;GACzE,MAAM,QAAkB,EAAE;AAC1B,cAAW,MAAM,CAAC,WAAW,WAAY,IACvC,KAAI,OAAO,SAAS,UAAU,UAAU,SAAS,UAAU,CACzD,OAAM,KAAK,UAAU,MAAM,GAAG,GAAkB,CAAC;AAGrD,UAAO,MAAM,MAAM;WACZ,KAAc;AACrB,OAAI,eAAe,SAAS,IAAI,SAAS,gBAAiB,QAAO,EAAE;GACnE,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAO,MAAM,yBAAyB,MAAM;AAC5C,UAAO,EAAE;;;;;;CAOb,MAAM,OAAO,MAA6B;AACxC,MAAI,CAAC,cAAc,KAAK,KAAK,CAC3B,OAAM,IAAI,MAAM,0BAA0B,OAAO;EAEnD,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,MAAI,SAAU,OAAM,SAAS,OAAO;AACpC,QAAM,KAAK,mBAAmB,KAAK;;CAGrC,MAAc,mBAAmB,MAA6B;AAC5D,MAAI;AAGF,UADY,OADC,MAAM,UAAU,QAAQ,cAAc,EAC5B,mBAAmB,aAAa,EAAE,QAAQ,OAAO,CAAC,EAC/D,YAAY,GAAG,KAAK,SAAS;AACvC,UAAO,KAAK,mBAAmB,OAAO;WAC/B,KAAK;GACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,UAAO,MAAM,6BAA6B,KAAK,IAAI,MAAM;AACzD,SAAM,IAAI,MAAM,8BAA8B,MAAM;;;;AAK1D,IAAa,gBAAgB,IAAI,eAAe"}
|
|
1
|
+
{"version":3,"file":"duckdb-service-C-0tk2wY.js","names":[],"sources":["../src/duckdb-service.ts"],"sourcesContent":["import { createLogger, workspaceService } from '@eclipse-docks/core';\nimport type { File } from '@eclipse-docks/core';\nimport * as DuckDBWasm from '@duckdb/duckdb-wasm';\nimport * as duckdb from '@duckdb/duckdb-wasm';\n\nconst logger = createLogger('DuckDBService');\n\nconst JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();\n\nconst IN_MEMORY_KEY = '__memory__';\nconst OPFS_DB_DIR = 'duckdb-databases';\nconst EXTENSION_NAME_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*$/;\nconst DB_NAME_REGEX = /^[a-zA-Z0-9_.-]+$/;\nconst WORKSPACE_PREFIX = '/workspace/';\n\nfunction pathFor(name: string): string {\n return `opfs://${OPFS_DB_DIR}/${name}.duckdb`;\n}\n\ntype AsyncDuckDB = duckdb.AsyncDuckDB;\ntype AsyncDuckDBConnection = Awaited<ReturnType<AsyncDuckDB['connect']>>;\ntype DuckDBDataProtocol = DuckDBWasm.DuckDBDataProtocol;\n\n/** Plain JS result: columns in order, rows as array of value arrays. */\nexport interface DuckDBQueryResult {\n columns: string[];\n rows: unknown[][];\n}\n\nfunction toPlainValue(v: unknown): unknown {\n if (v === null || v === undefined) return v;\n if (typeof v === 'bigint') return Number(v);\n if (v instanceof Date) return v.toISOString();\n if (typeof v === 'object' && v !== null && typeof (v as { toJSON: unknown }).toJSON === 'function') {\n return (v as { toJSON: () => unknown }).toJSON();\n }\n return v;\n}\n\nfunction tableToPlainArrays(table: { toArray?: () => unknown[] }): { columns: string[]; rows: unknown[][] } {\n const raw = table.toArray?.();\n const rowObjects = Array.isArray(raw) ? (raw as Record<string, unknown>[]) : [];\n if (rowObjects.length === 0) return { columns: [], rows: [] };\n const columns = Object.keys(rowObjects[0]);\n const rows = rowObjects.map((obj) => columns.map((col) => toPlainValue(obj[col])));\n return { columns, rows };\n}\n\nasync function ensureOPFSDatabaseDir(): Promise<void> {\n const root = await navigator.storage.getDirectory();\n await root.getDirectoryHandle(OPFS_DB_DIR, { create: true });\n}\n\nasync function createConnection(path: string | null): Promise<{\n db: AsyncDuckDB;\n conn: AsyncDuckDBConnection;\n worker: Worker;\n}> {\n const bundle = await duckdb.selectBundle(JSDELIVR_BUNDLES);\n const workerUrl = URL.createObjectURL(\n new Blob([`importScripts(\"${bundle.mainWorker}\");`], { type: 'text/javascript' }),\n );\n const worker = new Worker(workerUrl);\n URL.revokeObjectURL(workerUrl);\n const log = new duckdb.ConsoleLogger();\n const db = new duckdb.AsyncDuckDB(log, worker);\n await db.instantiate(bundle.mainModule, bundle.pthreadWorker);\n if (path) {\n await ensureOPFSDatabaseDir();\n await db.open({\n path,\n accessMode: duckdb.DuckDBAccessMode.READ_WRITE,\n });\n logger.info(`DuckDB-WASM opened: ${path} (read-write)`);\n }\n const conn = await db.connect();\n logger.info('DuckDB-WASM initialized');\n return { db, conn, worker };\n}\n\nasync function registerWorkspaceFilesForQuery(\n db: AsyncDuckDB,\n sql: string,\n alreadyRegistered: Set<string>,\n): Promise<void> {\n const literalRegex = /'\\/workspace\\/([^']+)'/g;\n const matches = new Map<string, string>();\n\n let match: RegExpExecArray | null;\n while ((match = literalRegex.exec(sql)) !== null) {\n const relPath = match[1];\n if (!matches.has(relPath)) {\n matches.set(relPath, `${WORKSPACE_PREFIX}${relPath}`);\n }\n }\n\n if (matches.size === 0) return;\n\n const workspaceRoot = await workspaceService.getWorkspace();\n if (!workspaceRoot) {\n throw new Error('Workspace is not available');\n }\n\n for (const [relPath, vfsPath] of matches) {\n if (alreadyRegistered.has(vfsPath)) {\n // Already registered for this database, skip.\n // If the underlying workspace file changes, users can reopen the connection.\n // This keeps query overhead low.\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const resource = await workspaceRoot.getResource(relPath);\n if (!resource) {\n throw new Error(`Workspace file not found: ${relPath}`);\n }\n\n const file = resource as File;\n const url = await file.getContents({ uri: true });\n\n if (typeof url !== 'string') {\n throw new Error(`Unable to obtain URL for workspace file: ${relPath}`);\n }\n\n await db.registerFileURL(vfsPath, url, DuckDBWasm.DuckDBDataProtocol.HTTP, false);\n alreadyRegistered.add(vfsPath);\n }\n}\n\n/**\n * Abstraction over a single DuckDB database. Use runQuery, enableExtension, close, or delete.\n */\nexport class DuckDBDatabase {\n private readonly key: string;\n private readonly registeredWorkspaceFiles = new Set<string>();\n\n constructor(\n readonly name: string | null,\n private db: AsyncDuckDB,\n private conn: AsyncDuckDBConnection,\n private worker: Worker,\n private onClose: (key: string) => void,\n private onDeleteFromOPFS?: (name: string) => Promise<void>,\n ) {\n this.key = name ?? IN_MEMORY_KEY;\n }\n\n async runQuery(sql: string): Promise<DuckDBQueryResult> {\n const trimmed = sql.trim();\n if (!trimmed) return { rows: [], columns: [] };\n\n try {\n await registerWorkspaceFilesForQuery(this.db, trimmed, this.registeredWorkspaceFiles);\n const table = await this.conn.query(trimmed);\n return tableToPlainArrays(table);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`Query failed: ${msg}`);\n throw new Error(`Query failed: ${msg}`);\n }\n }\n\n async enableExtension(extensionName: string): Promise<void> {\n if (!EXTENSION_NAME_REGEX.test(extensionName)) {\n throw new Error(`Invalid extension name: ${extensionName}`);\n }\n const installSql = `INSTALL ${extensionName}`;\n const loadSql = `LOAD ${extensionName}`;\n try {\n await this.conn.query(installSql);\n await this.conn.query(loadSql);\n logger.info(`DuckDB extension enabled: ${extensionName}`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`Failed to enable extension ${extensionName}: ${msg}`);\n throw new Error(`Failed to enable extension ${extensionName}: ${msg}`);\n }\n }\n\n async close(): Promise<void> {\n try {\n await this.conn.close();\n } catch (e) {\n logger.warn('Error closing DuckDB connection: ' + (e instanceof Error ? e.message : String(e)));\n }\n try {\n this.db.terminate();\n } catch (e) {\n logger.warn('Error terminating DuckDB: ' + (e instanceof Error ? e.message : String(e)));\n }\n this.onClose(this.key);\n }\n}\n\nexport class DuckDBService {\n private databases = new Map<string, DuckDBDatabase>();\n\n private keyFor(name: string | undefined): string {\n return name === undefined || name === '' ? IN_MEMORY_KEY : name;\n }\n\n /**\n * Open a database by name. Stored in OPFS as `duckdb-databases/<name>.duckdb`. Omit name for in-memory.\n * Returns the same abstraction if that database is already open.\n */\n async open(name?: string): Promise<DuckDBDatabase> {\n const key = this.keyFor(name);\n const existing = this.databases.get(key);\n if (existing) return existing;\n\n if (key !== IN_MEMORY_KEY && !DB_NAME_REGEX.test(name!)) {\n throw new Error(`Invalid database name: ${name}`);\n }\n\n const nameOrNull = name === undefined || name === '' ? null : name;\n const path = nameOrNull ? pathFor(nameOrNull) : null;\n const { db, conn, worker } = await createConnection(path);\n\n const dbObj = new DuckDBDatabase(\n nameOrNull,\n db,\n conn,\n worker,\n (k) => this.databases.delete(k),\n nameOrNull ? (n) => this.removeOPFSDatabase(n) : undefined,\n );\n this.databases.set(key, dbObj);\n return dbObj;\n }\n\n /**\n * List persisted database names (files in OPFS under duckdb-databases/, without .duckdb extension).\n */\n async listDatabases(): Promise<string[]> {\n try {\n const root = await navigator.storage.getDirectory();\n const dir = await root.getDirectoryHandle(OPFS_DB_DIR, { create: false });\n const names: string[] = [];\n for await (const [entryName, handle] of (dir as unknown as AsyncIterable<[string, FileSystemHandle]>)) {\n if (handle.kind === 'file' && entryName.endsWith('.duckdb')) {\n names.push(entryName.slice(0, -'.duckdb'.length));\n }\n }\n return names.sort();\n } catch (err: unknown) {\n if (err instanceof Error && err.name === 'NotFoundError') return [];\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`listDatabases failed: ${msg}`);\n return [];\n }\n }\n\n /**\n * Close the database if open and remove its file from OPFS. Name is the simple database name (e.g. `mydb`).\n */\n async delete(name: string): Promise<void> {\n if (!DB_NAME_REGEX.test(name)) {\n throw new Error(`Invalid database name: ${name}`);\n }\n const existing = this.databases.get(name);\n if (existing) await existing.close();\n await this.removeOPFSDatabase(name);\n }\n\n private async removeOPFSDatabase(name: string): Promise<void> {\n try {\n const root = await navigator.storage.getDirectory();\n const dir = await root.getDirectoryHandle(OPFS_DB_DIR, { create: false });\n await dir.removeEntry(`${name}.duckdb`);\n logger.info(`DuckDB removed: ${name}`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`Failed to delete database ${name}: ${msg}`);\n throw new Error(`Failed to delete database: ${msg}`);\n }\n }\n}\n\nexport const duckdbService = new DuckDBService();\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.de-
|
|
1
|
+
{"version":3,"file":"i18n.de-DuUamDgP.js","names":[],"sources":["../src/i18n.de.json"],"sourcesContent":["{\n \"EXT_DUCKDB_NAME\": \"DuckDB\",\n \"EXT_DUCKDB_DESC\": \"SQL-Engine im Browser (DuckDB-WASM) für erweiterte Abfragen, Analysen und Parquet/CSV/JSON.\"\n}\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.en-
|
|
1
|
+
{"version":3,"file":"i18n.en-CuROhwi7.js","names":[],"sources":["../src/i18n.en.json"],"sourcesContent":["{\n \"EXT_DUCKDB_NAME\": \"DuckDB\",\n \"EXT_DUCKDB_DESC\": \"In-browser SQL engine (DuckDB-WASM) for advanced queries, analytics, and Parquet/CSV/JSON.\"\n}\n"],"mappings":""}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { extensionRegistry, i18n } from "@eclipse-docks/core";
|
|
2
2
|
import pkg from "../package.json";
|
|
3
3
|
//#region src/index.ts
|
|
4
|
-
var t = await i18n(/*
|
|
5
|
-
"./i18n.de.json": () => import("./i18n.de-
|
|
6
|
-
"./i18n.en.json": () => import("./i18n.en-
|
|
4
|
+
var t = await i18n(/* #__PURE__ */ Object.assign({
|
|
5
|
+
"./i18n.de.json": () => import("./i18n.de-DuUamDgP.js"),
|
|
6
|
+
"./i18n.en.json": () => import("./i18n.en-CuROhwi7.js")
|
|
7
7
|
}), true);
|
|
8
8
|
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-jR5Rc6cP.js"),
|
|
13
13
|
icon: "database",
|
|
14
14
|
dependencies: ["@eclipse-docks/extension-sqleditor"],
|
|
15
15
|
experimental: true
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_DUCKDB_NAME,\n description: t.EXT_DUCKDB_DESC,\n loader: () => import('./duckdb-extension'),\n icon: 'database',\n dependencies: ['@eclipse-docks/extension-sqleditor'],\n experimental: true,\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_DUCKDB_NAME,\n description: t.EXT_DUCKDB_DESC,\n loader: () => import('./duckdb-extension'),\n icon: 'database',\n dependencies: ['@eclipse-docks/extension-sqleditor'],\n experimental: true,\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;AAAA,CAAA,GAAkC,IAAI;AAE3D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,OAAO;CACrB,MAAM;CACN,cAAc,CAAC,oCAAoC;CACnD,cAAc;AAChB,CAAC"}
|