@panoboard/core 1.11.6 → 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,181 +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 snowflake from "snowflake-sdk";
15
- import fs from "fs";
16
- import crypto from "crypto";
17
- import { normalizeParams } from "./params";
18
- export function mapSnowflakeType(sfType) {
19
- switch (sfType.toUpperCase()) {
20
- case "VARCHAR":
21
- case "CHAR":
22
- case "STRING":
23
- case "TEXT":
24
- return "string";
25
- case "NUMBER":
26
- case "DECIMAL":
27
- case "NUMERIC":
28
- case "INT":
29
- case "INTEGER":
30
- case "BIGINT":
31
- case "SMALLINT":
32
- case "TINYINT":
33
- case "BYTEINT":
34
- case "FLOAT":
35
- case "FLOAT4":
36
- case "FLOAT8":
37
- case "DOUBLE":
38
- case "DOUBLE PRECISION":
39
- case "REAL":
40
- return "number";
41
- case "BOOLEAN":
42
- return "boolean";
43
- case "DATE":
44
- case "DATETIME":
45
- case "TIME":
46
- case "TIMESTAMP":
47
- case "TIMESTAMP_LTZ":
48
- case "TIMESTAMP_NTZ":
49
- case "TIMESTAMP_TZ":
50
- return "date";
51
- default:
52
- return "string";
53
- }
54
- }
55
- /**
56
- * Reads a PEM key and exports it as unencrypted PKCS8.
57
- * Snowflake SDK requires decrypted keys — the `privateKeyPass` option
58
- * is unreliable (see snowflake-connector-nodejs#855).
59
- */
60
- function loadPrivateKey(auth) {
61
- let pem;
62
- try {
63
- pem = auth.private_key_file
64
- ? fs.readFileSync(auth.private_key_file, "utf-8")
65
- : auth.private_key;
66
- }
67
- catch (err) {
68
- throw new Error(`Private key file not found: ${auth.private_key_file}: ${err.message}`);
69
- }
70
- const keyObj = crypto.createPrivateKey({
71
- key: pem,
72
- format: "pem",
73
- ...(auth.passphrase ? { passphrase: auth.passphrase } : {}),
74
- });
75
- return keyObj.export({ format: "pem", type: "pkcs8" });
76
- }
77
- export class SnowflakeConnector {
78
- id;
79
- type = "snowflake";
80
- connection;
81
- connected = false;
82
- constructor(config) {
83
- this.id = config.id;
84
- const baseOpts = {
85
- account: config.account,
86
- warehouse: config.warehouse,
87
- database: config.database,
88
- schema: config.schema,
89
- role: config.role,
90
- };
91
- if (config.auth.type === "password") {
92
- this.connection = snowflake.createConnection({
93
- ...baseOpts,
94
- username: config.auth.user,
95
- password: config.auth.password,
96
- });
97
- }
98
- else {
99
- const privateKey = loadPrivateKey(config.auth);
100
- this.connection = snowflake.createConnection({
101
- ...baseOpts,
102
- username: config.auth.user,
103
- authenticator: "SNOWFLAKE_JWT",
104
- privateKey,
105
- });
106
- }
107
- }
108
- async ensureConnected() {
109
- if (this.connected)
110
- return;
111
- return new Promise((resolve, reject) => {
112
- this.connection.connect((err) => {
113
- if (err)
114
- reject(new Error(`Failed to connect to Snowflake: ${err.message}`));
115
- else {
116
- this.connected = true;
117
- resolve();
118
- }
119
- });
120
- });
121
- }
122
- async query(request, options) {
123
- if (request.type !== "sql") {
124
- throw new Error("[SnowflakeConnector] only supports SQL queries");
125
- }
126
- const start = Date.now();
127
- await this.ensureConnected();
128
- const params = request.params ?? options?.params ?? {};
129
- const { normalizedSql, values } = normalizeParams(request.sql, params, "positional");
130
- return new Promise((resolve, reject) => {
131
- this.connection.execute({
132
- sqlText: normalizedSql,
133
- binds: values,
134
- complete(err, stmt, rows) {
135
- if (err) {
136
- reject(new Error(`Snowflake query error: ${err.message}`));
137
- return;
138
- }
139
- const resultRows = (rows ?? []);
140
- const colMeta = (stmt.getColumns() ?? []).map((col) => ({
141
- name: col.getName(),
142
- type: mapSnowflakeType(col.getType()),
143
- nullable: true,
144
- }));
145
- resolve({
146
- columns: colMeta,
147
- rows: resultRows,
148
- rowCount: resultRows.length,
149
- durationMs: Date.now() - start,
150
- fromCache: false,
151
- });
152
- },
153
- });
154
- });
155
- }
156
- async testConnection() {
157
- const start = Date.now();
158
- try {
159
- await this.query({ type: "sql", sql: "SELECT 1" });
160
- return { ok: true, latencyMs: Date.now() - start };
161
- }
162
- catch (error) {
163
- return {
164
- ok: false,
165
- latencyMs: Date.now() - start,
166
- error: error.message,
167
- };
168
- }
169
- }
170
- async close() {
171
- return new Promise((resolve, reject) => {
172
- this.connection.destroy((err) => {
173
- if (err)
174
- reject(err);
175
- else
176
- resolve();
177
- });
178
- });
179
- }
180
- }
181
- //# sourceMappingURL=snowflake.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snowflake.js","sourceRoot":"","sources":["../../src/connectors/snowflake.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/connectors/types.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,UAAU,GACV,UAAU,GACV,eAAe,GACf,KAAK,GACL,WAAW,CAAC;AAEhB,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACxD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3E,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
@@ -1,15 +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 {};
15
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/connectors/types.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"}
@@ -1,13 +0,0 @@
1
- import type { ColumnMeta } from "./types";
2
- interface ParsedResponse {
3
- columns: ColumnMeta[];
4
- rows: Record<string, unknown>[];
5
- rowCount: number;
6
- }
7
- export declare function parsePanoboard(body: unknown): ParsedResponse;
8
- export declare function parseArray(body: unknown, panelColumns: ColumnMeta[]): ParsedResponse;
9
- export declare function parseGrafana(body: unknown): ParsedResponse;
10
- export declare function parseDatasette(body: unknown, panelColumns?: ColumnMeta[]): ParsedResponse;
11
- export declare function parseJsonl(body: string, panelColumns: ColumnMeta[]): ParsedResponse;
12
- export {};
13
- //# sourceMappingURL=url-parsers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url-parsers.d.ts","sourceRoot":"","sources":["../../src/connectors/url-parsers.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,UAAU,cAAc;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAoB5D;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,OAAO,EACb,YAAY,EAAE,UAAU,EAAE,GACzB,cAAc,CAShB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAc1D;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,YAAY,CAAC,EAAE,UAAU,EAAE,GAC1B,cAAc,CAchB;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,UAAU,EAAE,GACzB,cAAc,CAUhB"}
@@ -1,95 +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
- /** Map user-facing column types to ColumnMeta types */
15
- function mapColumnType(type) {
16
- if (type === "integer")
17
- return "number";
18
- if (["string", "number", "boolean", "date", "null"].includes(type)) {
19
- return type;
20
- }
21
- return "string";
22
- }
23
- function toColumnMeta(name, type, nullable) {
24
- return {
25
- name,
26
- type: mapColumnType(type ?? "string"),
27
- nullable: nullable ?? true,
28
- };
29
- }
30
- export function parsePanoboard(body) {
31
- const b = body;
32
- if (!b.columns || !Array.isArray(b.columns)) {
33
- throw new Error("Missing or invalid 'columns' in panoboard response");
34
- }
35
- if (!Array.isArray(b.rows)) {
36
- throw new Error("Missing or invalid 'rows' in panoboard response");
37
- }
38
- const columns = b.columns.map((c) => toColumnMeta(c.name, c.type));
39
- return {
40
- columns,
41
- rows: b.rows,
42
- rowCount: b.row_count ?? b.rows.length,
43
- };
44
- }
45
- export function parseArray(body, panelColumns) {
46
- if (!Array.isArray(body)) {
47
- throw new Error("Expected array response, got " + typeof body);
48
- }
49
- return {
50
- columns: panelColumns,
51
- rows: body,
52
- rowCount: body.length,
53
- };
54
- }
55
- export function parseGrafana(body) {
56
- const b = body;
57
- const columns = b.columns.map((c) => toColumnMeta(c.text, c.type));
58
- const rows = b.rows.map((row) => {
59
- const obj = {};
60
- b.columns.forEach((col, i) => {
61
- obj[col.text] = row[i];
62
- });
63
- return obj;
64
- });
65
- return { columns, rows, rowCount: rows.length };
66
- }
67
- export function parseDatasette(body, panelColumns) {
68
- const b = body;
69
- const columns = b.columns.map((name, i) => {
70
- if (panelColumns && panelColumns[i])
71
- return panelColumns[i];
72
- return toColumnMeta(name);
73
- });
74
- const rows = b.rows.map((row) => {
75
- const obj = {};
76
- b.columns.forEach((name, i) => {
77
- obj[name] = row[i];
78
- });
79
- return obj;
80
- });
81
- return { columns, rows, rowCount: rows.length };
82
- }
83
- export function parseJsonl(body, panelColumns) {
84
- const lines = body.split("\n").filter((line) => line.trim().length > 0);
85
- const rows = lines.map((line, i) => {
86
- try {
87
- return JSON.parse(line);
88
- }
89
- catch {
90
- throw new Error(`Invalid JSON on line ${i + 1}: ${line.slice(0, 100)}`);
91
- }
92
- });
93
- return { columns: panelColumns, rows, rowCount: rows.length };
94
- }
95
- //# sourceMappingURL=url-parsers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url-parsers.js","sourceRoot":"","sources":["../../src/connectors/url-parsers.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- import type { Connector, QueryRequest, QueryOptions, QueryResult, ConnectionTestResult } from "./types";
2
- type UrlAuthConfig = {
3
- type: "bearer";
4
- token: string;
5
- } | {
6
- type: "basic";
7
- user: string;
8
- password: string;
9
- } | {
10
- type: "header";
11
- headers: Record<string, string>;
12
- };
13
- type ResponseFormat = "panoboard" | "array" | "grafana" | "datasette" | "jsonl";
14
- export interface UrlConnectorConfig {
15
- id: string;
16
- base_url: string;
17
- method: "get" | "post";
18
- request_body?: string;
19
- response_format: ResponseFormat;
20
- timeout: number;
21
- health_check_path?: string;
22
- auth?: UrlAuthConfig;
23
- }
24
- export declare class UrlConnector implements Connector {
25
- readonly id: string;
26
- readonly type: "url";
27
- private config;
28
- constructor(config: UrlConnectorConfig);
29
- query(request: QueryRequest, options?: QueryOptions): Promise<QueryResult>;
30
- testConnection(): Promise<ConnectionTestResult>;
31
- close(): Promise<void>;
32
- private buildAuthHeaders;
33
- private parseResponse;
34
- }
35
- export {};
36
- //# sourceMappingURL=url.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/connectors/url.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,oBAAoB,EAErB,MAAM,SAAS,CAAC;AASjB,KAAK,aAAa,GACd;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAExD,KAAK,cAAc,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AAEhF,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,cAAc,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,qBAAa,YAAa,YAAW,SAAS;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAC/B,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,kBAAkB;IAKhC,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC;IAkEjB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAgC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAE5B,OAAO,CAAC,gBAAgB;YAaV,aAAa;CA8B5B"}
@@ -1,139 +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 { parsePanoboard, parseArray, parseGrafana, parseDatasette, parseJsonl, } from "./url-parsers";
15
- export class UrlConnector {
16
- id;
17
- type = "url";
18
- config;
19
- constructor(config) {
20
- this.id = config.id;
21
- this.config = config;
22
- }
23
- async query(request, options) {
24
- if (request.type !== "http") {
25
- throw new Error("UrlConnector only supports HTTP queries");
26
- }
27
- const start = Date.now();
28
- const url = new URL(this.config.base_url + request.path);
29
- if (request.params) {
30
- for (const [key, value] of Object.entries(request.params)) {
31
- if (value !== null && value !== undefined) {
32
- url.searchParams.set(key, String(value));
33
- }
34
- }
35
- }
36
- const headers = {};
37
- if (this.config.auth) {
38
- Object.assign(headers, this.buildAuthHeaders(this.config.auth));
39
- }
40
- const fetchOptions = {
41
- method: this.config.method.toUpperCase(),
42
- headers,
43
- signal: AbortSignal.timeout(this.config.timeout),
44
- };
45
- if (this.config.method === "post") {
46
- headers["Content-Type"] = "application/json";
47
- fetchOptions.body = this.config.request_body ?? "{}";
48
- }
49
- const response = await fetch(url, fetchOptions).catch((err) => {
50
- if (err.name === "TimeoutError") {
51
- throw new Error(`Request to ${this.config.base_url}${request.path} timed out after ${this.config.timeout}ms`);
52
- }
53
- throw new Error(`Failed to connect to ${this.config.base_url}: ${err.message}`);
54
- });
55
- if (!response.ok) {
56
- let errorMsg;
57
- try {
58
- const errorBody = (await response.json());
59
- errorMsg = errorBody.error
60
- ? `Upstream error: ${errorBody.error}`
61
- : `Upstream returned HTTP ${response.status}`;
62
- }
63
- catch {
64
- errorMsg = `Upstream returned HTTP ${response.status}`;
65
- }
66
- throw new Error(errorMsg);
67
- }
68
- const panelColumns = options?.panelColumns;
69
- const parsed = await this.parseResponse(response, panelColumns);
70
- return {
71
- ...parsed,
72
- durationMs: Date.now() - start,
73
- fromCache: false,
74
- };
75
- }
76
- async testConnection() {
77
- const start = Date.now();
78
- const path = this.config.health_check_path ?? "";
79
- const url = `${this.config.base_url}${path}`;
80
- try {
81
- const response = await fetch(url, {
82
- method: "GET",
83
- signal: AbortSignal.timeout(this.config.timeout),
84
- headers: this.config.auth
85
- ? this.buildAuthHeaders(this.config.auth)
86
- : {},
87
- });
88
- if (response.status >= 500) {
89
- return {
90
- ok: false,
91
- latencyMs: Date.now() - start,
92
- error: `Upstream returned HTTP ${response.status}`,
93
- };
94
- }
95
- return { ok: true, latencyMs: Date.now() - start };
96
- }
97
- catch (err) {
98
- return {
99
- ok: false,
100
- latencyMs: Date.now() - start,
101
- error: `Failed to connect to ${this.config.base_url}: ${err.message}`,
102
- };
103
- }
104
- }
105
- async close() { }
106
- buildAuthHeaders(auth) {
107
- switch (auth.type) {
108
- case "bearer":
109
- return { Authorization: `Bearer ${auth.token}` };
110
- case "basic":
111
- return {
112
- Authorization: `Basic ${btoa(`${auth.user}:${auth.password}`)}`,
113
- };
114
- case "header":
115
- return { ...auth.headers };
116
- }
117
- }
118
- async parseResponse(response, panelColumns) {
119
- const format = this.config.response_format;
120
- if (format === "jsonl") {
121
- const text = await response.text();
122
- return parseJsonl(text, panelColumns);
123
- }
124
- const json = await response.json();
125
- switch (format) {
126
- case "panoboard":
127
- return parsePanoboard(json);
128
- case "array":
129
- return parseArray(json, panelColumns);
130
- case "grafana":
131
- return parseGrafana(json);
132
- case "datasette":
133
- return parseDatasette(json, panelColumns);
134
- default:
135
- throw new Error(`Unsupported response format: ${format}`);
136
- }
137
- }
138
- }
139
- //# sourceMappingURL=url.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/connectors/url.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- export declare function expandArrayParams(sql: string, params: Record<string, unknown>): {
2
- sql: string;
3
- params: Record<string, unknown>;
4
- };
5
- //# sourceMappingURL=array-expansion.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"array-expansion.d.ts","sourceRoot":"","sources":["../../src/query/array-expansion.ts"],"names":[],"mappings":"AAgBA,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CA6BlD"}
@@ -1,39 +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
- // packages/core/src/query/array-expansion.ts
15
- export function expandArrayParams(sql, params) {
16
- const expandedParams = {};
17
- let expandedSql = sql;
18
- for (const [name, value] of Object.entries(params)) {
19
- if (Array.isArray(value)) {
20
- if (value.length === 0) {
21
- // Empty array -> replace IN (:name) with IN (SELECT NULL WHERE 1=0)
22
- expandedSql = expandedSql.replace(new RegExp(`IN\\s*\\(\\s*:${name}\\b\\s*\\)`, "gi"), "IN (SELECT NULL WHERE 1=0)");
23
- }
24
- else {
25
- // Expand :regions -> :regions_0, :regions_1, :regions_2
26
- const expandedNames = value.map((_, i) => `:${name}_${i}`);
27
- expandedSql = expandedSql.replace(new RegExp(`:${name}\\b`, "g"), expandedNames.join(", "));
28
- value.forEach((v, i) => {
29
- expandedParams[`${name}_${i}`] = v;
30
- });
31
- }
32
- }
33
- else {
34
- expandedParams[name] = value;
35
- }
36
- }
37
- return { sql: expandedSql, params: expandedParams };
38
- }
39
- //# sourceMappingURL=array-expansion.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"array-expansion.js","sourceRoot":"","sources":["../../src/query/array-expansion.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,6CAA6C;AAE7C,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,MAA+B;IAE/B,MAAM,cAAc,GAA4B,EAAE,CAAC;IACnD,IAAI,WAAW,GAAG,GAAG,CAAC;IAEtB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,oEAAoE;gBACpE,WAAW,GAAG,WAAW,CAAC,OAAO,CAC/B,IAAI,MAAM,CAAC,iBAAiB,IAAI,YAAY,EAAE,IAAI,CAAC,EACnD,4BAA4B,CAC7B,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,wDAAwD;gBACxD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC3D,WAAW,GAAG,WAAW,CAAC,OAAO,CAC/B,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,EAAE,GAAG,CAAC,EAC9B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAC;gBACF,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACrB,cAAc,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBACrC,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AACtD,CAAC"}
@@ -1,8 +0,0 @@
1
- export { executePanelQuery, type PanelQuery } from "./pipeline";
2
- export { renderTemplate, type TemplateVar } from "./template";
3
- export { expandArrayParams } from "./array-expansion";
4
- export { getStrategy } from "./strategy";
5
- export type { QueryStrategy } from "./strategy/types";
6
- export { SqlStrategy } from "./strategy/sql";
7
- export { HttpStrategy } from "./strategy/http";
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,20 +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 { executePanelQuery } from "./pipeline";
15
- export { renderTemplate } from "./template";
16
- export { expandArrayParams } from "./array-expansion";
17
- export { getStrategy } from "./strategy";
18
- export { SqlStrategy } from "./strategy/sql";
19
- export { HttpStrategy } from "./strategy/http";
20
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/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,iBAAiB,EAAmB,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,27 +0,0 @@
1
- import type { Connector, QueryResult } from "../connectors/types";
2
- export interface PanelQuery {
3
- sql?: string;
4
- path?: string;
5
- params?: Record<string, {
6
- filter?: string;
7
- ctx?: string;
8
- format?: string;
9
- }>;
10
- template_vars?: Record<string, {
11
- allowlist: string[];
12
- from_filter?: string;
13
- value?: string;
14
- }>;
15
- columns?: {
16
- name: string;
17
- type: string;
18
- nullable?: boolean;
19
- }[];
20
- }
21
- /**
22
- * Orchestrates query execution via the appropriate strategy:
23
- * - SQL datasources: template rendering -> array expansion -> connector.query()
24
- * - URL datasources: path + params -> connector.query()
25
- */
26
- export declare function executePanelQuery(query: PanelQuery, resolvedParams: Record<string, unknown>, connector: Connector): Promise<QueryResult>;
27
- //# sourceMappingURL=pipeline.d.ts.map