@querypanel/node-sdk 1.0.23 → 1.0.25

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.
Files changed (137) hide show
  1. package/README.md +46 -274
  2. package/dist/index.cjs +1471 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +468 -0
  5. package/dist/index.d.ts +468 -0
  6. package/dist/index.js +1443 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +53 -43
  9. package/dist/cjs/adapters/clickhouse.d.ts +0 -48
  10. package/dist/cjs/adapters/clickhouse.d.ts.map +0 -1
  11. package/dist/cjs/adapters/clickhouse.js +0 -284
  12. package/dist/cjs/adapters/clickhouse.js.map +0 -1
  13. package/dist/cjs/adapters/introspection.spec.d.ts +0 -2
  14. package/dist/cjs/adapters/introspection.spec.d.ts.map +0 -1
  15. package/dist/cjs/adapters/introspection.spec.js +0 -192
  16. package/dist/cjs/adapters/introspection.spec.js.map +0 -1
  17. package/dist/cjs/adapters/postgres.d.ts +0 -46
  18. package/dist/cjs/adapters/postgres.d.ts.map +0 -1
  19. package/dist/cjs/adapters/postgres.js +0 -457
  20. package/dist/cjs/adapters/postgres.js.map +0 -1
  21. package/dist/cjs/adapters/postgres.spec.d.ts +0 -2
  22. package/dist/cjs/adapters/postgres.spec.d.ts.map +0 -1
  23. package/dist/cjs/adapters/postgres.spec.js +0 -37
  24. package/dist/cjs/adapters/postgres.spec.js.map +0 -1
  25. package/dist/cjs/adapters/types.d.ts +0 -38
  26. package/dist/cjs/adapters/types.d.ts.map +0 -1
  27. package/dist/cjs/adapters/types.js +0 -3
  28. package/dist/cjs/adapters/types.js.map +0 -1
  29. package/dist/cjs/anonymize.spec.d.ts +0 -2
  30. package/dist/cjs/anonymize.spec.d.ts.map +0 -1
  31. package/dist/cjs/anonymize.spec.js +0 -78
  32. package/dist/cjs/anonymize.spec.js.map +0 -1
  33. package/dist/cjs/clickhouseClient.spec.d.ts +0 -2
  34. package/dist/cjs/clickhouseClient.spec.d.ts.map +0 -1
  35. package/dist/cjs/clickhouseClient.spec.js +0 -286
  36. package/dist/cjs/clickhouseClient.spec.js.map +0 -1
  37. package/dist/cjs/connectors/base.d.ts +0 -14
  38. package/dist/cjs/connectors/base.d.ts.map +0 -1
  39. package/dist/cjs/connectors/base.js +0 -3
  40. package/dist/cjs/connectors/base.js.map +0 -1
  41. package/dist/cjs/connectors/clickhouse.d.ts +0 -35
  42. package/dist/cjs/connectors/clickhouse.d.ts.map +0 -1
  43. package/dist/cjs/connectors/clickhouse.js +0 -292
  44. package/dist/cjs/connectors/clickhouse.js.map +0 -1
  45. package/dist/cjs/index.d.ts +0 -498
  46. package/dist/cjs/index.d.ts.map +0 -1
  47. package/dist/cjs/index.js +0 -849
  48. package/dist/cjs/index.js.map +0 -1
  49. package/dist/cjs/index.test.d.ts +0 -2
  50. package/dist/cjs/index.test.d.ts.map +0 -1
  51. package/dist/cjs/index.test.js +0 -185
  52. package/dist/cjs/index.test.js.map +0 -1
  53. package/dist/cjs/introspectV3.d.ts +0 -45
  54. package/dist/cjs/introspectV3.d.ts.map +0 -1
  55. package/dist/cjs/introspectV3.js +0 -99
  56. package/dist/cjs/introspectV3.js.map +0 -1
  57. package/dist/cjs/multidb.spec.d.ts +0 -2
  58. package/dist/cjs/multidb.spec.d.ts.map +0 -1
  59. package/dist/cjs/multidb.spec.js +0 -76
  60. package/dist/cjs/multidb.spec.js.map +0 -1
  61. package/dist/cjs/package.json +0 -1
  62. package/dist/cjs/schema/types.d.ts +0 -73
  63. package/dist/cjs/schema/types.d.ts.map +0 -1
  64. package/dist/cjs/schema/types.js +0 -3
  65. package/dist/cjs/schema/types.js.map +0 -1
  66. package/dist/cjs/tenant-isolation.spec.d.ts +0 -2
  67. package/dist/cjs/tenant-isolation.spec.d.ts.map +0 -1
  68. package/dist/cjs/tenant-isolation.spec.js +0 -420
  69. package/dist/cjs/tenant-isolation.spec.js.map +0 -1
  70. package/dist/cjs/utils/clickhouse.d.ts +0 -9
  71. package/dist/cjs/utils/clickhouse.d.ts.map +0 -1
  72. package/dist/cjs/utils/clickhouse.js +0 -99
  73. package/dist/cjs/utils/clickhouse.js.map +0 -1
  74. package/dist/esm/adapters/clickhouse.d.ts +0 -48
  75. package/dist/esm/adapters/clickhouse.d.ts.map +0 -1
  76. package/dist/esm/adapters/clickhouse.js +0 -280
  77. package/dist/esm/adapters/clickhouse.js.map +0 -1
  78. package/dist/esm/adapters/introspection.spec.d.ts +0 -2
  79. package/dist/esm/adapters/introspection.spec.d.ts.map +0 -1
  80. package/dist/esm/adapters/introspection.spec.js +0 -190
  81. package/dist/esm/adapters/introspection.spec.js.map +0 -1
  82. package/dist/esm/adapters/postgres.d.ts +0 -46
  83. package/dist/esm/adapters/postgres.d.ts.map +0 -1
  84. package/dist/esm/adapters/postgres.js +0 -453
  85. package/dist/esm/adapters/postgres.js.map +0 -1
  86. package/dist/esm/adapters/postgres.spec.d.ts +0 -2
  87. package/dist/esm/adapters/postgres.spec.d.ts.map +0 -1
  88. package/dist/esm/adapters/postgres.spec.js +0 -35
  89. package/dist/esm/adapters/postgres.spec.js.map +0 -1
  90. package/dist/esm/adapters/types.d.ts +0 -38
  91. package/dist/esm/adapters/types.d.ts.map +0 -1
  92. package/dist/esm/adapters/types.js +0 -2
  93. package/dist/esm/adapters/types.js.map +0 -1
  94. package/dist/esm/anonymize.spec.d.ts +0 -2
  95. package/dist/esm/anonymize.spec.d.ts.map +0 -1
  96. package/dist/esm/anonymize.spec.js +0 -76
  97. package/dist/esm/anonymize.spec.js.map +0 -1
  98. package/dist/esm/clickhouseClient.spec.d.ts +0 -2
  99. package/dist/esm/clickhouseClient.spec.d.ts.map +0 -1
  100. package/dist/esm/clickhouseClient.spec.js +0 -281
  101. package/dist/esm/clickhouseClient.spec.js.map +0 -1
  102. package/dist/esm/connectors/base.d.ts +0 -14
  103. package/dist/esm/connectors/base.d.ts.map +0 -1
  104. package/dist/esm/connectors/base.js +0 -2
  105. package/dist/esm/connectors/base.js.map +0 -1
  106. package/dist/esm/connectors/clickhouse.d.ts +0 -35
  107. package/dist/esm/connectors/clickhouse.d.ts.map +0 -1
  108. package/dist/esm/connectors/clickhouse.js +0 -288
  109. package/dist/esm/connectors/clickhouse.js.map +0 -1
  110. package/dist/esm/index.d.ts +0 -498
  111. package/dist/esm/index.d.ts.map +0 -1
  112. package/dist/esm/index.js +0 -844
  113. package/dist/esm/index.js.map +0 -1
  114. package/dist/esm/index.test.d.ts +0 -2
  115. package/dist/esm/index.test.d.ts.map +0 -1
  116. package/dist/esm/index.test.js +0 -183
  117. package/dist/esm/index.test.js.map +0 -1
  118. package/dist/esm/introspectV3.d.ts +0 -45
  119. package/dist/esm/introspectV3.d.ts.map +0 -1
  120. package/dist/esm/introspectV3.js +0 -96
  121. package/dist/esm/introspectV3.js.map +0 -1
  122. package/dist/esm/multidb.spec.d.ts +0 -2
  123. package/dist/esm/multidb.spec.d.ts.map +0 -1
  124. package/dist/esm/multidb.spec.js +0 -74
  125. package/dist/esm/multidb.spec.js.map +0 -1
  126. package/dist/esm/schema/types.d.ts +0 -73
  127. package/dist/esm/schema/types.d.ts.map +0 -1
  128. package/dist/esm/schema/types.js +0 -2
  129. package/dist/esm/schema/types.js.map +0 -1
  130. package/dist/esm/tenant-isolation.spec.d.ts +0 -2
  131. package/dist/esm/tenant-isolation.spec.d.ts.map +0 -1
  132. package/dist/esm/tenant-isolation.spec.js +0 -418
  133. package/dist/esm/tenant-isolation.spec.js.map +0 -1
  134. package/dist/esm/utils/clickhouse.d.ts +0 -9
  135. package/dist/esm/utils/clickhouse.d.ts.map +0 -1
  136. package/dist/esm/utils/clickhouse.js +0 -92
  137. package/dist/esm/utils/clickhouse.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"anonymize.spec.js","sourceRoot":"","sources":["../../src/anonymize.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=clickhouseClient.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clickhouseClient.spec.d.ts","sourceRoot":"","sources":["../../src/clickhouseClient.spec.ts"],"names":[],"mappings":""}
