@querypanel/node-sdk 1.0.25 → 1.0.26

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 (145) hide show
  1. package/README.md +23 -0
  2. package/dist/cjs/__tests__/ingest.test.d.ts +5 -0
  3. package/dist/cjs/__tests__/ingest.test.d.ts.map +1 -0
  4. package/dist/cjs/__tests__/ingest.test.js +95 -0
  5. package/dist/cjs/__tests__/ingest.test.js.map +1 -0
  6. package/dist/cjs/adapters/clickhouse.d.ts +48 -0
  7. package/dist/cjs/adapters/clickhouse.d.ts.map +1 -0
  8. package/dist/cjs/adapters/clickhouse.js +284 -0
  9. package/dist/cjs/adapters/clickhouse.js.map +1 -0
  10. package/dist/cjs/adapters/introspection.spec.d.ts +2 -0
  11. package/dist/cjs/adapters/introspection.spec.d.ts.map +1 -0
  12. package/dist/cjs/adapters/introspection.spec.js +192 -0
  13. package/dist/cjs/adapters/introspection.spec.js.map +1 -0
  14. package/dist/cjs/adapters/postgres.d.ts +46 -0
  15. package/dist/cjs/adapters/postgres.d.ts.map +1 -0
  16. package/dist/cjs/adapters/postgres.js +457 -0
  17. package/dist/cjs/adapters/postgres.js.map +1 -0
  18. package/dist/cjs/adapters/postgres.spec.d.ts +2 -0
  19. package/dist/cjs/adapters/postgres.spec.d.ts.map +1 -0
  20. package/dist/cjs/adapters/postgres.spec.js +37 -0
  21. package/dist/cjs/adapters/postgres.spec.js.map +1 -0
  22. package/dist/cjs/adapters/types.d.ts +38 -0
  23. package/dist/cjs/adapters/types.d.ts.map +1 -0
  24. package/dist/cjs/adapters/types.js +3 -0
  25. package/dist/cjs/adapters/types.js.map +1 -0
  26. package/dist/cjs/anonymize.spec.d.ts +2 -0
  27. package/dist/cjs/anonymize.spec.d.ts.map +1 -0
  28. package/dist/cjs/anonymize.spec.js +78 -0
  29. package/dist/cjs/anonymize.spec.js.map +1 -0
  30. package/dist/cjs/clickhouseClient.spec.d.ts +2 -0
  31. package/dist/cjs/clickhouseClient.spec.d.ts.map +1 -0
  32. package/dist/cjs/clickhouseClient.spec.js +286 -0
  33. package/dist/cjs/clickhouseClient.spec.js.map +1 -0
  34. package/dist/cjs/connectors/__tests__/clickhouse.introspect.test.d.ts +2 -0
  35. package/dist/cjs/connectors/__tests__/clickhouse.introspect.test.d.ts.map +1 -0
  36. package/dist/cjs/connectors/__tests__/clickhouse.introspect.test.js +119 -0
  37. package/dist/cjs/connectors/__tests__/clickhouse.introspect.test.js.map +1 -0
  38. package/dist/cjs/connectors/base.d.ts +13 -0
  39. package/dist/cjs/connectors/base.d.ts.map +1 -0
  40. package/dist/cjs/connectors/base.js +3 -0
  41. package/dist/cjs/connectors/base.js.map +1 -0
  42. package/dist/cjs/connectors/clickhouse.d.ts +53 -0
  43. package/dist/cjs/connectors/clickhouse.d.ts.map +1 -0
  44. package/dist/cjs/connectors/clickhouse.js +270 -0
  45. package/dist/cjs/connectors/clickhouse.js.map +1 -0
  46. package/dist/cjs/index.d.ts +490 -0
  47. package/dist/cjs/index.d.ts.map +1 -0
  48. package/dist/cjs/index.js +843 -0
  49. package/dist/cjs/index.js.map +1 -0
  50. package/dist/cjs/index.test.d.ts +2 -0
  51. package/dist/cjs/index.test.d.ts.map +1 -0
  52. package/dist/cjs/index.test.js +185 -0
  53. package/dist/cjs/index.test.js.map +1 -0
  54. package/dist/cjs/introspectV3.d.ts +45 -0
  55. package/dist/cjs/introspectV3.d.ts.map +1 -0
  56. package/dist/cjs/introspectV3.js +99 -0
  57. package/dist/cjs/introspectV3.js.map +1 -0
  58. package/dist/cjs/multidb.spec.d.ts +2 -0
  59. package/dist/cjs/multidb.spec.d.ts.map +1 -0
  60. package/dist/cjs/multidb.spec.js +76 -0
  61. package/dist/cjs/multidb.spec.js.map +1 -0
  62. package/dist/cjs/package.json +1 -0
  63. package/dist/cjs/schema/types.d.ts +73 -0
  64. package/dist/cjs/schema/types.d.ts.map +1 -0
  65. package/dist/cjs/schema/types.js +3 -0
  66. package/dist/cjs/schema/types.js.map +1 -0
  67. package/dist/cjs/tenant-isolation.spec.d.ts +2 -0
  68. package/dist/cjs/tenant-isolation.spec.d.ts.map +1 -0
  69. package/dist/cjs/tenant-isolation.spec.js +420 -0
  70. package/dist/cjs/tenant-isolation.spec.js.map +1 -0
  71. package/dist/cjs/utils/clickhouse.d.ts +9 -0
  72. package/dist/cjs/utils/clickhouse.d.ts.map +1 -0
  73. package/dist/cjs/utils/clickhouse.js +99 -0
  74. package/dist/cjs/utils/clickhouse.js.map +1 -0
  75. package/dist/esm/adapters/clickhouse.d.ts +48 -0
  76. package/dist/esm/adapters/clickhouse.d.ts.map +1 -0
  77. package/dist/esm/adapters/clickhouse.js +280 -0
  78. package/dist/esm/adapters/clickhouse.js.map +1 -0
  79. package/dist/esm/adapters/introspection.spec.d.ts +2 -0
  80. package/dist/esm/adapters/introspection.spec.d.ts.map +1 -0
  81. package/dist/esm/adapters/introspection.spec.js +190 -0
  82. package/dist/esm/adapters/introspection.spec.js.map +1 -0
  83. package/dist/esm/adapters/postgres.d.ts +46 -0
  84. package/dist/esm/adapters/postgres.d.ts.map +1 -0
  85. package/dist/esm/adapters/postgres.js +453 -0
  86. package/dist/esm/adapters/postgres.js.map +1 -0
  87. package/dist/esm/adapters/postgres.spec.d.ts +2 -0
  88. package/dist/esm/adapters/postgres.spec.d.ts.map +1 -0
  89. package/dist/esm/adapters/postgres.spec.js +35 -0
  90. package/dist/esm/adapters/postgres.spec.js.map +1 -0
  91. package/dist/esm/adapters/types.d.ts +38 -0
  92. package/dist/esm/adapters/types.d.ts.map +1 -0
  93. package/dist/esm/adapters/types.js +2 -0
  94. package/dist/esm/adapters/types.js.map +1 -0
  95. package/dist/esm/anonymize.spec.d.ts +2 -0
  96. package/dist/esm/anonymize.spec.d.ts.map +1 -0
  97. package/dist/esm/anonymize.spec.js +76 -0
  98. package/dist/esm/anonymize.spec.js.map +1 -0
  99. package/dist/esm/clickhouseClient.spec.d.ts +2 -0
  100. package/dist/esm/clickhouseClient.spec.d.ts.map +1 -0
  101. package/dist/esm/clickhouseClient.spec.js +281 -0
  102. package/dist/esm/clickhouseClient.spec.js.map +1 -0
  103. package/dist/esm/connectors/base.d.ts +14 -0
  104. package/dist/esm/connectors/base.d.ts.map +1 -0
  105. package/dist/esm/connectors/base.js +2 -0
  106. package/dist/esm/connectors/base.js.map +1 -0
  107. package/dist/esm/connectors/clickhouse.d.ts +35 -0
  108. package/dist/esm/connectors/clickhouse.d.ts.map +1 -0
  109. package/dist/esm/connectors/clickhouse.js +281 -0
  110. package/dist/esm/connectors/clickhouse.js.map +1 -0
  111. package/dist/esm/index.d.ts +490 -0
  112. package/dist/esm/index.d.ts.map +1 -0
  113. package/dist/esm/index.js +838 -0
  114. package/dist/esm/index.js.map +1 -0
  115. package/dist/esm/index.test.d.ts +2 -0
  116. package/dist/esm/index.test.d.ts.map +1 -0
  117. package/dist/esm/index.test.js +183 -0
  118. package/dist/esm/index.test.js.map +1 -0
  119. package/dist/esm/introspectV3.d.ts +45 -0
  120. package/dist/esm/introspectV3.d.ts.map +1 -0
  121. package/dist/esm/introspectV3.js +96 -0
  122. package/dist/esm/introspectV3.js.map +1 -0
  123. package/dist/esm/multidb.spec.d.ts +2 -0
  124. package/dist/esm/multidb.spec.d.ts.map +1 -0
  125. package/dist/esm/multidb.spec.js +74 -0
  126. package/dist/esm/multidb.spec.js.map +1 -0
  127. package/dist/esm/schema/types.d.ts +73 -0
  128. package/dist/esm/schema/types.d.ts.map +1 -0
  129. package/dist/esm/schema/types.js +2 -0
  130. package/dist/esm/schema/types.js.map +1 -0
  131. package/dist/esm/tenant-isolation.spec.d.ts +2 -0
  132. package/dist/esm/tenant-isolation.spec.d.ts.map +1 -0
  133. package/dist/esm/tenant-isolation.spec.js +418 -0
  134. package/dist/esm/tenant-isolation.spec.js.map +1 -0
  135. package/dist/esm/utils/clickhouse.d.ts +9 -0
  136. package/dist/esm/utils/clickhouse.d.ts.map +1 -0
  137. package/dist/esm/utils/clickhouse.js +92 -0
  138. package/dist/esm/utils/clickhouse.js.map +1 -0
  139. package/package.json +73 -53
  140. package/dist/index.cjs +0 -1471
  141. package/dist/index.cjs.map +0 -1
  142. package/dist/index.d.cts +0 -468
  143. package/dist/index.d.ts +0 -468
  144. package/dist/index.js +0 -1443
  145. package/dist/index.js.map +0 -1
