@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.
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 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cache/client.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,KAAK,MAAM,SAAS,CAAC;AAE5B,IAAI,MAAM,GAAiB,IAAI,CAAC;AAChC,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,SAAS,CAAC,MAA4C;IACpE,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QAC7B,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC;KACtD,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACxB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;QAChC,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACrD,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QAC1B,OAAO,CAAC,IAAI,CACV,8DAA8D,CAC/D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW;IACxC,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,MAAM,MAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,GAAW,EACX,KAAa;IAEb,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO;IAC3B,IAAI,CAAC;QACH,MAAM,MAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,UAAU;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,GAAG,IAAI,CAAC;QACd,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -1,4 +0,0 @@
1
- export { buildCacheKey } from "./keys";
2
- export { cachedQuery, resolveTtl } from "./cache";
3
- export { initCache, cacheGet, cacheSet, isAvailable, closeCache, } from "./client";
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EACL,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,UAAU,GACX,MAAM,UAAU,CAAC"}
@@ -1,17 +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
- export { buildCacheKey } from "./keys";
15
- export { cachedQuery, resolveTtl } from "./cache";
16
- export { initCache, cacheGet, cacheSet, isAvailable, closeCache, } from "./client";
17
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.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,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EACL,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,UAAU,GACX,MAAM,UAAU,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function buildCacheKey(prefix: string, slug: string, panelId: string, params: Record<string, unknown>, queryIdentifier?: string): string;
2
- //# sourceMappingURL=keys.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/cache/keys.ts"],"names":[],"mappings":"AAgBA,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAaR"}
@@ -1,26 +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 { createHash } from "crypto";
15
- export function buildCacheKey(prefix, slug, panelId, params, queryIdentifier) {
16
- const sortedEntries = Object.entries(params).sort(([a], [b]) => a.localeCompare(b));
17
- const hashParts = queryIdentifier
18
- ? [queryIdentifier, sortedEntries]
19
- : [sortedEntries];
20
- const hash = createHash("sha256")
21
- .update(JSON.stringify(hashParts))
22
- .digest("hex")
23
- .slice(0, 16);
24
- return `${prefix}:panel:${slug}:${panelId}:${hash}`;
25
- }
26
- //# sourceMappingURL=keys.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/cache/keys.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,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,IAAY,EACZ,OAAe,EACf,MAA+B,EAC/B,eAAwB;IAExB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7D,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CACnB,CAAC;IACF,MAAM,SAAS,GAAc,eAAe;QAC1C,CAAC,CAAC,CAAC,eAAe,EAAE,aAAa,CAAC;QAClC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAEpB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;SACjC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,GAAG,MAAM,UAAU,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;AACtD,CAAC"}
@@ -1,26 +0,0 @@
1
- import type { Connector, QueryRequest, QueryResult, QueryOptions, ConnectionTestResult, ColumnMeta } from "./types";
2
- export declare function mapBigQueryType(bqType: string): ColumnMeta["type"];
3
- export interface BigQueryConnectorConfig {
4
- id: string;
5
- project: string;
6
- dataset?: string;
7
- location?: string;
8
- auth: {
9
- type: "adc";
10
- } | {
11
- type: "service-account-key";
12
- key_file?: string;
13
- key_json?: string;
14
- };
15
- }
16
- export declare class BigQueryConnector implements Connector {
17
- readonly id: string;
18
- readonly type: "bigquery";
19
- private client;
20
- private location?;
21
- constructor(config: BigQueryConnectorConfig);
22
- query(request: QueryRequest, options?: QueryOptions): Promise<QueryResult>;
23
- testConnection(): Promise<ConnectionTestResult>;
24
- close(): Promise<void>;
25
- }
26
- //# sourceMappingURL=bigquery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bigquery.d.ts","sourceRoot":"","sources":["../../src/connectors/bigquery.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACX,MAAM,SAAS,CAAC;AAMjB,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CA2BlE;AAMD,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EACA;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,GACf;QAAE,IAAI,EAAE,qBAAqB,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAMD,qBAAa,iBAAkB,YAAW,SAAS;IACjD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAEd,MAAM,EAAE,uBAAuB;IAmBrC,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC;IAiDjB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAe/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,118 +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 { BigQuery } from "@google-cloud/bigquery";
15
- // ---------------------------------------------------------------------------
16
- // BigQuery column type → normalized column type
17
- // ---------------------------------------------------------------------------
18
- export function mapBigQueryType(bqType) {
19
- switch (bqType) {
20
- case "STRING":
21
- case "BYTES":
22
- return "string";
23
- case "INT64":
24
- case "FLOAT64":
25
- case "NUMERIC":
26
- case "BIGNUMERIC":
27
- return "number";
28
- case "BOOL":
29
- return "boolean";
30
- case "DATE":
31
- case "DATETIME":
32
- case "TIMESTAMP":
33
- case "TIME":
34
- return "date";
35
- case "NULL":
36
- return "null";
37
- default:
38
- return "string";
39
- }
40
- }
41
- // ---------------------------------------------------------------------------
42
- // Connector implementation
43
- // ---------------------------------------------------------------------------
44
- export class BigQueryConnector {
45
- id;
46
- type = "bigquery";
47
- client;
48
- location;
49
- constructor(config) {
50
- this.id = config.id;
51
- this.location = config.location;
52
- const clientOptions = {
53
- projectId: config.project,
54
- };
55
- if (config.auth.type === "service-account-key") {
56
- if (config.auth.key_file) {
57
- clientOptions.keyFilename = config.auth.key_file;
58
- }
59
- else if (config.auth.key_json) {
60
- clientOptions.credentials = JSON.parse(config.auth.key_json);
61
- }
62
- }
63
- this.client = new BigQuery(clientOptions);
64
- }
65
- async query(request, options) {
66
- if (request.type !== "sql") {
67
- throw new Error("[BigQueryConnector] only supports SQL queries");
68
- }
69
- const start = Date.now();
70
- // Replace :param_name with @param_name (BigQuery named param syntax)
71
- const normalizedSql = request.sql.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_match, name) => `@${name}`);
72
- // BigQuery SDK throws if any param value is null without an explicit type.
73
- // Strip nulls — unbound params will result in a "parameter not found" error
74
- // from BigQuery, which surfaces as a panel-level 500, not a process crash.
75
- const rawParams = request.params ?? options?.params ?? {};
76
- const params = Object.fromEntries(Object.entries(rawParams).filter(([, v]) => v !== null && v !== undefined));
77
- const queryOptions = {
78
- query: normalizedSql,
79
- params,
80
- };
81
- if (this.location !== undefined) {
82
- queryOptions.location = this.location;
83
- }
84
- const [rows, metadata] = await this.client.query(queryOptions);
85
- const fields = metadata?.schema?.fields ?? [];
86
- const columns = fields.map((f) => ({
87
- name: f.name,
88
- type: mapBigQueryType(f.type),
89
- nullable: true, // BigQuery does not expose nullability in query responses
90
- }));
91
- return {
92
- columns,
93
- rows: rows,
94
- rowCount: rows.length,
95
- durationMs: Date.now() - start,
96
- fromCache: false,
97
- };
98
- }
99
- async testConnection() {
100
- const start = Date.now();
101
- try {
102
- await this.client.query({ query: "SELECT 1" });
103
- return { ok: true, latencyMs: Date.now() - start };
104
- }
105
- catch (error) {
106
- return {
107
- ok: false,
108
- latencyMs: Date.now() - start,
109
- error: error.message,
110
- };
111
- }
112
- }
113
- // BigQuery SDK is stateless (HTTP-based); nothing to close.
114
- async close() {
115
- // no-op
116
- }
117
- }
118
- //# sourceMappingURL=bigquery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bigquery.js","sourceRoot":"","sources":["../../src/connectors/bigquery.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- export type { DatasourceType, QueryRequest, ColumnMeta, QueryResult, QueryOptions, ConnectionTestResult, Connector, } from "./types";
2
- export { normalizeParams, type ParamStyle } from "./params";
3
- export { registerConnector, getConnector, getAllConnectors, closeAll, clearRegistry, } from "./registry";
4
- export { PostgresConnector, mapOidToType } from "./postgres";
5
- export type { PostgresConnectorConfig, PostgresIamAuth } from "./postgres";
6
- export { BigQueryConnector, mapBigQueryType } from "./bigquery";
7
- export type { BigQueryConnectorConfig } from "./bigquery";
8
- export { RedshiftConnector } from "./redshift";
9
- export type { RedshiftConnectorConfig, RedshiftIamAuth } from "./redshift";
10
- export { RedshiftDataConnector, mapTypeNameToType } from "./redshift-data";
11
- export type { RedshiftDataConnectorConfig } from "./redshift-data";
12
- export { UrlConnector } from "./url";
13
- export type { UrlConnectorConfig } from "./url";
14
- export { SnowflakeConnector, mapSnowflakeType } from "./snowflake";
15
- export type { SnowflakeConnectorConfig } from "./snowflake";
16
- export { parsePanoboard, parseArray, parseGrafana, parseDatasette, parseJsonl, } from "./url-parsers";
17
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAcA,YAAY,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,SAAS,GACV,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3E,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,YAAY,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EACL,cAAc,EACd,UAAU,EACV,YAAY,EACZ,cAAc,EACd,UAAU,GACX,MAAM,eAAe,CAAC"}
@@ -1,23 +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
- export { normalizeParams } from "./params";
15
- export { registerConnector, getConnector, getAllConnectors, closeAll, clearRegistry, } from "./registry";
16
- export { PostgresConnector, mapOidToType } from "./postgres";
17
- export { BigQueryConnector, mapBigQueryType } from "./bigquery";
18
- export { RedshiftConnector } from "./redshift";
19
- export { RedshiftDataConnector, mapTypeNameToType } from "./redshift-data";
20
- export { UrlConnector } from "./url";
21
- export { SnowflakeConnector, mapSnowflakeType } from "./snowflake";
22
- export { parsePanoboard, parseArray, parseGrafana, parseDatasette, parseJsonl, } from "./url-parsers";
23
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.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;AAYjC,OAAO,EAAE,eAAe,EAAmB,MAAM,UAAU,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG3E,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,EACL,cAAc,EACd,UAAU,EACV,YAAY,EACZ,cAAc,EACd,UAAU,GACX,MAAM,eAAe,CAAC"}
@@ -1,15 +0,0 @@
1
- export type ParamStyle = "numbered" | "positional";
2
- /**
3
- * Normalizes named :param_name placeholders in SQL to driver-specific
4
- * positional parameters.
5
- *
6
- * @param style - "numbered" ($1, $2) for Postgres/Redshift, "positional" (?) for Snowflake
7
- *
8
- * With "numbered": duplicate :param references reuse the same $N index.
9
- * With "positional": each :param occurrence gets its own ? slot.
10
- */
11
- export declare function normalizeParams(sql: string, params: Record<string, unknown>, style?: ParamStyle): {
12
- normalizedSql: string;
13
- values: unknown[];
14
- };
15
- //# sourceMappingURL=params.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/connectors/params.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAEnD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,GAAE,UAAuB,GAC7B;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CA6B9C"}
@@ -1,46 +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
- /**
15
- * Normalizes named :param_name placeholders in SQL to driver-specific
16
- * positional parameters.
17
- *
18
- * @param style - "numbered" ($1, $2) for Postgres/Redshift, "positional" (?) for Snowflake
19
- *
20
- * With "numbered": duplicate :param references reuse the same $N index.
21
- * With "positional": each :param occurrence gets its own ? slot.
22
- */
23
- export function normalizeParams(sql, params, style = "numbered") {
24
- if (style === "positional") {
25
- const paramNames = [];
26
- const normalizedSql = sql.replace(/(?<!:):([a-zA-Z_][a-zA-Z0-9_]*)/g, (_match, name) => {
27
- paramNames.push(name);
28
- return "?";
29
- });
30
- const values = paramNames.map((name) => params[name] ?? null);
31
- return { normalizedSql, values };
32
- }
33
- // "numbered" — Postgres/Redshift style ($1, $2, ...)
34
- const paramNames = [];
35
- const paramMap = new Map();
36
- const normalizedSql = sql.replace(/(?<!:):([a-zA-Z_][a-zA-Z0-9_]*)/g, (_match, name) => {
37
- if (!paramMap.has(name)) {
38
- paramMap.set(name, paramNames.length + 1);
39
- paramNames.push(name);
40
- }
41
- return `$${paramMap.get(name)}`;
42
- });
43
- const values = paramNames.map((name) => params[name] ?? null);
44
- return { normalizedSql, values };
45
- }
46
- //# sourceMappingURL=params.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/connectors/params.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;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,MAA+B,EAC/B,QAAoB,UAAU;IAE9B,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAC/B,kCAAkC,EAClC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACf,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,GAAG,CAAC;QACb,CAAC,CACF,CAAC;QACF,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IACnC,CAAC;IAED,qDAAqD;IACrD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAC/B,kCAAkC,EAClC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IAClC,CAAC,CACF,CAAC;IACF,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACnC,CAAC"}
@@ -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 PostgresIamAuth {
4
- type: "iam";
5
- provider: "aws" | "gcp";
6
- region?: string;
7
- username?: string;
8
- }
9
- export interface PostgresConnectorConfig {
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?: PostgresIamAuth;
19
- }
20
- export declare class PostgresConnector implements Connector {
21
- readonly id: string;
22
- readonly type: "postgres";
23
- private pool;
24
- constructor(config: PostgresConnectorConfig);
25
- query(request: QueryRequest, options?: QueryOptions): Promise<QueryResult>;
26
- testConnection(): Promise<ConnectionTestResult>;
27
- close(): Promise<void>;
28
- }
29
- //# sourceMappingURL=postgres.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/connectors/postgres.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACX,MAAM,SAAS,CAAC;AAIjB,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CA0B5D;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,EAAE,MAAM,CAAC;IACb,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;AAoCD,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,133 +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
- // Postgres OID → normalized column type
17
- export function mapOidToType(oid) {
18
- switch (oid) {
19
- case 20: // int8
20
- case 21: // int2
21
- case 23: // int4
22
- case 700: // float4
23
- case 701: // float8
24
- case 1700: // numeric / decimal
25
- return "number";
26
- case 16: // bool
27
- return "boolean";
28
- case 25: // text
29
- case 1042: // bpchar
30
- case 1043: // varchar
31
- return "string";
32
- case 1082: // date
33
- case 1114: // timestamp
34
- case 1184: // timestamptz
35
- return "date";
36
- default:
37
- return "string";
38
- }
39
- }
40
- async function resolveIamPassword(config) {
41
- if (!config.auth || config.auth.type !== "iam") {
42
- return config.password;
43
- }
44
- if (config.auth.provider === "aws") {
45
- const { Signer } = await import("@aws-sdk/rds-signer");
46
- const signer = new Signer({
47
- hostname: config.host,
48
- port: config.port,
49
- username: config.auth.username ?? config.user,
50
- region: config.auth.region,
51
- });
52
- return signer.getAuthToken();
53
- }
54
- if (config.auth.provider === "gcp") {
55
- const { GoogleAuth } = await import("google-auth-library");
56
- const auth = new GoogleAuth({
57
- scopes: ["https://www.googleapis.com/auth/sqlservice.admin"],
58
- });
59
- const client = await auth.getClient();
60
- const tokenResponse = await client.getAccessToken();
61
- if (!tokenResponse.token) {
62
- throw new Error("Failed to get GCP access token for Cloud SQL IAM auth");
63
- }
64
- return tokenResponse.token;
65
- }
66
- return config.password;
67
- }
68
- export class PostgresConnector {
69
- id;
70
- type = "postgres";
71
- pool;
72
- constructor(config) {
73
- this.id = config.id;
74
- this.pool = new Pool({
75
- host: config.host,
76
- port: config.port,
77
- database: config.database,
78
- user: config.user,
79
- password: config.auth?.type === "iam"
80
- ? () => resolveIamPassword(config)
81
- : config.password,
82
- ssl: config.ssl === "require"
83
- ? { rejectUnauthorized: true }
84
- : config.ssl === "prefer"
85
- ? { rejectUnauthorized: false }
86
- : config.ssl === true
87
- ? { rejectUnauthorized: true }
88
- : undefined,
89
- max: config.pool_size,
90
- });
91
- this.pool.on("error", (err) => {
92
- console.error(`[${this.id}] pg.Pool idle client error:`, err.message);
93
- });
94
- }
95
- async query(request, options) {
96
- if (request.type !== "sql") {
97
- throw new Error("[PostgresConnector] only supports SQL queries");
98
- }
99
- const start = Date.now();
100
- const { normalizedSql, values } = normalizeParams(request.sql, request.params ?? options?.params ?? {});
101
- const result = await this.pool.query(normalizedSql, values);
102
- const columns = result.fields.map((f) => ({
103
- name: f.name,
104
- type: mapOidToType(f.dataTypeID),
105
- nullable: true, // pg doesn't expose nullability in query results
106
- }));
107
- return {
108
- columns,
109
- rows: result.rows,
110
- rowCount: result.rowCount ?? result.rows.length,
111
- durationMs: Date.now() - start,
112
- fromCache: false,
113
- };
114
- }
115
- async testConnection() {
116
- const start = Date.now();
117
- try {
118
- await this.pool.query("SELECT 1");
119
- return { ok: true, latencyMs: Date.now() - start };
120
- }
121
- catch (error) {
122
- return {
123
- ok: false,
124
- latencyMs: Date.now() - start,
125
- error: error.message,
126
- };
127
- }
128
- }
129
- async close() {
130
- await this.pool.end();
131
- }
132
- }
133
- //# sourceMappingURL=postgres.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/connectors/postgres.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,wCAAwC;AACxC,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,EAAE,CAAC,CAAC,OAAO;QAChB,KAAK,EAAE,CAAC,CAAC,OAAO;QAChB,KAAK,EAAE,CAAC,CAAC,OAAO;QAChB,KAAK,GAAG,CAAC,CAAC,SAAS;QACnB,KAAK,GAAG,CAAC,CAAC,SAAS;QACnB,KAAK,IAAI,EAAE,oBAAoB;YAC7B,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,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;YACjB,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,uDAAuD,CAAC,CAAC;QAC3E,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;YACjB,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,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,IAAI,EAAE,CACxC,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,iDAAiD;SAClE,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,25 +0,0 @@
1
- import type { Connector, QueryRequest, QueryResult, QueryOptions, ConnectionTestResult, ColumnMeta } from "./types";
2
- export declare function mapTypeNameToType(typeName: string): ColumnMeta["type"];
3
- export interface RedshiftDataConnectorConfig {
4
- id: string;
5
- cluster_identifier?: string;
6
- workgroup_name?: string;
7
- database: string;
8
- region: string;
9
- auth: {
10
- type: "sdk-default" | "role";
11
- role_arn?: string;
12
- };
13
- }
14
- export declare class RedshiftDataConnector implements Connector {
15
- readonly id: string;
16
- readonly type: "redshift-data";
17
- private client;
18
- private config;
19
- constructor(config: RedshiftDataConnectorConfig);
20
- private getClient;
21
- query(request: QueryRequest, options?: QueryOptions): Promise<QueryResult>;
22
- testConnection(): Promise<ConnectionTestResult>;
23
- close(): Promise<void>;
24
- }
25
- //# sourceMappingURL=redshift-data.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redshift-data.d.ts","sourceRoot":"","sources":["../../src/connectors/redshift-data.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACX,MAAM,SAAS,CAAC;AAMjB,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CA2BtE;AAMD,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,IAAI,EAAE,aAAa,GAAG,MAAM,CAAC;QAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAsCD,qBAAa,qBAAsB,YAAW,SAAS;IACrD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,eAAe,CAAU;IAEzC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAA8B;gBAEhC,MAAM,EAAE,2BAA2B;YAOjC,SAAS;IAgBjB,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC;IAqJjB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAc/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}