Skip to content

Commit be92e91

Browse files
committed
add logger class
1 parent 233a8e0 commit be92e91

File tree

11 files changed

+93
-22
lines changed

11 files changed

+93
-22
lines changed

eslint.config.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ export default defineConfig(
2525
// typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects.
2626
// see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors
2727
"no-undef": "off",
28+
// Forbid console methods - use the logger utility instead
29+
"no-console": "error",
30+
},
31+
},
32+
{
33+
// Allow console in CLI tool and logger implementation
34+
files: ["cli.ts", "src/lib/utils/logger.ts"],
35+
rules: {
36+
"no-console": "off",
2837
},
2938
},
3039
{

src/api/servers.remote.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import JsonEncoder from "$lib/server/JsonEncoder";
44
import { getMongo } from "$lib/server/mongo";
55
import { isEmptyObject } from "$lib/utils/isEmptyObject";
66
import { parseJSON } from "$lib/utils/jsonParser";
7+
import { logger } from "$lib/utils/logger";
78
import { error } from "@sveltejs/kit";
89
import { ObjectId, type Document } from "mongodb";
910
import { z } from "zod";
@@ -21,6 +22,7 @@ export const addServer = command(
2122
url: z.string(),
2223
}),
2324
async ({ url }) => {
25+
logger.log("addServer called with payload:", { url });
2426
const mongo = await getMongo();
2527
await mongo.addServer(url);
2628
return { ok: true };
@@ -29,6 +31,7 @@ export const addServer = command(
2931

3032
// Remove a server
3133
export const removeServer = command(z.string(), async (serverName) => {
34+
logger.log("removeServer called with payload:", { serverName });
3235
const mongo = await getMongo();
3336
await mongo.removeServer(serverName);
3437
return { ok: true };
@@ -46,6 +49,7 @@ export const updateDocument = command(
4649
upsert: z.boolean().optional().default(false),
4750
}),
4851
async ({ server, database, collection, document, value, partial, upsert }) => {
52+
logger.log("updateDocument called with payload:", { server, database, collection, document, partial, upsert });
4953
checkReadOnly();
5054

5155
const mongo = await getMongo();
@@ -96,6 +100,7 @@ export const insertDocument = command(
96100
value: z.unknown(),
97101
}),
98102
async ({ server, database, collection, document, value }) => {
103+
logger.log("insertDocument called with payload:", { server, database, collection, document });
99104
checkReadOnly();
100105

101106
const mongo = await getMongo();
@@ -130,6 +135,7 @@ export const deleteDocument = command(
130135
document: z.string(),
131136
}),
132137
async ({ server, database, collection, document }) => {
138+
logger.log("deleteDocument called with payload:", { server, database, collection, document });
133139
checkReadOnly();
134140

135141
const mongo = await getMongo();
@@ -162,6 +168,7 @@ export const updateMany = command(
162168
update: z.string(),
163169
}),
164170
async ({ server, database, collection, filter, update }) => {
171+
logger.log("updateMany called with payload:", { server, database, collection, filter, update });
165172
checkReadOnly();
166173

167174
const mongo = await getMongo();
@@ -190,6 +197,7 @@ export const hideIndex = command(
190197
index: z.string(),
191198
}),
192199
async ({ server, database, collection, index }) => {
200+
logger.log("hideIndex called with payload:", { server, database, collection, index });
193201
checkReadOnly();
194202

195203
const mongo = await getMongo();
@@ -218,6 +226,7 @@ export const unhideIndex = command(
218226
index: z.string(),
219227
}),
220228
async ({ server, database, collection, index }) => {
229+
logger.log("unhideIndex called with payload:", { server, database, collection, index });
221230
checkReadOnly();
222231

223232
const mongo = await getMongo();
@@ -246,6 +255,7 @@ export const dropIndex = command(
246255
index: z.string(),
247256
}),
248257
async ({ server, database, collection, index }) => {
258+
logger.log("dropIndex called with payload:", { server, database, collection, index });
249259
checkReadOnly();
250260

251261
const mongo = await getMongo();
@@ -270,6 +280,7 @@ export const dropCollection = command(
270280
collection: z.string(),
271281
}),
272282
async ({ server, database, collection }) => {
283+
logger.log("dropCollection called with payload:", { server, database, collection });
273284
checkReadOnly();
274285

275286
const mongo = await getMongo();
@@ -286,6 +297,7 @@ export const dropCollection = command(
286297

287298
// Retry connection to a server
288299
export const retryConnection = command(z.string(), async (serverName) => {
300+
logger.log("retryConnection called with payload:", { serverName });
289301
const mongo = await getMongo();
290302

291303
// Reconnect the client (closes old connection and creates a new one)
@@ -368,7 +380,7 @@ export const loadDocuments = query(
368380
isAggregation: true,
369381
};
370382
} catch (err) {
371-
console.error("Error executing aggregation:", err);
383+
logger.error("Error executing aggregation:", err);
372384
error(500, `Failed to execute aggregation: ${err instanceof Error ? err.message : String(err)}`);
373385
}
374386
}
@@ -390,7 +402,7 @@ export const loadDocuments = query(
390402
isAggregation: false,
391403
};
392404
} catch (err) {
393-
console.error("Error fetching query results:", err);
405+
logger.error("Error fetching query results:", err);
394406
error(500, `Failed to fetch query results: ${err instanceof Error ? err.message : String(err)}`);
395407
}
396408
},
@@ -431,7 +443,7 @@ export const fetchMappedDocument = query(
431443
};
432444
}
433445
} catch (err) {
434-
console.error(`Error fetching mapped document from ${mapping.collection}.${mapping.on}:`, err);
446+
logger.error(`Error fetching mapped document from ${mapping.collection}.${mapping.on}:`, err);
435447
// Continue to next mapping on error
436448
continue;
437449
}

src/hooks.server.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { logger } from "$lib/utils/logger";
12
import type { Handle, HandleServerError } from "@sveltejs/kit";
23
import { MongoError } from "mongodb";
34

@@ -26,7 +27,7 @@ export const handle: Handle = async ({ event, resolve }) => {
2627

2728
export const handleError: HandleServerError = ({ error }) => {
2829
// Log the error server-side
29-
console.error(error);
30+
logger.error(error);
3031

3132
// Handle MongoDB errors specifically
3233
if (error instanceof MongoError) {

src/lib/server/mongo.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { CollectionJSON, CollectionMappings, Mappings } from "$lib/types";
2+
import { logger } from "$lib/utils/logger";
23
import { MongoClient, type Collection } from "mongodb";
34
import { URL } from "url";
45
import { HostsManager } from "./HostsManager";
@@ -148,7 +149,7 @@ class MongoConnections {
148149
this.clientIds.set(hostname, host._id);
149150
}
150151
} catch (err) {
151-
console.error(`Failed to parse URL for host ${host.path}:`, err);
152+
logger.error(`Failed to parse URL for host ${host.path}:`, err);
152153
}
153154
}
154155
}
@@ -201,7 +202,7 @@ class MongoConnections {
201202
this.clientIds.set(hostname, id);
202203
}
203204
} catch (err) {
204-
console.error(`Failed to parse URL for host ${hostPath}:`, err);
205+
logger.error(`Failed to parse URL for host ${hostPath}:`, err);
205206
throw err;
206207
}
207208
}
@@ -212,7 +213,7 @@ class MongoConnections {
212213
this.clients
213214
.get(name)
214215
?.close()
215-
.catch((err) => console.error(`Error closing client ${name}:`, err));
216+
.catch((err) => logger.error(`Error closing client ${name}:`, err));
216217
this.clients.delete(name);
217218
this.clientIds.delete(name);
218219
}
@@ -228,7 +229,7 @@ class MongoConnections {
228229
// Close the old client
229230
const oldClient = this.clients.get(name);
230231
if (oldClient) {
231-
oldClient.close()?.catch((err) => console.error(`Error closing old client ${name}:`, err));
232+
oldClient.close()?.catch((err) => logger.error(`Error closing old client ${name}:`, err));
232233
}
233234

234235
// Create a new client

src/lib/utils/logger.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Logger class that wraps console methods for centralized logging
3+
*/
4+
class Logger {
5+
/**
6+
* Log an informational message
7+
*/
8+
log(...args: unknown[]): void {
9+
console.log(...args);
10+
}
11+
12+
/**
13+
* Log an informational message (alias for log)
14+
*/
15+
info(...args: unknown[]): void {
16+
console.log(...args);
17+
}
18+
19+
/**
20+
* Log an error message
21+
*/
22+
error(...args: unknown[]): void {
23+
console.error(...args);
24+
}
25+
26+
/**
27+
* Log a warning message
28+
*/
29+
warn(...args: unknown[]): void {
30+
console.warn(...args);
31+
}
32+
33+
/**
34+
* Log a debug message
35+
*/
36+
debug(...args: unknown[]): void {
37+
console.debug(...args);
38+
}
39+
}
40+
41+
// Export a singleton instance
42+
export const logger = new Logger();

src/routes/servers/+page.server.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getMongo } from "$lib/server/mongo";
22
import type { DatabaseStats } from "$lib/types";
3+
import { logger } from "$lib/utils/logger";
34
import type { PageServerLoad } from "./$types";
45

