@panoboard/core 1.11.7 → 1.12.0

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/dist/components/PanelWrapper.js +50 -5
  2. package/dist/components/PanelWrapper.js.map +1 -1
  3. package/dist/components/panels/TablePanel.d.ts +7 -1
  4. package/dist/components/panels/TablePanel.d.ts.map +1 -1
  5. package/dist/components/panels/TablePanel.js +38 -23
  6. package/dist/components/panels/TablePanel.js.map +1 -1
  7. package/dist/index.d.ts +1 -4
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +0 -8
  10. package/dist/index.js.map +1 -1
  11. package/dist/schemas/dashboard.d.ts +1 -0
  12. package/dist/schemas/dashboard.d.ts.map +1 -1
  13. package/dist/schemas/datasource.d.ts +118 -0
  14. package/dist/schemas/datasource.d.ts.map +1 -1
  15. package/dist/schemas/datasource.js +46 -0
  16. package/dist/schemas/datasource.js.map +1 -1
  17. package/dist/transforms/computed.d.ts +1 -1
  18. package/dist/transforms/computed.d.ts.map +1 -1
  19. package/dist/transforms/engine.d.ts +1 -1
  20. package/dist/transforms/engine.d.ts.map +1 -1
  21. package/dist/transforms/filter.d.ts +1 -1
  22. package/dist/transforms/filter.d.ts.map +1 -1
  23. package/dist/transforms/limit.d.ts +1 -1
  24. package/dist/transforms/limit.d.ts.map +1 -1
  25. package/dist/transforms/percentage.d.ts +1 -1
  26. package/dist/transforms/percentage.d.ts.map +1 -1
  27. package/dist/transforms/rename.d.ts +1 -1
  28. package/dist/transforms/rename.d.ts.map +1 -1
  29. package/dist/transforms/sort.d.ts +1 -1
  30. package/dist/transforms/sort.d.ts.map +1 -1
  31. package/dist/{connectors/types.d.ts → types/connector-types.d.ts} +8 -2
  32. package/dist/types/connector-types.d.ts.map +1 -0
  33. package/dist/{query/strategy/types.js → types/connector-types.js} +1 -1
  34. package/dist/types/connector-types.js.map +1 -0
  35. package/package.json +2 -39
  36. package/dist/annotations/executor.d.ts +0 -32
  37. package/dist/annotations/executor.d.ts.map +0 -1
  38. package/dist/annotations/executor.js +0 -87
  39. package/dist/annotations/executor.js.map +0 -1
  40. package/dist/annotations/index.d.ts +0 -2
  41. package/dist/annotations/index.d.ts.map +0 -1
  42. package/dist/annotations/index.js +0 -15
  43. package/dist/annotations/index.js.map +0 -1
  44. package/dist/cache/cache.d.ts +0 -11
  45. package/dist/cache/cache.d.ts.map +0 -1
  46. package/dist/cache/cache.js +0 -42
  47. package/dist/cache/cache.js.map +0 -1
  48. package/dist/cache/client.d.ts +0 -9
  49. package/dist/cache/client.d.ts.map +0 -1
  50. package/dist/cache/client.js +0 -63
  51. package/dist/cache/client.js.map +0 -1
  52. package/dist/cache/index.d.ts +0 -4
  53. package/dist/cache/index.d.ts.map +0 -1
  54. package/dist/cache/index.js +0 -17
  55. package/dist/cache/index.js.map +0 -1
  56. package/dist/cache/keys.d.ts +0 -2
  57. package/dist/cache/keys.d.ts.map +0 -1
  58. package/dist/cache/keys.js +0 -26
  59. package/dist/cache/keys.js.map +0 -1
  60. package/dist/connectors/bigquery.d.ts +0 -26
  61. package/dist/connectors/bigquery.d.ts.map +0 -1
  62. package/dist/connectors/bigquery.js +0 -118
  63. package/dist/connectors/bigquery.js.map +0 -1
  64. package/dist/connectors/index.d.ts +0 -17
  65. package/dist/connectors/index.d.ts.map +0 -1
  66. package/dist/connectors/index.js +0 -23
  67. package/dist/connectors/index.js.map +0 -1
  68. package/dist/connectors/params.d.ts +0 -15
  69. package/dist/connectors/params.d.ts.map +0 -1
  70. package/dist/connectors/params.js +0 -46
  71. package/dist/connectors/params.js.map +0 -1
  72. package/dist/connectors/postgres.d.ts +0 -29
  73. package/dist/connectors/postgres.d.ts.map +0 -1
  74. package/dist/connectors/postgres.js +0 -133
  75. package/dist/connectors/postgres.js.map +0 -1
  76. package/dist/connectors/redshift-data.d.ts +0 -25
  77. package/dist/connectors/redshift-data.d.ts.map +0 -1
  78. package/dist/connectors/redshift-data.js +0 -237
  79. package/dist/connectors/redshift-data.js.map +0 -1
  80. package/dist/connectors/redshift.d.ts +0 -29
  81. package/dist/connectors/redshift.d.ts.map +0 -1
  82. package/dist/connectors/redshift.js +0 -141
  83. package/dist/connectors/redshift.js.map +0 -1
  84. package/dist/connectors/registry.d.ts +0 -7
  85. package/dist/connectors/registry.d.ts.map +0 -1
  86. package/dist/connectors/registry.js +0 -30
  87. package/dist/connectors/registry.js.map +0 -1
  88. package/dist/connectors/snowflake.d.ts +0 -37
  89. package/dist/connectors/snowflake.d.ts.map +0 -1
  90. package/dist/connectors/snowflake.js +0 -181
  91. package/dist/connectors/snowflake.js.map +0 -1
  92. package/dist/connectors/types.d.ts.map +0 -1
  93. package/dist/connectors/types.js +0 -15
  94. package/dist/connectors/types.js.map +0 -1
  95. package/dist/connectors/url-parsers.d.ts +0 -13
  96. package/dist/connectors/url-parsers.d.ts.map +0 -1
  97. package/dist/connectors/url-parsers.js +0 -95
  98. package/dist/connectors/url-parsers.js.map +0 -1
  99. package/dist/connectors/url.d.ts +0 -36
  100. package/dist/connectors/url.d.ts.map +0 -1
  101. package/dist/connectors/url.js +0 -139
  102. package/dist/connectors/url.js.map +0 -1
  103. package/dist/query/array-expansion.d.ts +0 -5
  104. package/dist/query/array-expansion.d.ts.map +0 -1
  105. package/dist/query/array-expansion.js +0 -39
  106. package/dist/query/array-expansion.js.map +0 -1
  107. package/dist/query/index.d.ts +0 -8
  108. package/dist/query/index.d.ts.map +0 -1
  109. package/dist/query/index.js +0 -20
  110. package/dist/query/index.js.map +0 -1
  111. package/dist/query/pipeline.d.ts +0 -27
  112. package/dist/query/pipeline.d.ts.map +0 -1
  113. package/dist/query/pipeline.js +0 -49
  114. package/dist/query/pipeline.js.map +0 -1
  115. package/dist/query/strategy/http.d.ts +0 -7
  116. package/dist/query/strategy/http.d.ts.map +0 -1
  117. package/dist/query/strategy/http.js +0 -26
  118. package/dist/query/strategy/http.js.map +0 -1
  119. package/dist/query/strategy/index.d.ts +0 -4
  120. package/dist/query/strategy/index.d.ts.map +0 -1
  121. package/dist/query/strategy/index.js +0 -32
  122. package/dist/query/strategy/index.js.map +0 -1
  123. package/dist/query/strategy/sql.d.ts +0 -7
  124. package/dist/query/strategy/sql.d.ts.map +0 -1
  125. package/dist/query/strategy/sql.js +0 -40
  126. package/dist/query/strategy/sql.js.map +0 -1
  127. package/dist/query/strategy/types.d.ts +0 -6
  128. package/dist/query/strategy/types.d.ts.map +0 -1
  129. package/dist/query/strategy/types.js.map +0 -1
  130. package/dist/query/template.d.ts +0 -7
  131. package/dist/query/template.d.ts.map +0 -1
  132. package/dist/query/template.js +0 -43
  133. package/dist/query/template.js.map +0 -1
  134. package/dist/startup/index.d.ts +0 -5
  135. package/dist/startup/index.d.ts.map +0 -1
  136. package/dist/startup/index.js +0 -16
  137. package/dist/startup/index.js.map +0 -1
  138. package/dist/startup/sentinel-check.d.ts +0 -12
  139. package/dist/startup/sentinel-check.d.ts.map +0 -1
  140. package/dist/startup/sentinel-check.js +0 -142
  141. package/dist/startup/sentinel-check.js.map +0 -1
  142. package/dist/startup/sql-lint.d.ts +0 -13
  143. package/dist/startup/sql-lint.d.ts.map +0 -1
  144. package/dist/startup/sql-lint.js +0 -87
  145. package/dist/startup/sql-lint.js.map +0 -1
