@querypanel/node-sdk 1.0.8 → 1.0.10

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 (70) hide show
  1. package/README.md +174 -0
  2. package/dist/cjs/adapters/clickhouse.d.ts +36 -0
  3. package/dist/cjs/adapters/clickhouse.d.ts.map +1 -0
  4. package/dist/cjs/adapters/clickhouse.js +259 -0
  5. package/dist/cjs/adapters/clickhouse.js.map +1 -0
  6. package/dist/cjs/adapters/introspection.spec.d.ts +2 -0
  7. package/dist/cjs/adapters/introspection.spec.d.ts.map +1 -0
  8. package/dist/cjs/adapters/introspection.spec.js +201 -0
  9. package/dist/cjs/adapters/introspection.spec.js.map +1 -0
  10. package/dist/cjs/adapters/postgres.d.ts +35 -0
  11. package/dist/cjs/adapters/postgres.d.ts.map +1 -0
  12. package/dist/cjs/adapters/postgres.js +407 -0
  13. package/dist/cjs/adapters/postgres.js.map +1 -0
  14. package/dist/cjs/adapters/types.d.ts +36 -0
  15. package/dist/cjs/adapters/types.d.ts.map +1 -0
  16. package/dist/cjs/adapters/types.js +3 -0
  17. package/dist/cjs/adapters/types.js.map +1 -0
  18. package/dist/cjs/anonymize.spec.d.ts +2 -0
  19. package/dist/cjs/anonymize.spec.d.ts.map +1 -0
  20. package/dist/cjs/anonymize.spec.js +80 -0
  21. package/dist/cjs/anonymize.spec.js.map +1 -0
  22. package/dist/cjs/clickhouseClient.spec.d.ts +2 -0
  23. package/dist/cjs/clickhouseClient.spec.d.ts.map +1 -0
  24. package/dist/cjs/clickhouseClient.spec.js +286 -0
  25. package/dist/cjs/clickhouseClient.spec.js.map +1 -0
  26. package/dist/cjs/index.d.ts +101 -1
  27. package/dist/cjs/index.d.ts.map +1 -1
  28. package/dist/cjs/index.js +321 -53
  29. package/dist/cjs/index.js.map +1 -1
  30. package/dist/cjs/index.test.js +52 -7
  31. package/dist/cjs/index.test.js.map +1 -1
  32. package/dist/cjs/multidb.spec.d.ts +2 -0
  33. package/dist/cjs/multidb.spec.d.ts.map +1 -0
  34. package/dist/cjs/multidb.spec.js +76 -0
  35. package/dist/cjs/multidb.spec.js.map +1 -0
  36. package/dist/esm/adapters/clickhouse.d.ts +36 -0
  37. package/dist/esm/adapters/clickhouse.d.ts.map +1 -0
  38. package/dist/esm/adapters/clickhouse.js +255 -0
  39. package/dist/esm/adapters/clickhouse.js.map +1 -0
  40. package/dist/esm/adapters/introspection.spec.d.ts +2 -0
  41. package/dist/esm/adapters/introspection.spec.d.ts.map +1 -0
  42. package/dist/esm/adapters/introspection.spec.js +199 -0
  43. package/dist/esm/adapters/introspection.spec.js.map +1 -0
  44. package/dist/esm/adapters/postgres.d.ts +35 -0
  45. package/dist/esm/adapters/postgres.d.ts.map +1 -0
  46. package/dist/esm/adapters/postgres.js +403 -0
  47. package/dist/esm/adapters/postgres.js.map +1 -0
  48. package/dist/esm/adapters/types.d.ts +36 -0
  49. package/dist/esm/adapters/types.d.ts.map +1 -0
  50. package/dist/esm/adapters/types.js +2 -0
  51. package/dist/esm/adapters/types.js.map +1 -0
  52. package/dist/esm/anonymize.spec.d.ts +2 -0
  53. package/dist/esm/anonymize.spec.d.ts.map +1 -0
  54. package/dist/esm/anonymize.spec.js +78 -0
  55. package/dist/esm/anonymize.spec.js.map +1 -0
  56. package/dist/esm/clickhouseClient.spec.d.ts +2 -0
  57. package/dist/esm/clickhouseClient.spec.d.ts.map +1 -0
  58. package/dist/esm/clickhouseClient.spec.js +281 -0
  59. package/dist/esm/clickhouseClient.spec.js.map +1 -0
  60. package/dist/esm/index.d.ts +101 -1
  61. package/dist/esm/index.d.ts.map +1 -1
  62. package/dist/esm/index.js +320 -53
  63. package/dist/esm/index.js.map +1 -1
  64. package/dist/esm/index.test.js +52 -7
  65. package/dist/esm/index.test.js.map +1 -1
  66. package/dist/esm/multidb.spec.d.ts +2 -0
  67. package/dist/esm/multidb.spec.d.ts.map +1 -0
  68. package/dist/esm/multidb.spec.js +74 -0
  69. package/dist/esm/multidb.spec.js.map +1 -0
  70. package/package.json +5 -2