@@ -1,281 +0,0 @@
1
- import duckdb from "duckdb";
2
- import { afterAll, beforeAll, describe, expect, it } from "vitest";
3
- import { QueryPanelSdkAPI } from "./index.js";
4
- // @ts-expect-error
5
- globalThis.fetch = async (input, _init) => {
6
- const url = String(input);
7
- if (url.endsWith("/v2/active-charts")) {
8
- return {
9
- ok: true,
10
- status: 200,
11
- text: async () => JSON.stringify({
12
- data: [
13
- {
14
- id: "ac1",
15
- chart_id: "1",
16
- order: 1,
17
- meta: null,
18
- organization_id: null,
19
- tenant_id: null,
20
- user_id: null,
21
- created_at: null,
22
- updated_at: null,
23
- },
24
- ],
25
- pagination: {
26
- page: 1,
27
- limit: 10,
28
- total: 1,
29
- totalPages: 1,
30
- hasNext: false,
31
- hasPrev: false,
32
- },
33
- }),
34
- };
35
- }
36
- if (/\/v2\/charts\/[^/]+$/.test(url)) {
37
- return {
38
- ok: true,
39
- status: 200,
40
- text: async () => JSON.stringify({
41
- id: "1",
42
- title: "Single",
43
- description: null,
44
- sql: "SELECT id, value FROM demo ORDER BY id",
45
- vega_lite_spec: { mark: "point" },
46
- query_id: null,
47
- organization_id: null,
48
- tenant_id: null,
49
- user_id: null,
50
- created_at: null,
51
- updated_at: null,
52
- }),
53
- };
54
- }
55
- if (url.endsWith("/v2/charts")) {
56
- return {
57
- ok: true,
58
- status: 200,
59
- text: async () => JSON.stringify({
60
- data: [
61
- {
62
- id: "1",
63
- title: "Demo",
64
- description: null,
65
- sql: "SELECT id, value FROM demo ORDER BY id",
66
- vega_lite_spec: { mark: "bar" },
67
- query_id: null,
68
- organization_id: null,
69
- tenant_id: null,
70
- user_id: null,
71
- created_at: null,
72
- updated_at: null,
73
- },
74
- ],
75
- pagination: {
76
- page: 1,
77
- limit: 10,
78
- total: 1,
79
- totalPages: 1,
80
- hasNext: false,
81
- hasPrev: false,
82
- },
83
- }),
84
- };
85
- }
86
- if (url.endsWith("/v2/generate-sql")) {
87
- return {
88
- ok: true,
89
- status: 200,
90
- text: async () => JSON.stringify({
91
- sql: "SELECT id as x, value as y FROM demo ORDER BY id",
92
- rationale: "ok",
93
- context: [],
94
- }),
95
- };
96
- }
97
- if (url.endsWith("/v2/generate-chart")) {
98
- return {
99
- ok: true,
100
- status: 200,
101
- text: async () => JSON.stringify({ vegaLiteSpec: { mark: "line" }, notes: null }),
102
- };
103
- }
104
- if (/\/v2\/active-charts\/[^/]+$/.test(url)) {
105
- const id = url.split("/").pop();
106
- if (id === "ac1") {
107
- return {
108
- ok: true,
109
- status: 200,
110
- text: async () => JSON.stringify({
111
- id: "ac1",
112
- chart_id: "1",
113
- order: 1,
114
- meta: null,
115
- organization_id: null,
116
- tenant_id: null,
117
- user_id: null,
118
- created_at: null,
119
- updated_at: null,
120
- }),
121
- };
122
- }
123
- if (id === "ac2") {
124
- return {
125
- ok: true,
126
- status: 200,
127
- text: async () => JSON.stringify({
128
- id: "ac2",
129
- chart_id: "1",
130
- order: 1,
131
- meta: null,
132
- organization_id: null,
133
- tenant_id: null,
134
- user_id: null,
135
- created_at: null,
136
- updated_at: null,
137
- chart: {
138
- id: "1",
139
- title: "Nested",
140
- description: null,
141
- sql: "SELECT id, value FROM demo ORDER BY id",
142
- vega_lite_spec: { mark: "square" },
143
- query_id: null,
144
- organization_id: null,
145
- tenant_id: null,
146
- user_id: null,
147
- created_at: null,
148
- updated_at: null,
149
- },
150
- }),
151
- };
152
- }
153
- }
154
- // other endpoints not used in this test
155
- return { ok: false, status: 404, text: async () => "" };
156
- };
157
- // Helper to create an in-memory DuckDB connection and run queries
158
- function createDuckDb() {
159
- const db = new duckdb.Database(":memory:");
160
- const conn = db.connect();
161
- return { db, conn };
162
- }
163
- describe("attachClickhouseClient", () => {
164
- let conn;
165
- let clickhouseClientFn;
166
- beforeAll(async () => {
167
- ({ conn } = createDuckDb());
168
- clickhouseClientFn = async ({ query }) => {
169
- const rows = await new Promise((resolve, reject) => {
170
- conn.all(query, (err, result) => {
171
- if (err)
172
- return reject(err);
173
- resolve(result);
174
- });
175
- });
176
- const result = {
177
- json: async () => rows,
178
- };
179
- return result;
180
- };
181
- await new Promise((resolve, reject) => {
182
- conn.run("CREATE TABLE demo(id INTEGER, value VARCHAR)", (err) => {
183
- if (err)
184
- return reject(err);
185
- conn.run("INSERT INTO demo VALUES (1, 'a'), (2, 'b')", (err2) => {
186
- if (err2)
187
- return reject(err2);
188
- resolve();
189
- });
190
- });
191
- });
192
- });
193
- afterAll(() => {
194
- try {
195
- conn.close();
196
- }
197
- catch { }
198
- });
199
- it("returns values from runDataOnCLient when listing charts", async () => {
200
- const sdk = new QueryPanelSdkAPI("http://api", "test-token");
201
- sdk.attachClickhouseClient(clickhouseClientFn);
202
- const result = await sdk.listCharts({ tenantId: "t1" });
203
- expect(result.data.length).toBe(1);
204
- const chart = result.data[0];
205
- expect(chart.vega_lite_spec?.data?.values).toEqual([
206
- { id: 1, value: "a" },
207
- { id: 2, value: "b" },
208
- ]);
209
- });
210
- it("hydrates data when getting a single chart", async () => {
211
- const sdk = new QueryPanelSdkAPI("http://api", "test-token");
212
- sdk.attachClickhouseClient(clickhouseClientFn);
213
- const chart = await sdk.getChart("1", { tenantId: "t1" });
214
- expect(chart.id).toBe("1");
215
- expect(chart.vega_lite_spec?.data?.values).toEqual([
216
- { id: 1, value: "a" },
217
- { id: 2, value: "b" },
218
- ]);
219
- });
220
- it("lists active charts without data when withdata=false", async () => {
221
- const sdk = new QueryPanelSdkAPI("http://api", "test-token");
222
- sdk.attachClickhouseClient(clickhouseClientFn);
223
- const result = await sdk.listActiveCharts({
224
- tenantId: "t1",
225
- withdata: false,
226
- });
227
- expect(result.data.length).toBe(1);
228
- const firstNoData = result.data[0];
229
- if (!firstNoData)
230
- throw new Error("missing active chart");
231
- expect(firstNoData.chart).toBeUndefined();
232
- });
233
- it("lists active charts with data when withdata=true", async () => {
234
- const sdk = new QueryPanelSdkAPI("http://api", "test-token");
235
- sdk.attachClickhouseClient(clickhouseClientFn);
236
- const result = await sdk.listActiveCharts({
237
- tenantId: "t1",
238
- withdata: true,
239
- });
240
- expect(result.data.length).toBe(1);
241
- const firstWithData = result.data[0];
242
- if (!firstWithData || !firstWithData.chart)
243
- throw new Error("missing hydrated active chart");
244
- expect(Boolean(firstWithData.chart)).toBe(true);
245
- expect(firstWithData.chart.vega_lite_spec?.data?.values).toEqual([
246
- { id: 1, value: "a" },
247
- { id: 2, value: "b" },
248
- ]);
249
- });
250
- it("gets active chart without nested chart unchanged", async () => {
251
- const sdk = new QueryPanelSdkAPI("http://api", "test-token");
252
- sdk.attachClickhouseClient(clickhouseClientFn);
253
- const ac = await sdk.getActiveChart("ac1", { tenantId: "t1" });
254
- expect(ac.id).toBe("ac1");
255
- expect("chart" in ac ? ac.chart : undefined).toBeUndefined();
256
- });
257
- it("gets active chart with nested chart hydrated", async () => {
258
- const sdk = new QueryPanelSdkAPI("http://api", "test-token");
259
- sdk.attachClickhouseClient(clickhouseClientFn);
260
- const ac = await sdk.getActiveChart("ac2", { tenantId: "t1" });
261
- if (!ac.chart)
262
- throw new Error("expected nested chart");
263
- expect(ac.chart.vega_lite_spec?.data?.values).toEqual([
264
- { id: 1, value: "a" },
265
- { id: 2, value: "b" },
266
- ]);
267
- });
268
- it("works with ask() by executing SQL against DuckDB", async () => {
269
- const sdk = new QueryPanelSdkAPI("http://api", "test-token");
270
- sdk.attachClickhouseClient(clickhouseClientFn);
271
- const result = await sdk.ask("q", { tenantId: "t1" });
272
- expect(result.sql).toContain("SELECT id as x, value as y");
273
- expect(result.fields).toEqual(["x", "y"]);
274
- expect(result.rows).toEqual([
275
- { x: 1, y: "a" },
276
- { x: 2, y: "b" },
277
- ]);
278
- expect(result.chart.vegaLiteSpec).toMatchObject({ mark: "line" });
279
- });
280
- });
281
- //# sourceMappingURL=clickhouseClient.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clickhouseClient.spec.js","sourceRoot":"","sources":["../../src/clickhouseClient.spec.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type { DataFormat } from '@clickhouse/client';
2
- import type { IntrospectOptions, SchemaIntrospection } from '../schema/types.js';
3
- export interface QueryOptions {
4
- params?: Record<string, unknown>;
5
- format?: DataFormat;
6
- settings?: Record<string, unknown>;
7
- }
8
- export interface DatabaseConnector {
9
- connect(): Promise<void>;
10
- query<T = Record<string, unknown>>(sql: string, options?: QueryOptions): Promise<T[]>;
11
- introspect(options?: IntrospectOptions): Promise<SchemaIntrospection>;
12
- close(): Promise<void>;
13
- }
14
- //# sourceMappingURL=base.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/connectors/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACtF,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=base.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/connectors/base.ts"],"names":[],"mappings":""}
@@ -1,35 +0,0 @@
1
- import { type ClickHouseClient, type ClickHouseClientConfigOptions } from "@clickhouse/client";
2
- import type { IntrospectOptions, SchemaIntrospection } from "../schema/types.js";
3
- import type { DatabaseConnector, QueryOptions } from "./base.js";
4
- export interface ClickHouseConnectorConfig {
5
- /** Fully qualified ClickHouse URL. Overrides host/port/protocol when provided. */
6
- url?: string;
7
- host?: string;
8
- port?: number;
9
- protocol?: "http" | "https";
10
- database: string;
11
- username?: string;
12
- password?: string;
13
- application?: string;
14
- clickhouseSettings?: Record<string, unknown>;
15
- clientOptions?: Partial<ClickHouseClientConfigOptions>;
16
- }
17
- export interface ClickHouseConnectorOverrides {
18
- client?: ClickHouseClient;
19
- clientFactory?: () => ClickHouseClient;
20
- }
21
- export declare class ClickHouseConnector implements DatabaseConnector {
22
- private readonly config;
23
- private readonly overrides;
24
- private client;
25
- private readonly defaultFormat;
26
- constructor(config: ClickHouseConnectorConfig, overrides?: ClickHouseConnectorOverrides);
27
- connect(): Promise<void>;
28
- query<T = Record<string, unknown>>(sql: string, options?: QueryOptions): Promise<T[]>;
29
- introspect(options?: IntrospectOptions): Promise<SchemaIntrospection>;
30
- close(): Promise<void>;
31
- private ensureClient;
32
- private safePing;
33
- private buildClientConfig;
34
- }
35
- //# sourceMappingURL=clickhouse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clickhouse.d.ts","sourceRoot":"","sources":["../../../src/connectors/clickhouse.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,6BAA6B,EAIlC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAEX,iBAAiB,EACjB,mBAAmB,EAEnB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,WAAW,yBAAyB;IACzC,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,aAAa,CAAC,EAAE,OAAO,CAAC,6BAA6B,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,4BAA4B;IAC5C,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,gBAAgB,CAAC;CACvC;AA4BD,qBAAa,mBAAoB,YAAW,iBAAiB;IAO3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAEC;gBAGb,MAAM,EAAE,yBAAyB,EACjC,SAAS,GAAE,4BAAiC;IAKxD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,CAAC,EAAE,CAAC;IAmCT,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyGrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAMd,YAAY;YAcZ,QAAQ;IAYtB,OAAO,CAAC,iBAAiB;CAkCzB"}
@@ -1,288 +0,0 @@
1
- import { createClient, } from "@clickhouse/client";
2
- import { extractFixedStringLength, extractPrecisionScale, isNullableType, parseKeyExpression, unwrapTypeModifiers, } from "../utils/clickhouse.js";
3
- export class ClickHouseConnector {
4
- constructor(config, overrides = {}) {
5
- this.config = config;
6
- this.overrides = overrides;
7
- this.defaultFormat = "JSONEachRow";
8
- this.client = overrides.client ?? null;
9
- }
10
- async connect() {
11
- await this.ensureClient();
12
- }
13
- async query(sql, options) {
14
- const client = await this.ensureClient();
15
- const params = {
16
- query: sql,
17
- };
18
- const format = options?.format ?? this.defaultFormat;
19
- if (format) {
20
- Object.assign(params, { format });
21
- }
22
- if (options?.params) {
23
- Object.assign(params, { query_params: options.params });
24
- }
25
- if (options?.settings) {
26
- Object.assign(params, {
27
- clickhouse_settings: options.settings,
28
- });
29
- }
30
- const result = await client.query(params);
31
- const payload = await result.json();
32
- if (Array.isArray(payload)) {
33
- return payload;
34
- }
35
- if (payload && typeof payload === "object") {
36
- const maybeData = payload.data;
37
- if (Array.isArray(maybeData)) {
38
- return maybeData;
39
- }
40
- }
41
- return [];
42
- }
43
- async introspect(options) {
44
- const allowTables = normalizeTableFilter(options?.tables);
45
- const hasFilter = allowTables.length > 0;
46
- const queryParams = {
47
- db: this.config.database,
48
- };
49
- if (hasFilter) {
50
- queryParams.tables = allowTables;
51
- }
52
- const filterClause = hasFilter ? " AND name IN {tables:Array(String)}" : "";
53
- const tables = await this.query(`SELECT name, engine, comment, total_rows, total_bytes, is_view, primary_key, sorting_key
54
- FROM system.tables
55
- WHERE database = {db:String}${filterClause}
56
- ORDER BY name`, { params: queryParams });
57
- const columnFilterClause = hasFilter
58
- ? " AND table IN {tables:Array(String)}"
59
- : "";
60
- const columns = await this.query(`SELECT table, name, type, position, default_kind, default_expression, comment,
61
- codec_expression, ttl_expression, is_in_primary_key,
62
- data_compressed_bytes, data_uncompressed_bytes
63
- FROM system.columns
64
- WHERE database = {db:String}${columnFilterClause}
65
- ORDER BY table, position`, { params: queryParams });
66
- const columnsByTable = new Map();
67
- for (const rawColumn of columns) {
68
- const list = columnsByTable.get(rawColumn.table) ?? [];
69
- list.push(transformColumnRow(rawColumn));
70
- columnsByTable.set(rawColumn.table, list);
71
- }
72
- const tableSchemas = tables.map((table) => {
73
- const tableColumns = columnsByTable.get(table.name) ?? [];
74
- const primaryKeyColumns = parseKeyExpression(table.primary_key);
75
- const totalRows = toNumber(table.total_rows);
76
- const totalBytes = toNumber(table.total_bytes);
77
- for (const column of tableColumns) {
78
- column.isPrimaryKey =
79
- column.isPrimaryKey || primaryKeyColumns.includes(column.name);
80
- }
81
- const indexes = primaryKeyColumns.length
82
- ? [
83
- {
84
- name: "primary_key",
85
- columns: primaryKeyColumns,
86
- unique: true,
87
- type: "PRIMARY KEY",
88
- ...(table.primary_key ? { definition: table.primary_key } : {}),
89
- },
90
- ]
91
- : [];
92
- const constraints = primaryKeyColumns.length
93
- ? [
94
- {
95
- name: "primary_key",
96
- type: "PRIMARY KEY",
97
- columns: primaryKeyColumns,
98
- },
99
- ]
100
- : [];
101
- const base = {
102
- name: table.name,
103
- schema: this.config.database,
104
- type: asTableType(table.is_view),
105
- engine: table.engine,
106
- columns: tableColumns,
107
- indexes,
108
- constraints,
109
- };
110
- const comment = sanitize(table.comment);
111
- if (comment !== undefined) {
112
- base.comment = comment;
113
- }
114
- const statistics = buildTableStatistics(totalRows, totalBytes);
115
- if (statistics) {
116
- base.statistics = statistics;
117
- }
118
- return base;
119
- });
120
- return {
121
- db: {
122
- kind: "clickhouse",
123
- name: this.config.database,
124
- },
125
- tables: tableSchemas,
126
- introspectedAt: new Date().toISOString(),
127
- };
128
- }
129
- async close() {
130
- if (!this.client)
131
- return;
132
- await this.client.close();
133
- this.client = null;
134
- }
135
- async ensureClient() {
136
- if (this.client) {
137
- return this.client;
138
- }
139
- this.client =
140
- this.overrides?.clientFactory?.() ??
141
- createClient(this.buildClientConfig());
142
- const pingResult = await this.safePing(this.client);
143
- if (pingResult && "success" in pingResult && pingResult.success === false) {
144
- throw pingResult.error ?? new Error("ClickHouse ping failed");
145
- }
146
- return this.client;
147
- }
148
- async safePing(client) {
149
- try {
150
- return await client.ping();
151
- }
152
- catch (error) {
153
- await client.close();
154
- this.client = null;
155
- throw error;
156
- }
157
- }
158
- buildClientConfig() {
159
- const merged = {
160
- ...(this.config.clientOptions ?? {}),
161
- };
162
- if (this.config.url) {
163
- merged.url = this.config.url;
164
- }
165
- else if (this.config.host) {
166
- const protocol = this.config.protocol ?? "https";
167
- const port = this.config.port ?? (protocol === "https" ? 8443 : 8123);
168
- merged.url = `${protocol}://${this.config.host}:${port}`;
169
- }
170
- merged.database = this.config.database;
171
- if (this.config.username) {
172
- merged.username = this.config.username;
173
- }
174
- if (this.config.password) {
175
- merged.password = this.config.password;
176
- }
177
- if (this.config.application) {
178
- merged.application = this.config.application;
179
- }
180
- if (this.config.clickhouseSettings) {
181
- merged.clickhouse_settings = {
182
- ...(this.config.clientOptions?.clickhouse_settings ?? {}),
183
- ...this.config.clickhouseSettings,
184
- };
185
- }
186
- return merged;
187
- }
188
- }
189
- function normalizeTableFilter(tables) {
190
- if (!tables?.length)
191
- return [];
192
- const seen = new Set();
193
- const normalized = [];
194
- for (const table of tables) {
195
- if (!table)
196
- continue;
197
- const trimmed = table.trim();
198
- if (!trimmed)
199
- continue;
200
- const parts = trimmed.split(".");
201
- const tableName = parts[parts.length - 1];
202
- if (!tableName || seen.has(tableName))
203
- continue;
204
- seen.add(tableName);
205
- normalized.push(tableName);
206
- }
207
- return normalized;
208
- }
209
- function transformColumnRow(row) {
210
- const nullable = isNullableType(row.type);
211
- const unwrappedType = unwrapTypeModifiers(row.type);
212
- const { precision, scale } = extractPrecisionScale(row.type);
213
- const maxLength = extractFixedStringLength(row.type);
214
- const compressedBytes = toNumber(row.data_compressed_bytes);
215
- const uncompressedBytes = toNumber(row.data_uncompressed_bytes);
216
- const column = {
217
- name: row.name,
218
- type: unwrappedType,
219
- nullable,
220
- isPrimaryKey: Boolean(toNumber(row.is_in_primary_key)),
221
- isForeignKey: false,
222
- };
223
- column.rawType = row.type;
224
- const defaultKind = sanitize(row.default_kind);
225
- if (defaultKind !== undefined)
226
- column.defaultKind = defaultKind;
227
- const defaultExpression = sanitize(row.default_expression);
228
- if (defaultExpression !== undefined)
229
- column.defaultExpression = defaultExpression;
230
- const comment = sanitize(row.comment);
231
- if (comment !== undefined)
232
- column.comment = comment;
233
- const codec = sanitize(row.codec_expression);
234
- if (codec !== undefined)
235
- column.codec = codec;
236
- const ttlExpression = sanitize(row.ttl_expression);
237
- if (ttlExpression !== undefined)
238
- column.ttlExpression = ttlExpression;
239
- if (maxLength !== undefined)
240
- column.maxLength = maxLength;
241
- if (precision !== undefined)
242
- column.precision = precision;
243
- if (scale !== undefined)
244
- column.scale = scale;
245
- if (compressedBytes !== undefined || uncompressedBytes !== undefined) {
246
- column.statistics = {};
247
- if (compressedBytes !== undefined)
248
- column.statistics.compressedBytes = compressedBytes;
249
- if (uncompressedBytes !== undefined)
250
- column.statistics.uncompressedBytes = uncompressedBytes;
251
- }
252
- return column;
253
- }
254
- function toNumber(value) {
255
- if (value === null || value === undefined)
256
- return undefined;
257
- if (typeof value === "number")
258
- return value;
259
- const parsed = Number.parseFloat(String(value));
260
- return Number.isNaN(parsed) ? undefined : parsed;
261
- }
262
- function sanitize(value) {
263
- if (value === null || value === undefined)
264
- return undefined;
265
- const trimmed = String(value).trim();
266
- return trimmed.length ? trimmed : undefined;
267
- }
268
- function asTableType(isView) {
269
- if (typeof isView === "number") {
270
- return isView > 0 ? "view" : "table";
271
- }
272
- if (typeof isView === "string") {
273
- const normalized = isView.toLowerCase();
274
- return normalized === "1" || normalized === "true" ? "view" : "table";
275
- }
276
- return "table";
277
- }
278
- function buildTableStatistics(totalRows, totalBytes) {
279
- if (totalRows === undefined && totalBytes === undefined)
280
- return undefined;
281
- const stats = {};
282
- if (totalRows !== undefined)
283
- stats.totalRows = totalRows;
284
- if (totalBytes !== undefined)
285
- stats.totalBytes = totalBytes;
286
- return stats;
287
- }
288
- //# sourceMappingURL=clickhouse.js.map