From 0c64b6fa05c271918f174881619a15dfb33e04e6 Mon Sep 17 00:00:00 2001 From: kumudasrip Date: Fri, 7 Aug 2026 21:31:47 +0530 Subject: [PATCH] fix: TypeScript Refactoring --- apps/api/scripts/rotate-abha-secret.ts | 4 +- apps/api/src/routes/abha.ts | 11 +++-- apps/api/src/routes/compare.ts | 4 +- apps/api/src/routes/eligibility.ts | 6 +-- apps/api/src/routes/map.ts | 4 +- apps/api/src/routes/notifications.ts | 20 ++++----- apps/api/src/routes/pharmacies.ts | 41 +++++++++++-------- .../api/src/services/governmentEligibility.ts | 4 +- .../pharmacy/inventory/bulk-upload/page.tsx | 13 ++---- .../web/app/[locale]/admin/dashboard/page.tsx | 4 +- apps/web/app/[locale]/admin/synonyms/page.tsx | 16 ++++---- apps/web/app/[locale]/calculator/page.tsx | 4 +- apps/web/app/[locale]/components/Chatbot.tsx | 2 +- .../app/[locale]/interaction-checker/page.tsx | 4 +- apps/web/app/[locale]/scan/page.tsx | 4 +- apps/web/hooks/useAshaDashboard.ts | 6 +-- apps/web/hooks/useLASAChecker.ts | 4 +- apps/web/lib/workers/imageEnhancer.worker.ts | 2 +- 18 files changed, 76 insertions(+), 77 deletions(-) diff --git a/apps/api/scripts/rotate-abha-secret.ts b/apps/api/scripts/rotate-abha-secret.ts index 9875733af..22a29ec23 100644 --- a/apps/api/scripts/rotate-abha-secret.ts +++ b/apps/api/scripts/rotate-abha-secret.ts @@ -53,8 +53,8 @@ async function main() { encryption_iv: iv, encryption_salt: salt, }); - } catch (err: any) { - logger.error(`Failed to rotate secret for user ${record.user_id}: ${err.message}`); + } catch (err: unknown) { + logger.error(`Failed to rotate secret for user ${record.user_id}: ${err instanceof Error ? err.message : String(err)}`); } } diff --git a/apps/api/src/routes/abha.ts b/apps/api/src/routes/abha.ts index 06df04873..4e1f96602 100644 --- a/apps/api/src/routes/abha.ts +++ b/apps/api/src/routes/abha.ts @@ -125,10 +125,9 @@ router.get( const result = await getAbhaStatus(userId); res.status(200).json(result); - } catch (error) { - res.status(500).json({ - error: error instanceof Error ? error.message : "Failed to check ABHA status", - }); + } catch (error: unknown) { + console.error("ABHA linking error:", error); + res.status(500).json({ error: error instanceof Error ? error.message : "Failed to link ABHA address" }); } } ); @@ -294,9 +293,9 @@ router.get( const metricsResult = await downloadHealthRecords(userId); res.status(200).json(metricsResult); - } catch (error: any) { + } catch (error: unknown) { res.status(500).json({ - error: error.message || "Records processing engine encountered an error", + error: error instanceof Error ? error.message : "Records processing engine encountered an error", }); } } diff --git a/apps/api/src/routes/compare.ts b/apps/api/src/routes/compare.ts index cbd23ed6b..4a9d75ffa 100644 --- a/apps/api/src/routes/compare.ts +++ b/apps/api/src/routes/compare.ts @@ -84,9 +84,9 @@ router.post( } res.status(200).json(resultData); - } catch (mlError: any) { + } catch (mlError: unknown) { clearTimeout(timeoutId); - logger.error(`Failed to connect or fetch from ML Service: ${mlError.message}`); + logger.error("ML service failed, falling back to basic matching", { error: mlError instanceof Error ? mlError.message : String(mlError) }); res.status(502).json({ error: "ML service comparison failed or timed out." }); } } catch (error) { diff --git a/apps/api/src/routes/eligibility.ts b/apps/api/src/routes/eligibility.ts index 163085bfb..b7bdaecd4 100644 --- a/apps/api/src/routes/eligibility.ts +++ b/apps/api/src/routes/eligibility.ts @@ -192,10 +192,10 @@ router.post("/", eligibilityLimiter, async (req: Request, res: Response): Promis }); res.status(200).json({ eligible_schemes }); return; - } catch (err: any) { + } catch (err: unknown) { logger.error("Error calling PM-JAY eligibility service", { - error: err.message || String(err), - name: err.name, + error: err instanceof Error ? err.message : String(err), + name: err instanceof Error ? err.name : "Unknown", }); if (err instanceof PmjayAuthError) { diff --git a/apps/api/src/routes/map.ts b/apps/api/src/routes/map.ts index 17f87cb79..5d5b79de7 100644 --- a/apps/api/src/routes/map.ts +++ b/apps/api/src/routes/map.ts @@ -153,7 +153,7 @@ router.get( pharmacies = Array.isArray(rpcData) ? (rpcData as PharmacyRpcResult[]).map(formatNearbyPharmacy) : []; - } catch (err: any) { + } catch (err: unknown) { logger.warn({ message: "get_nearest_pharmacies RPC failed, falling back to db query", error: err, @@ -219,7 +219,7 @@ router.get( if (rpcError) throw rpcError; ashaWorkers = Array.isArray(rpcData) ? rpcData : []; - } catch (err: any) { + } catch (err: unknown) { logger.warn({ message: "get_nearest_asha_workers RPC failed, falling back to db query", error: err, diff --git a/apps/api/src/routes/notifications.ts b/apps/api/src/routes/notifications.ts index 2b4c8b15a..8b339a2fa 100644 --- a/apps/api/src/routes/notifications.ts +++ b/apps/api/src/routes/notifications.ts @@ -362,9 +362,9 @@ router.get("/status", limiter, optionalAuth, async (req: AuthenticatedRequest, r } else { subscriber = data; } - } catch (dbError: any) { + } catch (dbError: unknown) { dbFailed = true; - const msg = dbError?.message || String(dbError); + const msg = dbError instanceof Error ? dbError.message : String(dbError); if ( msg.includes("fetch failed") || msg.includes("refused") || @@ -467,9 +467,9 @@ router.post( } else { existing = data; } - } catch (dbError: any) { + } catch (dbError: unknown) { dbFailed = true; - const msg = dbError?.message || String(dbError); + const msg = dbError instanceof Error ? dbError.message : String(dbError); if ( msg.includes("fetch failed") || msg.includes("refused") || @@ -706,9 +706,9 @@ router.post( } else { subscriber = data; } - } catch (dbError: any) { + } catch (dbError: unknown) { dbFailed = true; - const msg = dbError?.message || String(dbError); + const msg = dbError instanceof Error ? dbError.message : String(dbError); if ( msg.includes("fetch failed") || msg.includes("refused") || @@ -991,9 +991,9 @@ router.patch( } else { data = dbData; } - } catch (dbError: any) { + } catch (dbError: unknown) { dbFailed = true; - const msg = dbError?.message || String(dbError); + const msg = dbError instanceof Error ? dbError.message : String(dbError); if ( msg.includes("fetch failed") || msg.includes("refused") || @@ -1074,9 +1074,9 @@ router.delete("/phone", limiter, optionalAuth, async (req: AuthenticatedRequest, } else { data = dbData; } - } catch (dbError: any) { + } catch (dbError: unknown) { dbFailed = true; - const msg = dbError?.message || String(dbError); + const msg = dbError instanceof Error ? dbError.message : String(dbError); if ( msg.includes("fetch failed") || msg.includes("refused") || diff --git a/apps/api/src/routes/pharmacies.ts b/apps/api/src/routes/pharmacies.ts index f6c1e1672..b729c3da3 100644 --- a/apps/api/src/routes/pharmacies.ts +++ b/apps/api/src/routes/pharmacies.ts @@ -367,9 +367,10 @@ router.post( const pharmacy = await pharmacyService.registerPharmacy(parsed.data, req.user.id); res.status(201).json({ pharmacy }); - } catch (err: any) { - if (err.status) { - res.status(err.status).json({ error: err.message }); + } catch (err: unknown) { + const status = err && typeof err === 'object' && 'status' in err ? (err as any).status : null; + if (status) { + res.status(status).json({ error: err instanceof Error ? err.message : String(err) }); return; } next(err); @@ -601,12 +602,13 @@ router.get( const result = await pharmacyService.searchByMedicine(rawQuery); res.json(result); - } catch (err: any) { - if (err.status) { - res.status(err.status).json({ error: err.message }); + } catch (err: unknown) { + const status = err && typeof err === 'object' && 'status' in err ? (err as any).status : null; + if (status) { + res.status(status).json({ error: err instanceof Error ? err.message : String(err) }); return; } - logger.error("Pharmacy medicine search failed", { error: err.message }); + logger.error("Pharmacy medicine search failed", { error: err instanceof Error ? err.message : String(err) }); res.status(500).json({ error: "Database query failed" }); } } @@ -979,7 +981,7 @@ router.post( ); res.end(); } - } catch (err: any) { + } catch (err: unknown) { const message = err instanceof Error ? err.message : "Unknown error"; logger.error(`Exception in bulk operations handler: ${message}`); if (!res.headersSent) { @@ -1018,9 +1020,10 @@ router.put( req.body ); res.status(200).json({ pharmacy }); - } catch (err: any) { - if (err.status) { - res.status(err.status).json({ error: err.message }); + } catch (err: unknown) { + const status = err && typeof err === 'object' && 'status' in err ? (err as any).status : null; + if (status) { + res.status(status).json({ error: err instanceof Error ? err.message : String(err) }); return; } next(err); @@ -1045,9 +1048,10 @@ router.delete( const pharmacyId = String(req.params.id); await pharmacyService.deletePharmacy(pharmacyId, req.user!.id, req.user!.role); res.status(200).json({ message: "Pharmacy deleted successfully" }); - } catch (err: any) { - if (err.status) { - res.status(err.status).json({ error: err.message }); + } catch (err: unknown) { + const status = err && typeof err === 'object' && 'status' in err ? (err as any).status : null; + if (status) { + res.status(status).json({ error: err instanceof Error ? err.message : String(err) }); return; } next(err); @@ -1079,12 +1083,13 @@ router.post( fileContent ); res.status(200).json(result); - } catch (err: any) { - if (err.status) { - res.status(err.status).json({ error: err.message }); + } catch (err: unknown) { + const status = err && typeof err === 'object' && 'status' in err ? (err as any).status : null; + if (status) { + res.status(status).json({ error: err instanceof Error ? err.message : String(err) }); return; } - logger.error(`Exception in specific pharmacy upload handler: ${err.message}`); + logger.error(`Exception in specific pharmacy upload handler: ${err instanceof Error ? err.message : String(err)}`); next(err); } } diff --git a/apps/api/src/services/governmentEligibility.ts b/apps/api/src/services/governmentEligibility.ts index 4b72fe3d4..9530a852b 100644 --- a/apps/api/src/services/governmentEligibility.ts +++ b/apps/api/src/services/governmentEligibility.ts @@ -268,9 +268,9 @@ export async function fetchPmjayEligibility( how_to_apply: s.how_to_apply, link: s.link, })); - } catch (err: any) { + } catch (err: unknown) { logger.error("Error evaluating eligibility: ", err); - const errName = err?.name; + const errName = err instanceof Error ? err.name : null; if ( err instanceof PmjayAuthError || errName === "PmjayAuthError" || diff --git a/apps/web/app/[locale]/(dashboard)/pharmacy/inventory/bulk-upload/page.tsx b/apps/web/app/[locale]/(dashboard)/pharmacy/inventory/bulk-upload/page.tsx index dd7d513bf..27b1d9cfd 100644 --- a/apps/web/app/[locale]/(dashboard)/pharmacy/inventory/bulk-upload/page.tsx +++ b/apps/web/app/[locale]/(dashboard)/pharmacy/inventory/bulk-upload/page.tsx @@ -148,19 +148,14 @@ export default function BulkUploadPage() { errors: data.errors, }); } - } catch (parseErr: any) { - if ( - parseErr.message !== "Unexpected end of JSON input" && - !parseErr.message.includes("JSON") - ) { - throw parseErr; - } + } catch (parseErr: unknown) { + throw parseErr; } } } } - } catch (err: any) { - setApiError(err.message || "An unexpected error occurred."); + } catch (err: unknown) { + setApiError(err instanceof Error ? err.message : "An unexpected error occurred."); } finally { setIsLoading(false); setProgressStats(null); diff --git a/apps/web/app/[locale]/admin/dashboard/page.tsx b/apps/web/app/[locale]/admin/dashboard/page.tsx index 8144b79bc..68d98a426 100644 --- a/apps/web/app/[locale]/admin/dashboard/page.tsx +++ b/apps/web/app/[locale]/admin/dashboard/page.tsx @@ -262,11 +262,11 @@ export default function AdminDashboard() { keys! ); - } catch (err: any) { + } catch (err: unknown) { notify( <> {" "} - {err.message || "Cache flush failed"} + {err instanceof Error ? err.message : "Cache flush failed"} , false ); diff --git a/apps/web/app/[locale]/admin/synonyms/page.tsx b/apps/web/app/[locale]/admin/synonyms/page.tsx index 2cecb1b58..5a506769a 100644 --- a/apps/web/app/[locale]/admin/synonyms/page.tsx +++ b/apps/web/app/[locale]/admin/synonyms/page.tsx @@ -94,8 +94,8 @@ export default function AdminSynonymsPage() { if (error) throw error; setSynonyms(data as OcrSynonym[]); - } catch (err: any) { - setError(err.message || t("fetchError")); + } catch (err: unknown) { + setError(err instanceof Error ? err.message : t("fetchError")); } finally { setLoading(false); } @@ -136,8 +136,8 @@ export default function AdminSynonymsPage() { setNormalizedTerm(""); await fetchSynonyms(); await invalidateCache(); - } catch (err: any) { - setError(err.message || t("addError")); + } catch (err: unknown) { + setError(err instanceof Error ? err.message : t("addError")); } finally { setActionLoading(null); } @@ -154,8 +154,8 @@ export default function AdminSynonymsPage() { await fetchSynonyms(); await invalidateCache(); - } catch (err: any) { - setError(err.message || t("deleteError")); + } catch (err: unknown) { + setError(err instanceof Error ? err.message : t("deleteError")); } finally { setActionLoading(null); } @@ -220,8 +220,8 @@ export default function AdminSynonymsPage() { await fetchSynonyms(); await invalidateCache(); toast.success(t("uploadSuccess", { count: payload.length })); - } catch (err: any) { - setError(err.message || t("uploadError")); + } catch (err: unknown) { + setError(err instanceof Error ? err.message : t("uploadError")); if (fileInputRef.current) fileInputRef.current.value = ""; } finally { setActionLoading(null); diff --git a/apps/web/app/[locale]/calculator/page.tsx b/apps/web/app/[locale]/calculator/page.tsx index 774c6cd82..cae4380dd 100644 --- a/apps/web/app/[locale]/calculator/page.tsx +++ b/apps/web/app/[locale]/calculator/page.tsx @@ -44,8 +44,8 @@ async function searchMedicines(query: string): Promise { composition: row.composition, cdsco_approval_status: row.cdsco_approval_status || "approved", })); - } catch (error: any) { - console.error(error.message || error); + } catch (error: unknown) { + console.error(error instanceof Error ? error.message : error); return []; } } diff --git a/apps/web/app/[locale]/components/Chatbot.tsx b/apps/web/app/[locale]/components/Chatbot.tsx index d29525689..ab16fc6ad 100644 --- a/apps/web/app/[locale]/components/Chatbot.tsx +++ b/apps/web/app/[locale]/components/Chatbot.tsx @@ -192,7 +192,7 @@ export default function Chatbot() { msg.id === typingMessage.id ? { id: msg.id, text: finalText, isBot: true } : msg ); }); - } catch (error: any) { + } catch (error: unknown) { if (isAbortError(error)) return; console.error("Chatbot API Error:", error); diff --git a/apps/web/app/[locale]/interaction-checker/page.tsx b/apps/web/app/[locale]/interaction-checker/page.tsx index 1b0951288..ccaa91e21 100644 --- a/apps/web/app/[locale]/interaction-checker/page.tsx +++ b/apps/web/app/[locale]/interaction-checker/page.tsx @@ -229,8 +229,8 @@ export default function InteractionCheckerPage() { setInteractions(sorted); setIsOfflineResult(response.verified === false); setHasChecked(true); - } catch (err: any) { - setError(err.message || t("errorMessage")); + } catch (err: unknown) { + setError(err instanceof Error ? err.message : t("errorMessage")); } finally { setIsLoading(false); } diff --git a/apps/web/app/[locale]/scan/page.tsx b/apps/web/app/[locale]/scan/page.tsx index 55e5d246b..8ca72aabf 100644 --- a/apps/web/app/[locale]/scan/page.tsx +++ b/apps/web/app/[locale]/scan/page.tsx @@ -248,8 +248,8 @@ export default function ScanPage() { try { await handleVerify(scannedText); - } catch (error: any) { - setApiError(error.message || "Failed to verify medicine with CDSCO."); + } catch (error: unknown) { + setApiError(error instanceof Error ? error.message : "Failed to verify medicine with CDSCO."); } finally { setIsVerifying(false); } diff --git a/apps/web/hooks/useAshaDashboard.ts b/apps/web/hooks/useAshaDashboard.ts index 2c4f82fe8..cc88901be 100644 --- a/apps/web/hooks/useAshaDashboard.ts +++ b/apps/web/hooks/useAshaDashboard.ts @@ -36,8 +36,8 @@ export function useAshaDashboard() { setStats(statsData); setLeaderboard(leaderboardData.leaderboard); - } catch (err: any) { - setError(err.message || "An error occurred"); + } catch (err: unknown) { + setError(err instanceof Error ? err.message : "An error occurred"); } finally { setLoading(false); } @@ -66,7 +66,7 @@ export function useAshaDashboard() { setLeaderboard(leaderboardData.leaderboard); return data; - } catch (err: any) { + } catch (err: unknown) { console.error(err); throw err; } diff --git a/apps/web/hooks/useLASAChecker.ts b/apps/web/hooks/useLASAChecker.ts index 18f1d5206..b651e49e3 100644 --- a/apps/web/hooks/useLASAChecker.ts +++ b/apps/web/hooks/useLASAChecker.ts @@ -28,8 +28,8 @@ export function useLASAChecker() { try { const result = await checkLasaConflicts(query, controller.signal); setData(result); - } catch (err: any) { - if (err.name === "AbortError") { + } catch (err: unknown) { + if (err instanceof Error && err.name === "AbortError") { return; } console.error("useLASAChecker error:", err); diff --git a/apps/web/lib/workers/imageEnhancer.worker.ts b/apps/web/lib/workers/imageEnhancer.worker.ts index 7f262a02b..b41155181 100644 --- a/apps/web/lib/workers/imageEnhancer.worker.ts +++ b/apps/web/lib/workers/imageEnhancer.worker.ts @@ -256,7 +256,7 @@ ctx.onmessage = async (event: MessageEvent) => { ); ctx.postMessage({ id, pixels: enhancedPixels }, [enhancedPixels.buffer]); } - } catch (error: any) { + } catch (error: unknown) { ctx.postMessage({ id, error: error instanceof Error ? error.message : "Image enhancement worker failed.",