datapeek 0.1.16 → 0.1.17
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/cli/chunk-25W7DLJU.js +763 -0
- package/dist/cli/chunk-4ZTTGN4K.js +772 -0
- package/dist/cli/chunk-AZZM4KI4.js +748 -0
- package/dist/cli/chunk-N4ZN35TN.js +753 -0
- package/dist/cli/chunk-NT7RKOGB.js +736 -0
- package/dist/cli/db-DUN4MAAS.js +36 -0
- package/dist/cli/db-G3OUYANY.js +36 -0
- package/dist/cli/db-GII5HVII.js +36 -0
- package/dist/cli/db-PLHJBMIE.js +36 -0
- package/dist/cli/db-UXHWQZEH.js +36 -0
- package/dist/cli/dev.js +40 -12
- package/dist/cli/index.js +40 -12
- package/dist/client/assets/index-BvCSgDQI.css +1 -0
- package/dist/client/assets/index-k-JqbRd3.js +395 -0
- package/dist/client/index.html +2 -2
- package/dist/server/chunk-FUD3HYYO.js +750 -0
- package/dist/server/chunk-ICJJTM6H.js +745 -0
- package/dist/server/chunk-IFTGVLYX.js +760 -0
- package/dist/server/chunk-J4S2WZCU.js +733 -0
- package/dist/server/chunk-VTBMBBQX.js +769 -0
- package/dist/server/db-P6KUHD2Z.js +34 -0
- package/dist/server/db-QCCVQUMG.js +34 -0
- package/dist/server/db-SHAIVNT5.js +34 -0
- package/dist/server/db-T5GG3OX4.js +34 -0
- package/dist/server/db-TN4IWAPG.js +34 -0
- package/dist/server/dev.js +40 -12
- package/dist/server/index.js +40 -12
- package/package.json +1 -1
- package/dist/client/assets/index-Bc0Vjyhl.js +0 -390
- package/dist/client/assets/index-DEccnksW.css +0 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
connect,
|
|
5
|
+
detectDbType,
|
|
6
|
+
disconnect,
|
|
7
|
+
executeQuery,
|
|
8
|
+
executeQueryMultiple,
|
|
9
|
+
getConnection,
|
|
10
|
+
getConnectionConfig,
|
|
11
|
+
getDbType,
|
|
12
|
+
getDialect,
|
|
13
|
+
parseConnectionString,
|
|
14
|
+
setDbType,
|
|
15
|
+
testConnection
|
|
16
|
+
} from "./chunk-4ZTTGN4K.js";
|
|
17
|
+
import {
|
|
18
|
+
cancelQuery,
|
|
19
|
+
generateQueryId
|
|
20
|
+
} from "./chunk-4MIQHH6K.js";
|
|
21
|
+
export {
|
|
22
|
+
cancelQuery,
|
|
23
|
+
connect,
|
|
24
|
+
detectDbType,
|
|
25
|
+
disconnect,
|
|
26
|
+
executeQuery,
|
|
27
|
+
executeQueryMultiple,
|
|
28
|
+
generateQueryId,
|
|
29
|
+
getConnection,
|
|
30
|
+
getConnectionConfig,
|
|
31
|
+
getDbType,
|
|
32
|
+
getDialect,
|
|
33
|
+
parseConnectionString,
|
|
34
|
+
setDbType,
|
|
35
|
+
testConnection
|
|
36
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
connect,
|
|
5
|
+
detectDbType,
|
|
6
|
+
disconnect,
|
|
7
|
+
executeQuery,
|
|
8
|
+
executeQueryMultiple,
|
|
9
|
+
getConnection,
|
|
10
|
+
getConnectionConfig,
|
|
11
|
+
getDbType,
|
|
12
|
+
getDialect,
|
|
13
|
+
parseConnectionString,
|
|
14
|
+
setDbType,
|
|
15
|
+
testConnection
|
|
16
|
+
} from "./chunk-AZZM4KI4.js";
|
|
17
|
+
import {
|
|
18
|
+
cancelQuery,
|
|
19
|
+
generateQueryId
|
|
20
|
+
} from "./chunk-4MIQHH6K.js";
|
|
21
|
+
export {
|
|
22
|
+
cancelQuery,
|
|
23
|
+
connect,
|
|
24
|
+
detectDbType,
|
|
25
|
+
disconnect,
|
|
26
|
+
executeQuery,
|
|
27
|
+
executeQueryMultiple,
|
|
28
|
+
generateQueryId,
|
|
29
|
+
getConnection,
|
|
30
|
+
getConnectionConfig,
|
|
31
|
+
getDbType,
|
|
32
|
+
getDialect,
|
|
33
|
+
parseConnectionString,
|
|
34
|
+
setDbType,
|
|
35
|
+
testConnection
|
|
36
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
connect,
|
|
5
|
+
detectDbType,
|
|
6
|
+
disconnect,
|
|
7
|
+
executeQuery,
|
|
8
|
+
executeQueryMultiple,
|
|
9
|
+
getConnection,
|
|
10
|
+
getConnectionConfig,
|
|
11
|
+
getDbType,
|
|
12
|
+
getDialect,
|
|
13
|
+
parseConnectionString,
|
|
14
|
+
setDbType,
|
|
15
|
+
testConnection
|
|
16
|
+
} from "./chunk-N4ZN35TN.js";
|
|
17
|
+
import {
|
|
18
|
+
cancelQuery,
|
|
19
|
+
generateQueryId
|
|
20
|
+
} from "./chunk-4MIQHH6K.js";
|
|
21
|
+
export {
|
|
22
|
+
cancelQuery,
|
|
23
|
+
connect,
|
|
24
|
+
detectDbType,
|
|
25
|
+
disconnect,
|
|
26
|
+
executeQuery,
|
|
27
|
+
executeQueryMultiple,
|
|
28
|
+
generateQueryId,
|
|
29
|
+
getConnection,
|
|
30
|
+
getConnectionConfig,
|
|
31
|
+
getDbType,
|
|
32
|
+
getDialect,
|
|
33
|
+
parseConnectionString,
|
|
34
|
+
setDbType,
|
|
35
|
+
testConnection
|
|
36
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
connect,
|
|
5
|
+
detectDbType,
|
|
6
|
+
disconnect,
|
|
7
|
+
executeQuery,
|
|
8
|
+
executeQueryMultiple,
|
|
9
|
+
getConnection,
|
|
10
|
+
getConnectionConfig,
|
|
11
|
+
getDbType,
|
|
12
|
+
getDialect,
|
|
13
|
+
parseConnectionString,
|
|
14
|
+
setDbType,
|
|
15
|
+
testConnection
|
|
16
|
+
} from "./chunk-25W7DLJU.js";
|
|
17
|
+
import {
|
|
18
|
+
cancelQuery,
|
|
19
|
+
generateQueryId
|
|
20
|
+
} from "./chunk-4MIQHH6K.js";
|
|
21
|
+
export {
|
|
22
|
+
cancelQuery,
|
|
23
|
+
connect,
|
|
24
|
+
detectDbType,
|
|
25
|
+
disconnect,
|
|
26
|
+
executeQuery,
|
|
27
|
+
executeQueryMultiple,
|
|
28
|
+
generateQueryId,
|
|
29
|
+
getConnection,
|
|
30
|
+
getConnectionConfig,
|
|
31
|
+
getDbType,
|
|
32
|
+
getDialect,
|
|
33
|
+
parseConnectionString,
|
|
34
|
+
setDbType,
|
|
35
|
+
testConnection
|
|
36
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
connect,
|
|
5
|
+
detectDbType,
|
|
6
|
+
disconnect,
|
|
7
|
+
executeQuery,
|
|
8
|
+
executeQueryMultiple,
|
|
9
|
+
getConnection,
|
|
10
|
+
getConnectionConfig,
|
|
11
|
+
getDbType,
|
|
12
|
+
getDialect,
|
|
13
|
+
parseConnectionString,
|
|
14
|
+
setDbType,
|
|
15
|
+
testConnection
|
|
16
|
+
} from "./chunk-NT7RKOGB.js";
|
|
17
|
+
import {
|
|
18
|
+
cancelQuery,
|
|
19
|
+
generateQueryId
|
|
20
|
+
} from "./chunk-4MIQHH6K.js";
|
|
21
|
+
export {
|
|
22
|
+
cancelQuery,
|
|
23
|
+
connect,
|
|
24
|
+
detectDbType,
|
|
25
|
+
disconnect,
|
|
26
|
+
executeQuery,
|
|
27
|
+
executeQueryMultiple,
|
|
28
|
+
generateQueryId,
|
|
29
|
+
getConnection,
|
|
30
|
+
getConnectionConfig,
|
|
31
|
+
getDbType,
|
|
32
|
+
getDialect,
|
|
33
|
+
parseConnectionString,
|
|
34
|
+
setDbType,
|
|
35
|
+
testConnection
|
|
36
|
+
};
|
package/dist/cli/dev.js
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
parseConnectionString,
|
|
13
13
|
setDbType,
|
|
14
14
|
testConnection
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-4ZTTGN4K.js";
|
|
16
16
|
import {
|
|
17
17
|
cancelQuery,
|
|
18
18
|
generateQueryId
|
|
@@ -190,7 +190,7 @@ tableRoutes.get("/", async (req, res) => {
|
|
|
190
190
|
console.error("Error fetching tables:", error);
|
|
191
191
|
const errorMessage = error.message || "";
|
|
192
192
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
193
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
193
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
194
194
|
await disconnect2();
|
|
195
195
|
}
|
|
196
196
|
const errorDetails = error.originalError?.message || error.originalError?.info?.message || error.message || "Failed to fetch tables";
|
|
@@ -266,7 +266,7 @@ tableRoutes.get("/:schema/:table", async (req, res) => {
|
|
|
266
266
|
} catch (error) {
|
|
267
267
|
const errorMessage = error.message || "";
|
|
268
268
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
269
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
269
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
270
270
|
await disconnect2();
|
|
271
271
|
}
|
|
272
272
|
res.status(500).json({ error: error.message || "Failed to fetch table structure" });
|
|
@@ -822,7 +822,7 @@ ${limitOffsetClause}`;
|
|
|
822
822
|
console.error("Error fetching table data:", error);
|
|
823
823
|
const errorMessage = error.message || "";
|
|
824
824
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
825
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
825
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
826
826
|
await disconnect2();
|
|
827
827
|
}
|
|
828
828
|
const isTimeout = error.code === "ETIMEOUT" || error.code === "ESOCKET" || error.message?.includes("timeout") || error.message?.includes("ETIMEDOUT") || error.originalError?.code === "ETIMEOUT" || error.originalError?.code === "ESOCKET";
|
|
@@ -923,7 +923,7 @@ tableRoutes.post("/:schema/:table/related-data", async (req, res) => {
|
|
|
923
923
|
console.error("Error fetching related data:", error);
|
|
924
924
|
const errorMessage = error.message || "";
|
|
925
925
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
926
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
926
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
927
927
|
await disconnect2();
|
|
928
928
|
}
|
|
929
929
|
res.status(500).json({ error: error.message || "Failed to fetch related data" });
|
|
@@ -1100,7 +1100,7 @@ tableRoutes.get("/:schema/:table/distinct-values/:column", async (req, res) => {
|
|
|
1100
1100
|
console.error("Error fetching distinct values:", error);
|
|
1101
1101
|
const errorMessage = error.message || "";
|
|
1102
1102
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
1103
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
1103
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
1104
1104
|
await disconnect2();
|
|
1105
1105
|
}
|
|
1106
1106
|
res.status(500).json({ error: error.message || "Failed to fetch distinct values" });
|
|
@@ -1166,7 +1166,7 @@ tableRoutes.get("/:schema/:table/reverse-foreign-keys", async (req, res) => {
|
|
|
1166
1166
|
console.error("Error fetching reverse foreign keys:", error);
|
|
1167
1167
|
const errorMessage = error.message || "";
|
|
1168
1168
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
1169
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
1169
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
1170
1170
|
await disconnect2();
|
|
1171
1171
|
}
|
|
1172
1172
|
res.status(500).json({ error: error.message || "Failed to fetch reverse foreign keys" });
|
|
@@ -1225,7 +1225,7 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
|
|
|
1225
1225
|
console.error("Error counting related rows:", error);
|
|
1226
1226
|
const errorMessage = error.message || "";
|
|
1227
1227
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
1228
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
1228
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
1229
1229
|
await disconnect2();
|
|
1230
1230
|
}
|
|
1231
1231
|
res.status(500).json({ error: error.message || "Failed to count related rows" });
|
|
@@ -1235,6 +1235,31 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
|
|
|
1235
1235
|
// src/server/routes/query.ts
|
|
1236
1236
|
import { Router as Router3 } from "express";
|
|
1237
1237
|
var queryRoutes = Router3();
|
|
1238
|
+
function extractErrorMessages(error) {
|
|
1239
|
+
const out = [];
|
|
1240
|
+
if (Array.isArray(error?.messages)) {
|
|
1241
|
+
for (const msg of error.messages) {
|
|
1242
|
+
const text = typeof msg?.message === "string" ? msg.message : String(msg ?? "");
|
|
1243
|
+
if (!text.trim()) continue;
|
|
1244
|
+
const type = msg?.type === "warning" ? "warning" : msg?.type === "error" ? "error" : "info";
|
|
1245
|
+
out.push({ type, message: text });
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
if (Array.isArray(error?.precedingErrors)) {
|
|
1249
|
+
for (const err of error.precedingErrors) {
|
|
1250
|
+
const text = typeof err?.message === "string" ? err.message : String(err ?? "");
|
|
1251
|
+
if (!text.trim()) continue;
|
|
1252
|
+
out.push({ type: "error", message: text });
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
if (error?.message) {
|
|
1256
|
+
const hasPrimary = out.some((msg) => msg.message === error.message);
|
|
1257
|
+
if (!hasPrimary) {
|
|
1258
|
+
out.push({ type: "error", message: error.message });
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
return out.length > 0 ? out : void 0;
|
|
1262
|
+
}
|
|
1238
1263
|
queryRoutes.post("/", async (req, res) => {
|
|
1239
1264
|
try {
|
|
1240
1265
|
const { query: sqlQuery, queryId } = req.body;
|
|
@@ -1243,7 +1268,7 @@ queryRoutes.post("/", async (req, res) => {
|
|
|
1243
1268
|
}
|
|
1244
1269
|
const activeQueryId = queryId || generateQueryId();
|
|
1245
1270
|
const startTime = Date.now();
|
|
1246
|
-
const { recordsets: resultSets, columnMetadata } = await executeQueryMultiple(sqlQuery, void 0, activeQueryId);
|
|
1271
|
+
const { recordsets: resultSets, columnMetadata, messages } = await executeQueryMultiple(sqlQuery, void 0, activeQueryId);
|
|
1247
1272
|
const executionTime = Date.now() - startTime;
|
|
1248
1273
|
res.json({
|
|
1249
1274
|
data: resultSets[0] || [],
|
|
@@ -1251,6 +1276,7 @@ queryRoutes.post("/", async (req, res) => {
|
|
|
1251
1276
|
executionTime,
|
|
1252
1277
|
columnMetadata,
|
|
1253
1278
|
// Include column metadata for empty result sets
|
|
1279
|
+
messages,
|
|
1254
1280
|
queryId: activeQueryId
|
|
1255
1281
|
// Return queryId so client can track it
|
|
1256
1282
|
});
|
|
@@ -1258,17 +1284,19 @@ queryRoutes.post("/", async (req, res) => {
|
|
|
1258
1284
|
if (error.cancelled || error.code === "ECANCEL") {
|
|
1259
1285
|
return res.status(499).json({
|
|
1260
1286
|
error: "Query was cancelled",
|
|
1261
|
-
cancelled: true
|
|
1287
|
+
cancelled: true,
|
|
1288
|
+
messages: extractErrorMessages(error)
|
|
1262
1289
|
});
|
|
1263
1290
|
}
|
|
1264
1291
|
const errorMessage = error.message || "";
|
|
1265
1292
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
1266
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
1293
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
1267
1294
|
await disconnect2();
|
|
1268
1295
|
}
|
|
1269
1296
|
res.status(500).json({
|
|
1270
1297
|
error: error.message || "Query execution failed",
|
|
1271
|
-
details: error.originalError?.message
|
|
1298
|
+
details: error.originalError?.message,
|
|
1299
|
+
messages: extractErrorMessages(error)
|
|
1272
1300
|
});
|
|
1273
1301
|
}
|
|
1274
1302
|
});
|
package/dist/cli/index.js
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
parseConnectionString,
|
|
13
13
|
setDbType,
|
|
14
14
|
testConnection
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-4ZTTGN4K.js";
|
|
16
16
|
import {
|
|
17
17
|
cancelQuery,
|
|
18
18
|
generateQueryId
|
|
@@ -193,7 +193,7 @@ tableRoutes.get("/", async (req, res) => {
|
|
|
193
193
|
console.error("Error fetching tables:", error);
|
|
194
194
|
const errorMessage = error.message || "";
|
|
195
195
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
196
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
196
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
197
197
|
await disconnect2();
|
|
198
198
|
}
|
|
199
199
|
const errorDetails = error.originalError?.message || error.originalError?.info?.message || error.message || "Failed to fetch tables";
|
|
@@ -269,7 +269,7 @@ tableRoutes.get("/:schema/:table", async (req, res) => {
|
|
|
269
269
|
} catch (error) {
|
|
270
270
|
const errorMessage = error.message || "";
|
|
271
271
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
272
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
272
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
273
273
|
await disconnect2();
|
|
274
274
|
}
|
|
275
275
|
res.status(500).json({ error: error.message || "Failed to fetch table structure" });
|
|
@@ -825,7 +825,7 @@ ${limitOffsetClause}`;
|
|
|
825
825
|
console.error("Error fetching table data:", error);
|
|
826
826
|
const errorMessage = error.message || "";
|
|
827
827
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
828
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
828
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
829
829
|
await disconnect2();
|
|
830
830
|
}
|
|
831
831
|
const isTimeout = error.code === "ETIMEOUT" || error.code === "ESOCKET" || error.message?.includes("timeout") || error.message?.includes("ETIMEDOUT") || error.originalError?.code === "ETIMEOUT" || error.originalError?.code === "ESOCKET";
|
|
@@ -926,7 +926,7 @@ tableRoutes.post("/:schema/:table/related-data", async (req, res) => {
|
|
|
926
926
|
console.error("Error fetching related data:", error);
|
|
927
927
|
const errorMessage = error.message || "";
|
|
928
928
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
929
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
929
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
930
930
|
await disconnect2();
|
|
931
931
|
}
|
|
932
932
|
res.status(500).json({ error: error.message || "Failed to fetch related data" });
|
|
@@ -1103,7 +1103,7 @@ tableRoutes.get("/:schema/:table/distinct-values/:column", async (req, res) => {
|
|
|
1103
1103
|
console.error("Error fetching distinct values:", error);
|
|
1104
1104
|
const errorMessage = error.message || "";
|
|
1105
1105
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
1106
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
1106
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
1107
1107
|
await disconnect2();
|
|
1108
1108
|
}
|
|
1109
1109
|
res.status(500).json({ error: error.message || "Failed to fetch distinct values" });
|
|
@@ -1169,7 +1169,7 @@ tableRoutes.get("/:schema/:table/reverse-foreign-keys", async (req, res) => {
|
|
|
1169
1169
|
console.error("Error fetching reverse foreign keys:", error);
|
|
1170
1170
|
const errorMessage = error.message || "";
|
|
1171
1171
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
1172
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
1172
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
1173
1173
|
await disconnect2();
|
|
1174
1174
|
}
|
|
1175
1175
|
res.status(500).json({ error: error.message || "Failed to fetch reverse foreign keys" });
|
|
@@ -1228,7 +1228,7 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
|
|
|
1228
1228
|
console.error("Error counting related rows:", error);
|
|
1229
1229
|
const errorMessage = error.message || "";
|
|
1230
1230
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
1231
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
1231
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
1232
1232
|
await disconnect2();
|
|
1233
1233
|
}
|
|
1234
1234
|
res.status(500).json({ error: error.message || "Failed to count related rows" });
|
|
@@ -1238,6 +1238,31 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
|
|
|
1238
1238
|
// src/server/routes/query.ts
|
|
1239
1239
|
import { Router as Router3 } from "express";
|
|
1240
1240
|
var queryRoutes = Router3();
|
|
1241
|
+
function extractErrorMessages(error) {
|
|
1242
|
+
const out = [];
|
|
1243
|
+
if (Array.isArray(error?.messages)) {
|
|
1244
|
+
for (const msg of error.messages) {
|
|
1245
|
+
const text = typeof msg?.message === "string" ? msg.message : String(msg ?? "");
|
|
1246
|
+
if (!text.trim()) continue;
|
|
1247
|
+
const type = msg?.type === "warning" ? "warning" : msg?.type === "error" ? "error" : "info";
|
|
1248
|
+
out.push({ type, message: text });
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1251
|
+
if (Array.isArray(error?.precedingErrors)) {
|
|
1252
|
+
for (const err of error.precedingErrors) {
|
|
1253
|
+
const text = typeof err?.message === "string" ? err.message : String(err ?? "");
|
|
1254
|
+
if (!text.trim()) continue;
|
|
1255
|
+
out.push({ type: "error", message: text });
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
if (error?.message) {
|
|
1259
|
+
const hasPrimary = out.some((msg) => msg.message === error.message);
|
|
1260
|
+
if (!hasPrimary) {
|
|
1261
|
+
out.push({ type: "error", message: error.message });
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
return out.length > 0 ? out : void 0;
|
|
1265
|
+
}
|
|
1241
1266
|
queryRoutes.post("/", async (req, res) => {
|
|
1242
1267
|
try {
|
|
1243
1268
|
const { query: sqlQuery, queryId } = req.body;
|
|
@@ -1246,7 +1271,7 @@ queryRoutes.post("/", async (req, res) => {
|
|
|
1246
1271
|
}
|
|
1247
1272
|
const activeQueryId = queryId || generateQueryId();
|
|
1248
1273
|
const startTime = Date.now();
|
|
1249
|
-
const { recordsets: resultSets, columnMetadata } = await executeQueryMultiple(sqlQuery, void 0, activeQueryId);
|
|
1274
|
+
const { recordsets: resultSets, columnMetadata, messages } = await executeQueryMultiple(sqlQuery, void 0, activeQueryId);
|
|
1250
1275
|
const executionTime = Date.now() - startTime;
|
|
1251
1276
|
res.json({
|
|
1252
1277
|
data: resultSets[0] || [],
|
|
@@ -1254,6 +1279,7 @@ queryRoutes.post("/", async (req, res) => {
|
|
|
1254
1279
|
executionTime,
|
|
1255
1280
|
columnMetadata,
|
|
1256
1281
|
// Include column metadata for empty result sets
|
|
1282
|
+
messages,
|
|
1257
1283
|
queryId: activeQueryId
|
|
1258
1284
|
// Return queryId so client can track it
|
|
1259
1285
|
});
|
|
@@ -1261,17 +1287,19 @@ queryRoutes.post("/", async (req, res) => {
|
|
|
1261
1287
|
if (error.cancelled || error.code === "ECANCEL") {
|
|
1262
1288
|
return res.status(499).json({
|
|
1263
1289
|
error: "Query was cancelled",
|
|
1264
|
-
cancelled: true
|
|
1290
|
+
cancelled: true,
|
|
1291
|
+
messages: extractErrorMessages(error)
|
|
1265
1292
|
});
|
|
1266
1293
|
}
|
|
1267
1294
|
const errorMessage = error.message || "";
|
|
1268
1295
|
if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
|
|
1269
|
-
const { disconnect: disconnect2 } = await import("./db-
|
|
1296
|
+
const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
|
|
1270
1297
|
await disconnect2();
|
|
1271
1298
|
}
|
|
1272
1299
|
res.status(500).json({
|
|
1273
1300
|
error: error.message || "Query execution failed",
|
|
1274
|
-
details: error.originalError?.message
|
|
1301
|
+
details: error.originalError?.message,
|
|
1302
|
+
messages: extractErrorMessages(error)
|
|
1275
1303
|
});
|
|
1276
1304
|
}
|
|
1277
1305
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--card: 0 0% 100%;--card-foreground: 222.2 84% 4.9%;--popover: 0 0% 100%;--popover-foreground: 222.2 84% 4.9%;--primary: 222.2 47.4% 11.2%;--primary-foreground: 210 40% 98%;--secondary: 210 40% 96.1%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 210 40% 96.1%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 210 40% 96.1%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 40% 98%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--ring: 222.2 84% 4.9%;--radius: .5rem;--chart-1: 12 76% 61%;--chart-2: 173 58% 39%;--chart-3: 197 37% 24%;--chart-4: 43 74% 66%;--chart-5: 27 87% 67%;--header-bg: 0 0% 100%;--sidebar-bg: 0 0% 100%;--content-bg: 0 0% 100%;--tabs-bg: 0 0% 100%;--grid-bg: 0 0% 100%}.dark{--background: 222.2 84% 4.9%;--foreground: 210 40% 98%;--card: 222.2 84% 4.9%;--card-foreground: 210 40% 98%;--popover: 222.2 84% 4.9%;--popover-foreground: 210 40% 98%;--primary: 210 40% 98%;--primary-foreground: 222.2 47.4% 11.2%;--secondary: 217.2 32.6% 17.5%;--secondary-foreground: 210 40% 98%;--muted: 217.2 32.6% 17.5%;--muted-foreground: 215 20.2% 65.1%;--accent: 217.2 32.6% 17.5%;--accent-foreground: 210 40% 98%;--destructive: 0 70% 55%;--destructive-foreground: 210 40% 98%;--border: 220 13% 20%;--input: 217.2 32.6% 17.5%;--ring: 212.7 26.8% 83.9%;--chart-1: 220 70% 50%;--chart-2: 160 60% 45%;--chart-3: 30 80% 55%;--chart-4: 280 65% 60%;--chart-5: 340 75% 55%;--header-bg: 222.2 47% 9%;--sidebar-bg: 222.2 47% 7%;--content-bg: 222.2 84% 4.9%;--tabs-bg: 222.2 47% 8%;--grid-bg: 222.2 84% 5%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}code,pre{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[100\]{z-index:100}.m-2{margin:.5rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-mb-px{margin-bottom:-1px}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.\!table{display:table!important}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-96{max-height:24rem}.max-h-\[400px\]{max-height:400px}.max-h-\[95vh\]{max-height:95vh}.max-h-\[calc\(100vh-16px\)\]{max-height:calc(100vh - 16px)}.min-h-\[240px\]{min-height:240px}.w-12{width:3rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-\[280px\]{min-width:280px}.min-w-\[600px\]{min-width:600px}.min-w-\[8rem\]{min-width:8rem}.max-w-\[220px\]{max-width:220px}.max-w-\[300px\]{max-width:300px}.max-w-\[3800px\]{max-width:3800px}.max-w-\[400px\]{max-width:400px}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-cell{cursor:cell}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.cursor-text{cursor:text}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[1fr_150px\]{grid-template-columns:1fr 150px}.grid-cols-\[1fr_200px\]{grid-template-columns:1fr 200px}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-r-2{border-right-width:2px}.border-t{border-top-width:1px}.border-border{border-color:hsl(var(--border))}.border-border\/40{border-color:hsl(var(--border) / .4)}.border-border\/50{border-color:hsl(var(--border) / .5)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-background{background-color:hsl(var(--background))}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-black\/50{background-color:#00000080}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-content-bg{background-color:hsl(var(--content-bg))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-destructive\/90{background-color:hsl(var(--destructive) / .9)}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-grid-bg{background-color:hsl(var(--grid-bg))}.bg-header-bg{background-color:hsl(var(--header-bg))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/20{background-color:hsl(var(--primary) / .2)}.bg-primary\/90{background-color:hsl(var(--primary) / .9)}.bg-secondary{background-color:hsl(var(--secondary))}.bg-secondary\/80{background-color:hsl(var(--secondary) / .8)}.bg-sidebar-bg{background-color:hsl(var(--sidebar-bg))}.bg-tabs-bg{background-color:hsl(var(--tabs-bg))}.bg-transparent{background-color:transparent}.fill-yellow-500{fill:#eab308}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}@keyframes tab-enter{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}@keyframes tab-exit{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-12px)}}.animate-tab-enter{animation:tab-enter .2s ease-out forwards}.animate-tab-exit{animation:tab-exit .2s ease-in forwards}@media(prefers-reduced-motion:reduce){.animate-tab-enter,.animate-tab-exit{animation:none}}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:border-r-0:last-child{border-right-width:0px}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent) / .5)}.hover\:bg-accent\/80:hover{background-color:hsl(var(--accent) / .8)}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive) / .1)}.hover\:bg-destructive\/20:hover{background-color:hsl(var(--destructive) / .2)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-green-500\/20:hover{background-color:#22c55e33}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-primary\/50:hover{background-color:hsl(var(--primary) / .5)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-transparent:hover{background-color:transparent}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:bg-destructive\/10:focus{background-color:hsl(var(--destructive) / .1)}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:text-destructive:focus{color:hsl(var(--destructive))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.dark\:bg-content-bg:is(.dark *){background-color:hsl(var(--content-bg))}.dark\:bg-grid-bg:is(.dark *){background-color:hsl(var(--grid-bg))}.dark\:bg-header-bg:is(.dark *){background-color:hsl(var(--header-bg))}.dark\:bg-muted\/20:is(.dark *){background-color:hsl(var(--muted) / .2)}.dark\:bg-muted\/40:is(.dark *){background-color:hsl(var(--muted) / .4)}.dark\:bg-sidebar-bg:is(.dark *){background-color:hsl(var(--sidebar-bg))}.dark\:bg-tabs-bg:is(.dark *){background-color:hsl(var(--tabs-bg))}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}@media(min-width:640px){.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}.\[\&_th\]\:border-b-2 th{border-bottom-width:2px}.\[\&_th\]\:border-border th{border-color:hsl(var(--border))}.\[\&_th\]\:bg-muted th{background-color:hsl(var(--muted))}
|