@eclipse-docks/extension-duckdb 0.7.68

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.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { duckdbService, DuckDBService, DuckDBDatabase, type DuckDBQueryResult, } from './duckdb-service';
2
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC"}
package/dist/api.js ADDED
@@ -0,0 +1,2 @@
1
+ import { n as DuckDBService, r as duckdbService, t as DuckDBDatabase } from "./duckdb-service-BjJkjGgt.js";
2
+ export { DuckDBDatabase, DuckDBService, duckdbService };
@@ -0,0 +1,2 @@
1
+ export declare function registerDuckdbCatalog(): void;
2
+ //# sourceMappingURL=duckdb-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duckdb-catalog.d.ts","sourceRoot":"","sources":["../src/duckdb-catalog.ts"],"names":[],"mappings":"AA4BA,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
@@ -0,0 +1,217 @@
1
+ import { r as duckdbService } from "./duckdb-service-BjJkjGgt.js";
2
+ import { contributionRegistry, rootContext } from "@eclipse-docks/core";
3
+ import { TARGET_NOTEBOOK_KERNELS } from "@eclipse-docks/extension-notebook";
4
+ import { registerCatalog } from "@eclipse-docks/extension-catalog/api";
5
+ //#region src/duckdb-catalog.ts
6
+ var DUCKDB_CATALOG = {
7
+ label: "DuckDB",
8
+ icon: "database",
9
+ contributionId: "catalog.duckdb",
10
+ items: [{
11
+ label: "Basics",
12
+ icon: "file-lines",
13
+ contributionId: "catalog.duckdb.basics",
14
+ items: [{
15
+ label: "Hello DuckDB",
16
+ icon: "file-code",
17
+ state: {
18
+ url: new URL("data:application/sql;base64,LS0gSGVsbG8gRHVja0RCOiBiYXNpYyBxdWVyaWVzIGFuZCBmdW5jdGlvbnMKLS0gUnVuIHRoaXMgaW4gdGhlIFNRTCBlZGl0b3Igd2l0aCBEdWNrREIgc2VsZWN0ZWQgYXMgYWRhcHRlci4KClNFTEVDVCAnSGVsbG8sIER1Y2tEQiEnIEFTIGdyZWV0aW5nOwoKU0VMRUNUIDEgKyAyIEFTIHN1bSwgMTAgKiA1IEFTIHByb2R1Y3Q7CgpTRUxFQ1QgY3VycmVudF9kYXRlIEFTIHRvZGF5LCBjdXJyZW50X3RpbWVzdGFtcCBBUyBub3c7CgotLSBDcmVhdGUgYSBzbWFsbCBpbi1tZW1vcnkgdGFibGUgYW5kIHF1ZXJ5IGl0CkNSRUFURSBPUiBSRVBMQUNFIFRFTVAgVEFCTEUgc2FtcGxlIChpZCBJTlQsIG5hbWUgVkFSQ0hBUik7CklOU0VSVCBJTlRPIHNhbXBsZSBWQUxVRVMgKDEsICdBbGljZScpLCAoMiwgJ0JvYicpLCAoMywgJ0Nhcm9sJyk7ClNFTEVDVCAqIEZST00gc2FtcGxlOwo=", "" + import.meta.url).href,
19
+ filename: "hello-duckdb.sql"
20
+ }
21
+ }, {
22
+ label: "Aggregations and filters",
23
+ icon: "file-code",
24
+ state: {
25
+ url: new URL("data:application/sql;base64,LS0gRHVja0RCOiBhZ2dyZWdhdGlvbnMgYW5kIGZpbHRlcnMKLS0gRGVtb25zdHJhdGVzIEdST1VQIEJZLCBIQVZJTkcsIFdIRVJFLCBhbmQgY29tbW9uIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMuCgpDUkVBVEUgT1IgUkVQTEFDRSBURU1QIFRBQkxFIHNhbGVzICgKICAgIHJlZ2lvbiBWQVJDSEFSLAogICAgcHJvZHVjdCBWQVJDSEFSLAogICAgYW1vdW50IERFQ0lNQUwoMTAsIDIpCik7CklOU0VSVCBJTlRPIHNhbGVzIFZBTFVFUwogICAgKCdOb3J0aCcsICdXaWRnZXQnLCAxMDAuMDApLAogICAgKCdOb3J0aCcsICdHYWRnZXQnLCAyNTAuNTApLAogICAgKCdTb3V0aCcsICdXaWRnZXQnLCA3NS4wMCksCiAgICAoJ1NvdXRoJywgJ0dhZGdldCcsIDMyMC4wMCksCiAgICAoJ05vcnRoJywgJ1dpZGdldCcsIDkwLjAwKTsKCi0tIEZpbHRlciBhbmQgYWdncmVnYXRlIGJ5IHJlZ2lvbgpTRUxFQ1QgcmVnaW9uLCBTVU0oYW1vdW50KSBBUyB0b3RhbCwgQ09VTlQoKikgQVMgb3JkZXJzCkZST00gc2FsZXMKV0hFUkUgYW1vdW50ID4gODAKR1JPVVAgQlkgcmVnaW9uCkhBVklORyBTVU0oYW1vdW50KSA+IDIwMApPUkRFUiBCWSB0b3RhbCBERVNDOwoKLS0gUGVyLXByb2R1Y3QgdG90YWxzClNFTEVDVCBwcm9kdWN0LCBTVU0oYW1vdW50KSBBUyB0b3RhbCwgQVZHKGFtb3VudCkgQVMgYXZnX29yZGVyCkZST00gc2FsZXMKR1JPVVAgQlkgcHJvZHVjdDsK", "" + import.meta.url).href,
26
+ filename: "aggregations.sql"
27
+ }
28
+ }]
29
+ }, {
30
+ label: "Data types & functions",
31
+ icon: "file-lines",
32
+ contributionId: "catalog.duckdb.types",
33
+ items: [{
34
+ label: "Types and built-in functions",
35
+ icon: "file-code",
36
+ state: {
37
+ url: new URL("data:application/sql;base64,LS0gRHVja0RCOiBkYXRhIHR5cGVzIGFuZCBidWlsdC1pbiBmdW5jdGlvbnMKLS0gRXhwbG9yZSB0eXBlIGNvbnN0cnVjdG9ycyBhbmQgY29tbW9uIHN0cmluZy9kYXRlL21hdGggZnVuY3Rpb25zLgoKU0VMRUNUCiAgICBDQVNUKCc0MicgQVMgSU5UKSBBUyBwYXJzZWRfaW50LAogICAgQ0FTVCgnMy4xNCcgQVMgRE9VQkxFKSBBUyBwYXJzZWRfZG91YmxlLAogICAgQ0FTVCgnMjAyNC0wMS0xNScgQVMgREFURSkgQVMgcGFyc2VkX2RhdGU7CgpTRUxFQ1QKICAgIHVwcGVyKCdoZWxsbycpIEFTIHVwcGVyX2Nhc2UsCiAgICBsb3dlcignV09STEQnKSBBUyBsb3dlcl9jYXNlLAogICAgbGVuZ3RoKCdEdWNrREInKSBBUyBsZW4sCiAgICBzdWJzdHIoJ0R1Y2tEQicsIDEsIDQpIEFTIHN1YjsKClNFTEVDVAogICAgcm91bmQoMy4xNDE1OSwgMikgQVMgcm91bmRlZCwKICAgIGZsb29yKDIuNykgQVMgZmxyLAogICAgY2VpbCgyLjIpIEFTIGNsLAogICAgYWJzKC0xMCkgQVMgYWJzb2x1dGU7CgpTRUxFQ1QKICAgIGRhdGVfcGFydCgneWVhcicsIGN1cnJlbnRfZGF0ZSkgQVMgeWVhciwKICAgIGRhdGVfcGFydCgnbW9udGgnLCBjdXJyZW50X2RhdGUpIEFTIG1vbnRoLAogICAgc3RyZnRpbWUoY3VycmVudF90aW1lc3RhbXAsICclWS0lbS0lZCAlSDolTScpIEFTIGZvcm1hdHRlZDsK", "" + import.meta.url).href,
38
+ filename: "types-and-functions.sql"
39
+ }
40
+ }]
41
+ }]
42
+ };
43
+ function registerDuckdbCatalog() {
44
+ registerCatalog(DUCKDB_CATALOG);
45
+ }
46
+ //#endregion
47
+ //#region src/duckdb-sqldatabase.ts
48
+ var DuckdbSqlDatabase = class {
49
+ constructor() {
50
+ this.engineId = "duckdb";
51
+ this.current = null;
52
+ this.currentId = null;
53
+ this.enabledExtensions = /* @__PURE__ */ new Set();
54
+ }
55
+ get currentConnectionId() {
56
+ return this.currentId;
57
+ }
58
+ async listConnections() {
59
+ return [{
60
+ id: null,
61
+ label: "In-memory",
62
+ isDefault: true
63
+ }, ...(await duckdbService.listDatabases()).map((name) => ({
64
+ id: name,
65
+ label: name
66
+ }))];
67
+ }
68
+ async selectConnection(id) {
69
+ if (this.current && this.currentId === id) return;
70
+ if (this.current) {
71
+ await this.current.close();
72
+ this.current = null;
73
+ }
74
+ const db = id === null ? await duckdbService.open() : await duckdbService.open(id);
75
+ this.current = db;
76
+ this.currentId = db.name ?? null;
77
+ }
78
+ async runQuery(sql) {
79
+ if (!this.current) await this.selectConnection(null);
80
+ if (!this.current) return {
81
+ columns: [],
82
+ rows: []
83
+ };
84
+ const result = await this.current.runQuery(sql);
85
+ return {
86
+ columns: result.columns,
87
+ rows: result.rows
88
+ };
89
+ }
90
+ async createConnection() {
91
+ return null;
92
+ }
93
+ async deleteConnection(id) {
94
+ if (!id) return;
95
+ if (this.current && this.current.name === id) {
96
+ await this.current.close();
97
+ this.current = null;
98
+ this.currentId = null;
99
+ }
100
+ await duckdbService.delete(id);
101
+ }
102
+ async listDbExtensions() {
103
+ if (!this.current) await this.selectConnection(null);
104
+ if (!this.current) return [];
105
+ try {
106
+ const result = await this.current.runQuery("SELECT extension_name, installed, loaded, description FROM duckdb_extensions();");
107
+ const nameIndex = result.columns.indexOf("extension_name");
108
+ if (nameIndex === -1) return [];
109
+ const installedIndex = result.columns.indexOf("installed");
110
+ const loadedIndex = result.columns.indexOf("loaded");
111
+ const descriptionIndex = result.columns.indexOf("description");
112
+ return result.rows.map((row) => {
113
+ const cells = row;
114
+ const id = String(cells[nameIndex] ?? "").trim();
115
+ const installedValue = installedIndex >= 0 ? cells[installedIndex] : void 0;
116
+ const loadedValue = loadedIndex >= 0 ? cells[loadedIndex] : void 0;
117
+ const descriptionValue = descriptionIndex >= 0 ? cells[descriptionIndex] : void 0;
118
+ const isInstalled = loadedValue === true || loadedValue === 1 || loadedValue === "t" || loadedValue === "true" || installedValue === true || installedValue === 1 || installedValue === "t" || installedValue === "true" || this.enabledExtensions.has(id);
119
+ return {
120
+ id,
121
+ label: id,
122
+ description: typeof descriptionValue === "string" ? descriptionValue : void 0,
123
+ installed: isInstalled
124
+ };
125
+ });
126
+ } catch {
127
+ return [];
128
+ }
129
+ }
130
+ async enableDbExtension(id) {
131
+ if (!this.current) return;
132
+ await this.current.enableExtension(id);
133
+ this.enabledExtensions.add(id);
134
+ }
135
+ async close() {
136
+ if (!this.current) return;
137
+ await this.current.close();
138
+ this.current = null;
139
+ this.currentId = null;
140
+ }
141
+ };
142
+ var duckdbSqlAdapterContribution = {
143
+ id: "duckdb",
144
+ label: "DuckDB",
145
+ icon: "database",
146
+ loader: async () => new DuckdbSqlDatabase()
147
+ };
148
+ //#endregion
149
+ //#region src/duckdb-notebook-kernel.ts
150
+ function formatResult(columns, rows) {
151
+ if (columns.length === 0 && rows.length === 0) return "";
152
+ const pad = (s, w) => s.padEnd(w);
153
+ const colWidths = columns.map((c, i) => {
154
+ const maxVal = rows.reduce((m, r) => Math.max(m, String(r[i] ?? "").length), 0);
155
+ return Math.max(c.length, maxVal, 1);
156
+ });
157
+ const sep = colWidths.map((w) => "-".repeat(w)).join("-+-");
158
+ return [
159
+ columns.map((c, i) => pad(c, colWidths[i])).join(" | "),
160
+ sep,
161
+ ...rows.map((row) => row.map((v, i) => pad(String(v ?? ""), colWidths[i])).join(" | "))
162
+ ].join("\n");
163
+ }
164
+ var DuckdbNotebookKernel = class {
165
+ constructor() {
166
+ this.id = "duckdb";
167
+ this.label = "DuckDB";
168
+ this.language = "sql";
169
+ this.db = null;
170
+ }
171
+ async getDb() {
172
+ if (!this.db) {
173
+ this.db = await duckdbSqlAdapterContribution.loader();
174
+ await this.db.selectConnection(null);
175
+ }
176
+ return this.db;
177
+ }
178
+ async getVersion() {
179
+ try {
180
+ return (await (await this.getDb()).runQuery("SELECT version()")).rows[0]?.[0] ?? void 0;
181
+ } catch {
182
+ return;
183
+ }
184
+ }
185
+ async execute(code) {
186
+ try {
187
+ const result = await (await this.getDb()).runQuery(code);
188
+ return { data: formatResult(result.columns, result.rows) || void 0 };
189
+ } catch (err) {
190
+ return { error: err instanceof Error ? err.message : String(err) };
191
+ }
192
+ }
193
+ close() {
194
+ if (this.db) {
195
+ this.db.close();
196
+ this.db = null;
197
+ }
198
+ }
199
+ };
200
+ var duckdbNotebookKernelContribution = {
201
+ id: "duckdb",
202
+ label: "DuckDB",
203
+ language: "sql",
204
+ loadKernel: async () => new DuckdbNotebookKernel()
205
+ };
206
+ //#endregion
207
+ //#region src/duckdb-extension.ts
208
+ function duckdb_extension_default() {
209
+ registerDuckdbCatalog();
210
+ rootContext.put("duckdbService", duckdbService);
211
+ contributionRegistry.registerContribution("system.sqladapters", duckdbSqlAdapterContribution);
212
+ contributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, duckdbNotebookKernelContribution);
213
+ }
214
+ //#endregion
215
+ export { duckdb_extension_default as default };
216
+
217
+ //# sourceMappingURL=duckdb-extension-B40T7F65.js.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,2 @@
1
+ export default function (): void;
2
+ //# sourceMappingURL=duckdb-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duckdb-extension.d.ts","sourceRoot":"","sources":["../src/duckdb-extension.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,OAAO,mBAWb"}
@@ -0,0 +1,3 @@
1
+ import { NotebookKernelContribution } from '@eclipse-docks/extension-notebook';
2
+ export declare const duckdbNotebookKernelContribution: NotebookKernelContribution;
3
+ //# sourceMappingURL=duckdb-notebook-kernel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duckdb-notebook-kernel.d.ts","sourceRoot":"","sources":["../src/duckdb-notebook-kernel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,0BAA0B,EAC3B,MAAM,mCAAmC,CAAC;AAkE3C,eAAO,MAAM,gCAAgC,EAAE,0BAK9C,CAAC"}
@@ -0,0 +1,201 @@
1
+ import { createLogger, workspaceService } from "@eclipse-docks/core";
2
+ import * as DuckDBWasm from "@duckdb/duckdb-wasm";
3
+ //#region src/duckdb-service.ts
4
+ var logger = createLogger("DuckDBService");
5
+ var JSDELIVR_BUNDLES = DuckDBWasm.getJsDelivrBundles();
6
+ var IN_MEMORY_KEY = "__memory__";
7
+ var OPFS_DB_DIR = "duckdb-databases";
8
+ var EXTENSION_NAME_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*$/;
9
+ var DB_NAME_REGEX = /^[a-zA-Z0-9_.-]+$/;
10
+ var WORKSPACE_PREFIX = "/workspace/";
11
+ function pathFor(name) {
12
+ return `opfs://${OPFS_DB_DIR}/${name}.duckdb`;
13
+ }
14
+ function toPlainValue(v) {
15
+ if (v === null || v === void 0) return v;
16
+ if (typeof v === "bigint") return Number(v);
17
+ if (v instanceof Date) return v.toISOString();
18
+ if (typeof v === "object" && v !== null && typeof v.toJSON === "function") return v.toJSON();
19
+ return v;
20
+ }
21
+ function tableToPlainArrays(table) {
22
+ const raw = table.toArray?.();
23
+ const rowObjects = Array.isArray(raw) ? raw : [];
24
+ if (rowObjects.length === 0) return {
25
+ columns: [],
26
+ rows: []
27
+ };
28
+ const columns = Object.keys(rowObjects[0]);
29
+ return {
30
+ columns,
31
+ rows: rowObjects.map((obj) => columns.map((col) => toPlainValue(obj[col])))
32
+ };
33
+ }
34
+ async function ensureOPFSDatabaseDir() {
35
+ await (await navigator.storage.getDirectory()).getDirectoryHandle(OPFS_DB_DIR, { create: true });
36
+ }
37
+ async function createConnection(path) {
38
+ const bundle = await DuckDBWasm.selectBundle(JSDELIVR_BUNDLES);
39
+ const workerUrl = URL.createObjectURL(new Blob([`importScripts("${bundle.mainWorker}");`], { type: "text/javascript" }));
40
+ const worker = new Worker(workerUrl);
41
+ URL.revokeObjectURL(workerUrl);
42
+ const log = new DuckDBWasm.ConsoleLogger();
43
+ const db = new DuckDBWasm.AsyncDuckDB(log, worker);
44
+ await db.instantiate(bundle.mainModule, bundle.pthreadWorker);
45
+ if (path) {
46
+ await ensureOPFSDatabaseDir();
47
+ await db.open({
48
+ path,
49
+ accessMode: DuckDBWasm.DuckDBAccessMode.READ_WRITE
50
+ });
51
+ logger.info(`DuckDB-WASM opened: ${path} (read-write)`);
52
+ }
53
+ const conn = await db.connect();
54
+ logger.info("DuckDB-WASM initialized");
55
+ return {
56
+ db,
57
+ conn,
58
+ worker
59
+ };
60
+ }
61
+ async function registerWorkspaceFilesForQuery(db, sql, alreadyRegistered) {
62
+ const literalRegex = /'\/workspace\/([^']+)'/g;
63
+ const matches = /* @__PURE__ */ new Map();
64
+ let match;
65
+ while ((match = literalRegex.exec(sql)) !== null) {
66
+ const relPath = match[1];
67
+ if (!matches.has(relPath)) matches.set(relPath, `${WORKSPACE_PREFIX}${relPath}`);
68
+ }
69
+ if (matches.size === 0) return;
70
+ const workspaceRoot = await workspaceService.getWorkspace();
71
+ if (!workspaceRoot) throw new Error("Workspace is not available");
72
+ for (const [relPath, vfsPath] of matches) {
73
+ if (alreadyRegistered.has(vfsPath)) continue;
74
+ const resource = await workspaceRoot.getResource(relPath);
75
+ if (!resource) throw new Error(`Workspace file not found: ${relPath}`);
76
+ const url = await resource.getContents({ uri: true });
77
+ if (typeof url !== "string") throw new Error(`Unable to obtain URL for workspace file: ${relPath}`);
78
+ await db.registerFileURL(vfsPath, url, DuckDBWasm.DuckDBDataProtocol.HTTP, false);
79
+ alreadyRegistered.add(vfsPath);
80
+ }
81
+ }
82
+ /**
83
+ * Abstraction over a single DuckDB database. Use runQuery, enableExtension, close, or delete.
84
+ */
85
+ var DuckDBDatabase = class {
86
+ constructor(name, db, conn, worker, onClose, onDeleteFromOPFS) {
87
+ this.name = name;
88
+ this.db = db;
89
+ this.conn = conn;
90
+ this.worker = worker;
91
+ this.onClose = onClose;
92
+ this.onDeleteFromOPFS = onDeleteFromOPFS;
93
+ this.registeredWorkspaceFiles = /* @__PURE__ */ new Set();
94
+ this.key = name ?? IN_MEMORY_KEY;
95
+ }
96
+ async runQuery(sql) {
97
+ const trimmed = sql.trim();
98
+ if (!trimmed) return {
99
+ rows: [],
100
+ columns: []
101
+ };
102
+ try {
103
+ await registerWorkspaceFilesForQuery(this.db, trimmed, this.registeredWorkspaceFiles);
104
+ return tableToPlainArrays(await this.conn.query(trimmed));
105
+ } catch (err) {
106
+ const msg = err instanceof Error ? err.message : String(err);
107
+ logger.error(`Query failed: ${msg}`);
108
+ throw new Error(`Query failed: ${msg}`);
109
+ }
110
+ }
111
+ async enableExtension(extensionName) {
112
+ if (!EXTENSION_NAME_REGEX.test(extensionName)) throw new Error(`Invalid extension name: ${extensionName}`);
113
+ const installSql = `INSTALL ${extensionName}`;
114
+ const loadSql = `LOAD ${extensionName}`;
115
+ try {
116
+ await this.conn.query(installSql);
117
+ await this.conn.query(loadSql);
118
+ logger.info(`DuckDB extension enabled: ${extensionName}`);
119
+ } catch (err) {
120
+ const msg = err instanceof Error ? err.message : String(err);
121
+ logger.error(`Failed to enable extension ${extensionName}: ${msg}`);
122
+ throw new Error(`Failed to enable extension ${extensionName}: ${msg}`);
123
+ }
124
+ }
125
+ async close() {
126
+ try {
127
+ await this.conn.close();
128
+ } catch (e) {
129
+ logger.warn("Error closing DuckDB connection: " + (e instanceof Error ? e.message : String(e)));
130
+ }
131
+ try {
132
+ this.db.terminate();
133
+ } catch (e) {
134
+ logger.warn("Error terminating DuckDB: " + (e instanceof Error ? e.message : String(e)));
135
+ }
136
+ this.onClose(this.key);
137
+ }
138
+ };
139
+ var DuckDBService = class {
140
+ constructor() {
141
+ this.databases = /* @__PURE__ */ new Map();
142
+ }
143
+ keyFor(name) {
144
+ return name === void 0 || name === "" ? IN_MEMORY_KEY : name;
145
+ }
146
+ /**
147
+ * Open a database by name. Stored in OPFS as `duckdb-databases/<name>.duckdb`. Omit name for in-memory.
148
+ * Returns the same abstraction if that database is already open.
149
+ */
150
+ async open(name) {
151
+ const key = this.keyFor(name);
152
+ const existing = this.databases.get(key);
153
+ if (existing) return existing;
154
+ if (key !== IN_MEMORY_KEY && !DB_NAME_REGEX.test(name)) throw new Error(`Invalid database name: ${name}`);
155
+ const nameOrNull = name === void 0 || name === "" ? null : name;
156
+ const { db, conn, worker } = await createConnection(nameOrNull ? pathFor(nameOrNull) : null);
157
+ const dbObj = new DuckDBDatabase(nameOrNull, db, conn, worker, (k) => this.databases.delete(k), nameOrNull ? (n) => this.removeOPFSDatabase(n) : void 0);
158
+ this.databases.set(key, dbObj);
159
+ return dbObj;
160
+ }
161
+ /**
162
+ * List persisted database names (files in OPFS under duckdb-databases/, without .duckdb extension).
163
+ */
164
+ async listDatabases() {
165
+ try {
166
+ const dir = await (await navigator.storage.getDirectory()).getDirectoryHandle(OPFS_DB_DIR, { create: false });
167
+ const names = [];
168
+ for await (const [entryName, handle] of dir) if (handle.kind === "file" && entryName.endsWith(".duckdb")) names.push(entryName.slice(0, -7));
169
+ return names.sort();
170
+ } catch (err) {
171
+ if (err instanceof Error && err.name === "NotFoundError") return [];
172
+ const msg = err instanceof Error ? err.message : String(err);
173
+ logger.error(`listDatabases failed: ${msg}`);
174
+ return [];
175
+ }
176
+ }
177
+ /**
178
+ * Close the database if open and remove its file from OPFS. Name is the simple database name (e.g. `mydb`).
179
+ */
180
+ async delete(name) {
181
+ if (!DB_NAME_REGEX.test(name)) throw new Error(`Invalid database name: ${name}`);
182
+ const existing = this.databases.get(name);
183
+ if (existing) await existing.close();
184
+ await this.removeOPFSDatabase(name);
185
+ }
186
+ async removeOPFSDatabase(name) {
187
+ try {
188
+ await (await (await navigator.storage.getDirectory()).getDirectoryHandle(OPFS_DB_DIR, { create: false })).removeEntry(`${name}.duckdb`);
189
+ logger.info(`DuckDB removed: ${name}`);
190
+ } catch (err) {
191
+ const msg = err instanceof Error ? err.message : String(err);
192
+ logger.error(`Failed to delete database ${name}: ${msg}`);
193
+ throw new Error(`Failed to delete database: ${msg}`);
194
+ }
195
+ }
196
+ };
197
+ var duckdbService = new DuckDBService();
198
+ //#endregion
199
+ export { DuckDBService as n, duckdbService as r, DuckDBDatabase as t };
200
+
201
+ //# sourceMappingURL=duckdb-service-BjJkjGgt.js.map
@@ -0,0 +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"}
@@ -0,0 +1,46 @@
1
+ import * as duckdb from '@duckdb/duckdb-wasm';
2
+ type AsyncDuckDB = duckdb.AsyncDuckDB;
3
+ type AsyncDuckDBConnection = Awaited<ReturnType<AsyncDuckDB['connect']>>;
4
+ /** Plain JS result: columns in order, rows as array of value arrays. */
5
+ export interface DuckDBQueryResult {
6
+ columns: string[];
7
+ rows: unknown[][];
8
+ }
9
+ /**
10
+ * Abstraction over a single DuckDB database. Use runQuery, enableExtension, close, or delete.
11
+ */
12
+ export declare class DuckDBDatabase {
13
+ readonly name: string | null;
14
+ private db;
15
+ private conn;
16
+ private worker;
17
+ private onClose;
18
+ private onDeleteFromOPFS?;
19
+ private readonly key;
20
+ private readonly registeredWorkspaceFiles;
21
+ constructor(name: string | null, db: AsyncDuckDB, conn: AsyncDuckDBConnection, worker: Worker, onClose: (key: string) => void, onDeleteFromOPFS?: ((name: string) => Promise<void>) | undefined);
22
+ runQuery(sql: string): Promise<DuckDBQueryResult>;
23
+ enableExtension(extensionName: string): Promise<void>;
24
+ close(): Promise<void>;
25
+ }
26
+ export declare class DuckDBService {
27
+ private databases;
28
+ private keyFor;
29
+ /**
30
+ * Open a database by name. Stored in OPFS as `duckdb-databases/<name>.duckdb`. Omit name for in-memory.
31
+ * Returns the same abstraction if that database is already open.
32
+ */
33
+ open(name?: string): Promise<DuckDBDatabase>;
34
+ /**
35
+ * List persisted database names (files in OPFS under duckdb-databases/, without .duckdb extension).
36
+ */
37
+ listDatabases(): Promise<string[]>;
38
+ /**
39
+ * Close the database if open and remove its file from OPFS. Name is the simple database name (e.g. `mydb`).
40
+ */
41
+ delete(name: string): Promise<void>;
42
+ private removeOPFSDatabase;
43
+ }
44
+ export declare const duckdbService: DuckDBService;
45
+ export {};
46
+ //# sourceMappingURL=duckdb-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duckdb-service.d.ts","sourceRoot":"","sources":["../src/duckdb-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAgB9C,KAAK,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACtC,KAAK,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAGzE,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;CACnB;AAsGD;;GAEG;AACH,qBAAa,cAAc;IAKvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAC5B,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,gBAAgB,CAAC;IAT3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAqB;gBAGnD,IAAI,EAAE,MAAM,GAAG,IAAI,EACpB,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAC9B,gBAAgB,CAAC,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,aAAA;IAKtD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAejD,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa7B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAqC;IAEtD,OAAO,CAAC,MAAM;IAId;;;OAGG;IACG,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAyBlD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBxC;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAS3B,kBAAkB;CAYjC;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { SqlAdapterContribution } from '@eclipse-docks/extension-sqleditor';
2
+ export declare const duckdbSqlAdapterContribution: SqlAdapterContribution;
3
+ //# sourceMappingURL=duckdb-sqldatabase.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ //#region src/i18n.de.json
2
+ var EXT_DUCKDB_NAME = "DuckDB";
3
+ var EXT_DUCKDB_DESC = "SQL-Engine im Browser (DuckDB-WASM) für erweiterte Abfragen, Analysen und Parquet/CSV/JSON.";
4
+ var i18n_de_default = {
5
+ EXT_DUCKDB_NAME,
6
+ EXT_DUCKDB_DESC
7
+ };
8
+ //#endregion
9
+ export { EXT_DUCKDB_DESC, EXT_DUCKDB_NAME, i18n_de_default as default };
10
+
11
+ //# sourceMappingURL=i18n.de-DcvaIwdb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.de-DcvaIwdb.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":""}
@@ -0,0 +1,11 @@
1
+ //#region src/i18n.en.json
2
+ var EXT_DUCKDB_NAME = "DuckDB";
3
+ var EXT_DUCKDB_DESC = "In-browser SQL engine (DuckDB-WASM) for advanced queries, analytics, and Parquet/CSV/JSON.";
4
+ var i18n_en_default = {
5
+ EXT_DUCKDB_NAME,
6
+ EXT_DUCKDB_DESC
7
+ };
8
+ //#endregion
9
+ export { EXT_DUCKDB_DESC, EXT_DUCKDB_NAME, i18n_en_default as default };
10
+
11
+ //# sourceMappingURL=i18n.en-CEVgAB1e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.en-CEVgAB1e.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":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ import { extensionRegistry, i18n } from "@eclipse-docks/core";
2
+ import pkg from "../package.json";
3
+ //#region src/index.ts
4
+ var t = await i18n(/* @__PURE__ */ Object.assign({
5
+ "./i18n.de.json": () => import("./i18n.de-DcvaIwdb.js"),
6
+ "./i18n.en.json": () => import("./i18n.en-CEVgAB1e.js")
7
+ }), true);
8
+ extensionRegistry.registerExtension({
9
+ id: pkg.name,
10
+ name: t.EXT_DUCKDB_NAME,
11
+ description: t.EXT_DUCKDB_DESC,
12
+ loader: () => import("./duckdb-extension-B40T7F65.js"),
13
+ icon: "database",
14
+ dependencies: ["@eclipse-docks/extension-sqleditor"],
15
+ experimental: true
16
+ });
17
+ //#endregion
18
+
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,OAAO;CACrB,MAAM;CACN,cAAc,CAAC,qCAAqC;CACpD,cAAc;CACf,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@eclipse-docks/extension-duckdb",
3
+ "version": "0.7.68",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./api": {
14
+ "types": "./dist/api.d.ts",
15
+ "import": "./dist/api.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "scripts": {
22
+ "build": "vite build"
23
+ },
24
+ "dependencies": {
25
+ "@duckdb/duckdb-wasm": "1.33.1-dev20.0",
26
+ "@eclipse-docks/core": "*",
27
+ "@eclipse-docks/extension-catalog": "*",
28
+ "@eclipse-docks/extension-notebook": "*",
29
+ "@eclipse-docks/extension-sqleditor": "*"
30
+ },
31
+ "devDependencies": {
32
+ "typescript": "^6.0.0",
33
+ "vite": "^8.0.0",
34
+ "vite-plugin-dts": "^4.5.4"
35
+ },
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/eclipse-docks/core"
39
+ }
40
+ }