@@ -1,237 +0,0 @@
1
- // Copyright 2026 Mataki Labs LLC
2
- //
3
- // Licensed under the Business Source License 1.1 (the "License");
4
- // you may not use this file except in compliance with the License.
5
- // You may obtain a copy of the License at
6
- //
7
- // https://github.com/panoboard/panoboard/blob/main/LICENSE
8
- //
9
- // Unless required by applicable law or agreed to in writing, software
10
- // distributed under the License is distributed on an "AS IS" BASIS,
11
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- // See the License for the specific language governing permissions and
13
- // limitations under the License.
14
- import { RedshiftDataClient, ExecuteStatementCommand, DescribeStatementCommand, GetStatementResultCommand, CancelStatementCommand, } from "@aws-sdk/client-redshift-data";
15
- // ---------------------------------------------------------------------------
16
- // Type mapping
17
- // ---------------------------------------------------------------------------
18
- export function mapTypeNameToType(typeName) {
19
- switch (typeName) {
20
- case "varchar":
21
- case "text":
22
- case "char":
23
- case "bpchar":
24
- return "string";
25
- case "int2":
26
- case "int4":
27
- case "int8":
28
- case "float4":
29
- case "float8":
30
- case "numeric":
31
- return "number";
32
- case "bool":
33
- return "boolean";
34
- case "date":
35
- case "timestamp":
36
- case "timestamptz":
37
- return "date";
38
- default:
39
- return "string";
40
- }
41
- }
42
- // ---------------------------------------------------------------------------
43
- // Role assumption helper
44
- // ---------------------------------------------------------------------------
45
- async function resolveCredentials(auth, region) {
46
- if (auth.type === "role" && auth.role_arn) {
47
- const { STSClient, AssumeRoleCommand } = await import("@aws-sdk/client-sts");
48
- const stsClient = new STSClient({ region });
49
- const response = await stsClient.send(new AssumeRoleCommand({
50
- RoleArn: auth.role_arn,
51
- RoleSessionName: "panoboard-redshift-data",
52
- }));
53
- if (!response.Credentials) {
54
- throw new Error("Failed to assume role: no credentials returned");
55
- }
56
- return {
57
- credentials: {
58
- accessKeyId: response.Credentials.AccessKeyId,
59
- secretAccessKey: response.Credentials.SecretAccessKey,
60
- sessionToken: response.Credentials.SessionToken,
61
- },
62
- };
63
- }
64
- return undefined;
65
- }
66
- // ---------------------------------------------------------------------------
67
- // Connector implementation
68
- // ---------------------------------------------------------------------------
69
- export class RedshiftDataConnector {
70
- id;
71
- type = "redshift-data";
72
- client;
73
- config;
74
- constructor(config) {
75
- this.id = config.id;
76
- this.config = config;
77
- // Client is created synchronously; for role-based auth, we create it lazily
78
- this.client = new RedshiftDataClient({ region: config.region });
79
- }
80
- async getClient() {
81
- if (this.config.auth.type === "role" && this.config.auth.role_arn) {
82
- const extraConfig = await resolveCredentials(this.config.auth, this.config.region);
83
- if (extraConfig) {
84
- return new RedshiftDataClient({
85
- region: this.config.region,
86
- ...extraConfig,
87
- });
88
- }
89
- }
90
- return this.client;
91
- }
92
- async query(request, options) {
93
- if (request.type !== "sql") {
94
- throw new Error("[RedshiftDataConnector] only supports SQL queries");
95
- }
96
- const start = Date.now();
97
- const params = options?.params ?? {};
98
- const timeoutMs = options?.timeoutMs;
99
- const client = await this.getClient();
100
- // Build Parameters array for named params
101
- const parameters = Object.entries(params).map(([name, value]) => ({
102
- name,
103
- value: String(value),
104
- }));
105
- // 1. Execute statement
106
- const executeCmd = new ExecuteStatementCommand({
107
- Sql: request.sql,
108
- Database: this.config.database,
109
- ...(this.config.cluster_identifier
110
- ? { ClusterIdentifier: this.config.cluster_identifier }
111
- : {}),
112
- ...(this.config.workgroup_name
113
- ? { WorkgroupName: this.config.workgroup_name }
114
- : {}),
115
- ...(parameters.length > 0 ? { Parameters: parameters } : {}),
116
- });
117
- const executeResult = await client.send(executeCmd);
118
- const statementId = executeResult.Id;
119
- // 2. Poll with exponential backoff until FINISHED or timeout
120
- const timeoutError = new Error(`RedshiftData query timeout after ${timeoutMs}ms`);
121
- let intervalMs = 250;
122
- const maxIntervalMs = 2000;
123
- const poll = async () => {
124
- while (true) {
125
- if (timeoutMs !== undefined && Date.now() - start >= timeoutMs) {
126
- // Attempt cancel; suppress errors if already finished
127
- try {
128
- await client.send(new CancelStatementCommand({ Id: statementId }));
129
- }
130
- catch {
131
- // Suppress — statement may have finished before cancel
132
- }
133
- throw timeoutError;
134
- }
135
- const describeCmd = new DescribeStatementCommand({ Id: statementId });
136
- const describeResult = await client.send(describeCmd);
137
- const status = describeResult.Status;
138
- if (status === "FINISHED") {
139
- return;
140
- }
141
- if (status === "FAILED" || status === "ABORTED") {
142
- throw new Error(`RedshiftData statement ${statementId} ended with status: ${status}`);
143
- }
144
- // Check timeout again after the describe call returned
145
- if (timeoutMs !== undefined && Date.now() - start >= timeoutMs) {
146
- try {
147
- await client.send(new CancelStatementCommand({ Id: statementId }));
148
- }
149
- catch {
150
- // Suppress
151
- }
152
- throw timeoutError;
153
- }
154
- // Wait before next poll
155
- await new Promise((r) => setTimeout(r, intervalMs));
156
- intervalMs = Math.min(intervalMs * 2, maxIntervalMs);
157
- }
158
- };
159
- await poll();
160
- // 3. Fetch results — loop while NextToken is present
161
- let nextToken;
162
- let columns = null;
163
- const allRows = [];
164
- do {
165
- const getResultCmd = new GetStatementResultCommand({
166
- Id: statementId,
167
- ...(nextToken ? { NextToken: nextToken } : {}),
168
- });
169
- const page = await client.send(getResultCmd);
170
- // Column metadata comes from the first page
171
- if (columns === null) {
172
- columns = (page.ColumnMetadata ?? []).map((col) => ({
173
- name: col.name ?? "",
174
- type: mapTypeNameToType(col.typeName ?? ""),
175
- nullable: true,
176
- }));
177
- }
178
- // Map records to row objects
179
- const colNames = columns.map((c) => c.name);
180
- for (const record of page.Records ?? []) {
181
- const row = {};
182
- for (let i = 0; i < record.length; i++) {
183
- const field = record[i];
184
- const colName = colNames[i];
185
- if (field.isNull) {
186
- row[colName] = null;
187
- }
188
- else if ("longValue" in field && field.longValue !== undefined) {
189
- row[colName] = field.longValue;
190
- }
191
- else if ("booleanValue" in field &&
192
- field.booleanValue !== undefined) {
193
- row[colName] = field.booleanValue;
194
- }
195
- else if ("doubleValue" in field &&
196
- field.doubleValue !== undefined) {
197
- row[colName] = field.doubleValue;
198
- }
199
- else if ("stringValue" in field &&
200
- field.stringValue !== undefined) {
201
- row[colName] = field.stringValue;
202
- }
203
- else {
204
- row[colName] = null;
205
- }
206
- }
207
- allRows.push(row);
208
- }
209
- nextToken = page.NextToken;
210
- } while (nextToken);
211
- return {
212
- columns: columns ?? [],
213
- rows: allRows,
214
- rowCount: allRows.length,
215
- durationMs: Date.now() - start,
216
- fromCache: false,
217
- };
218
- }
219
- async testConnection() {
220
- const start = Date.now();
221
- try {
222
- await this.query({ type: "sql", sql: "SELECT 1" });
223
- return { ok: true, latencyMs: Date.now() - start };
224
- }
225
- catch (error) {
226
- return {
227
- ok: false,
228
- latencyMs: Date.now() - start,
229
- error: error.message,
230
- };
231
- }
232
- }
233
- async close() {
234
- // No-op: stateless API client
235
- }
236
- }
237
- //# sourceMappingURL=redshift-data.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redshift-data.js","sourceRoot":"","sources":["../../src/connectors/redshift-data.ts"],"names":[],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- import type { Connector, QueryRequest, QueryResult, QueryOptions, ConnectionTestResult, ColumnMeta } from "./types";
2
- export declare function mapOidToType(oid: number): ColumnMeta["type"];
3
- export interface RedshiftIamAuth {
4
- type: "iam";
5
- provider: "aws" | "gcp";
6
- region?: string;
7
- username?: string;
8
- }
9
- export interface RedshiftConnectorConfig {
10
- id: string;
11
- host: string;
12
- port?: number;
13
- database: string;
14
- user: string;
15
- password: string;
16
- ssl: "require" | "prefer" | boolean;
17
- pool_size: number;
18
- auth?: RedshiftIamAuth;
19
- }
20
- export declare class RedshiftConnector implements Connector {
21
- readonly id: string;
22
- readonly type: "redshift";
23
- private pool;
24
- constructor(config: RedshiftConnectorConfig);
25
- query(request: QueryRequest, options?: QueryOptions): Promise<QueryResult>;
26
- testConnection(): Promise<ConnectionTestResult>;
27
- close(): Promise<void>;
28
- }
29
- //# sourceMappingURL=redshift.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redshift.d.ts","sourceRoot":"","sources":["../../src/connectors/redshift.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACX,MAAM,SAAS,CAAC;AAMjB,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CA+B5D;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,KAAK,GAAG,KAAK,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAsCD,qBAAa,iBAAkB,YAAW,SAAS;IACjD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,OAAO,CAAC,IAAI,CAAO;gBAEP,MAAM,EAAE,uBAAuB;IA0BrC,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC;IA2BjB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAc/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,141 +0,0 @@
1
- // Copyright 2026 Mataki Labs LLC
2
- //
3
- // Licensed under the Business Source License 1.1 (the "License");
4
- // you may not use this file except in compliance with the License.
5
- // You may obtain a copy of the License at
6
- //
7
- // https://github.com/panoboard/panoboard/blob/main/LICENSE
8
- //
9
- // Unless required by applicable law or agreed to in writing, software
10
- // distributed under the License is distributed on an "AS IS" BASIS,
11
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- // See the License for the specific language governing permissions and
13
- // limitations under the License.
14
- import { Pool } from "pg";
15
- import { normalizeParams } from "./params";
16
- // Redshift shares OID semantics with Postgres for the common types.
17
- // Re-export the same mapping function under a Redshift-specific name so
18
- // the test file can import from this module if needed.
19
- export function mapOidToType(oid) {
20
- switch (oid) {
21
- // integers
22
- case 20: // int8
23
- case 21: // int2
24
- case 23: // int4
25
- // floats
26
- // falls through
27
- case 700: // float4
28
- case 701: // float8
29
- // numeric / decimal
30
- // falls through
31
- case 1700:
32
- return "number";
33
- case 16: // bool
34
- return "boolean";
35
- case 25: // text
36
- case 1042: // bpchar
37
- case 1043: // varchar
38
- return "string";
39
- case 1082: // date
40
- case 1114: // timestamp
41
- case 1184: // timestamptz
42
- return "date";
43
- default:
44
- return "string";
45
- }
46
- }
47
- const DEFAULT_PORT = 5439;
48
- async function resolveIamPassword(config) {
49
- if (!config.auth || config.auth.type !== "iam") {
50
- return config.password;
51
- }
52
- if (config.auth.provider === "aws") {
53
- const { Signer } = await import("@aws-sdk/rds-signer");
54
- const signer = new Signer({
55
- hostname: config.host,
56
- port: config.port ?? DEFAULT_PORT,
57
- username: config.auth.username ?? config.user,
58
- region: config.auth.region,
59
- });
60
- return signer.getAuthToken();
61
- }
62
- if (config.auth.provider === "gcp") {
63
- const { GoogleAuth } = await import("google-auth-library");
64
- const auth = new GoogleAuth({
65
- scopes: ["https://www.googleapis.com/auth/sqlservice.admin"],
66
- });
67
- const client = await auth.getClient();
68
- const tokenResponse = await client.getAccessToken();
69
- if (!tokenResponse.token) {
70
- throw new Error("Failed to get GCP access token for IAM auth");
71
- }
72
- return tokenResponse.token;
73
- }
74
- return config.password;
75
- }
76
- export class RedshiftConnector {
77
- id;
78
- type = "redshift";
79
- pool;
80
- constructor(config) {
81
- this.id = config.id;
82
- this.pool = new Pool({
83
- host: config.host,
84
- port: config.port ?? DEFAULT_PORT,
85
- database: config.database,
86
- user: config.user,
87
- password: config.auth?.type === "iam"
88
- ? () => resolveIamPassword(config)
89
- : config.password,
90
- ssl: config.ssl === "require"
91
- ? { rejectUnauthorized: true }
92
- : config.ssl === "prefer"
93
- ? { rejectUnauthorized: false }
94
- : config.ssl === true
95
- ? { rejectUnauthorized: true }
96
- : undefined,
97
- max: config.pool_size,
98
- });
99
- this.pool.on("error", (err) => {
100
- console.error(`[${this.id}] pg.Pool idle client error:`, err.message);
101
- });
102
- }
103
- async query(request, options) {
104
- if (request.type !== "sql") {
105
- throw new Error("[RedshiftConnector] only supports SQL queries");
106
- }
107
- const start = Date.now();
108
- const { normalizedSql, values } = normalizeParams(request.sql, options?.params ?? {});
109
- const result = await this.pool.query(normalizedSql, values);
110
- const columns = result.fields.map((f) => ({
111
- name: f.name,
112
- type: mapOidToType(f.dataTypeID),
113
- nullable: true, // pg driver doesn't expose nullability in query results
114
- }));
115
- return {
116
- columns,
117
- rows: result.rows,
118
- rowCount: result.rowCount ?? result.rows.length,
119
- durationMs: Date.now() - start,
120
- fromCache: false,
121
- };
122
- }
123
- async testConnection() {
124
- const start = Date.now();
125
- try {
126
- await this.pool.query("SELECT 1");
127
- return { ok: true, latencyMs: Date.now() - start };
128
- }
129
- catch (error) {
130
- return {
131
- ok: false,
132
- latencyMs: Date.now() - start,
133
- error: error.message,
134
- };
135
- }
136
- }
137
- async close() {
138
- await this.pool.end();
139
- }
140
- }
141
- //# sourceMappingURL=redshift.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redshift.js","sourceRoot":"","sources":["../../src/connectors/redshift.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAS1B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,oEAAoE;AACpE,wEAAwE;AACxE,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,QAAQ,GAAG,EAAE,CAAC;QACZ,WAAW;QACX,KAAK,EAAE,CAAC,CAAC,OAAO;QAChB,KAAK,EAAE,CAAC,CAAC,OAAO;QAChB,KAAK,EAAE,CAAC,CAAC,OAAO;QAChB,SAAS;QACT,gBAAgB;QAChB,KAAK,GAAG,CAAC,CAAC,SAAS;QACnB,KAAK,GAAG,CAAC,CAAC,SAAS;QACnB,oBAAoB;QACpB,gBAAgB;QAChB,KAAK,IAAI;YACP,OAAO,QAAQ,CAAC;QAElB,KAAK,EAAE,EAAE,OAAO;YACd,OAAO,SAAS,CAAC;QAEnB,KAAK,EAAE,CAAC,CAAC,OAAO;QAChB,KAAK,IAAI,CAAC,CAAC,SAAS;QACpB,KAAK,IAAI,EAAE,UAAU;YACnB,OAAO,QAAQ,CAAC;QAElB,KAAK,IAAI,CAAC,CAAC,OAAO;QAClB,KAAK,IAAI,CAAC,CAAC,YAAY;QACvB,KAAK,IAAI,EAAE,cAAc;YACvB,OAAO,MAAM,CAAC;QAEhB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAqBD,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,KAAK,UAAU,kBAAkB,CAC/B,MAA+B;IAE/B,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACnC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,QAAQ,EAAE,MAAM,CAAC,IAAI;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,YAAY;YACjC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI;YAC7C,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;SAC3B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACnC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC1B,MAAM,EAAE,CAAC,kDAAkD,CAAC;SAC7D,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,aAAa,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,OAAO,iBAAiB;IACnB,EAAE,CAAS;IACX,IAAI,GAAG,UAAmB,CAAC;IAC5B,IAAI,CAAO;IAEnB,YAAY,MAA+B;QACzC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,YAAY;YACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EACN,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK;gBACzB,CAAC,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC;gBAClC,CAAC,CAAC,MAAM,CAAC,QAAQ;YACrB,GAAG,EACD,MAAM,CAAC,GAAG,KAAK,SAAS;gBACtB,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE;gBAC9B,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ;oBACvB,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE;oBAC/B,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI;wBACnB,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE;wBAC9B,CAAC,CAAC,SAAS;YACnB,GAAG,EAAE,MAAM,CAAC,SAAS;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,8BAA8B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CACT,OAAqB,EACrB,OAAsB;QAEtB,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,eAAe,CAC/C,OAAO,CAAC,GAAG,EACX,OAAO,EAAE,MAAM,IAAI,EAAE,CACtB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAE5D,MAAM,OAAO,GAAiB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;YAChC,QAAQ,EAAE,IAAI,EAAE,wDAAwD;SACzE,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO;YACP,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;YAC/C,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC9B,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAClC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC7B,KAAK,EAAG,KAAe,CAAC,OAAO;aAChC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -1,7 +0,0 @@
1
- import type { Connector } from "./types";
2
- export declare function registerConnector(connector: Connector): void;
3
- export declare function getConnector(id: string): Connector | undefined;
4
- export declare function getAllConnectors(): Connector[];
5
- export declare function closeAll(): Promise<void>;
6
- export declare function clearRegistry(): void;
7
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIzC,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAE5D;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE9D;AAED,wBAAgB,gBAAgB,IAAI,SAAS,EAAE,CAE9C;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAE9C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
@@ -1,30 +0,0 @@
1
- // Copyright 2026 Mataki Labs LLC
2
- //
3
- // Licensed under the Business Source License 1.1 (the "License");
4
- // you may not use this file except in compliance with the License.
5
- // You may obtain a copy of the License at
6
- //
7
- // https://github.com/panoboard/panoboard/blob/main/LICENSE
8
- //
9
- // Unless required by applicable law or agreed to in writing, software
10
- // distributed under the License is distributed on an "AS IS" BASIS,
11
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- // See the License for the specific language governing permissions and
13
- // limitations under the License.
14
- const registry = new Map();
15
- export function registerConnector(connector) {
16
- registry.set(connector.id, connector);
17
- }
18
- export function getConnector(id) {
19
- return registry.get(id);
20
- }
21
- export function getAllConnectors() {
22
- return Array.from(registry.values());
23
- }
24
- export async function closeAll() {
25
- await Promise.all(Array.from(registry.values()).map((c) => c.close()));
26
- }
27
- export function clearRegistry() {
28
- registry.clear();
29
- }
30
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAIjC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE9C,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IACpD,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
@@ -1,37 +0,0 @@
1
- import type { Connector, QueryRequest, QueryResult, QueryOptions, ConnectionTestResult, ColumnMeta } from "./types";
2
- export declare function mapSnowflakeType(sfType: string): ColumnMeta["type"];
3
- interface SnowflakePasswordAuth {
4
- type: "password";
5
- user: string;
6
- password: string;
7
- }
8
- interface SnowflakeKeyPairAuth {
9
- type: "key-pair";
10
- user: string;
11
- private_key_file?: string;
12
- private_key?: string;
13
- passphrase?: string;
14
- }
15
- type SnowflakeAuth = SnowflakePasswordAuth | SnowflakeKeyPairAuth;
16
- export interface SnowflakeConnectorConfig {
17
- id: string;
18
- account: string;
19
- warehouse: string;
20
- database: string;
21
- schema?: string;
22
- role?: string;
23
- auth: SnowflakeAuth;
24
- }
25
- export declare class SnowflakeConnector implements Connector {
26
- readonly id: string;
27
- readonly type: "snowflake";
28
- private connection;
29
- private connected;
30
- constructor(config: SnowflakeConnectorConfig);
31
- private ensureConnected;
32
- query(request: QueryRequest, options?: QueryOptions): Promise<QueryResult>;
33
- testConnection(): Promise<ConnectionTestResult>;
34
- close(): Promise<void>;
35
- }
36
- export {};
37
- //# sourceMappingURL=snowflake.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snowflake.d.ts","sourceRoot":"","sources":["../../src/connectors/snowflake.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACX,MAAM,SAAS,CAAC;AAGjB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAwCnE;AAED,UAAU,qBAAqB;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,aAAa,GAAG,qBAAqB,GAAG,oBAAoB,CAAC;AAElE,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;CACrB;AA2BD,qBAAa,kBAAmB,YAAW,SAAS;IAClD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IACrC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,wBAAwB;YA4B9B,eAAe;IAcvB,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC;IA6CjB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAc/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}