56
export const load: PageServerLoad = async () => {
@@ -18,7 +19,7 @@ export const load: PageServerLoad = async () => {
1819
const db = client.db(d.name);
1920
const dbStats: Pick<DatabaseStats, "collections"> = await (db.stats() as Promise<DatabaseStats>).catch(
2021
() => {
21-
console.error(`Error getting stats for database ${d.name} on server ${name}`);
22+
logger.error(`Error getting stats for database ${d.name} on server ${name}`);
2223
return {
2324
collections: 0,
2425
};
@@ -37,7 +38,7 @@ export const load: PageServerLoad = async () => {
3738
size: results.totalSize ?? 0,
3839
};
3940
} catch (err) {
40-
console.error(`Error getting details for server ${name}:`, err);
41+
logger.error(`Error getting details for server ${name}:`, err);
4142
return {
4243
error: {
4344
code: err instanceof Error && "code" in err ? err.code : undefined,
@@ -47,7 +48,7 @@ export const load: PageServerLoad = async () => {
4748
};
4849
}
4950
})().catch((err) => {
50-
console.error(`Error getting details for server ${name}:`, err);
51+
logger.error(`Error getting details for server ${name}:`, err);
5152
return {
5253
error: {
5354
code: err instanceof Error && "code" in err ? err.code : undefined,

src/routes/servers/[server]/databases/+page.server.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getCollectionJson, getMongo } from "$lib/server/mongo";
22
import type { CollectionJSON, DatabaseStats } from "$lib/types";
3+
import { logger } from "$lib/utils/logger";
34
import type { PageServerLoad } from "./$types";
45

56
export const load: PageServerLoad = async ({ params }) => {
@@ -21,7 +22,7 @@ export const load: PageServerLoad = async ({ params }) => {
2122
const db = client.db(d.name);
2223
const dbStats: Pick<DatabaseStats, "dataSize" | "avgObjSize" | "storageSize" | "indexSize" | "collections"> =
2324
await (db.stats() as Promise<DatabaseStats>).catch(() => {
24-
console.error(`Error getting stats for database ${d.name} on server ${params.server}`);
25+
logger.error(`Error getting stats for database ${d.name} on server ${params.server}`);
2526
return {
2627
dataSize: 0,
2728
avgObjSize: 0,

src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.server.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { getMongo } from "$lib/server/mongo";
44
import { type MongoDocument } from "$lib/types";
55
import { isEmptyObject } from "$lib/utils/isEmptyObject";
66
import { parseJSON } from "$lib/utils/jsonParser";
7+
import { logger } from "$lib/utils/logger";
78
import type { Document } from "mongodb";
89
import type { PageServerLoad } from "./$types";
910

@@ -117,7 +118,7 @@ export const load: PageServerLoad = async ({ params, url }) => {
117118
error: null as string | null,
118119
}))
119120
.catch((err) => {
120-
console.error("Error executing aggregation:", err);
121+
logger.error("Error executing aggregation:", err);
121122
return {
122123
data: [] as MongoDocument[],
123124
error: `Failed to execute aggregation: ${err instanceof Error ? err.message : String(err)}`,
@@ -133,7 +134,7 @@ export const load: PageServerLoad = async ({ params, url }) => {
133134
error: null,
134135
}))
135136
.catch((err) => {
136-
console.error("Error counting documents:", err);
137+
logger.error("Error counting documents:", err);
137138
return {
138139
data: 0,
139140
error: `Failed to count documents: ${err instanceof Error ? err.message : String(err)}`,
@@ -167,7 +168,7 @@ export const load: PageServerLoad = async ({ params, url }) => {
167168
error: null as string | null,
168169
}))
169170
.catch((err) => {
170-
console.error("Error fetching query results:", err);
171+
logger.error("Error fetching query results:", err);
171172
return {
172173
data: [] as MongoDocument[],
173174
error: `Failed to fetch query results: ${err instanceof Error ? err.message : String(err)}`,
@@ -191,7 +192,7 @@ export const load: PageServerLoad = async ({ params, url }) => {
191192
};
192193
}
193194
} catch (err) {
194-
console.error("Error counting documents:", err);
195+
logger.error("Error counting documents:", err);
195196
return {
196197
data: 0,
197198
error: `Failed to count documents: ${err instanceof Error ? err.message : String(err)}`,

src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import { notificationStore } from "$lib/stores/notifications.svelte";
1515
import type { MongoDocument, SearchParams } from "$lib/types";
1616
import { formatNumber } from "$lib/utils/filters";
17+
import { logger } from "$lib/utils/logger";
1718
import { SvelteURLSearchParams } from "svelte/reactivity";
1819
import type { PageData } from "./$types";
1920
@@ -103,7 +104,7 @@
103104
modifiedItems = items;
104105
}
105106
} catch (error) {
106-
console.log(error);
107+
logger.log(error);
107108
notificationStore.notifyError(error, "Failed to update document");
108109
}
109110
}
@@ -195,7 +196,7 @@
195196
editMode = false;
196197
}
197198
} catch (error) {
198-
console.error(error);
199+
logger.error(error);
199200
notificationStore.notifyError(error, "Failed to update documents");
200201
} finally {
201202
isUpdating = false;

src/routes/servers/[server]/databases/[database]/collections/[collection]/indexes/+page.server.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import JsonEncoder from "$lib/server/JsonEncoder";
22
import { getMongo } from "$lib/server/mongo";
3+
import { logger } from "$lib/utils/logger";
34
import type { IndexDescription } from "mongodb";
45
import type { PageServerLoad } from "./$types";
56

@@ -31,7 +32,7 @@ export const load: PageServerLoad = async ({ params, depends }) => {
3132
{} as Record<string, { ops: number; since: Date }>,
3233
);
3334
} catch (err) {
34-
console.error("Error fetching index stats:", err);
35+
logger.error("Error fetching index stats:", err);
3536
// Continue without stats if unavailable
3637
}
3738

@@ -56,7 +57,7 @@ export const load: PageServerLoad = async ({ params, depends }) => {
5657
indexSizes = collStatsResult.storageStats.indexSizes;
5758
}
5859
} catch (err) {
59-
console.error("Error fetching index sizes:", err);
60+
logger.error("Error fetching index sizes:", err);
6061
// Continue without sizes if unavailable
6162
}
6263

@@ -73,7 +74,7 @@ export const load: PageServerLoad = async ({ params, depends }) => {
7374
error: null as string | null,
7475
};
7576
} catch (err) {
76-
console.error("Error fetching indexes:", err);
77+
logger.error("Error fetching indexes:", err);
7778
return {
7879
data: [],
7980
error: `Failed to fetch indexes: ${err instanceof Error ? err.message : String(err)}`,

0 commit comments

Comments
 (0)