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'}