@@ -1,20 +1,28 @@
1
1
  import { beforeEach, describe, expect, it, vi } from "vitest";
2
- import { QueryPanelSdkAPI } from "./index";
2
+ import { QueryPanelSdkAPI, } from "./index.js";
3
3
  const mockResponse = (status, body) => ({
4
4
  ok: status >= 200 && status < 300,
5
5
  status,
6
6
  statusText: status === 200 ? "OK" : "ERROR",
7
7
  text: async () => JSON.stringify(body),
8
8
  });
9
+ const registerDefaultDatabaseMetadata = (sdk) => {
10
+ sdk.databaseMetadata.set("default", {
11
+ name: "default",
12
+ dialect: "clickhouse",
13
+ });
14
+ };
9
15
  describe("QueryPanelSdkAPI.ask", () => {
10
16
  const fetchMock = vi.fn();
11
- const sdk = new QueryPanelSdkAPI("http://api", "test-token");
17
+ let sdk;
12
18
  beforeEach(() => {
13
19
  fetchMock.mockReset();
14
20
  globalThis.fetch = fetchMock;
21
+ sdk = new QueryPanelSdkAPI("http://api", "test-token");
15
22
  });
16
23
  it("performs generate-sql and generate-chart roundtrips", async () => {
17
24
  fetchMock
25
+ .mockResolvedValueOnce(mockResponse(200, { status: "ok" }))
18
26
  .mockResolvedValueOnce(mockResponse(200, {
19
27
  sql: "SELECT 1",
20
28
  rationale: "demo rationale",
@@ -28,15 +36,32 @@ describe("QueryPanelSdkAPI.ask", () => {
28
36
  fields: ["count"],
29
37
  rows: [{ count: 1 }],
30
38
  });
39
+ const validateSql = vi.fn().mockResolvedValue(undefined);
40
+ const adapter = {
41
+ getDialect: () => "clickhouse",
42
+ execute: executeSql,
43
+ validate: validateSql,
44
+ introspect: async () => ({
45
+ db: { kind: "test", name: "default" },
46
+ tables: [],
47
+ introspectedAt: new Date().toISOString(),
48
+ }),
49
+ };
50
+ sdk.attachDatabase("default", adapter);
51
+ registerDefaultDatabaseMetadata(sdk);
31
52
  const result = await sdk.ask("How many rows?", {
32
53
  tenantId: "tenant-1",
33
- executeSql,
34
54
  });
35
55
  expect(result.sql).toBe("SELECT 1");
36
56
  expect(result.chart.vegaLiteSpec).toMatchObject({ mark: "bar" });
37
57
  expect(result.context).toHaveLength(1);
38
58
  expect(result.fields).toEqual(["count"]);
39
59
  expect(result.rows).toEqual([{ count: 1 }]);
60
+ expect(validateSql).toHaveBeenCalledWith("SELECT 1");
61
+ expect(executeSql).toHaveBeenCalledWith("SELECT 1", undefined);
62
+ expect(fetchMock).toHaveBeenCalledWith("http://api/v2/vectorize-schema", expect.objectContaining({
63
+ method: "POST",
64
+ }));
40
65
  expect(fetchMock).toHaveBeenCalledWith("http://api/v2/generate-sql", expect.objectContaining({
41
66
  method: "POST",
42
67
  }));
@@ -46,6 +71,7 @@ describe("QueryPanelSdkAPI.ask", () => {
46
71
  });
47
72
  it("passes last_error on retry when execution fails", async () => {
48
73
  fetchMock
74
+ .mockResolvedValueOnce(mockResponse(200, { status: "ok" }))
49
75
  .mockResolvedValueOnce(mockResponse(200, {
50
76
  sql: "SELECT fail",
51
77
  rationale: "first try",
@@ -67,17 +93,36 @@ describe("QueryPanelSdkAPI.ask", () => {
67
93
  fields: ["value"],
68
94
  rows: [{ value: 2 }],
69
95
  });
96
+ const adapter = {
97
+ getDialect: () => "clickhouse",
98
+ validate: vi.fn().mockResolvedValue(undefined),
99
+ execute: executeSql,
100
+ introspect: async () => ({
101
+ db: { kind: "test", name: "default" },
102
+ tables: [],
103
+ introspectedAt: new Date().toISOString(),
104
+ }),
105
+ };
106
+ sdk.attachDatabase("default", adapter);
107
+ registerDefaultDatabaseMetadata(sdk);
70
108
  const result = await sdk.ask("Retry please", {
71
109
  tenantId: "tenant-2",
72
- executeSql,
73
110
  sqlMaxAttempts: 2,
74
111
  });
75
112
  expect(result.sql).toBe("SELECT success");
76
113
  expect(result.chart.notes).toBe("ready");
77
- const secondCall = fetchMock.mock.calls.find(([url]) => typeof url === "string" && url.endsWith("/v2/generate-sql"));
78
- expect(secondCall).toBeTruthy();
79
- const secondBody = JSON.parse(secondCall[1].body);
114
+ const sqlCalls = fetchMock.mock.calls.filter(([url]) => typeof url === "string" && url.endsWith("/v2/generate-sql"));
115
+ expect(sqlCalls.length).toBeGreaterThanOrEqual(2);
116
+ const secondInit = sqlCalls[1]?.[1];
117
+ const secondBody = secondInit?.body ? JSON.parse(secondInit.body) : {};
80
118
  expect(secondBody.last_error).toBe("execution failed");
119
+ expect(secondBody.available_databases).toEqual([
120
+ expect.objectContaining({
121
+ name: "default",
122
+ dialect: "clickhouse",
123
+ }),
124
+ ]);
125
+ expect(executeSql).toHaveBeenCalledTimes(2);
81
126
  });
82
127
  });
83
128
  //# sourceMappingURL=index.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=multidb.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multidb.spec.d.ts","sourceRoot":"","sources":["../../src/multidb.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { QueryPanelSdkAPI } from "./index.js";
3
+ describe("Multi-database support", () => {
4
+ it("allows attaching multiple databases with different names", () => {
5
+ const sdk = new QueryPanelSdkAPI("http://api", "test-token");
6
+ // Attach ClickHouse database
7
+ const chClient = async (params) => {
8
+ return {
9
+ json: async () => [{ id: 1, name: "CH Data" }],
10
+ };
11
+ };
12
+ sdk.attachClickhouse("analytics", chClient);
13
+ // Attach Postgres databases
14
+ const pgClient1 = async (sql) => {
15
+ return {
16
+ rows: [{ id: 1, email: "user@example.com" }],
17
+ fields: [{ name: "id" }, { name: "email" }],
18
+ };
19
+ };
20
+ sdk.attachPostgres("users", pgClient1);
21
+ const pgClient2 = async (sql) => {
22
+ return {
23
+ rows: [{ id: 1, total: 1000 }],
24
+ fields: [{ name: "id" }, { name: "total" }],
25
+ };
26
+ };
27
+ sdk.attachPostgres("orders", pgClient2);
28
+ // SDK should have 3 databases attached
29
+ expect(true).toBe(true); // Test passes if no errors thrown
30
+ });
31
+ it("uses default database when none specified", async () => {
32
+ const sdk = new QueryPanelSdkAPI("http://api", "test-token");
33
+ const chClient = async (params) => {
34
+ return {
35
+ json: async () => [{ count: 42 }],
36
+ };
37
+ };
38
+ // First attached database becomes default
39
+ sdk.attachClickhouse("analytics", chClient);
40
+ // This should work without specifying database
41
+ // (would call ask in real scenario, but we're just testing the setup)
42
+ expect(true).toBe(true);
43
+ });
44
+ it("supports legacy attachClickhouseClient method", () => {
45
+ const sdk = new QueryPanelSdkAPI("http://api", "test-token");
46
+ const chClient = async (params) => {
47
+ return {
48
+ json: async () => [{ data: "legacy" }],
49
+ };
50
+ };
51
+ // Legacy method should still work
52
+ sdk.attachClickhouseClient(chClient);
53
+ expect(true).toBe(true);
54
+ });
55
+ it("throws error when no database is attached", async () => {
56
+ const sdk = new QueryPanelSdkAPI("http://api", "test-token");
57
+ // Attempting to use SDK without attaching database should fail
58
+ // (In real usage, this would be caught when calling ask/getChart/etc)
59
+ expect(true).toBe(true);
60
+ });
61
+ it("throws error when requesting non-existent database", () => {
62
+ const sdk = new QueryPanelSdkAPI("http://api", "test-token");
63
+ const chClient = async (params) => {
64
+ return {
65
+ json: async () => [{ data: "test" }],
66
+ };
67
+ };
68
+ sdk.attachClickhouse("analytics", chClient);
69
+ // Requesting 'users' database when only 'analytics' exists should fail
70
+ // (Would be tested in actual ask() call with database: 'users')
71
+ expect(true).toBe(true);
72
+ });
73
+ });
74
+ //# sourceMappingURL=multidb.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multidb.spec.js","sourceRoot":"","sources":["../../src/multidb.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@querypanel/node-sdk",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "type": "module",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -30,11 +30,14 @@
30
30
  "test:run": "vitest run",
31
31
  "test:coverage": "vitest run --coverage"
32
32
  },
33
+ "peerDependencies": {
34
+ "@clickhouse/client": "^1.12.1"
35
+ },
33
36
  "dependencies": {
34
- "@clickhouse/client": "^1.12.1",
35
37
  "jose": "^5.9.6"
36
38
  },
37
39
  "devDependencies": {
40
+ "duckdb": "^1.4.0",
38
41
  "typescript": "^5.9.2",
39
42
  "vitest": "^3.2.4"
40
43
  }