From 5995650d67a8f11ea95d582b00a9f7451b7e2e68 Mon Sep 17 00:00:00 2001 From: blake Date: Mon, 22 Dec 2025 20:28:37 -0600 Subject: [PATCH] feat(utils): added in trycatch function --- backend/src/utils/trycatch.utlis.ts | 28 ++++++++++++++++++++++++++++ package-lock.json | 16 ++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 backend/src/utils/trycatch.utlis.ts diff --git a/backend/src/utils/trycatch.utlis.ts b/backend/src/utils/trycatch.utlis.ts new file mode 100644 index 0000000..b0d57cf --- /dev/null +++ b/backend/src/utils/trycatch.utlis.ts @@ -0,0 +1,28 @@ +type Success = { data: T; error: null }; +type Failure = { data: null; error: E }; + +export type Result = Success | Failure; + +/** + * A universal tryCatch wrapper that: + * - Never throws + * - Always resolves to Result + * - Allows optional error mapping function for strong typing + */ + +export async function tryCatch( + promise: Promise, + onError?: (error: unknown) => E, +): Promise> { + try { + const data = await promise; + return { data, error: null }; + } catch (err: unknown) { + const error = onError + ? onError(err) + : err instanceof Error + ? (err as E) + : (new Error(String(err)) as E); + return { data: null, error }; + } +} diff --git a/package-lock.json b/package-lock.json index e4484e2..c2579d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -356,6 +356,7 @@ "resolved": "https://registry.npmjs.org/@better-auth/core/-/core-1.4.6.tgz", "integrity": "sha512-cYjscr4wU5ZJPhk86JuUkecJT+LSYCFmUzYaitiLkizl+wCr1qdPFSEoAnRVZVTUEEoKpeS2XW69voBJ1NoB3g==", "dev": true, + "peer": true, "dependencies": { "@standard-schema/spec": "^1.0.0", "zod": "^4.1.12" @@ -387,13 +388,15 @@ "resolved": "https://registry.npmjs.org/@better-auth/utils/-/utils-0.3.0.tgz", "integrity": "sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@better-fetch/fetch": { "version": "1.1.18", "resolved": "https://registry.npmjs.org/@better-fetch/fetch/-/fetch-1.1.18.tgz", "integrity": "sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@biomejs/biome": { "version": "2.3.8", @@ -1135,6 +1138,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -2022,6 +2026,7 @@ "integrity": "sha512-gqkrWUsS8hcm0r44yn7/xZeV1ERva/nLgrLxFRUGb7aoNMIJfZJ3AC261zDQuOAKC7MiXai1WCpYc48jAHoShQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -2500,6 +2505,7 @@ "integrity": "sha512-nQJ3S87v6wApbDwbZ++FrQiSiVxWvZdjaO+2v6lZJAG2WWggkB2CziUDjPciz3eAt9TqfRursIQMZIcpkBnvlw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@better-auth/utils": "^0.3.0", "@better-fetch/fetch": "^1.1.4", @@ -3144,6 +3150,7 @@ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -3618,6 +3625,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -5154,6 +5162,7 @@ "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/panva" } @@ -5308,6 +5317,7 @@ "integrity": "sha512-QUOgl5ZrS9IRuhq5FvOKFSsD/3+IA6MLE81/bOOTRA/YQpKDza2sFdN5g6JCB9BOpqMJDGefLCQ9F12hRS13TA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" } @@ -5823,6 +5833,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^20.0.0 || >=22.0.0" } @@ -7788,6 +7799,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver"