diff --git a/.env b/.env index b5b3810..9dfcd84 100644 --- a/.env +++ b/.env @@ -1,6 +1,7 @@ ####### COMMON ####### USE_DEV_COLORS= BASE_PATH= +SENTRY_DSN= ####### URLS ######## URL_GET_USER_DIRECT= diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..7272006 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +sentrycli_cdnurl= \ No newline at end of file diff --git a/apps/web/Components/Calculation/Form/ELT/Kasko.tsx b/apps/web/Components/Calculation/Form/ELT/Kasko.tsx index e72d626..68c48b2 100644 --- a/apps/web/Components/Calculation/Form/ELT/Kasko.tsx +++ b/apps/web/Components/Calculation/Form/ELT/Kasko.tsx @@ -45,9 +45,31 @@ export const Kasko = observer(() => { queryFn: async (context: QueryFunctionContext) => { const payload = await makeEltKaskoRequest({ apolloClient, store }, row); const res = await getEltKasko(payload, context); - const companyRes = res[id]; - return { ...companyRes, id, key }; + if (res) { + const companyRes = res?.[id]; + + return { ...companyRes, id, key }; + } + + return { + error: null, + id, + kaskoSum: 0, + key, + message: null, + numCalc: 0, + paymentPeriods: [ + { + kaskoSum: 0, + }, + ], + requestId: '', + skCalcId: '', + status: null, + sum: 0, + totalFranchise: 0, + }; }, queryKey: ['elt', 'kasko', id], refetchOnWindowFocus: false, diff --git a/apps/web/Components/Calculation/Form/ELT/Osago.tsx b/apps/web/Components/Calculation/Form/ELT/Osago.tsx index ac6f0fe..941fbc7 100644 --- a/apps/web/Components/Calculation/Form/ELT/Osago.tsx +++ b/apps/web/Components/Calculation/Form/ELT/Osago.tsx @@ -35,9 +35,24 @@ export const Osago = observer(() => { queryFn: async (context: QueryFunctionContext) => { const payload = await makeEltOsagoRequest({ apolloClient, store }, row); const res = await getEltOsago(payload, context); - const companyRes = res[id]; - return { ...companyRes, id, key }; + if (res) { + const companyRes = res?.[id]; + + return { ...companyRes, id, key }; + } + + return { + error: null, + id, + key, + message: null, + numCalc: 0, + premiumSum: 0, + skCalcId: '', + status: null, + sum: 0, + }; }, queryKey: ['elt', 'osago', id], refetchOnWindowFocus: false, diff --git a/apps/web/api/1c/query.ts b/apps/web/api/1c/query.ts index 820d387..cd043ae 100644 --- a/apps/web/api/1c/query.ts +++ b/apps/web/api/1c/query.ts @@ -1,12 +1,13 @@ import type { RequestTransTax, ResponseTransTax } from './types'; import getUrls from '@/config/urls'; +import { withHandleError } from '@/utils/axios'; import type { QueryFunctionContext } from '@tanstack/react-query'; import axios from 'axios'; const { URL_1C_TRANSTAX } = getUrls(); -export async function getTransTax(payload: RequestTransTax, { signal }: QueryFunctionContext) { - const { data } = await axios.post(URL_1C_TRANSTAX, payload, { signal }); - - return data; +export function getTransTax(payload: RequestTransTax, { signal }: QueryFunctionContext) { + return withHandleError( + axios.post(URL_1C_TRANSTAX, payload, { signal }).then(({ data }) => data) + ); } diff --git a/apps/web/api/core/query.ts b/apps/web/api/core/query.ts index d8e2aaa..66f1f38 100644 --- a/apps/web/api/core/query.ts +++ b/apps/web/api/core/query.ts @@ -1,21 +1,23 @@ import type { RequestCalculate, RequestFinGAP, ResponseCalculate, ResponseFinGAP } from './types'; import getUrls from '@/config/urls'; +import { withHandleError } from '@/utils/axios'; import type { QueryFunctionContext } from '@tanstack/react-query'; import axios from 'axios'; const { URL_CORE_FINGAP, URL_CORE_CALCULATE } = getUrls(); export async function calculateFinGAP(payload: RequestFinGAP, { signal }: QueryFunctionContext) { - const { data } = await axios.post(URL_CORE_FINGAP, payload, { - signal, - }); - - return data; + return withHandleError( + axios + .post(URL_CORE_FINGAP, payload, { + signal, + }) + .then(({ data }) => data) + ); } -export async function calculate(payload: RequestCalculate): Promise { - return await axios - .post(URL_CORE_CALCULATE, payload) - .then((response) => response.data) - .catch((error) => error.response.data); +export async function calculate(payload: RequestCalculate) { + return withHandleError( + axios.post(URL_CORE_CALCULATE, payload).then(({ data }) => data) + ); } diff --git a/apps/web/api/crm/query.ts b/apps/web/api/crm/query.ts index 94efb72..b4dd137 100644 --- a/apps/web/api/crm/query.ts +++ b/apps/web/api/crm/query.ts @@ -1,12 +1,12 @@ import type { RequestCreateKP, ResponseCreateKP } from './types'; import getUrls from '@/config/urls'; +import { withHandleError } from '@/utils/axios'; import axios from 'axios'; const { URL_CRM_CREATEKP } = getUrls(); -export async function createKP(payload: RequestCreateKP): Promise { - return await axios - .post(URL_CRM_CREATEKP, payload) - .then((response) => ({ ...response.data, success: true })) - .catch((error) => ({ ...error.response.data, success: false })); +export async function createKP(payload: RequestCreateKP) { + return withHandleError( + axios.post(URL_CRM_CREATEKP, payload).then(({ data }) => data) + ); } diff --git a/apps/web/api/crm/types.ts b/apps/web/api/crm/types.ts index 0f9e0ef..f3d5017 100644 --- a/apps/web/api/crm/types.ts +++ b/apps/web/api/crm/types.ts @@ -31,21 +31,13 @@ export const RequestCreateKPSchema = z.object({ export type RequestCreateKP = z.infer; -export const ResponseCreateKPSchema = z.union([ - z.object({ - evo_quotename: z.string(), - link: z.string(), - name: z.string(), - offerprintform: z.string(), - offerprintformapi: z.string(), - quoteid: z.string(), - success: z.literal(true), - }), - z.object({ - fullMessage: z.string(), - message: z.string(), - success: z.literal(false), - }), -]); +export const ResponseCreateKPSchema = z.object({ + evo_quotename: z.string(), + link: z.string(), + name: z.string(), + offerprintform: z.string(), + offerprintformapi: z.string(), + quoteid: z.string(), +}); export type ResponseCreateKP = z.infer; diff --git a/apps/web/api/elt/query.ts b/apps/web/api/elt/query.ts index 6aaacc8..04abee6 100644 --- a/apps/web/api/elt/query.ts +++ b/apps/web/api/elt/query.ts @@ -1,22 +1,19 @@ import type * as ELT from './types'; import getUrls from '@/config/urls'; +import { withHandleError } from '@/utils/axios'; import type { QueryFunctionContext } from '@tanstack/react-query'; import axios from 'axios'; const { URL_ELT_KASKO, URL_ELT_OSAGO } = getUrls(); -export async function getEltOsago( - payload: ELT.RequestEltOsago, - { signal }: QueryFunctionContext -): Promise { - return await axios - .post(URL_ELT_OSAGO, payload, { signal }) - .then((response) => response.data) - .catch((error) => error.response.data); +export async function getEltOsago(payload: ELT.RequestEltOsago, { signal }: QueryFunctionContext) { + return withHandleError( + axios.post(URL_ELT_OSAGO, payload, { signal }).then(({ data }) => data) + ); } export async function getEltKasko(payload: ELT.RequestEltKasko, { signal }: QueryFunctionContext) { - const { data } = await axios.post(URL_ELT_KASKO, payload, { signal }); - - return data; + return withHandleError( + axios.post(URL_ELT_KASKO, payload, { signal }).then(({ data }) => data) + ); } diff --git a/apps/web/api/user/query.ts b/apps/web/api/user/query.ts index dfc6aab..ff5841d 100644 --- a/apps/web/api/user/query.ts +++ b/apps/web/api/user/query.ts @@ -1,11 +1,12 @@ import { love } from './tools'; import type { User } from './types'; import getUrls from '@/config/urls'; +import { withHandleError } from '@/utils/axios'; import type { AxiosRequestConfig } from 'axios'; import axios from 'axios'; const { URL_GET_USER } = getUrls(); export async function getUser(config?: AxiosRequestConfig) { - return await axios.get(URL_GET_USER, config).then((res) => love(res.data)); + return withHandleError(axios.get(URL_GET_USER, config).then((res) => love(res.data))); } diff --git a/apps/web/config/schema/env.js b/apps/web/config/schema/env.js index ac14f87..f82636e 100644 --- a/apps/web/config/schema/env.js +++ b/apps/web/config/schema/env.js @@ -3,6 +3,7 @@ const { z } = require('zod'); const envSchema = z.object({ BASE_PATH: z.string().optional().default(''), PORT: z.string().optional(), + SENTRY_DSN: z.string(), URL_1C_TRANSTAX_DIRECT: z.string(), URL_CORE_CALCULATE_DIRECT: z.string(), URL_CORE_FINGAP_DIRECT: z.string(), diff --git a/apps/web/config/schema/runtime-config.js b/apps/web/config/schema/runtime-config.js index d5dea27..73f0531 100644 --- a/apps/web/config/schema/runtime-config.js +++ b/apps/web/config/schema/runtime-config.js @@ -2,12 +2,14 @@ const envSchema = require('./env'); const publicRuntimeConfigSchema = envSchema.pick({ BASE_PATH: true, + SENTRY_DSN: true, USE_DEV_COLORS: true, }); const serverRuntimeConfigSchema = envSchema.pick({ BASE_PATH: true, PORT: true, + SENTRY_DSN: true, URL_1C_TRANSTAX_DIRECT: true, URL_CORE_CALCULATE_DIRECT: true, URL_CORE_FINGAP_DIRECT: true, diff --git a/apps/web/config/urls.ts b/apps/web/config/urls.ts index 0a124ab..0b74f38 100644 --- a/apps/web/config/urls.ts +++ b/apps/web/config/urls.ts @@ -4,7 +4,7 @@ import getConfig from 'next/config'; import { isServer } from 'tools/common'; const { serverRuntimeConfig, publicRuntimeConfig } = getConfig(); -const { BASE_PATH } = publicRuntimeConfigSchema.parse(publicRuntimeConfig); +const { BASE_PATH, SENTRY_DSN } = publicRuntimeConfigSchema.parse(publicRuntimeConfig); export function withBasePath(path: string) { return String.prototype.concat(BASE_PATH, path); @@ -27,6 +27,7 @@ function getUrls() { return { BASE_PATH, PORT, + SENTRY_DSN, URL_1C_TRANSTAX: URL_1C_TRANSTAX_DIRECT, URL_CORE_CALCULATE: URL_CORE_CALCULATE_DIRECT, URL_CORE_FINGAP: URL_CORE_FINGAP_DIRECT, @@ -41,6 +42,7 @@ function getUrls() { return { BASE_PATH, + SENTRY_DSN, URL_1C_TRANSTAX: withBasePath(urls.URL_1C_TRANSTAX_PROXY), URL_CORE_CALCULATE: withBasePath(urls.URL_CORE_CALCULATE_PROXY), URL_CORE_FINGAP: withBasePath(urls.URL_CORE_FINGAP_PROXY), diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 3fc778a..e6df328 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -5,7 +5,7 @@ const urls = require('./constants/urls'); const { devices } = require('./config/ui'); const { publicRuntimeConfigSchema } = require('./config/schema/runtime-config'); const { serverRuntimeConfigSchema } = require('./config/schema/runtime-config'); -const { Config } = require('next-recompose-plugins'); +const { withSentryConfig } = require('@sentry/nextjs'); const env = envSchema.parse(process.env); @@ -18,7 +18,7 @@ function buildFaviconRewrite(source) { }; } -module.exports = new Config({ +module.exports = withSentryConfig({ basePath: env.BASE_PATH, compiler: { styledComponents: true, @@ -68,7 +68,10 @@ module.exports = new Config({ ...favicons.map((fileName) => buildFaviconRewrite(`/${fileName}`)), ]; }, + sentry: { + tunnelRoute: '/track-error', + }, serverRuntimeConfig: serverRuntimeConfigSchema.parse(env), swcMinify: true, transpilePackages: ['ui', 'tools', 'antd'], -}).build(); +}); diff --git a/apps/web/package.json b/apps/web/package.json index 7e662bd..25bef78 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -15,6 +15,8 @@ "dependencies": { "@apollo/client": "^3.7.9", "@fontsource/montserrat": "^4.5.14", + "@sentry/nextjs": "^7.57.0", + "@sentry/node": "^7.57.0", "@tanstack/react-query": "^4.24.10", "@trpc/client": "^10.13.0", "@trpc/next": "^10.13.0", @@ -25,7 +27,6 @@ "mobx": "^6.8.0", "mobx-react-lite": "^3.4.0", "next": "^13.4.7", - "next-recompose-plugins": "^2.0.0", "normalize.css": "^8.0.1", "radash": "^10.7.0", "react": "^18.2.0", diff --git a/apps/web/pages/api/trpc/[trpc].ts b/apps/web/pages/api/trpc/[trpc].ts index b5455b5..d2f86de 100644 --- a/apps/web/pages/api/trpc/[trpc].ts +++ b/apps/web/pages/api/trpc/[trpc].ts @@ -1,7 +1,7 @@ -/* eslint-disable jsdoc/check-tag-names */ /* eslint-disable canonical/filename-match-regex */ import { createContext } from '@/server/context'; import { appRouter } from '@/server/routers/_app'; +import { captureException, withScope } from '@sentry/nextjs'; import * as trpcNext from '@trpc/server/adapters/next'; export default trpcNext.createNextApiHandler({ @@ -20,12 +20,21 @@ export default trpcNext.createNextApiHandler({ /** * @link https://trpc.io/docs/error-handling */ - onError({ error }) { - if (error.code === 'INTERNAL_SERVER_ERROR') { - // send to bug reporting - // eslint-disable-next-line no-console - console.error('Something went wrong', error); - } + onError(opts) { + const { error } = opts; + // send to bug reporting + withScope((scope) => { + (Object.keys(opts) as Array).forEach((key) => { + if (key !== 'req') { + let extra = opts[key]; + if (key === 'input') extra = JSON.stringify(extra); + scope.setExtra(key, extra); + } + }); + captureException(error); + }); + // eslint-disable-next-line no-console + console.error('Something went wrong', error); }, router: appRouter, diff --git a/apps/web/process/calculate/action.ts b/apps/web/process/calculate/action.ts index ea87d90..b0d319f 100644 --- a/apps/web/process/calculate/action.ts +++ b/apps/web/process/calculate/action.ts @@ -53,9 +53,10 @@ export async function action({ store, trpcClient }: ProcessContext) { }); } }) - .catch((error) => { + .catch((error_) => { + const error = error_ as Error; notification.error({ - description: JSON.stringify(error), + description: error.message, key, message: errorMessage, placement: 'bottomRight', diff --git a/apps/web/process/create-kp/action.ts b/apps/web/process/create-kp/action.ts index c704944..c1ea0dd 100644 --- a/apps/web/process/create-kp/action.ts +++ b/apps/web/process/create-kp/action.ts @@ -80,9 +80,10 @@ export function action({ store, trpcClient, apolloClient }: ProcessContext) { } } }) - .catch((error) => { + .catch((error_) => { + const error = error_ as Error; notification.error({ - description: JSON.stringify(error), + description: error.message, key, message: errorMessage, placement: 'bottomRight', diff --git a/apps/web/process/fingap/reactions/common.ts b/apps/web/process/fingap/reactions/common.ts index ec8cce9..493454f 100644 --- a/apps/web/process/fingap/reactions/common.ts +++ b/apps/web/process/fingap/reactions/common.ts @@ -205,15 +205,19 @@ export default function reactions({ store, apolloClient, queryClient }: ProcessC risks .map((risk) => getFingapRequestDataFromRisk(risk)) .map((data) => makeRequestGetFinGAP(data)) - ).then((results) => { - const newRisks = risks.map((risk, i) => ({ - ...risk, - premium: results.at(i)?.premium || 0, - sum: results.at(i)?.sum || 0, - })); + ) + .then((results) => { + const newRisks = risks.map((risk, i) => ({ + ...risk, + premium: results.at(i)?.premium || 0, + sum: results.at(i)?.sum || 0, + })); - $tables.fingap.setRisks(newRisks); - }); + $tables.fingap.setRisks(newRisks); + }) + .catch(() => { + $tables.fingap.clear(); + }); }, { // Important: delay prohibits multiple reaction invocation diff --git a/apps/web/process/gibdd/reactions.ts b/apps/web/process/gibdd/reactions.ts index 81f80d1..b41a24e 100644 --- a/apps/web/process/gibdd/reactions.ts +++ b/apps/web/process/gibdd/reactions.ts @@ -8,7 +8,6 @@ import { STALE_TIME } from '@/constants/request'; import * as CRMTypes from '@/graphql/crm.types'; import { normalizeOptions } from '@/utils/entity'; import { disposableReaction } from '@/utils/mobx'; -import type { QueryFunctionContext } from '@tanstack/react-query'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import { reaction } from 'mobx'; @@ -191,27 +190,26 @@ export function common({ store, apolloClient, queryClient }: ProcessContext) { if (OKTMO) { const currentDate = dayjs().utc(false).toDate(); - const request = (context: QueryFunctionContext) => - getTransTax( - { - OKTMO, - calcDate: currentDate, - carCategory, - power: leaseObjectMotorPower, - year: leaseObjectYear, - }, - context - ); - const { tax } = await queryClient.fetchQuery( + const response = await queryClient.fetchQuery( ['1c', 'trans-tax', carCategory, leaseObjectMotorPower, leaseObjectYear], - request, + (context) => + getTransTax( + { + OKTMO, + calcDate: currentDate, + carCategory, + power: leaseObjectMotorPower, + year: leaseObjectYear, + }, + context + ), { staleTime: STALE_TIME, } ); - if (tax) { - $calculation.element('tbxVehicleTaxInYear').setValue(tax); + if (response?.tax) { + $calculation.element('tbxVehicleTaxInYear').setValue(response.tax); } else { $calculation.element('tbxVehicleTaxInYear').resetValue(); } diff --git a/apps/web/process/load-kp/reactions.ts b/apps/web/process/load-kp/reactions.ts index 2c91686..dbec1eb 100644 --- a/apps/web/process/load-kp/reactions.ts +++ b/apps/web/process/load-kp/reactions.ts @@ -2,12 +2,13 @@ import eltHelper from '../elt/lib/helper'; import { message } from '@/Components/Common/Notification'; import type { ProcessContext } from '@/process/types'; +import { captureException, withScope } from '@sentry/nextjs'; import { reaction } from 'mobx'; import { omit } from 'radash'; const key = 'KP_LOADING_INFO'; -export function common({ store, trpcClient, apolloClient }: ProcessContext) { +export function common({ store, trpcClient, apolloClient, user }: ProcessContext) { const { $calculation, $process, $tables } = store; const { init: initElt } = eltHelper({ apolloClient, store }); @@ -85,12 +86,18 @@ export function common({ store, trpcClient, apolloClient }: ProcessContext) { key, }); }) - .catch(() => { + .catch((error_) => { message.error({ content: `Ошибка во время загрузки КП ${quote.label}`, key, }); $calculation.element('selectQuote').resetValue(); + + withScope((scope) => { + scope.setExtra('quote', quote); + scope.setExtra('user', user); + captureException(error_); + }); }) .finally(() => { $process.delete('LoadKP'); diff --git a/apps/web/sentry.client.config.js b/apps/web/sentry.client.config.js new file mode 100644 index 0000000..62ebc88 --- /dev/null +++ b/apps/web/sentry.client.config.js @@ -0,0 +1,37 @@ +// This file configures the initialization of Sentry on the browser. + +// The config you add here will be used whenever a page is visited. + +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import getUrls from './config/urls'; +import { init } from '@sentry/nextjs'; + +const { SENTRY_DSN } = getUrls(); + +init({ + dsn: SENTRY_DSN, + + integrations: [], + + // If the entire session is not sampled, use the below sample rate to sample + + // sessions when an error occurs. + replaysOnErrorSampleRate: 1, + + // ... + + // Note: if you want to override the automatic release value, do not set a + + // `release` value here - use the environment variable `SENTRY_RELEASE`, so + + // that it will also get attached to your source maps + + // in development and sample at a lower rate in production + + replaysSessionSampleRate: 0.1, + + // Adjust this value in production, or use tracesSampler for greater control + + tracesSampleRate: 1, +}); diff --git a/apps/web/sentry.edge.config.js b/apps/web/sentry.edge.config.js new file mode 100644 index 0000000..dfe1168 --- /dev/null +++ b/apps/web/sentry.edge.config.js @@ -0,0 +1,18 @@ +// This file configures the initialization of Sentry on the server. +// The config you add here will be used whenever middleware or an Edge route handles a request. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import getUrls from './config/urls'; +import { init } from '@sentry/nextjs'; + +const { SENTRY_DSN } = getUrls(); + +init({ + dsn: SENTRY_DSN, + // Adjust this value in production, or use tracesSampler for greater control + tracesSampleRate: 1, + // ... + // Note: if you want to override the automatic release value, do not set a + // `release` value here - use the environment variable `SENTRY_RELEASE`, so + // that it will also get attached to your source maps +}); diff --git a/apps/web/sentry.server.config.js b/apps/web/sentry.server.config.js new file mode 100644 index 0000000..573036f --- /dev/null +++ b/apps/web/sentry.server.config.js @@ -0,0 +1,18 @@ +// This file configures the initialization of Sentry on the server. +// The config you add here will be used whenever the server handles a request. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import getUrls from './config/urls'; +import { init } from '@sentry/nextjs'; + +const { SENTRY_DSN } = getUrls(); + +init({ + dsn: SENTRY_DSN, + // Adjust this value in production, or use tracesSampler for greater control + tracesSampleRate: 1, + // ... + // Note: if you want to override the automatic release value, do not set a + // `release` value here - use the environment variable `SENTRY_RELEASE`, so + // that it will also get attached to your source maps +}); diff --git a/apps/web/server/middleware.ts b/apps/web/server/middleware.ts index ac633b1..ea7ec11 100644 --- a/apps/web/server/middleware.ts +++ b/apps/web/server/middleware.ts @@ -2,6 +2,7 @@ import { t } from './trpc'; import initializeApollo from '@/apollo/client'; import { unlimitedRoles } from '@/config/users'; import * as CRMTypes from '@/graphql/crm.types'; +import { Handlers } from '@sentry/node'; import { TRPCError } from '@trpc/server'; /** @@ -34,4 +35,10 @@ export const userMiddleware = t.middleware(async ({ ctx, next }) => { }); }); +export const sentryMiddleware = t.middleware( + Handlers.trpcMiddleware({ + attachRpcInput: true, + }) +); + export const middleware = t.middleware; diff --git a/apps/web/server/procedure.ts b/apps/web/server/procedure.ts index dba8832..c1a3cf6 100644 --- a/apps/web/server/procedure.ts +++ b/apps/web/server/procedure.ts @@ -1,4 +1,4 @@ -import { userMiddleware } from './middleware'; +import { sentryMiddleware, userMiddleware } from './middleware'; import { t } from './trpc'; /** @@ -7,6 +7,6 @@ import { t } from './trpc'; * @see https://trpc.io/docs/v10/procedures */ -export const publicProcedure = t.procedure; +export const publicProcedure = t.procedure.use(sentryMiddleware); -export const protectedProcedure = t.procedure.use(userMiddleware); +export const protectedProcedure = t.procedure.use(sentryMiddleware).use(userMiddleware); diff --git a/apps/web/server/routers/calculate/index.ts b/apps/web/server/routers/calculate/index.ts index 2f206f5..ecb9aff 100644 --- a/apps/web/server/routers/calculate/index.ts +++ b/apps/web/server/routers/calculate/index.ts @@ -52,13 +52,6 @@ export const calculateRouter = router({ const calculateResult = await calculate(requestData); - if (calculateResult.errors?.length > 0) { - return { - error: calculateResult.errors[0], - success: false, - }; - } - const result = transformCalculateResults({ calculateInput: input, requestCalculate: requestData, diff --git a/apps/web/server/routers/quote/index.ts b/apps/web/server/routers/quote/index.ts index e900b2d..65ab388 100644 --- a/apps/web/server/routers/quote/index.ts +++ b/apps/web/server/routers/quote/index.ts @@ -131,13 +131,6 @@ export const quoteRouter = router({ const calculateResult = await calculate(requestData); - if (calculateResult.errors?.length > 0) { - return { - error: calculateResult.errors[0], - success: false, - }; - } - const requestCreateKP = compatRequestCreateKP({ domainName: user.domainName, finGAP: input.fingap, @@ -153,13 +146,6 @@ export const quoteRouter = router({ const createKPResult = await createKP(requestCreateKP); - if (createKPResult.success === false) { - return { - success: false, - error: createKPResult.message || createKPResult.fullMessage, - }; - } - const result = transformCalculateResults({ calculateInput: input, requestCalculate: requestData, diff --git a/apps/web/utils/axios.ts b/apps/web/utils/axios.ts new file mode 100644 index 0000000..22d68e3 --- /dev/null +++ b/apps/web/utils/axios.ts @@ -0,0 +1,43 @@ +import { captureException, withScope } from '@sentry/nextjs'; +import type { AxiosError } from 'axios'; +import { isAxiosError } from 'axios'; +import { pick } from 'radash'; + +function getErrorMessage( + error: AxiosError +) { + return ( + error.response?.data?.error || + error.response?.data?.errors?.[0] || + error.response?.data?.message || + error.message + ); +} + +export async function withHandleError(fn: Promise) { + return fn.catch((error_: AxiosError | Error) => { + if (isAxiosError(error_)) { + const err = pick(error_, ['code', 'message', 'status', 'cause']); + const data = error_.config?.data; + const params = error_.config?.params; + + const message = getErrorMessage(error_); + const opts = { ...err, data, message, params }; + + error_.message += ` | ${message}`; + + withScope((scope) => { + (Object.keys(opts) as Array).forEach((key) => { + let extra = opts[key]; + if (key === 'data') extra = JSON.stringify(extra); + scope.setExtra(key, extra); + }); + captureException(error_); + }); + + throw new Error(message); + } + + return null as unknown as T; + }); +} diff --git a/yarn.lock b/yarn.lock index 7b68e28..75c3111 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1738,6 +1738,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.13": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -1996,11 +2001,158 @@ resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== +"@rollup/plugin-commonjs@24.0.0": + version "24.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.0.tgz#fb7cf4a6029f07ec42b25daa535c75b05a43f75c" + integrity sha512-0w0wyykzdyRRPHOb0cQt14mIBLujfAv6GgP6g8nvg/iBxEm112t3YPPq+Buqe2+imvElTka+bjNlJ/gB56TD8g== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.27.0" + +"@rollup/pluginutils@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" + integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + "@rushstack/eslint-patch@^1.1.3", "@rushstack/eslint-patch@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== +"@sentry-internal/tracing@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.57.0.tgz#cb761931b635f8f24c84be0eecfacb8516b20551" + integrity sha512-tpViyDd8AhQGYYhI94xi2aaDopXOPfL2Apwrtb3qirWkomIQ2K86W1mPmkce+B0cFOnW2Dxv/ZTFKz6ghjK75A== + dependencies: + "@sentry/core" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/browser@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.57.0.tgz#6e724c9eac680dba99ced0fdf81be8d1e3b3bceb" + integrity sha512-E0HaYYlaqHFiIRZXxcvOO8Odvlt+TR1vFFXzqUWXPOvDRxURglTOCQ3EN/u6bxtAGJ6y/Zc2obgihTtypuel/w== + dependencies: + "@sentry-internal/tracing" "7.57.0" + "@sentry/core" "7.57.0" + "@sentry/replay" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/cli@^1.74.6": + version "1.75.2" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.75.2.tgz#2c38647b38300e52c9839612d42b7c23f8d6455b" + integrity sha512-CG0CKH4VCKWzEaegouWfCLQt9SFN+AieFESCatJ7zSuJmzF05ywpMusjxqRul6lMwfUhRKjGKOzcRJ1jLsfTBw== + dependencies: + https-proxy-agent "^5.0.0" + mkdirp "^0.5.5" + node-fetch "^2.6.7" + progress "^2.0.3" + proxy-from-env "^1.1.0" + which "^2.0.2" + +"@sentry/core@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.57.0.tgz#65093d739c04f320a54395a21be955fcbe326acb" + integrity sha512-l014NudPH0vQlzybtXajPxYFfs9w762NoarjObC3gu76D1jzBBFzhdRelkGpDbSLNTIsKhEDDRpgAjBWJ9icfw== + dependencies: + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/integrations@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.57.0.tgz#298085b3a2fe862cc70bc7f2143aa0fbc617322c" + integrity sha512-C3WZo5AGI2L0dj+mIjeZpdAwDEG2nDYvZbTzq5J9hVoHFdP3t7fOWBHSPkSFVtTdMaJrv+82aKnUefVCeAjxGg== + dependencies: + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + localforage "^1.8.1" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/nextjs@^7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.57.0.tgz#a6fc7cb827eb28124e06baf10d160b619208129d" + integrity sha512-TH7Hhs833j1k2rM5K3AqiQ7+bxrTzANZazBLEK1YVec02PpnqflVuBHSdFxT6dG7ypxOpMkN36BN5INY5HHT0Q== + dependencies: + "@rollup/plugin-commonjs" "24.0.0" + "@sentry/core" "7.57.0" + "@sentry/integrations" "7.57.0" + "@sentry/node" "7.57.0" + "@sentry/react" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + "@sentry/webpack-plugin" "1.20.0" + chalk "3.0.0" + rollup "2.78.0" + stacktrace-parser "^0.1.10" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/node@7.57.0", "@sentry/node@^7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.57.0.tgz#31052f5988ed4496d7f3ff925240cf9b02d09941" + integrity sha512-63mjyUVM6sfJFVQ5TGVRVGUsoEfESl5ABzIW1W0s9gUiQPaG8SOdaQJglb2VNrkMYxnRHgD8Q9LUh/qcmUyPGw== + dependencies: + "@sentry-internal/tracing" "7.57.0" + "@sentry/core" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/react@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.57.0.tgz#cf91f0115bcd2a8306d6c8a39d8e8b53d4b21814" + integrity sha512-XGNTjIoCG3naSmCU8qObd+y+CqAB6NQkGWOp2yyBwp2inyKF2ehJvDh6bIQloBYq2TmOJDa4NfXdMrkilxaLFQ== + dependencies: + "@sentry/browser" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + hoist-non-react-statics "^3.3.2" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/replay@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.57.0.tgz#c8f7eae7b7edc9d32c3d2955b337f3b3c76dff39" + integrity sha512-pN4ryNS3J5EYbkXvR+O/+hseAJha7XDl8mPFtK0OGTHG10JzCi4tQJazblHQdpb5QBaMMPCeZ+isyfoQLDNXnw== + dependencies: + "@sentry/core" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + +"@sentry/types@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.57.0.tgz#4fdb80cbd49ba034dd8d9be0c0005a016d5db3ce" + integrity sha512-D7ifoUfxuVCUyktIr5Gc+jXUbtcUMmfHdTtTbf1XCZHua5mJceK9wtl3YCg3eq/HK2Ppd52BKnTzEcS5ZKQM+w== + +"@sentry/utils@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.57.0.tgz#8253c6fcf35138b4c424234b8da1596e11b98ad8" + integrity sha512-YXrkMCiNklqkXctn4mKYkrzNCf/dfVcRUQrkXjeBC+PHXbcpPyaJgInNvztR7Skl8lE3JPGPN4v5XhLxK1bUUg== + dependencies: + "@sentry/types" "7.57.0" + tslib "^2.4.1 || ^1.9.3" + +"@sentry/webpack-plugin@1.20.0": + version "1.20.0" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.20.0.tgz#e7add76122708fb6b4ee7951294b521019720e58" + integrity sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw== + dependencies: + "@sentry/cli" "^1.74.6" + webpack-sources "^2.0.0 || ^3.0.0" + "@sinclair/typebox@^0.25.16": version "0.25.24" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" @@ -2286,6 +2438,11 @@ dependencies: "@types/ms" "*" +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" @@ -3260,6 +3417,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -3420,6 +3584,14 @@ capital-case@^1.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" +chalk@3.0.0, chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" @@ -3442,14 +3614,6 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -3710,6 +3874,11 @@ common-tags@1.8.2: resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -3744,7 +3913,7 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cookie@^0.4.2: +cookie@^0.4.1, cookie@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== @@ -4949,6 +5118,11 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -5450,6 +5624,17 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^11.1.0, globals@^11.12.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -5794,6 +5979,11 @@ ignore@^5.0.5, ignore@^5.1.1, ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + immutable@~3.7.6: version "3.7.6" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" @@ -6168,11 +6358,6 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - is-proto-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-proto-prop/-/is-proto-prop-2.0.0.tgz#99ab2863462e44090fd083efd1929058f9d935e1" @@ -6181,6 +6366,13 @@ is-proto-prop@^2.0.0: lowercase-keys "^1.0.0" proto-props "^2.0.0" +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -7035,6 +7227,13 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + lilconfig@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -7092,6 +7291,13 @@ listr2@^5.0.7: through "^2.3.8" wrap-ansi "^7.0.0" +localforage@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -7199,11 +7405,23 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -7333,6 +7551,13 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -7351,6 +7576,13 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + mobx-react-lite@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-3.4.0.tgz#d59156a96889cdadad751e5e4dab95f28926dfff" @@ -7443,15 +7675,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next-recompose-plugins@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/next-recompose-plugins/-/next-recompose-plugins-2.0.0.tgz#7d77c63ea7ff5c06e2e8504c9ca8c6b9bdb4c7f2" - integrity sha512-Dfg/5RVnbVCaJqAGt+Ikf5IudZ5mQ8PHHqcPT2oLeXA8fi7cxFIBF2DfzTcLz4AwFRy1x9uD8wgqSM5j98r6EA== - dependencies: - is-promise "^4.0.0" - semver "^7.3.8" - take-n-pipe "^1.1.1" - next@^13.4.7: version "13.4.7" resolved "https://registry.yarnpkg.com/next/-/next-13.4.7.tgz#2ab20e6fada2e25cb81bd17f68956705ffd9824e" @@ -8072,6 +8295,11 @@ pretty-format@^29.0.0, pretty-format@^29.4.3: ansi-styles "^5.0.0" react-is "^18.0.0" +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -8912,6 +9140,13 @@ roarr@^7.14.2: safe-stable-stringify "^2.4.1" semver-compare "^1.0.0" +rollup@2.78.0: + version "2.78.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.78.0.tgz#00995deae70c0f712ea79ad904d5f6b033209d9e" + integrity sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg== + optionalDependencies: + fsevents "~2.3.2" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -9337,6 +9572,13 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -9615,11 +9857,6 @@ synckit@^0.8.4, synckit@^0.8.5: "@pkgr/utils" "^2.3.1" tslib "^2.5.0" -take-n-pipe@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/take-n-pipe/-/take-n-pipe-1.1.1.tgz#6467eb0a6c768b1f183d7d0ae814136442ac4479" - integrity sha512-BPD//p7LC1AzA8jsIBgUqJEfv4lWSEGclTr6mQBJa4nBtHsFi0F+biD90E1A1OosO3+Y4sc0XM4M7ucxnYxoPA== - tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -9834,6 +10071,11 @@ tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +"tslib@^2.4.1 || ^1.9.3": + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -9924,6 +10166,11 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -10174,6 +10421,11 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== +"webpack-sources@^2.0.0 || ^3.0.0": + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + whatwg-encoding@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" @@ -10252,7 +10504,7 @@ which@^1.2.9: dependencies: isexe "^2.0.0" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==