@panoboard/core 1.11.7 → 1.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/PanelWrapper.js +50 -5
- package/dist/components/PanelWrapper.js.map +1 -1
- package/dist/components/panels/TablePanel.d.ts +7 -1
- package/dist/components/panels/TablePanel.d.ts.map +1 -1
- package/dist/components/panels/TablePanel.js +38 -23
- package/dist/components/panels/TablePanel.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -8
- package/dist/index.js.map +1 -1
- package/dist/schemas/dashboard.d.ts +1 -0
- package/dist/schemas/dashboard.d.ts.map +1 -1
- package/dist/schemas/datasource.d.ts +118 -0
- package/dist/schemas/datasource.d.ts.map +1 -1
- package/dist/schemas/datasource.js +46 -0
- package/dist/schemas/datasource.js.map +1 -1
- package/dist/transforms/computed.d.ts +1 -1
- package/dist/transforms/computed.d.ts.map +1 -1
- package/dist/transforms/engine.d.ts +1 -1
- package/dist/transforms/engine.d.ts.map +1 -1
- package/dist/transforms/filter.d.ts +1 -1
- package/dist/transforms/filter.d.ts.map +1 -1
- package/dist/transforms/limit.d.ts +1 -1
- package/dist/transforms/limit.d.ts.map +1 -1
- package/dist/transforms/percentage.d.ts +1 -1
- package/dist/transforms/percentage.d.ts.map +1 -1
- package/dist/transforms/rename.d.ts +1 -1
- package/dist/transforms/rename.d.ts.map +1 -1
- package/dist/transforms/sort.d.ts +1 -1
- package/dist/transforms/sort.d.ts.map +1 -1
- package/dist/{connectors/types.d.ts → types/connector-types.d.ts} +8 -2
- package/dist/types/connector-types.d.ts.map +1 -0
- package/dist/{query/strategy/types.js → types/connector-types.js} +1 -1
- package/dist/types/connector-types.js.map +1 -0
- package/package.json +2 -39
- package/dist/annotations/executor.d.ts +0 -32
- package/dist/annotations/executor.d.ts.map +0 -1
- package/dist/annotations/executor.js +0 -87
- package/dist/annotations/executor.js.map +0 -1
- package/dist/annotations/index.d.ts +0 -2
- package/dist/annotations/index.d.ts.map +0 -1
- package/dist/annotations/index.js +0 -15
- package/dist/annotations/index.js.map +0 -1
- package/dist/cache/cache.d.ts +0 -11
- package/dist/cache/cache.d.ts.map +0 -1
- package/dist/cache/cache.js +0 -42
- package/dist/cache/cache.js.map +0 -1
- package/dist/cache/client.d.ts +0 -9
- package/dist/cache/client.d.ts.map +0 -1
- package/dist/cache/client.js +0 -63
- package/dist/cache/client.js.map +0 -1
- package/dist/cache/index.d.ts +0 -4
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/index.js +0 -17
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/keys.d.ts +0 -2
- package/dist/cache/keys.d.ts.map +0 -1
- package/dist/cache/keys.js +0 -26
- package/dist/cache/keys.js.map +0 -1
- package/dist/connectors/bigquery.d.ts +0 -26
- package/dist/connectors/bigquery.d.ts.map +0 -1
- package/dist/connectors/bigquery.js +0 -118
- package/dist/connectors/bigquery.js.map +0 -1
- package/dist/connectors/index.d.ts +0 -17
- package/dist/connectors/index.d.ts.map +0 -1
- package/dist/connectors/index.js +0 -23
- package/dist/connectors/index.js.map +0 -1
- package/dist/connectors/params.d.ts +0 -15
- package/dist/connectors/params.d.ts.map +0 -1
- package/dist/connectors/params.js +0 -46
- package/dist/connectors/params.js.map +0 -1
- package/dist/connectors/postgres.d.ts +0 -29
- package/dist/connectors/postgres.d.ts.map +0 -1
- package/dist/connectors/postgres.js +0 -133
- package/dist/connectors/postgres.js.map +0 -1
- package/dist/connectors/redshift-data.d.ts +0 -25
- package/dist/connectors/redshift-data.d.ts.map +0 -1
- package/dist/connectors/redshift-data.js +0 -237
- package/dist/connectors/redshift-data.js.map +0 -1
- package/dist/connectors/redshift.d.ts +0 -29
- package/dist/connectors/redshift.d.ts.map +0 -1
- package/dist/connectors/redshift.js +0 -141
- package/dist/connectors/redshift.js.map +0 -1
- package/dist/connectors/registry.d.ts +0 -7
- package/dist/connectors/registry.d.ts.map +0 -1
- package/dist/connectors/registry.js +0 -30
- package/dist/connectors/registry.js.map +0 -1
- package/dist/connectors/snowflake.d.ts +0 -37
- package/dist/connectors/snowflake.d.ts.map +0 -1
- package/dist/connectors/snowflake.js +0 -181
- package/dist/connectors/snowflake.js.map +0 -1
- package/dist/connectors/types.d.ts.map +0 -1
- package/dist/connectors/types.js +0 -15
- package/dist/connectors/types.js.map +0 -1
- package/dist/connectors/url-parsers.d.ts +0 -13
- package/dist/connectors/url-parsers.d.ts.map +0 -1
- package/dist/connectors/url-parsers.js +0 -95
- package/dist/connectors/url-parsers.js.map +0 -1
- package/dist/connectors/url.d.ts +0 -36
- package/dist/connectors/url.d.ts.map +0 -1
- package/dist/connectors/url.js +0 -139
- package/dist/connectors/url.js.map +0 -1
- package/dist/query/array-expansion.d.ts +0 -5
- package/dist/query/array-expansion.d.ts.map +0 -1
- package/dist/query/array-expansion.js +0 -39
- package/dist/query/array-expansion.js.map +0 -1
- package/dist/query/index.d.ts +0 -8
- package/dist/query/index.d.ts.map +0 -1
- package/dist/query/index.js +0 -20
- package/dist/query/index.js.map +0 -1
- package/dist/query/pipeline.d.ts +0 -27
- package/dist/query/pipeline.d.ts.map +0 -1
- package/dist/query/pipeline.js +0 -49
- package/dist/query/pipeline.js.map +0 -1
- package/dist/query/strategy/http.d.ts +0 -7
- package/dist/query/strategy/http.d.ts.map +0 -1
- package/dist/query/strategy/http.js +0 -26
- package/dist/query/strategy/http.js.map +0 -1
- package/dist/query/strategy/index.d.ts +0 -4
- package/dist/query/strategy/index.d.ts.map +0 -1
- package/dist/query/strategy/index.js +0 -32
- package/dist/query/strategy/index.js.map +0 -1
- package/dist/query/strategy/sql.d.ts +0 -7
- package/dist/query/strategy/sql.d.ts.map +0 -1
- package/dist/query/strategy/sql.js +0 -40
- package/dist/query/strategy/sql.js.map +0 -1
- package/dist/query/strategy/types.d.ts +0 -6
- package/dist/query/strategy/types.d.ts.map +0 -1
- package/dist/query/strategy/types.js.map +0 -1
- package/dist/query/template.d.ts +0 -7
- package/dist/query/template.d.ts.map +0 -1
- package/dist/query/template.js +0 -43
- package/dist/query/template.js.map +0 -1
- package/dist/startup/index.d.ts +0 -5
- package/dist/startup/index.d.ts.map +0 -1
- package/dist/startup/index.js +0 -16
- package/dist/startup/index.js.map +0 -1
- package/dist/startup/sentinel-check.d.ts +0 -12
- package/dist/startup/sentinel-check.d.ts.map +0 -1
- package/dist/startup/sentinel-check.js +0 -142
- package/dist/startup/sentinel-check.js.map +0 -1
- package/dist/startup/sql-lint.d.ts +0 -13
- package/dist/startup/sql-lint.d.ts.map +0 -1
- package/dist/startup/sql-lint.js +0 -87
- 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":"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,EACL,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AAUvC,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAElB,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAElB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;QAEnB,KAAK,MAAM,CAAC;QACZ,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,MAAM,CAAC;QAEhB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAkBD,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,KAAK,UAAU,kBAAkB,CAC/B,IAAyC,EACzC,MAAc;IAEd,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GACpC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CACnC,IAAI,iBAAiB,CAAC;YACpB,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,eAAe,EAAE,yBAAyB;SAC3C,CAAC,CACH,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO;YACL,WAAW,EAAE;gBACX,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAY;gBAC9C,eAAe,EAAE,QAAQ,CAAC,WAAW,CAAC,eAAgB;gBACtD,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,YAAa;aACjD;SACF,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,MAAM,OAAO,qBAAqB;IACvB,EAAE,CAAS;IACX,IAAI,GAAG,eAAwB,CAAC;IAEjC,MAAM,CAAqB;IAC3B,MAAM,CAA8B;IAE5C,YAAY,MAAmC;QAC7C,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,4EAA4E;QAC5E,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClE,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,EAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CACnB,CAAC;YACF,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,IAAI,kBAAkB,CAAC;oBAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;oBAC1B,GAAG,WAAW;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CACT,OAAqB,EACrB,OAAsB;QAEtB,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEtC,0CAA0C;QAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAChE,IAAI;YACJ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;SACrB,CAAC,CAAC,CAAC;QAEJ,uBAAuB;QACvB,MAAM,UAAU,GAAG,IAAI,uBAAuB,CAAC;YAC7C,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB;gBAChC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;gBACvD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc;gBAC5B,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;gBAC/C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,aAAa,CAAC,EAAG,CAAC;QAEtC,6DAA6D;QAC7D,MAAM,YAAY,GAAG,IAAI,KAAK,CAC5B,oCAAoC,SAAS,IAAI,CAClD,CAAC;QACF,IAAI,UAAU,GAAG,GAAG,CAAC;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC;QAE3B,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;YACrC,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,SAAS,EAAE,CAAC;oBAC/D,sDAAsD;oBACtD,IAAI,CAAC;wBACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;oBACrE,CAAC;oBAAC,MAAM,CAAC;wBACP,uDAAuD;oBACzD,CAAC;oBACD,MAAM,YAAY,CAAC;gBACrB,CAAC;gBAED,MAAM,WAAW,GAAG,IAAI,wBAAwB,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBACtE,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACtD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;gBAErC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC1B,OAAO;gBACT,CAAC;gBAED,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChD,MAAM,IAAI,KAAK,CACb,0BAA0B,WAAW,uBAAuB,MAAM,EAAE,CACrE,CAAC;gBACJ,CAAC;gBAED,uDAAuD;gBACvD,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,SAAS,EAAE,CAAC;oBAC/D,IAAI,CAAC;wBACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;oBACrE,CAAC;oBAAC,MAAM,CAAC;wBACP,WAAW;oBACb,CAAC;oBACD,MAAM,YAAY,CAAC;gBACrB,CAAC;gBAED,wBAAwB;gBACxB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;gBACpD,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,IAAI,EAAE,CAAC;QAEb,qDAAqD;QACrD,IAAI,SAA6B,CAAC;QAClC,IAAI,OAAO,GAAwB,IAAI,CAAC;QACxC,MAAM,OAAO,GAA8B,EAAE,CAAC;QAE9C,GAAG,CAAC;YACF,MAAM,YAAY,GAAG,IAAI,yBAAyB,CAAC;gBACjD,EAAE,EAAE,WAAW;gBACf,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/C,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE7C,4CAA4C;YAC5C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAClD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;oBACpB,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;oBAC3C,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC,CAAC;YACN,CAAC;YAED,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBACxC,MAAM,GAAG,GAA4B,EAAE,CAAC;gBACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;wBACjB,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;oBACtB,CAAC;yBAAM,IAAI,WAAW,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;wBACjE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;oBACjC,CAAC;yBAAM,IACL,cAAc,IAAI,KAAK;wBACvB,KAAK,CAAC,YAAY,KAAK,SAAS,EAChC,CAAC;wBACD,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;oBACpC,CAAC;yBAAM,IACL,aAAa,IAAI,KAAK;wBACtB,KAAK,CAAC,WAAW,KAAK,SAAS,EAC/B,CAAC;wBACD,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;oBACnC,CAAC;yBAAM,IACL,aAAa,IAAI,KAAK;wBACtB,KAAK,CAAC,WAAW,KAAK,SAAS,EAC/B,CAAC;wBACD,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;oBACnC,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;oBACtB,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YAED,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,CAAC,QAAQ,SAAS,EAAE;QAEpB,OAAO;YACL,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,OAAO,CAAC,MAAM;YACxB,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,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;YACnD,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,8BAA8B;IAChC,CAAC;CACF"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|