diff --git a/.gitignore b/.gitignore index 825c471d73..53b1f4eb70 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,6 @@ Zone.Identifier # uploads packages/lib/uploads + +# Pino Logs +formbricks.log \ No newline at end of file diff --git a/apps/web/app/(app)/environments/[environmentId]/(actionsAndAttributes)/attributes/actions.ts b/apps/web/app/(app)/environments/[environmentId]/(actionsAndAttributes)/attributes/actions.ts index df117c45a0..6b2ff419a0 100644 --- a/apps/web/app/(app)/environments/[environmentId]/(actionsAndAttributes)/attributes/actions.ts +++ b/apps/web/app/(app)/environments/[environmentId]/(actionsAndAttributes)/attributes/actions.ts @@ -5,6 +5,7 @@ import { getServerSession } from "next-auth"; import { canUserAccessAttributeClass } from "@formbricks/lib/attributeClass/auth"; import { authOptions } from "@formbricks/lib/authOptions"; import { getSegmentsByAttributeClassName } from "@formbricks/lib/segment/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { TAttributeClass } from "@formbricks/types/attributeClasses"; import { AuthorizationError } from "@formbricks/types/errors"; @@ -36,7 +37,7 @@ export const getSegmentsByAttributeClassAction = async ( return { activeSurveys, inactiveSurveys }; } catch (err) { - console.log(err); + logger.error(`Error getting segments by attribute class: ${err}`); throw err; } }; diff --git a/apps/web/app/(auth)/invite/page.tsx b/apps/web/app/(auth)/invite/page.tsx index 3b4a91795c..8995bc7e31 100644 --- a/apps/web/app/(auth)/invite/page.tsx +++ b/apps/web/app/(auth)/invite/page.tsx @@ -7,6 +7,7 @@ import { deleteInvite, getInvite } from "@formbricks/lib/invite/service"; import { verifyInviteToken } from "@formbricks/lib/jwt"; import { createMembership } from "@formbricks/lib/membership/service"; import { updateUser } from "@formbricks/lib/user/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { ExpiredContent, @@ -49,7 +50,7 @@ export default async function InvitePage({ searchParams }) { return ; } } catch (e) { - console.error(e); + logger.error(e); return ; } } diff --git a/apps/web/app/[shortUrlId]/page.tsx b/apps/web/app/[shortUrlId]/page.tsx index 79280ab3cc..db34da7d35 100644 --- a/apps/web/app/[shortUrlId]/page.tsx +++ b/apps/web/app/[shortUrlId]/page.tsx @@ -1,6 +1,7 @@ import { notFound, redirect } from "next/navigation"; import { getShortUrl } from "@formbricks/lib/shortUrl/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { ZShortUrlId } from "@formbricks/types/shortUrl"; export default async function ShortUrlPage({ params }) { @@ -18,7 +19,7 @@ export default async function ShortUrlPage({ params }) { try { shortUrl = await getShortUrl(params.shortUrlId); } catch (error) { - console.error(error); + logger.error(error); } if (shortUrl) { diff --git a/apps/web/app/api/cron/report-usage/route.ts b/apps/web/app/api/cron/report-usage/route.ts index dd2451afbd..881d89433d 100644 --- a/apps/web/app/api/cron/report-usage/route.ts +++ b/apps/web/app/api/cron/report-usage/route.ts @@ -9,6 +9,7 @@ import { getMonthlyTeamResponseCount, getTeamsWithPaidPlan, } from "@formbricks/lib/team/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { TTeam } from "@formbricks/types/teams"; async function reportTeamUsage(team: TTeam) { @@ -65,7 +66,7 @@ export async function POST(): Promise { return responses.successResponse({}, true); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true); } } diff --git a/apps/web/app/api/internal/csv-conversion/route.ts b/apps/web/app/api/internal/csv-conversion/route.ts index 8696359721..a2a44c43dd 100755 --- a/apps/web/app/api/internal/csv-conversion/route.ts +++ b/apps/web/app/api/internal/csv-conversion/route.ts @@ -4,6 +4,7 @@ import { getServerSession } from "next-auth"; import { NextRequest } from "next/server"; import { authOptions } from "@formbricks/lib/authOptions"; +import { logger } from "@formbricks/lib/utils/logger"; export async function POST(request: NextRequest) { const session = await getServerSession(authOptions); @@ -29,7 +30,7 @@ export async function POST(request: NextRequest) { try { csv = await parser.parse(json).promise(); } catch (err) { - console.log({ err }); + logger.error(err); throw new Error("Failed to convert to CSV"); } diff --git a/apps/web/app/api/pipeline/route.ts b/apps/web/app/api/pipeline/route.ts index 91b599cf4a..11c49c6b08 100644 --- a/apps/web/app/api/pipeline/route.ts +++ b/apps/web/app/api/pipeline/route.ts @@ -10,6 +10,7 @@ import { getProductByEnvironmentId } from "@formbricks/lib/product/service"; import { getResponseCountBySurveyId } from "@formbricks/lib/response/service"; import { getSurvey, updateSurvey } from "@formbricks/lib/survey/service"; import { convertDatesInObject } from "@formbricks/lib/time"; +import { logger } from "@formbricks/lib/utils/logger"; import { checkForRecallInHeadline } from "@formbricks/lib/utils/recall"; import { ZPipelineInput } from "@formbricks/types/pipelines"; import { TUserNotificationSettings } from "@formbricks/types/user"; @@ -28,7 +29,7 @@ export async function POST(request: Request) { const inputValidation = ZPipelineInput.safeParse(jsonInput); if (!inputValidation.success) { - console.error(inputValidation.error); + logger.error(inputValidation.error); return responses.badRequestResponse( "Fields are missing or incorrectly formatted", transformErrorToDetails(inputValidation.error), @@ -125,7 +126,7 @@ export async function POST(request: Request) { if (usersWithNotifications.length > 0) { if (!survey) { - console.error(`Pipeline: Survey with id ${surveyId} not found`); + logger.error(`Pipeline: Survey with id ${surveyId} not found`); return new Response("Survey not found", { status: 404, }); diff --git a/apps/web/app/api/v1/(legacy)/client/[environmentId]/people/[userId]/set-attribute/route.ts b/apps/web/app/api/v1/(legacy)/client/[environmentId]/people/[userId]/set-attribute/route.ts index 5184050fe4..92ea8416b9 100644 --- a/apps/web/app/api/v1/(legacy)/client/[environmentId]/people/[userId]/set-attribute/route.ts +++ b/apps/web/app/api/v1/(legacy)/client/[environmentId]/people/[userId]/set-attribute/route.ts @@ -9,6 +9,7 @@ import { getProductByEnvironmentId } from "@formbricks/lib/product/service"; import { surveyCache } from "@formbricks/lib/survey/cache"; import { getSyncSurveys } from "@formbricks/lib/survey/service"; import { getTeamByEnvironmentId } from "@formbricks/lib/team/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { TJsStateSync, ZJsPeopleAttributeInput } from "@formbricks/types/js"; interface Context { @@ -96,7 +97,7 @@ export async function POST(req: Request, context: Context): Promise { return responses.successResponse({ ...state }, true); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(`Unable to complete request: ${error.message}`, true); } } diff --git a/apps/web/app/api/v1/(legacy)/client/displays/[displayId]/route.ts b/apps/web/app/api/v1/(legacy)/client/displays/[displayId]/route.ts index 50cf84fbe0..f18d135b18 100644 --- a/apps/web/app/api/v1/(legacy)/client/displays/[displayId]/route.ts +++ b/apps/web/app/api/v1/(legacy)/client/displays/[displayId]/route.ts @@ -2,6 +2,7 @@ import { responses } from "@/app/lib/api/response"; import { transformErrorToDetails } from "@/app/lib/api/validator"; import { updateDisplayLegacy } from "@formbricks/lib/display/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { ZDisplayLegacyUpdateInput } from "@formbricks/types/displays"; export async function OPTIONS(): Promise { @@ -30,7 +31,7 @@ export async function PUT( const display = await updateDisplayLegacy(displayId, inputValidation.data); return responses.successResponse(display, true); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message, true); } } diff --git a/apps/web/app/api/v1/(legacy)/client/displays/route.ts b/apps/web/app/api/v1/(legacy)/client/displays/route.ts index 83071eb537..e4c268d8e7 100644 --- a/apps/web/app/api/v1/(legacy)/client/displays/route.ts +++ b/apps/web/app/api/v1/(legacy)/client/displays/route.ts @@ -4,6 +4,7 @@ import { transformErrorToDetails } from "@/app/lib/api/validator"; import { createDisplayLegacy } from "@formbricks/lib/display/service"; import { capturePosthogEnvironmentEvent } from "@formbricks/lib/posthogServer"; import { getSurvey } from "@formbricks/lib/survey/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { TDisplay, ZDisplayLegacyCreateInput } from "@formbricks/types/displays"; import { InvalidInputError } from "@formbricks/types/errors"; @@ -38,7 +39,7 @@ export async function POST(request: Request): Promise { if (error instanceof InvalidInputError) { return responses.badRequestResponse(error.message); } else { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message); } } @@ -55,7 +56,7 @@ export async function POST(request: Request): Promise { if (error instanceof InvalidInputError) { return responses.badRequestResponse(error.message); } else { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message); } } diff --git a/apps/web/app/api/v1/(legacy)/client/people/[personId]/set-attribute/route.ts b/apps/web/app/api/v1/(legacy)/client/people/[personId]/set-attribute/route.ts index d49d9b2e89..8c24055346 100644 --- a/apps/web/app/api/v1/(legacy)/client/people/[personId]/set-attribute/route.ts +++ b/apps/web/app/api/v1/(legacy)/client/people/[personId]/set-attribute/route.ts @@ -9,6 +9,7 @@ import { getProductByEnvironmentId } from "@formbricks/lib/product/service"; import { surveyCache } from "@formbricks/lib/survey/cache"; import { getSyncSurveys } from "@formbricks/lib/survey/service"; import { getTeamByEnvironmentId } from "@formbricks/lib/team/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { TJsStateSync, ZJsPeopleAttributeInput } from "@formbricks/types/js"; interface Context { @@ -95,7 +96,7 @@ export async function POST(req: Request, context: Context): Promise { return responses.successResponse({ ...state }, true); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(`Unable to complete request: ${error.message}`, true); } } diff --git a/apps/web/app/api/v1/(legacy)/client/responses/[responseId]/route.ts b/apps/web/app/api/v1/(legacy)/client/responses/[responseId]/route.ts index 3bbedfe21f..8468715cb0 100644 --- a/apps/web/app/api/v1/(legacy)/client/responses/[responseId]/route.ts +++ b/apps/web/app/api/v1/(legacy)/client/responses/[responseId]/route.ts @@ -4,6 +4,7 @@ import { sendToPipeline } from "@/app/lib/pipelines"; import { updateResponse } from "@formbricks/lib/response/service"; import { getSurvey } from "@formbricks/lib/survey/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors"; import { ZResponseUpdateInput } from "@formbricks/types/responses"; @@ -45,7 +46,7 @@ export async function PUT( return responses.badRequestResponse(error.message); } if (error instanceof DatabaseError) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message); } } @@ -59,7 +60,7 @@ export async function PUT( return responses.badRequestResponse(error.message); } if (error instanceof DatabaseError) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message); } } diff --git a/apps/web/app/api/v1/(legacy)/client/responses/route.ts b/apps/web/app/api/v1/(legacy)/client/responses/route.ts index 101a8d7f70..dbf58e3294 100644 --- a/apps/web/app/api/v1/(legacy)/client/responses/route.ts +++ b/apps/web/app/api/v1/(legacy)/client/responses/route.ts @@ -7,6 +7,7 @@ import { UAParser } from "ua-parser-js"; import { capturePosthogEnvironmentEvent } from "@formbricks/lib/posthogServer"; import { createResponseLegacy } from "@formbricks/lib/response/service"; import { getSurvey } from "@formbricks/lib/survey/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { InvalidInputError } from "@formbricks/types/errors"; import { TResponse, ZResponseLegacyInput } from "@formbricks/types/responses"; import { TSurvey } from "@formbricks/types/surveys"; @@ -47,7 +48,7 @@ export async function POST(request: Request): Promise { if (error instanceof InvalidInputError) { return responses.badRequestResponse(error.message); } else { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message); } } @@ -79,7 +80,7 @@ export async function POST(request: Request): Promise { if (error instanceof InvalidInputError) { return responses.badRequestResponse(error.message); } else { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message); } } diff --git a/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-attribute/route.ts b/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-attribute/route.ts index 6864d687bd..076edf501b 100644 --- a/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-attribute/route.ts +++ b/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-attribute/route.ts @@ -6,6 +6,7 @@ import { createAttributeClass, getAttributeClassByName } from "@formbricks/lib/a import { personCache } from "@formbricks/lib/person/cache"; import { getPerson, updatePersonAttribute } from "@formbricks/lib/person/service"; import { surveyCache } from "@formbricks/lib/survey/cache"; +import { logger } from "@formbricks/lib/utils/logger"; import { ZJsPeopleLegacyAttributeInput } from "@formbricks/types/js"; import { TPersonClient } from "@formbricks/types/people"; @@ -77,7 +78,7 @@ export async function POST(req: Request, { params }): Promise { return responses.successResponse({ ...state, person }, true); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(`Unable to complete request: ${error.message}`, true); } } diff --git a/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-user-id/route.ts b/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-user-id/route.ts index a72e081228..edea2e9544 100644 --- a/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-user-id/route.ts +++ b/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-user-id/route.ts @@ -3,6 +3,7 @@ import { responses } from "@/app/lib/api/response"; import { transformErrorToDetails } from "@/app/lib/api/validator"; import { createPerson, getPersonByUserId } from "@formbricks/lib/person/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { ZJsPeopleUserIdInput } from "@formbricks/types/js"; export async function OPTIONS(): Promise { @@ -39,7 +40,7 @@ export async function POST(req: Request): Promise { const state = await getUpdatedState(environmentId, person.id); return responses.successResponse({ ...state, person: personClient }, true); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true); } } diff --git a/apps/web/app/api/v1/(legacy)/js/sync/route.ts b/apps/web/app/api/v1/(legacy)/js/sync/route.ts index bba712e178..0e40c6871f 100644 --- a/apps/web/app/api/v1/(legacy)/js/sync/route.ts +++ b/apps/web/app/api/v1/(legacy)/js/sync/route.ts @@ -2,6 +2,7 @@ import { getUpdatedState } from "@/app/api/v1/(legacy)/js/sync/lib/sync"; import { responses } from "@/app/lib/api/response"; import { transformErrorToDetails } from "@/app/lib/api/validator"; +import { logger } from "@formbricks/lib/utils/logger"; import { ZJsSyncLegacyInput } from "@formbricks/types/js"; import { TPersonClient } from "@formbricks/types/people"; @@ -38,7 +39,7 @@ export async function POST(req: Request): Promise { return responses.successResponse({ ...state, person }, true); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true); } } diff --git a/apps/web/app/api/v1/client/[environmentId]/actions/route.ts b/apps/web/app/api/v1/client/[environmentId]/actions/route.ts index 52b9dd6fac..aa8dfd331f 100644 --- a/apps/web/app/api/v1/client/[environmentId]/actions/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/actions/route.ts @@ -2,6 +2,7 @@ import { responses } from "@/app/lib/api/response"; import { transformErrorToDetails } from "@/app/lib/api/validator"; import { createAction } from "@formbricks/lib/action/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { ZActionInput } from "@formbricks/types/actions"; interface Context { @@ -36,7 +37,7 @@ export async function POST(req: Request, context: Context): Promise { return responses.successResponse({}, true); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse("Unable to handle the request: " + error.message, true); } } diff --git a/apps/web/app/api/v1/client/[environmentId]/displays/[displayId]/route.ts b/apps/web/app/api/v1/client/[environmentId]/displays/[displayId]/route.ts index 13fe22c682..297f034fc9 100644 --- a/apps/web/app/api/v1/client/[environmentId]/displays/[displayId]/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/displays/[displayId]/route.ts @@ -2,6 +2,7 @@ import { responses } from "@/app/lib/api/response"; import { transformErrorToDetails } from "@/app/lib/api/validator"; import { updateDisplay } from "@formbricks/lib/display/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { ZDisplayUpdateInput } from "@formbricks/types/displays"; interface Context { @@ -35,7 +36,7 @@ export async function PUT(request: Request, context: Context): Promise await updateDisplay(displayId, inputValidation.data); return responses.successResponse({}, true); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message, true); } } diff --git a/apps/web/app/api/v1/client/[environmentId]/displays/route.ts b/apps/web/app/api/v1/client/[environmentId]/displays/route.ts index 63ec5699c2..cd86dc15fb 100644 --- a/apps/web/app/api/v1/client/[environmentId]/displays/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/displays/route.ts @@ -3,6 +3,7 @@ import { transformErrorToDetails } from "@/app/lib/api/validator"; import { createDisplay } from "@formbricks/lib/display/service"; import { capturePosthogEnvironmentEvent } from "@formbricks/lib/posthogServer"; +import { logger } from "@formbricks/lib/utils/logger"; import { ZDisplayCreateInput } from "@formbricks/types/displays"; import { InvalidInputError } from "@formbricks/types/errors"; @@ -41,7 +42,7 @@ export async function POST(request: Request, context: Context): Promise { true ); } catch (error) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(`Unable to complete request: ${error.message}`, true); } } diff --git a/apps/web/app/api/v1/client/[environmentId]/responses/[responseId]/route.ts b/apps/web/app/api/v1/client/[environmentId]/responses/[responseId]/route.ts index af6f94eb8c..6071af6a7b 100644 --- a/apps/web/app/api/v1/client/[environmentId]/responses/[responseId]/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/responses/[responseId]/route.ts @@ -5,6 +5,7 @@ import { sendToPipeline } from "@/app/lib/pipelines"; import { getPerson } from "@formbricks/lib/person/service"; import { updateResponse } from "@formbricks/lib/response/service"; import { getSurvey } from "@formbricks/lib/survey/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors"; import { ZResponseUpdateInput } from "@formbricks/types/responses"; @@ -53,7 +54,7 @@ export async function PUT( return responses.badRequestResponse(error.message); } if (error instanceof DatabaseError) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message); } } @@ -67,7 +68,7 @@ export async function PUT( return responses.badRequestResponse(error.message); } if (error instanceof DatabaseError) { - console.error(error); + logger.error(error); return responses.internalServerErrorResponse(error.message); } } diff --git a/apps/web/app/api/v1/client/[environmentId]/responses/route.ts b/apps/web/app/api/v1/client/[environmentId]/responses/route.ts index 05ee853935..7d6aa0e2d0 100644 --- a/apps/web/app/api/v1/client/[environmentId]/responses/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/responses/route.ts @@ -8,6 +8,7 @@ import { getPerson } from "@formbricks/lib/person/service"; import { capturePosthogEnvironmentEvent } from "@formbricks/lib/posthogServer"; import { createResponse } from "@formbricks/lib/response/service"; import { getSurvey } from "@formbricks/lib/survey/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { ZId } from "@formbricks/types/environment"; import { InvalidInputError } from "@formbricks/types/errors"; import { TResponse, ZResponseInput } from "@formbricks/types/responses"; @@ -96,7 +97,7 @@ export async function POST(request: Request, context: Context): Promise; } diff --git a/apps/web/app/s/[surveyId]/lib/prefilling.ts b/apps/web/app/s/[surveyId]/lib/prefilling.ts index 408c42bd7d..59ce299429 100644 --- a/apps/web/app/s/[surveyId]/lib/prefilling.ts +++ b/apps/web/app/s/[surveyId]/lib/prefilling.ts @@ -1,3 +1,4 @@ +import { logger } from "@formbricks/lib/utils/logger"; import { TResponseData } from "@formbricks/types/responses"; import { TSurveyQuestionType } from "@formbricks/types/surveys"; import { TSurvey, TSurveyQuestion } from "@formbricks/types/surveys"; @@ -31,7 +32,7 @@ export function getPrefillResponseData( return answerObj; } } catch (error) { - console.log(error); + logger.error(error); } // eslint-disable-next-line react-hooks/exhaustive-deps } diff --git a/apps/web/instrumentation.node.ts b/apps/web/instrumentation.node.ts index 01a39b69e8..16f65bea17 100644 --- a/apps/web/instrumentation.node.ts +++ b/apps/web/instrumentation.node.ts @@ -5,6 +5,8 @@ import { NodeSDK } from "@opentelemetry/sdk-node"; import { SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base"; import { SEMRESATTRS_SERVICE_NAME } from "@opentelemetry/semantic-conventions"; +import { logger } from "@formbricks/lib/utils/logger"; + export function startInstrumentationForNode(url: string) { try { const exporter = new OTLPTraceExporter({ @@ -22,6 +24,6 @@ export function startInstrumentationForNode(url: string) { sdk.start(); } catch (err) { - console.error("Unable to setup Telemetry:", err); + logger.error(`Unable to setup Telemetry: ${err}`); } } diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index 3197b43c83..dc03030d14 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -18,6 +18,7 @@ import { NextResponse } from "next/server"; import type { NextRequest } from "next/server"; import { RATE_LIMITING_DISABLED, WEBAPP_URL } from "@formbricks/lib/constants"; +import { logger } from "@formbricks/lib/utils/logger"; export async function middleware(request: NextRequest) { const token = await getToken({ req: request }); @@ -31,7 +32,6 @@ export async function middleware(request: NextRequest) { if (token && callbackUrl) { return NextResponse.redirect(WEBAPP_URL + callbackUrl); } - if (process.env.NODE_ENV !== "production" || RATE_LIMITING_DISABLED) { return NextResponse.next(); } @@ -62,7 +62,7 @@ export async function middleware(request: NextRequest) { } return res; } catch (_e) { - console.log("Rate Limiting IP: ", ip); + logger.info(`Rate Limiting IP: ${ip}`); return NextResponse.json({ error: "Too many requests, Please try after a while!" }, { status: 429 }); } diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index e21e85a0a4..67317dadc5 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -18,7 +18,7 @@ const nextConfig = { assetPrefix: process.env.ASSET_PREFIX_URL || undefined, output: "standalone", experimental: { - serverComponentsExternalPackages: ["@aws-sdk"], + serverComponentsExternalPackages: ["@aws-sdk","pino"], instrumentationHook: true, outputFileTracingIncludes: { "app/api/js": ["../../packages/**/*"], diff --git a/packages/ee/billing/api/stripe-webhook.ts b/packages/ee/billing/api/stripe-webhook.ts index e428c2ba49..3e1605d838 100644 --- a/packages/ee/billing/api/stripe-webhook.ts +++ b/packages/ee/billing/api/stripe-webhook.ts @@ -1,6 +1,7 @@ import Stripe from "stripe"; import { env } from "@formbricks/lib/env"; +import { logger } from "@formbricks/lib/utils/logger"; import { handleCheckoutSessionCompleted } from "../handlers/checkoutSessionCompleted"; import { handleSubscriptionUpdatedOrCreated } from "../handlers/subscriptionCreatedOrUpdated"; @@ -19,7 +20,7 @@ const webhookHandler = async (requestBody: string, stripeSignature: string) => { event = stripe.webhooks.constructEvent(requestBody, stripeSignature, webhookSecret); } catch (err) { const errorMessage = err instanceof Error ? err.message : "Unknown error"; - if (err! instanceof Error) console.log(err); + if (err! instanceof Error) logger.error(err); return { status: 400, message: `Webhook Error: ${errorMessage}` }; } diff --git a/packages/ee/billing/handlers/subscriptionCreatedOrUpdated.ts b/packages/ee/billing/handlers/subscriptionCreatedOrUpdated.ts index 348ad7b24f..7768984238 100644 --- a/packages/ee/billing/handlers/subscriptionCreatedOrUpdated.ts +++ b/packages/ee/billing/handlers/subscriptionCreatedOrUpdated.ts @@ -7,6 +7,7 @@ import { getTeam, updateTeam, } from "@formbricks/lib/team/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { ProductFeatureKeys, StripePriceLookupKeys, StripeProductNames } from "../lib/constants"; import { reportUsage } from "../lib/reportUsage"; @@ -45,7 +46,7 @@ export const handleSubscriptionUpdatedOrCreated = async (event: Stripe.Event) => } if (!teamId) { - console.error("No teamId found in subscription"); + logger.error("No teamId found in subscription"); return { status: 400, message: "skipping, no teamId found" }; } diff --git a/packages/ee/billing/handlers/subscriptionDeleted.ts b/packages/ee/billing/handlers/subscriptionDeleted.ts index 28b3765208..4432894360 100644 --- a/packages/ee/billing/handlers/subscriptionDeleted.ts +++ b/packages/ee/billing/handlers/subscriptionDeleted.ts @@ -2,6 +2,7 @@ import Stripe from "stripe"; import { env } from "@formbricks/lib/env"; import { getTeam, updateTeam } from "@formbricks/lib/team/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { ProductFeatureKeys, StripeProductNames } from "../lib/constants"; import { unsubscribeCoreAndAppSurveyFeatures, unsubscribeLinkSurveyProFeatures } from "../lib/downgradePlan"; @@ -15,7 +16,7 @@ export const handleSubscriptionDeleted = async (event: Stripe.Event) => { const stripeSubscriptionObject = event.data.object as Stripe.Subscription; const teamId = stripeSubscriptionObject.metadata.teamId; if (!teamId) { - console.error("No teamId found in subscription"); + logger.error("No teamId found in subscription"); return { status: 400, message: "skipping, no teamId found" }; } diff --git a/packages/ee/billing/lib/createSubscription.ts b/packages/ee/billing/lib/createSubscription.ts index e1d0869b83..3b1cab8c9a 100644 --- a/packages/ee/billing/lib/createSubscription.ts +++ b/packages/ee/billing/lib/createSubscription.ts @@ -3,6 +3,7 @@ import Stripe from "stripe"; import { WEBAPP_URL } from "@formbricks/lib/constants"; import { env } from "@formbricks/lib/env"; import { getTeam } from "@formbricks/lib/team/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { StripePriceLookupKeys } from "./constants"; @@ -177,7 +178,7 @@ export const createSubscription = async ( url: "", }; } catch (err) { - console.error(err); + logger.error(err); return { status: 500, data: "Something went wrong!", diff --git a/packages/ee/billing/lib/removeSubscription.ts b/packages/ee/billing/lib/removeSubscription.ts index 748a90756d..43c90b6f12 100644 --- a/packages/ee/billing/lib/removeSubscription.ts +++ b/packages/ee/billing/lib/removeSubscription.ts @@ -3,6 +3,7 @@ import Stripe from "stripe"; import { WEBAPP_URL } from "@formbricks/lib/constants"; import { env } from "@formbricks/lib/env"; import { getTeam, updateTeam } from "@formbricks/lib/team/service"; +import { logger } from "@formbricks/lib/utils/logger"; import { StripePriceLookupKeys } from "./constants"; import { getFirstOfNextMonthTimestamp } from "./createSubscription"; @@ -112,7 +113,7 @@ export const removeSubscription = async ( url: "", }; } catch (err) { - console.log("Error in removing subscription:", err); + logger.error(`Error in removing subscription: ${err}`); return { status: 500, diff --git a/packages/lib/actionClass/service.ts b/packages/lib/actionClass/service.ts index 55c111bb03..ac53d77c51 100644 --- a/packages/lib/actionClass/service.ts +++ b/packages/lib/actionClass/service.ts @@ -18,6 +18,7 @@ import { DatabaseError, ResourceNotFoundError } from "@formbricks/types/errors"; import { ITEMS_PER_PAGE, SERVICES_REVALIDATION_INTERVAL } from "../constants"; import { formatDateFields } from "../utils/datetime"; +import { logger } from "../utils/logger"; import { validateInputs } from "../utils/validate"; import { actionClassCache } from "./cache"; @@ -176,7 +177,7 @@ export const createActionClass = async ( return actionClassPrisma; } catch (error) { - console.error(error); + logger.error(error); throw new DatabaseError(`Database error when creating an action for environment ${environmentId}`); } }; diff --git a/packages/lib/airtable/service.ts b/packages/lib/airtable/service.ts index 5a8835f9cf..3fe3688691 100644 --- a/packages/lib/airtable/service.ts +++ b/packages/lib/airtable/service.ts @@ -17,6 +17,7 @@ import { import { AIRTABLE_CLIENT_ID } from "../constants"; import { createOrUpdateIntegration, deleteIntegration, getIntegrationByType } from "../integration/service"; +import { logger } from "../utils/logger"; interface ConnectAirtableOptions { environmentId: string; @@ -95,7 +96,7 @@ export const fetchAirtableAuthToken = async (formData: Record) => { const parsedToken = ZIntegrationAirtableTokenSchema.safeParse(tokenRes); if (!parsedToken.success) { - console.error(parsedToken.error); + logger.error(parsedToken.error); throw new Error(parsedToken.error.message); } const { access_token, refresh_token, expires_in } = parsedToken.data; @@ -255,6 +256,6 @@ export const writeData = async ( } await addRecords(key, configData.baseId, configData.tableId, data); } catch (error: any) { - console.error(error?.message); + logger.error(error?.message); } }; diff --git a/packages/lib/authOptions.ts b/packages/lib/authOptions.ts index 888dc8fdad..8e95706f17 100644 --- a/packages/lib/authOptions.ts +++ b/packages/lib/authOptions.ts @@ -31,6 +31,7 @@ import { createMembership } from "./membership/service"; import { createProduct } from "./product/service"; import { createTeam, getTeam } from "./team/service"; import { createUser, getUserByEmail, updateUser } from "./user/service"; +import { logger } from "./utils/logger"; export const authOptions: NextAuthOptions = { providers: [ @@ -63,7 +64,7 @@ export const authOptions: NextAuthOptions = { }, }); } catch (e) { - console.error(e); + logger.error(e); throw Error("Internal server error. Please try again later"); } @@ -115,7 +116,7 @@ export const authOptions: NextAuthOptions = { }, }); } catch (e) { - console.error(e); + logger.error(e); throw new Error("Either a user does not match the provided token or the token is invalid"); } diff --git a/packages/lib/display/service.ts b/packages/lib/display/service.ts index b1cb9500fd..edaf64e111 100644 --- a/packages/lib/display/service.ts +++ b/packages/lib/display/service.ts @@ -25,6 +25,7 @@ import { TPerson } from "@formbricks/types/people"; import { ITEMS_PER_PAGE, SERVICES_REVALIDATION_INTERVAL } from "../constants"; import { createPerson, getPersonByUserId } from "../person/service"; import { formatDateFields } from "../utils/datetime"; +import { logger } from "../utils/logger"; import { validateInputs } from "../utils/validate"; import { displayCache } from "./cache"; @@ -111,7 +112,7 @@ export const updateDisplay = async ( return display; } catch (error) { - console.error(error); + logger.error(error); if (error instanceof Prisma.PrismaClientKnownRequestError) { throw new DatabaseError(error.message); } @@ -152,7 +153,7 @@ export const updateDisplayLegacy = async ( return display; } catch (error) { - console.error(error); + logger.error(error); if (error instanceof Prisma.PrismaClientKnownRequestError) { throw new DatabaseError(error.message); } diff --git a/packages/lib/emails/emails.ts b/packages/lib/emails/emails.ts index ad8024f758..add8abf26b 100644 --- a/packages/lib/emails/emails.ts +++ b/packages/lib/emails/emails.ts @@ -16,6 +16,7 @@ import { getProductByEnvironmentId } from "../product/service"; import { getQuestionResponseMapping } from "../responses"; import { getOriginalFileNameFromUrl } from "../storage/utils"; import { getTeamByEnvironmentId } from "../team/service"; +import { logger } from "../utils/logger"; import { withEmailTemplate } from "./email-template"; const nodemailer = require("nodemailer"); @@ -65,7 +66,7 @@ export const sendEmail = async (emailData: sendEmailData) => { }; await transporter.sendMail({ ...emailDefaults, ...emailData }); } else { - console.error(`Could not Email :: SMTP not configured :: ${emailData.subject}`); + logger.error(`Could not Email :: SMTP not configured :: ${emailData.subject}`); } } catch (error) { throw error; diff --git a/packages/lib/environment/service.ts b/packages/lib/environment/service.ts index 164acf7efd..c6227a8573 100644 --- a/packages/lib/environment/service.ts +++ b/packages/lib/environment/service.ts @@ -22,6 +22,7 @@ import { SERVICES_REVALIDATION_INTERVAL } from "../constants"; import { getProducts } from "../product/service"; import { getTeamsByUserId } from "../team/service"; import { formatDateFields } from "../utils/datetime"; +import { logger } from "../utils/logger"; import { validateInputs } from "../utils/validate"; import { environmentCache } from "./cache"; @@ -39,7 +40,7 @@ export const getEnvironment = async (environmentId: string): Promise => { await Promise.all(s3FilesPromises); } catch (err) { // fail silently because we don't want to throw an error if the files are not deleted - console.error(err); + logger.error(err); } } else { const localFilesPromises = product.environments.map(async (environment) => { @@ -215,7 +216,7 @@ export const deleteProduct = async (productId: string): Promise => { await Promise.all(localFilesPromises); } catch (err) { // fail silently because we don't want to throw an error if the files are not deleted - console.error(err); + logger.error(err); } } diff --git a/packages/lib/responseNote/service.ts b/packages/lib/responseNote/service.ts index 7c5e839123..3045cc658b 100644 --- a/packages/lib/responseNote/service.ts +++ b/packages/lib/responseNote/service.ts @@ -12,6 +12,7 @@ import { TResponseNote, ZResponseNote } from "@formbricks/types/responses"; import { SERVICES_REVALIDATION_INTERVAL } from "../constants"; import { responseCache } from "../response/cache"; import { formatDateFields } from "../utils/datetime"; +import { logger } from "../utils/logger"; import { validateInputs } from "../utils/validate"; import { responseNoteCache } from "./cache"; @@ -64,7 +65,7 @@ export const createResponseNote = async ( }); return responseNote; } catch (error) { - console.error(error); + logger.error(error); if (error instanceof Prisma.PrismaClientKnownRequestError) { throw new DatabaseError(error.message); } @@ -85,7 +86,7 @@ export const getResponseNote = async (responseNoteId: string): Promise= this.config.retryAttempts) { // Inform the user after 2 failed attempts - console.error("Failed to send response after 2 attempts."); + logger.error("Failed to send response after 2 attempts."); // If the response fails finally, inform the user if (this.config.onResponseSendingFailed) { this.config.onResponseSendingFailed(responseUpdate); @@ -97,7 +98,7 @@ export class ResponseQueue { responseId: response.data.id, }); } catch (error) { - console.error("Failed to update display, proceeding with the response.", error); + logger.error(`Failed to update display, proceeding with the response. ${error}`); } } this.surveyState.updateResponseId(response.data.id); @@ -107,7 +108,7 @@ export class ResponseQueue { } return true; } catch (error) { - console.error(error); + logger.error(error); return false; } } diff --git a/packages/lib/storage/service.ts b/packages/lib/storage/service.ts index 6615099d54..02f09966f0 100644 --- a/packages/lib/storage/service.ts +++ b/packages/lib/storage/service.ts @@ -31,6 +31,7 @@ import { } from "../constants"; import { generateLocalSignedUrl } from "../crypto"; import { env } from "../env"; +import { logger } from "../utils/logger"; import { storageCache } from "./cache"; // S3Client Singleton @@ -66,7 +67,7 @@ export const testS3BucketAccess = async () => { return true; } catch (error) { - console.error("Failed to access S3 bucket:", error); + logger.error(`Failed to access S3 bucket: ${error}`); throw new Error(`S3 Bucket Access Test Failed: ${error}`); } }; diff --git a/packages/lib/storage/utils.ts b/packages/lib/storage/utils.ts index 3cf07ffdc8..7e03ffc373 100644 --- a/packages/lib/storage/utils.ts +++ b/packages/lib/storage/utils.ts @@ -1,3 +1,5 @@ +import { logger } from "../utils/logger"; + export const getOriginalFileNameFromUrl = (fileURL: string) => { try { const fileNameFromURL = fileURL.startsWith("/storage/") @@ -16,6 +18,6 @@ export const getOriginalFileNameFromUrl = (fileURL: string) => { const fileName = originalFileName ? decodeURIComponent(`${originalFileName}.${fileExt}` || "") : ""; return fileName; } catch (error) { - console.error("Error parsing file URL:", error); + logger.error(`Error parsing file URL: ${error}`); } }; diff --git a/packages/lib/survey/service.ts b/packages/lib/survey/service.ts index c76014af77..8f34e1a719 100644 --- a/packages/lib/survey/service.ts +++ b/packages/lib/survey/service.ts @@ -29,6 +29,7 @@ import { createSegment, evaluateSegment, getSegment, updateSegment } from "../se import { transformSegmentFiltersToAttributeFilters } from "../segment/utils"; import { subscribeTeamMembersToSurveyResponses } from "../team/service"; import { diffInDays, formatDateFields } from "../utils/datetime"; +import { logger } from "../utils/logger"; import { validateInputs } from "../utils/validate"; import { surveyCache } from "./cache"; import { anySurveyHasFilters } from "./util"; @@ -187,10 +188,9 @@ export const getSurvey = async (surveyId: string): Promise => { }); } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { - console.error(error); + logger.error(error); throw new DatabaseError(error.message); } - throw error; } @@ -306,7 +306,7 @@ export const getSurveys = async ( }); } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { - console.error(error); + logger.error(error); throw new DatabaseError(error.message); } @@ -379,7 +379,7 @@ export const getSurveyCount = async (environmentId: string): Promise => return surveyCount; } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { - console.error(error); + logger.error(error); throw new DatabaseError(error.message); } @@ -472,7 +472,7 @@ export const updateSurvey = async (updatedSurvey: TSurvey): Promise => try { await updateSegment(segment.id, segment); } catch (error) { - console.error(error); + logger.error(error); throw new Error("Error updating survey"); } } @@ -512,7 +512,7 @@ export const updateSurvey = async (updatedSurvey: TSurvey): Promise => return modifiedSurvey; } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { - console.error(error); + logger.error(error); throw new DatabaseError(error.message); } diff --git a/packages/lib/team/service.ts b/packages/lib/team/service.ts index 205564ca98..d7158c2702 100644 --- a/packages/lib/team/service.ts +++ b/packages/lib/team/service.ts @@ -22,6 +22,7 @@ import { environmentCache } from "../environment/cache"; import { getProducts } from "../product/service"; import { getUsersWithTeam, updateUser } from "../user/service"; import { formatDateFields } from "../utils/datetime"; +import { logger } from "../utils/logger"; import { validateInputs } from "../utils/validate"; import { teamCache } from "./cache"; @@ -100,7 +101,7 @@ export const getTeamByEnvironmentId = async (environmentId: string): Promise { if (env.TELEMETRY_DISABLED !== "1" && process.env.NODE_ENV === "production" && process.env.INSTANCE_ID) { @@ -21,7 +22,7 @@ export const captureTelemetry = async (eventName: string, properties = {}) => { }), }); } catch (error) { - console.log("error sending telemetry:", error); + logger.error(`error sending telemetry: ${error}`); } } }; diff --git a/packages/lib/utils/datetime.ts b/packages/lib/utils/datetime.ts index da29dc7234..45abe5bc34 100644 --- a/packages/lib/utils/datetime.ts +++ b/packages/lib/utils/datetime.ts @@ -1,5 +1,7 @@ import z from "zod"; +import { logger } from "./logger"; + // Helper function to calculate difference in days between two dates export const diffInDays = (date1: Date, date2: Date) => { const diffTime = Math.abs(date2.getTime() - date1.getTime()); @@ -35,7 +37,7 @@ export function formatDateFields( (formattedObject as any)[key] = new Date(dateStr); } } catch (error) { - console.error(`Error parsing date for key ${key}:`, error); + logger.error(`Error parsing date for key ${key}:`, error); } } } diff --git a/packages/lib/utils/fileConversion.ts b/packages/lib/utils/fileConversion.ts index 58905b13a5..486fd6b14c 100644 --- a/packages/lib/utils/fileConversion.ts +++ b/packages/lib/utils/fileConversion.ts @@ -1,6 +1,8 @@ import { AsyncParser } from "@json2csv/node"; import * as xlsx from "xlsx"; +import { logger } from "./logger"; + export const convertToCsv = async (fields: string[], jsonData: Record[]) => { let csv: string = ""; @@ -11,7 +13,7 @@ export const convertToCsv = async (fields: string[], jsonData: Record ({}), + }, +}); diff --git a/packages/lib/utils/validate.ts b/packages/lib/utils/validate.ts index 7275d151f7..cb107e544e 100644 --- a/packages/lib/utils/validate.ts +++ b/packages/lib/utils/validate.ts @@ -2,6 +2,8 @@ import z from "zod"; import { ValidationError } from "@formbricks/types/errors"; +import { logger } from "./logger"; + type ValidationPair = [any, z.ZodSchema]; export const validateInputs = (...pairs: ValidationPair[]): void => { @@ -9,7 +11,7 @@ export const validateInputs = (...pairs: ValidationPair[]): void => { const inputValidation = schema.safeParse(value); if (!inputValidation.success) { - console.error( + logger.error( `Validation failed for ${JSON.stringify(value)} and ${JSON.stringify(schema)}: ${inputValidation.error.message}` ); throw new ValidationError("Validation failed"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b05a46198d..46ff9f3eaf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -284,7 +284,7 @@ importers: version: 8.0.2(typescript@5.3.3) vite: specifier: ^5.1.6 - version: 5.1.6(@types/node@20.11.24) + version: 5.1.6(terser@5.29.1) apps/web: dependencies: @@ -678,6 +678,12 @@ importers: nodemailer: specifier: ^6.9.12 version: 6.9.12 + pino: + specifier: ^8.19.0 + version: 8.19.0 + pino-pretty: + specifier: ^10.3.1 + version: 10.3.1 posthog-node: specifier: ^3.6.3 version: 3.6.3 @@ -4332,7 +4338,7 @@ packages: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.3.3) typescript: 5.3.3 - vite: 5.1.6(@types/node@20.11.24) + vite: 5.1.6(terser@5.29.1) dev: true /@jridgewell/gen-mapping@0.3.3: @@ -8603,7 +8609,7 @@ packages: magic-string: 0.30.5 ts-dedent: 2.2.0 typescript: 5.3.3 - vite: 5.1.6(@types/node@20.11.24) + vite: 5.1.6(terser@5.29.1) transitivePeerDependencies: - encoding - supports-color @@ -8834,7 +8840,7 @@ packages: react-dom: 18.2.0(react@18.2.0) resolve: 1.22.8 tsconfig-paths: 4.2.0 - vite: 5.1.6(@types/node@20.11.24) + vite: 5.1.6(terser@5.29.1) transitivePeerDependencies: - '@preact/preset-vite' - encoding @@ -10075,7 +10081,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.6) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.1.6(@types/node@20.11.24) + vite: 5.1.6(terser@5.29.1) transitivePeerDependencies: - supports-color dev: true @@ -10325,6 +10331,13 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: false + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -10750,6 +10763,11 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + /autoprefixer@10.4.14(postcss@8.4.35): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} @@ -11439,7 +11457,6 @@ packages: /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true /colors@1.2.5: resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} @@ -11793,6 +11810,10 @@ packages: resolution: {integrity: sha512-Akz4R8J9MXBsOgF1QeWeCsbv6pntT5KCPjU0Q9prBxVmWJYPLhwAIsNg3b0QAdr0ttiozYLD3L/af7Ra0jqYXw==} dev: false + /dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dev: false + /de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} dev: true @@ -12832,6 +12853,11 @@ packages: engines: {node: '>= 0.6'} dev: true + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: true @@ -12927,6 +12953,10 @@ packages: tmp: 0.0.33 dev: false + /fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + dev: false + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -12950,6 +12980,15 @@ packages: resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} dev: false + /fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + dev: false + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + /fast-shallow-equal@1.0.0: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} dev: false @@ -13717,6 +13756,10 @@ packages: readable-stream: 3.6.2 dev: false + /help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + dev: false + /hex-rgb@4.3.0: resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} engines: {node: '>=6'} @@ -14376,7 +14419,6 @@ packages: /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - dev: true /js-beautify@1.14.11: resolution: {integrity: sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==} @@ -16251,6 +16293,11 @@ packages: engines: {node: ^10.13.0 || >=12.0.0} dev: false + /on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + dev: false + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -16582,6 +16629,54 @@ packages: engines: {node: '>=6'} dev: false + /pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + dev: false + + /pino-pretty@10.3.1: + resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} + hasBin: true + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.1.0 + pump: 3.0.0 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 3.8.0 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + dev: false + + /pino@8.19.0: + resolution: {integrity: sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.1.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.8.0 + thread-stream: 2.4.1 + dev: false + /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -16935,6 +17030,10 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + dev: false + /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -17063,6 +17162,10 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -17613,6 +17716,17 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + /readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} dependencies: @@ -17625,6 +17739,11 @@ packages: dependencies: picomatch: 2.3.1 + /real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + dev: false + /recast@0.23.6: resolution: {integrity: sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==} engines: {node: '>= 4'} @@ -18029,6 +18148,11 @@ packages: get-intrinsic: 1.2.2 is-regex: 1.1.4 + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -18086,6 +18210,10 @@ packages: resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} dev: false + /secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false + /selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} dependencies: @@ -18419,6 +18547,12 @@ packages: - utf-8-validate dev: false + /sonic-boom@3.8.0: + resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + /sonner@1.3.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+rOAO56b2eI3q5BtgljERSn2umRk63KFIvgb2ohbZ5X+Eb5u+a/7/0ZgswYqgBMg8dyl7n6OXd9KasA8QF9ToA==} peerDependencies: @@ -18507,6 +18641,11 @@ packages: readable-stream: 3.6.2 dev: false + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -19051,6 +19190,12 @@ packages: engines: {node: '>=0.2.6'} dev: false + /thread-stream@2.4.1: + resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + dependencies: + real-require: 0.2.0 + dev: false + /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} engines: {node: '>=10'}