package/README.md CHANGED
@@ -90,6 +90,29 @@ Every request is signed with `RS256` using the private key you pass to the const
90
90
  - Schema ingestion failures are logged to `console.warn` during auto-sync, but you can call `syncSchema(..., { force: true })` to surface them directly.
91
91
  - `ask()` raises immediately for guardrail/moderation errors because `/query` responds with 4xx/5xx.
92
92
 
93
+ ### Automatic SQL repair and retry
94
+
95
+ When SQL execution fails (e.g., invalid column name, syntax error), the SDK can automatically retry with a repaired query:
96
+
97
+ ```ts
98
+ const response = await qp.ask("Show revenue by country", {
99
+ tenantId: "tenant_123",
100
+ maxRetry: 3, // Automatically retry up to 3 times on execution error
101
+ });
102
+
103
+ console.log(`Query succeeded after ${response.attempts} attempt(s)`);
104
+ console.table(response.rows);
105
+ ```
106
+
107
+ The SDK will:
108
+ 1. Execute the generated SQL
109
+ 2. If execution fails, send the error back to the server with the failed SQL
110
+ 3. Get a repaired SQL query from the server
111
+ 4. Execute the repaired query
112
+ 5. Repeat up to `maxRetry` times
113
+
114
+ Without `maxRetry`, execution errors throw immediately (default behavior).
115
+
93
116
  ## Need more?
94
117
 
95
118
  Open an issue or extend `node-sdk/src/index.ts`—every route lives in one file. Pull requests are welcome for additional adapters, richer param coercion, or convenience helpers around charts/annotations.
@@ -0,0 +1,5 @@
1
+ declare global {
2
+ var fetch: typeof globalThis.fetch;
3
+ }
4
+ export {};
5
+ //# sourceMappingURL=ingest.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/ingest.test.ts"],"names":[],"mappings":"AAKA,OAAO,CAAC,MAAM,CAAC;IAEX,IAAI,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACtC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const index_js_1 = require("../index.js");
5
+ const noop = () => { };
6
+ class StubConnector {
7
+ constructor(introspection) {
8
+ this.introspection = introspection;
9
+ this.connect = vitest_1.vi.fn(async () => { });
10
+ this.close = vitest_1.vi.fn(async () => { });
11
+ this.executeQuery = vitest_1.vi.fn(async () => []);
12
+ this.introspect = vitest_1.vi.fn(async (_options) => this.introspection);
13
+ }
14
+ }
15
+ (0, vitest_1.describe)('Ingestion API', () => {
16
+ const originalFetch = globalThis.fetch;
17
+ const fakeResponse = {
18
+ ok: true,
19
+ status: 200,
20
+ text: async () => JSON.stringify({ message: 'ok', ingestedTables: 1 }),
21
+ };
22
+ let fetchMock;
23
+ (0, vitest_1.beforeEach)(() => {
24
+ fetchMock = vitest_1.vi.fn().mockResolvedValue(fakeResponse);
25
+ globalThis.fetch = fetchMock;
26
+ });
27
+ (0, vitest_1.afterEach)(() => {
28
+ fetchMock.mockReset();
29
+ if (originalFetch) {
30
+ globalThis.fetch = originalFetch;
31
+ }
32
+ else {
33
+ delete globalThis.fetch;
34
+ }
35
+ });
36
+ (0, vitest_1.it)('posts schema introspection payloads with merged metadata', async () => {
37
+ const sdk = new index_js_1.QueryPanelSdkAPI('https://example.com', 'token');
38
+ const introspection = {
39
+ db: { kind: 'clickhouse', name: 'analytics' },
40
+ tables: [],
41
+ introspectedAt: new Date().toISOString(),
42
+ metadata: { existing: true },
43
+ };
44
+ const response = await sdk.ingestSchema(introspection, {
45
+ tenantId: 'tenant-1',
46
+ metadata: { triggeredBy: 'test' },
47
+ });
48
+ (0, vitest_1.expect)(response).toMatchObject({ message: 'ok', ingestedTables: 1 });
49
+ (0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(1);
50
+ const [url, init] = fetchMock.mock.calls[0];
51
+ (0, vitest_1.expect)(url).toBe('https://example.com/ingest/schema');
52
+ (0, vitest_1.expect)(init.method).toBe('POST');
53
+ (0, vitest_1.expect)(init.headers).toMatchObject({
54
+ Authorization: 'Bearer token',
55
+ 'Content-Type': 'application/json',
56
+ });
57
+ const body = JSON.parse(init.body);
58
+ (0, vitest_1.expect)(body.metadata).toEqual({ existing: true, triggeredBy: 'test' });
59
+ });
60
+ (0, vitest_1.it)('introspects via connector and closes connections by default', async () => {
61
+ const sdk = new index_js_1.QueryPanelSdkAPI('https://example.com', 'token');
62
+ const introspection = {
63
+ db: { kind: 'clickhouse', name: 'analytics' },
64
+ tables: [],
65
+ introspectedAt: new Date().toISOString(),
66
+ };
67
+ const connector = new StubConnector(introspection);
68
+ const response = await sdk.introspectAndIngest(connector, {
69
+ tenantId: 'tenant-1',
70
+ metadata: { flow: 'batch' },
71
+ tables: ['events'],
72
+ });
73
+ (0, vitest_1.expect)(response.message).toBe('ok');
74
+ (0, vitest_1.expect)(connector.connect).toHaveBeenCalledTimes(1);
75
+ (0, vitest_1.expect)(connector.introspect).toHaveBeenCalledWith({ tables: ['events'] });
76
+ (0, vitest_1.expect)(connector.close).toHaveBeenCalledTimes(1);
77
+ const [, init] = fetchMock.mock.calls[0];
78
+ const body = JSON.parse(init.body);
79
+ (0, vitest_1.expect)(body.metadata).toEqual({ flow: 'batch' });
80
+ });
81
+ (0, vitest_1.it)('respects keepConnectionOpen option', async () => {
82
+ const sdk = new index_js_1.QueryPanelSdkAPI('https://example.com', 'token');
83
+ const connector = new StubConnector({
84
+ db: { kind: 'clickhouse', name: 'analytics' },
85
+ tables: [],
86
+ introspectedAt: new Date().toISOString(),
87
+ });
88
+ await sdk.introspectAndIngest(connector, {
89
+ tenantId: 'tenant-1',
90
+ keepConnectionOpen: true,
91
+ });
92
+ (0, vitest_1.expect)(connector.close).not.toHaveBeenCalled();
93
+ });
94
+ });
95
+ //# sourceMappingURL=ingest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.test.js","sourceRoot":"","sources":["../../../src/__tests__/ingest.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { ClickHouseSettings, QueryParams, Row } from "@clickhouse/client";
2
+ import type { IntrospectOptions, SchemaIntrospection } from "../schema/types.js";
3
+ import type { DatabaseAdapter, DatabaseExecutionResult } from "./types.js";
4
+ export interface ClickHouseAdapterOptions {
5
+ /** Optional logical database name used in introspection metadata. */
6
+ database?: string;
7
+ /** Override the default response format used for query execution. */
8
+ defaultFormat?: QueryParams["format"];
9
+ /**
10
+ * Optional database kind label. Defaults to "clickhouse" but allows
11
+ * sub-classing/custom branding if needed.
12
+ */
13
+ kind?: SchemaIntrospection["db"]["kind"];
14
+ /**
15
+ * Optional allow-list of table names.
16
+ * When specified, introspection and queries are restricted to these tables only.
17
+ * ClickHouse tables are not schema-qualified, so just provide table names.
18
+ */
19
+ allowedTables?: string[];
20
+ }
21
+ export type ClickHouseQueryResult = {
22
+ json: () => Promise<unknown>;
23
+ };
24
+ export type ClickHouseClientFn = (params: QueryParams & {
25
+ query_params?: Record<string, unknown>;
26
+ clickhouse_settings?: ClickHouseSettings;
27
+ }) => Promise<ClickHouseQueryResult | Array<Record<string, unknown>> | Row[]>;
28
+ export declare class ClickHouseAdapter implements DatabaseAdapter {
29
+ private readonly clientFn;
30
+ private readonly databaseName;
31
+ private readonly defaultFormat;
32
+ private readonly kind;
33
+ private readonly allowedTables?;
34
+ constructor(clientFn: ClickHouseClientFn, options?: ClickHouseAdapterOptions);
35
+ execute(sql: string, params?: Record<string, string | number | boolean | string[] | number[]>): Promise<DatabaseExecutionResult>;
36
+ validate(sql: string, params?: Record<string, string | number | boolean | string[] | number[]>): Promise<void>;
37
+ getDialect(): "clickhouse";
38
+ introspect(options?: IntrospectOptions): Promise<SchemaIntrospection>;
39
+ /**
40
+ * Validate that the SQL query only references allowed tables.
41
+ * This is a basic validation that extracts table-like patterns from the query.
42
+ */
43
+ private validateQueryTables;
44
+ close(): Promise<void>;
45
+ private query;
46
+ private extractRows;
47
+ }
48
+ //# sourceMappingURL=clickhouse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickhouse.d.ts","sourceRoot":"","sources":["../../../src/adapters/clickhouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAEV,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,aAAa,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,WAAW,GAAG;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,mBAAmB,CAAC,EAAE,kBAAkB,CAAC;CAC1C,KACE,OAAO,CAAC,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AA6B7E,qBAAa,iBAAkB,YAAW,eAAe;IAOrD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAN3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAW;gBAGvB,QAAQ,EAAE,kBAAkB,EAC7C,OAAO,GAAE,wBAA6B;IAWlC,OAAO,CACX,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GACvE,OAAO,CAAC,uBAAuB,CAAC;IAkB7B,QAAQ,CACZ,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GACvE,OAAO,CAAC,IAAI,CAAC;IAWhB,UAAU,IACD,YAAY;IAGf,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2G3E;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0BrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAId,KAAK;YAyBL,WAAW;CAiB1B"}
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClickHouseAdapter = void 0;
4
+ const clickhouse_js_1 = require("../utils/clickhouse.js");
5
+ class ClickHouseAdapter {
6
+ constructor(clientFn, options = {}) {
7
+ this.clientFn = clientFn;
8
+ console.log({ options });
9
+ this.databaseName = options.database ?? "default";
10
+ this.defaultFormat = options.defaultFormat ?? "JSONEachRow";
11
+ this.kind = options.kind ?? "clickhouse";
12
+ if (options.allowedTables) {
13
+ this.allowedTables = normalizeTableFilter(options.allowedTables);
14
+ }
15
+ }
16
+ async execute(sql, params) {
17
+ // Validate query against allowed tables if restrictions are in place
18
+ if (this.allowedTables) {
19
+ this.validateQueryTables(sql);
20
+ }
21
+ const queryOptions = {
22
+ format: this.defaultFormat,
23
+ };
24
+ if (params) {
25
+ queryOptions.params = params;
26
+ }
27
+ const rows = await this.query(sql, queryOptions);
28
+ const fields = rows.length > 0 ? Object.keys(rows[0] ?? {}) : [];
29
+ return { fields, rows };
30
+ }
31
+ async validate(sql, params) {
32
+ const queryOptions = {
33
+ format: this.defaultFormat,
34
+ };
35
+ if (params) {
36
+ queryOptions.params = params;
37
+ }
38
+ await this.query(`EXPLAIN ${sql}`, queryOptions);
39
+ }
40
+ getDialect() {
41
+ return "clickhouse";
42
+ }
43
+ async introspect(options) {
44
+ // Use adapter-level allowedTables if no specific tables provided in options
45
+ const tablesToIntrospect = options?.tables
46
+ ? normalizeTableFilter(options.tables)
47
+ : this.allowedTables;
48
+ const allowTables = tablesToIntrospect ?? [];
49
+ const hasFilter = allowTables.length > 0;
50
+ const queryParams = {
51
+ db: this.databaseName,
52
+ };
53
+ if (hasFilter) {
54
+ queryParams.tables = allowTables;
55
+ }
56
+ const filterClause = hasFilter ? " AND name IN {tables:Array(String)}" : "";
57
+ const tables = await this.query(`SELECT name, engine, comment, total_rows, total_bytes, primary_key, sorting_key
58
+ FROM system.tables
59
+ WHERE database = {db:String}${filterClause}
60
+ ORDER BY name`, { params: queryParams });
61
+ const columnFilterClause = hasFilter
62
+ ? " AND table IN {tables:Array(String)}"
63
+ : "";
64
+ const columns = await this.query(`SELECT table, name, type, position, default_kind, default_expression, comment, is_in_primary_key
65
+ FROM system.columns
66
+ WHERE database = {db:String}${columnFilterClause}
67
+ ORDER BY table, position`, { params: queryParams });
68
+ const columnsByTable = new Map();
69
+ for (const rawColumn of columns) {
70
+ const list = columnsByTable.get(rawColumn.table) ?? [];
71
+ list.push(transformColumnRow(rawColumn));
72
+ columnsByTable.set(rawColumn.table, list);
73
+ }
74
+ const tableSchemas = tables.map((table) => {
75
+ const tableColumns = columnsByTable.get(table.name) ?? [];
76
+ const primaryKeyColumns = (0, clickhouse_js_1.parseKeyExpression)(table.primary_key);
77
+ const totalRows = toNumber(table.total_rows);
78
+ const totalBytes = toNumber(table.total_bytes);
79
+ for (const column of tableColumns) {
80
+ column.isPrimaryKey =
81
+ column.isPrimaryKey || primaryKeyColumns.includes(column.name);
82
+ }
83
+ const indexes = primaryKeyColumns.length
84
+ ? [
85
+ {
86
+ name: "primary_key",
87
+ columns: primaryKeyColumns,
88
+ unique: true,
89
+ type: "PRIMARY KEY",
90
+ ...(table.primary_key ? { definition: table.primary_key } : {}),
91
+ },
92
+ ]
93
+ : [];
94
+ const constraints = primaryKeyColumns.length
95
+ ? [
96
+ {
97
+ name: "primary_key",
98
+ type: "PRIMARY KEY",
99
+ columns: primaryKeyColumns,
100
+ },
101
+ ]
102
+ : [];
103
+ const base = {
104
+ name: table.name,
105
+ schema: this.databaseName,
106
+ type: asTableType(table.engine),
107
+ engine: table.engine,
108
+ columns: tableColumns,
109
+ indexes,
110
+ constraints,
111
+ };
112
+ const comment = sanitize(table.comment);
113
+ if (comment !== undefined) {
114
+ base.comment = comment;
115
+ }
116
+ const statistics = buildTableStatistics(totalRows, totalBytes);
117
+ if (statistics) {
118
+ base.statistics = statistics;
119
+ }
120
+ return base;
121
+ });
122
+ return {
123
+ db: {
124
+ kind: this.kind,
125
+ name: this.databaseName,
126
+ },
127
+ tables: tableSchemas,
128
+ introspectedAt: new Date().toISOString(),
129
+ };
130
+ }
131
+ /**
132
+ * Validate that the SQL query only references allowed tables.
133
+ * This is a basic validation that extracts table-like patterns from the query.
134
+ */
135
+ validateQueryTables(sql) {
136
+ if (!this.allowedTables || this.allowedTables.length === 0) {
137
+ return;
138
+ }
139
+ const allowedSet = new Set(this.allowedTables);
140
+ // Extract potential table references from SQL
141
+ // This regex looks for identifiers after FROM/JOIN keywords
142
+ // ClickHouse may use database.table notation
143
+ const tablePattern = /(?:FROM|JOIN)\s+(?:FINAL\s+)?(?:(?:[a-zA-Z_][a-zA-Z0-9_]*)\.)?(["'`]?[a-zA-Z_][a-zA-Z0-9_]*["'`]?)/gi;
144
+ const matches = sql.matchAll(tablePattern);
145
+ for (const match of matches) {
146
+ const table = match[1]?.replace(/["'`]/g, "");
147
+ if (table) {
148
+ if (!allowedSet.has(table)) {
149
+ throw new Error(`Query references table "${table}" which is not in the allowed tables list`);
150
+ }
151
+ }
152
+ }
153
+ }
154
+ async close() {
155
+ // No-op: lifecycle of the underlying client is controlled by the caller.
156
+ }
157
+ async query(sql, options) {
158
+ const params = {
159
+ query: sql,
160
+ };
161
+ const format = options?.format ?? this.defaultFormat;
162
+ if (format !== undefined) {
163
+ params.format = format;
164
+ }
165
+ if (options?.params) {
166
+ params.query_params = options.params;
167
+ }
168
+ if (options?.settings) {
169
+ params.clickhouse_settings = options.settings;
170
+ }
171
+ const result = await this.clientFn(params);
172
+ return this.extractRows(result);
173
+ }
174
+ async extractRows(result) {
175
+ if (Array.isArray(result)) {
176
+ return result;
177
+ }
178
+ if (result &&
179
+ typeof result.json === "function") {
180
+ const payload = await result.json();
181
+ return normalizePayload(payload);
182
+ }
183
+ return [];
184
+ }
185
+ }
186
+ exports.ClickHouseAdapter = ClickHouseAdapter;
187
+ function normalizePayload(payload) {
188
+ if (Array.isArray(payload)) {
189
+ return payload;
190
+ }
191
+ if (payload && typeof payload === "object") {
192
+ const maybeData = payload.data;
193
+ if (Array.isArray(maybeData)) {
194
+ return maybeData;
195
+ }
196
+ }
197
+ return [];
198
+ }
199
+ function normalizeTableFilter(tables) {
200
+ if (!tables?.length)
201
+ return [];
202
+ const seen = new Set();
203
+ const normalized = [];
204
+ for (const table of tables) {
205
+ if (!table)
206
+ continue;
207
+ const trimmed = table.trim();
208
+ if (!trimmed)
209
+ continue;
210
+ const parts = trimmed.split(".");
211
+ const tableName = parts[parts.length - 1];
212
+ if (!tableName || seen.has(tableName))
213
+ continue;
214
+ seen.add(tableName);
215
+ normalized.push(tableName);
216
+ }
217
+ return normalized;
218
+ }
219
+ function transformColumnRow(row) {
220
+ const nullable = (0, clickhouse_js_1.isNullableType)(row.type);
221
+ const unwrappedType = (0, clickhouse_js_1.unwrapTypeModifiers)(row.type);
222
+ const { precision, scale } = (0, clickhouse_js_1.extractPrecisionScale)(row.type);
223
+ const maxLength = (0, clickhouse_js_1.extractFixedStringLength)(row.type);
224
+ const column = {
225
+ name: row.name,
226
+ type: unwrappedType,
227
+ rawType: row.type,
228
+ nullable,
229
+ isPrimaryKey: Boolean(toNumber(row.is_in_primary_key)),
230
+ isForeignKey: false,
231
+ };
232
+ const defaultKind = sanitize(row.default_kind);
233
+ if (defaultKind !== undefined)
234
+ column.defaultKind = defaultKind;
235
+ const defaultExpression = sanitize(row.default_expression);
236
+ if (defaultExpression !== undefined) {
237
+ column.defaultExpression = defaultExpression;
238
+ }
239
+ const comment = sanitize(row.comment);
240
+ if (comment !== undefined)
241
+ column.comment = comment;
242
+ if (maxLength !== undefined)
243
+ column.maxLength = maxLength;
244
+ if (precision !== undefined)
245
+ column.precision = precision;
246
+ if (scale !== undefined)
247
+ column.scale = scale;
248
+ return column;
249
+ }
250
+ function asTableType(engine) {
251
+ if (typeof engine === "string") {
252
+ const normalized = engine.toLowerCase();
253
+ // ClickHouse view engines: View, MaterializedView, LiveView
254
+ if (normalized.includes("view")) {
255
+ return "view";
256
+ }
257
+ }
258
+ return "table";
259
+ }
260
+ function buildTableStatistics(totalRows, totalBytes) {
261
+ if (totalRows === undefined && totalBytes === undefined)
262
+ return undefined;
263
+ const stats = {};
264
+ if (totalRows !== undefined)
265
+ stats.totalRows = totalRows;
266
+ if (totalBytes !== undefined)
267
+ stats.totalBytes = totalBytes;
268
+ return stats;
269
+ }
270
+ function sanitize(value) {
271
+ if (value === null || value === undefined)
272
+ return undefined;
273
+ const trimmed = String(value).trim();
274
+ return trimmed.length ? trimmed : undefined;
275
+ }
276
+ function toNumber(value) {
277
+ if (value === null || value === undefined)
278
+ return undefined;
279
+ if (typeof value === "number")
280
+ return value;
281
+ const parsed = Number.parseFloat(String(value));
282
+ return Number.isNaN(parsed) ? undefined : parsed;
283
+ }
284
+ //# sourceMappingURL=clickhouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../../src/adapters/clickhouse.ts"],"names":[],"mappings":";;;AAOA,0DAMgC;AAyDhC,MAAa,iBAAiB;IAM5B,YACmB,QAA4B,EAC7C,UAAoC,EAAE;QADrB,aAAQ,GAAR,QAAQ,CAAoB;QAG7C,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;QACzC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAW,EACX,MAAwE;QAExE,qEAAqE;QACrE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,YAAY,GAAiB;YACjC,MAAM,EAAE,IAAI,CAAC,aAAa;SAC3B,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAA0B,GAAG,EAAE,YAAY,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,GAAW,EACX,MAAwE;QAExE,MAAM,YAAY,GAAiB;YACjC,MAAM,EAAE,IAAI,CAAC,aAAa;SAC3B,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IAED,UAAU;QACR,OAAO,YAAqB,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA2B;QAC1C,4EAA4E;QAC5E,MAAM,kBAAkB,GAAG,OAAO,EAAE,MAAM;YACxC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;QACvB,MAAM,WAAW,GAAG,kBAAkB,IAAI,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACzC,MAAM,WAAW,GAA4B;YAC3C,EAAE,EAAE,IAAI,CAAC,YAAY;SACtB,CAAC;QACF,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC;QACnC,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;;qCAE+B,YAAY;qBAC5B,EACf,EAAE,MAAM,EAAE,WAAW,EAAE,CACxB,CAAC;QAEF,MAAM,kBAAkB,GAAG,SAAS;YAClC,CAAC,CAAC,sCAAsC;YACxC,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAC9B;;qCAE+B,kBAAkB;gCACvB,EAC1B,EAAE,MAAM,EAAE,WAAW,EAAE,CACxB,CAAC;QAEF,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;QACzD,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;YACzC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,YAAY,GAAkB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACvD,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1D,MAAM,iBAAiB,GAAG,IAAA,kCAAkB,EAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE/C,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;gBAClC,MAAM,CAAC,YAAY;oBACjB,MAAM,CAAC,YAAY,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM;gBACtC,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,iBAAiB;wBAC1B,MAAM,EAAE,IAAI;wBACZ,IAAI,EAAE,aAAa;wBACnB,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAChE;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YAEP,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM;gBAC1C,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,aAAa;wBACnB,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,iBAAiB;qBAC3B;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YAEP,MAAM,IAAI,GAAgB;gBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,IAAI,CAAC,YAAY;gBACzB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC/B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO,EAAE,YAAY;gBACrB,OAAO;gBACP,WAAW;aACZ,CAAC;YAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACzB,CAAC;YAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC/D,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC/B,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,EAAE,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,YAAY;aACxB;YACD,MAAM,EAAE,YAAY;YACpB,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACzC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,mBAAmB,CAAC,GAAW;QACrC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE/C,8CAA8C;QAC9C,4DAA4D;QAC5D,6CAA6C;QAC7C,MAAM,YAAY,GAChB,sGAAsG,CAAC;QACzG,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAE3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CACb,2BAA2B,KAAK,2CAA2C,CAC5E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,yEAAyE;IAC3E,CAAC;IAEO,KAAK,CAAC,KAAK,CAAI,GAAW,EAAE,OAAsB;QACxD,MAAM,MAAM,GAGR;YACF,KAAK,EAAE,GAAG;SACX,CAAC;QAEF,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC;QACrD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;QACvC,CAAC;QAED,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,MAAM,CAAC,mBAAmB,GAAG,OAAO,CAAC,QAA8B,CAAC;QACtE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,WAAW,CAAI,MAAM,CAAC,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,MAAsE;QAEtE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAa,CAAC;QACvB,CAAC;QAED,IACE,MAAM;YACN,OAAQ,MAAgC,CAAC,IAAI,KAAK,UAAU,EAC5D,CAAC;YACD,MAAM,OAAO,GAAG,MAAO,MAAgC,CAAC,IAAI,EAAE,CAAC;YAC/D,OAAO,gBAAgB,CAAI,OAAO,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAjPD,8CAiPC;AAED,SAAS,gBAAgB,CAAI,OAAgB;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAc,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAI,OAA8B,CAAC,IAAI,CAAC;QACvD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAgB,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAwB;IACpD,IAAI,CAAC,MAAM,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QAChD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAc;IACxC,MAAM,QAAQ,GAAG,IAAA,8BAAc,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAA,mCAAmB,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAA,qCAAqB,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAA,wCAAwB,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,MAAM,GAAiB;QAC3B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,GAAG,CAAC,IAAI;QACjB,QAAQ;QACR,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACtD,YAAY,EAAE,KAAK;KACpB,CAAC;IAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC/C,IAAI,WAAW,KAAK,SAAS;QAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IAEhE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC3D,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC/C,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAEpD,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1D,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1D,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,MAAe;IAClC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACxC,4DAA4D;QAC5D,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAC3B,SAAkB,EAClB,UAAmB;IAEnB,IAAI,SAAS,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1E,MAAM,KAAK,GAA2C,EAAE,CAAC;IACzD,IAAI,SAAS,KAAK,SAAS;QAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACzD,IAAI,UAAU,KAAK,SAAS;QAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;IAC5D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=introspection.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection.spec.d.ts","sourceRoot":"","sources":["../../../src/adapters/introspection.spec.ts"],"names":[],"mappings":""}