feat: Tests for Response service (#1527)

Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
This commit is contained in:
Rotimi Best
2023-12-18 12:32:50 +01:00
committed by GitHub
parent ddc06b19bf
commit 2ce759c023
20 changed files with 631 additions and 106 deletions

View File

@@ -25,7 +25,7 @@ jobs:
- name: create .env
run: cp .env.example .env
- name: Generate Random NEXTAUTH_SECRET
- name: Generate Random ENCRYPTION_KEY
run: |
SECRET=$(openssl rand -hex 32)
echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV

View File

@@ -29,6 +29,11 @@ jobs:
- name: create .env
run: cp .env.example .env
- name: Generate Random ENCRYPTION_KEY
run: |
SECRET=$(openssl rand -hex 32)
echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV
- name: Build formbricks-js dependencies
run: pnpm build --filter=js

View File

@@ -25,7 +25,7 @@
"generate": "turbo run generate",
"lint": "turbo run lint",
"release": "turbo run build --filter=js... && turbo run build --filter=n8n-node... && changeset publish",
"test": "turbo run test",
"test": "turbo run test --no-cache",
"test:e2e": "playwright test",
"prepare": "husky install"
},

View File

@@ -0,0 +1,15 @@
import { PrismaClient } from "@prisma/client";
import { DeepMockProxy, mockDeep, mockReset } from "jest-mock-extended";
import { prisma } from "./client";
jest.mock("./client", () => ({
__esModule: true,
prisma: mockDeep<PrismaClient>(),
}));
export const prismaMock = prisma as unknown as DeepMockProxy<PrismaClient>;
beforeEach(() => {
mockReset(prismaMock);
});

View File

@@ -34,8 +34,8 @@
"build": "tsc && vite build",
"go": "vite build --watch",
"lint": "eslint ./src --fix",
"clean": "rimraf .turbo node_modules dist coverage",
"test": "jest"
"test": "jest --coverage --no-cache",
"clean": "rimraf .turbo node_modules dist coverage"
},
"author": "Formbricks <hola@formbricks.com>",
"devDependencies": {

View File

@@ -37,7 +37,8 @@ beforeEach(() => {
fetchMock.resetMocks();
});
/* test("Formbricks should Initialise", async () => {
/*
test("Formbricks should Initialise", async () => {
mockInitResponse();
await formbricks.init({
@@ -119,7 +120,7 @@ test("Formbricks should track event", async () => {
expect(consoleLogMock).toHaveBeenCalledWith(
expect.stringMatching(/Formbricks: Event "Button Clicked" tracked/)
);
});
});
test("Formbricks should register for route change", async () => {
mockRegisterRouteChangeResponse();
@@ -135,4 +136,5 @@ test("Formbricks should reset", async () => {
expect(Object.keys(currentStatePersonAttributes).length).toBe(0);
});
*/
*/

View File

@@ -1,14 +0,0 @@
import "server-only";
import { TAttributeClass } from "@formbricks/types/attributeClasses";
export const formatAttributeClassDateFields = (attributeClass: TAttributeClass): TAttributeClass => {
if (typeof attributeClass.createdAt === "string") {
attributeClass.createdAt = new Date(attributeClass.createdAt);
}
if (typeof attributeClass.updatedAt === "string") {
attributeClass.updatedAt = new Date(attributeClass.updatedAt);
}
return attributeClass;
};

View File

@@ -0,0 +1 @@
module.exports = { presets: ["@babel/preset-env"] };

View File

@@ -318,7 +318,10 @@ export const getDisplaysByPersonId = async (personId: string, page?: number): Pr
return displays.map((display) => formatDateFields(display, ZDisplay));
};
export const deleteDisplayByResponseId = async (responseId: string, surveyId: string): Promise<TDisplay> => {
export const deleteDisplayByResponseId = async (
responseId: string,
surveyId: string
): Promise<TDisplay | null> => {
validateInputs([responseId, ZId], [surveyId, ZId]);
try {

1
packages/lib/env.d.ts vendored Normal file
View File

@@ -0,0 +1 @@
declare module "*";

View File

@@ -0,0 +1,39 @@
import { Config } from "jest";
const config: Config = {
preset: "ts-jest",
collectCoverage: true,
// on node 14.x coverage provider v8 offers good speed and more or less good report
coverageProvider: "v8",
testMatch: ["**/*.test.ts"],
collectCoverageFrom: [
"**/*.{js,jsx,ts,tsx}",
"!**/*.d.ts",
"!**/node_modules/**",
"!<rootDir>/out/**",
"!<rootDir>/.next/**",
"!<rootDir>/*.config.js",
"!<rootDir>/*.config.ts",
"!<rootDir>/coverage/**",
"!<rootDir>/jest/**",
],
testPathIgnorePatterns: ["<rootDir>/node_modules/", "<rootDir>/.next/"],
setupFilesAfterEnv: ["<rootDir>/jest/jestSetup.ts", "<rootDir>/../database/src/jestClient.ts"],
transform: {
// Use babel-jest to transpile tests with the next/babel preset
// https://jestjs.io/docs/configuration#transform-objectstring-pathtotransformer--pathtotransformer-object
"^.+\\.(ts|tsx)$": "ts-jest",
"^.+\\.(js|jsx)$": ["babel-jest", { presets: ["next/babel"] }],
"^.+\\.mjs$": "babel-jest",
},
transformIgnorePatterns: [
"/node_modules/",
"^.+\\.module\\.(css|sass|scss)$",
"node_modules/(?!uuid).+\\.js$",
],
moduleNameMapper: {
"^uuid$": "uuid",
},
};
export default config;

View File

@@ -0,0 +1,18 @@
// mock these globally used functions
jest.mock("next/cache", () => ({
__esModule: true,
unstable_cache: (fn: () => {}) => {
return async () => {
return fn();
};
},
revalidateTag: jest.fn(),
}));
jest.mock("server-only", () => jest.fn());
beforeEach(() => {
jest.resetModules();
jest.resetAllMocks();
});

View File

@@ -6,10 +6,12 @@
"main": "./index.ts",
"types": "./index.ts",
"scripts": {
"clean": "rimraf .turbo node_modules .next",
"clean": "rimraf .turbo node_modules .next coverage",
"lint": "eslint . --ext .ts,.js,.tsx,.jsx",
"lint:fix": "eslint . --ext .ts,.js,.tsx,.jsx --fix",
"lint:report": "eslint . --format json --output-file ../../lint-results/app-store.json"
"lint:report": "eslint . --format json --output-file ../../lint-results/app-store.json",
"test:dev": "jest --coverage --watch",
"test": "jest -ci --coverage --no-cache"
},
"dependencies": {
"@aws-sdk/s3-presigned-post": "3.473.0",
@@ -36,6 +38,11 @@
"@formbricks/tsconfig": "*",
"@types/jsonwebtoken": "^9.0.5",
"@types/mime": "3.0.4",
"eslint-config-formbricks": "workspace:*"
"eslint-config-formbricks": "workspace:*",
"babel-jest": "^29.7.0",
"jest-mock-extended": "^3.0.5",
"jest": "^29.7.0",
"ts-jest": "^29.1.1",
"ts-node": "^10.9.2"
}
}

View File

@@ -32,7 +32,7 @@ import { formatDateFields } from "../utils/datetime";
import { validateInputs } from "../utils/validate";
import { responseCache } from "./cache";
const responseSelection = {
export const responseSelection = {
id: true,
createdAt: true,
updatedAt: true,
@@ -117,13 +117,17 @@ export const getResponsesByPersonId = async (
let responses: Array<TResponse> = [];
responsePrisma.forEach((response) => {
responses.push({
...response,
person: response.person ? transformPrismaPerson(response.person) : null,
tags: response.tags.map((tagPrisma: { tag: TTag }) => tagPrisma.tag),
});
});
await Promise.all(
responsePrisma.map(async (response) => {
const responseNotes = await getResponseNotes(response.id);
responses.push({
...response,
notes: responseNotes,
person: response.person ? transformPrismaPerson(response.person) : null,
tags: response.tags.map((tagPrisma: { tag: TTag }) => tagPrisma.tag),
});
})
);
return responses;
} catch (error) {

View File

@@ -0,0 +1,109 @@
import { Prisma } from "@prisma/client";
import { TResponseUpdateInput } from "@formbricks/types/responses";
import { responseNoteSelect } from "../../../responseNote/service";
import { responseSelection } from "../../service";
import { constantsForTests } from "../constants";
type ResponseMock = Prisma.ResponseGetPayload<{
include: typeof responseSelection;
}>;
type ResponseNoteMock = Prisma.ResponseNoteGetPayload<{
include: typeof responseNoteSelect;
}>;
type ResponsePersonMock = Prisma.PersonGetPayload<{
select: typeof responseSelection.person.select;
}>;
export const mockEnvironmentId = "ars2tjk8hsi8oqk1uac00mo7";
export const mockPersonId = "lhwy39ga2zy8by1ol1bnaiso";
export const mockResponseId = "z32bqib0nlcw8vqymlj6m8x7";
export const mockSingleUseId = "qj57j3opsw8b5sxgea20fgcq";
export const mockSurveyId = "nlg30c8btxljivh6dfcoxve2";
export const mockUserId = "qwywazmugeezyfr3zcg9jk8a";
export const mockMeta = {
source: constantsForTests.url,
url: constantsForTests.url,
userAgent: {
browser: constantsForTests.browser,
os: constantsForTests.text,
device: constantsForTests.text,
},
};
export const mockResponseNote: ResponseNoteMock = {
id: "clnndevho0mqrqp0fm2ozul8p",
createdAt: new Date(),
updatedAt: new Date(),
text: constantsForTests.text,
isEdited: constantsForTests.boolean,
isResolved: constantsForTests.boolean,
responseId: mockResponseId,
userId: mockUserId,
response: {
id: mockResponseId,
surveyId: mockSurveyId,
},
user: {
id: mockPersonId,
name: constantsForTests.fullName,
},
};
export const mockPerson: ResponsePersonMock = {
id: mockPersonId,
userId: mockUserId,
createdAt: new Date(),
updatedAt: new Date(),
environmentId: mockEnvironmentId,
attributes: [
{
value: "attribute1",
attributeClass: {
name: "attributeClass1",
},
},
],
};
export const mockTags = [
{
tag: {
id: constantsForTests.uuid,
name: "tag1",
createdAt: new Date(),
updatedAt: new Date(),
environmentId: mockEnvironmentId,
},
},
];
export const mockResponse: ResponseMock = {
id: mockResponseId,
surveyId: mockSurveyId,
singleUseId: mockSingleUseId,
data: {},
person: null,
personAttributes: {},
createdAt: new Date(),
finished: constantsForTests.boolean,
meta: mockMeta,
notes: [mockResponseNote],
tags: mockTags,
personId: mockPersonId,
updatedAt: new Date(),
ttc: {},
};
export const mockResponseData: TResponseUpdateInput["data"] = {
key1: "value",
key2: ["value1", "value2"],
key3: 20,
};
export const getMockUpdateResponseInput = (finished: boolean = false): TResponseUpdateInput => ({
data: mockResponseData,
finished,
});

View File

@@ -0,0 +1,8 @@
export const constantsForTests = {
uuid: "123e4567-e89b-12d3-a456-426614174000",
browser: "Chrome",
url: "https://www.example.com",
boolean: true,
text: "Abc12345",
fullName: "Pavitr Prabhakar",
};

View File

@@ -0,0 +1,182 @@
import {
getMockUpdateResponseInput,
mockEnvironmentId,
mockMeta,
mockPerson,
mockResponse,
mockResponseData,
mockResponseNote,
mockSingleUseId,
mockSurveyId,
mockTags,
mockUserId,
} from "./__mocks__/data.mock";
import { prismaMock } from "@formbricks/database/src/jestClient";
import { TResponse, TResponseInput } from "@formbricks/types/responses";
import { TTag } from "@formbricks/types/tags";
import { selectPerson, transformPrismaPerson } from "../../person/service";
import { createResponse, updateResponse } from "../service";
import { constantsForTests } from "./constants";
const expectedResponseWithoutPerson: TResponse = {
...mockResponse,
person: null,
tags: mockTags.map((tagPrisma: { tag: TTag }) => tagPrisma.tag),
};
const expectedResponseWithPerson: TResponse = {
...mockResponse,
person: transformPrismaPerson(mockPerson),
tags: mockTags?.map((tagPrisma: { tag: TTag }) => tagPrisma.tag),
};
const mockResponseInputWithoutUserId: TResponseInput = {
environmentId: mockEnvironmentId,
surveyId: mockSurveyId,
singleUseId: mockSingleUseId,
finished: constantsForTests.boolean,
data: {},
meta: mockMeta,
};
const mockResponseInputWithUserId: TResponseInput = {
...mockResponseInputWithoutUserId,
userId: mockUserId,
};
beforeEach(() => {
// @ts-expect-error
prismaMock.response.create.mockImplementation(async (args) => {
if (args.data.person && args.data.person.connect) {
return {
...mockResponse,
person: mockPerson,
};
}
return mockResponse;
});
// mocking the person findFirst call as it is used in the transformPrismaPerson function
prismaMock.person.findFirst.mockResolvedValue(mockPerson);
prismaMock.responseNote.findMany.mockResolvedValue([mockResponseNote]);
prismaMock.response.findUnique.mockResolvedValue(mockResponse);
// @ts-expect-error
prismaMock.response.update.mockImplementation(async (args) => {
if (args.data.finished === true) {
return {
...mockResponse,
finished: true,
data: mockResponseData,
};
}
return {
...mockResponse,
finished: false,
data: mockResponseData,
};
});
});
describe("Tests for Response Service", () => {
it("creates a response with an existing user", async () => {
const response = await createResponse(mockResponseInputWithUserId);
expect(response).toEqual(expectedResponseWithPerson);
});
it("creates a response without an existing user", async () => {
const response = await createResponse(mockResponseInputWithoutUserId);
expect(response).toEqual(expectedResponseWithoutPerson);
});
it("creates a new person if the person does not exists and then creates a response", async () => {
prismaMock.person.findFirst.mockResolvedValue(null);
prismaMock.person.create.mockResolvedValue(mockPerson);
const response = await createResponse(mockResponseInputWithUserId);
expect(response).toEqual(expectedResponseWithPerson);
expect(prismaMock.person.create).toHaveBeenCalledWith({
data: {
environment: { connect: { id: mockEnvironmentId } },
userId: mockUserId,
},
select: selectPerson,
});
});
it("updates a response (finished = true)", async () => {
const response = await updateResponse(mockResponse.id, getMockUpdateResponseInput(true));
expect(response).toEqual({
...expectedResponseWithoutPerson,
data: mockResponseData,
});
});
it("updates a response (finished = false)", async () => {
const response = await updateResponse(mockResponse.id, getMockUpdateResponseInput(false));
expect(response).toEqual({
...expectedResponseWithoutPerson,
finished: false,
data: mockResponseData,
});
});
});
// describe("Response Service", () => {
// test("getResponsesByPersonId function", async () => {
// const responses = await getResponsesByPersonId(mockPersonId, 1);
// const expectedResponses = [expectedResponse];
// expect(responses).toHaveLength(1);
// expect(responses).toEqual(expectedResponses);
// });
// test("getResponseBySingleUseId function", async () => {
// const response = await getResponseBySingleUseId(mockSurveyId, mockSingleUseId);
// expect(response).toEqual(expectedResponse);
// });
// test("createResponse function", async () => {
// const response = await createResponse(mockResponseInput);
// expect(response).toEqual(expectedResponse);
// });
// test("getResponse function", async () => {
// const response = await getResponse(mockResponseId);
// expect(response).toEqual(expectedResponse);
// });
// test("getResponses function", async () => {
// const responses = await getResponses(mockSurveyId);
// expect(responses).toEqual([expectedResponse]);
// });
// test("getResponsesByEnvironmentId function", async () => {
// const responses = await getResponsesByEnvironmentId(mockEnvironmentId, 1);
// expect(responses).toHaveLength(1);
// expect(responses).toEqual([expectedResponse]);
// });
// test("updateResponse function", async () => {
// const response = await updateResponse(mockResponseId, mockResponseInput);
// expect(response).toEqual(expectedResponse);
// });
// test("deleteResponse function", async () => {
// const response = await deleteResponse(mockResponseId);
// expect(response).toEqual(expectedResponse);
// });
// test("getResponseCountBySurveyId function", async () => {
// const count = await getResponseCountBySurveyId(mockSurveyId);
// expect(count).toEqual(1);
// });
// });

View File

@@ -15,7 +15,7 @@ import { formatDateFields } from "../utils/datetime";
import { validateInputs } from "../utils/validate";
import { responseNoteCache } from "./cache";
const select = {
export const responseNoteSelect = {
id: true,
createdAt: true,
updatedAt: true,
@@ -50,7 +50,7 @@ export const createResponseNote = async (
userId: userId,
text: text,
},
select,
select: responseNoteSelect,
});
responseCache.revalidate({
@@ -81,7 +81,7 @@ export const getResponseNote = async (responseNoteId: string): Promise<TResponse
where: {
id: responseNoteId,
},
select,
select: responseNoteSelect,
});
return responseNote;
} catch (error) {
@@ -109,7 +109,7 @@ export const getResponseNotes = async (responseId: string): Promise<TResponseNot
where: {
responseId,
},
select,
select: responseNoteSelect,
});
if (!responseNotes) {
throw new ResourceNotFoundError("Response Notes by ResponseId", responseId);
@@ -143,7 +143,7 @@ export const updateResponseNote = async (responseNoteId: string, text: string):
updatedAt: new Date(),
isEdited: true,
},
select,
select: responseNoteSelect,
});
responseCache.revalidate({
@@ -179,7 +179,7 @@ export const resolveResponseNote = async (responseNoteId: string): Promise<TResp
updatedAt: new Date(),
isResolved: true,
},
select,
select: responseNoteSelect,
});
responseCache.revalidate({

View File

@@ -0,0 +1,5 @@
import { createId } from "@paralleldrive/cuid2";
export function randomCuid2() {
return createId();
}

274
pnpm-lock.yaml generated
View File

@@ -44,7 +44,7 @@ importers:
version: 2.0.18(react@18.2.0)
next:
specifier: 14.0.4
version: 14.0.4(react-dom@18.2.0)(react@18.2.0)
version: 14.0.4(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0)
react:
specifier: 18.2.0
version: 18.2.0
@@ -365,7 +365,7 @@ importers:
version: 4.0.0
next:
specifier: 14.0.4
version: 14.0.4(react-dom@18.2.0)(react@18.2.0)
version: 14.0.4(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0)
nodemailer:
specifier: ^6.9.7
version: 6.9.7
@@ -593,7 +593,7 @@ importers:
version: 3.0.0
jest:
specifier: ^29.7.0
version: 29.7.0
version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2)
jest-environment-jsdom:
specifier: ^29.7.0
version: 29.7.0
@@ -635,7 +635,7 @@ importers:
version: 2.2.2
'@t3-oss/env-nextjs':
specifier: ^0.7.1
version: 0.7.1(zod@3.22.4)
version: 0.7.1(typescript@5.3.3)(zod@3.22.4)
aws-crt:
specifier: ^1.20.0
version: 1.20.0
@@ -679,9 +679,24 @@ importers:
'@types/mime':
specifier: 3.0.4
version: 3.0.4
babel-jest:
specifier: ^29.7.0
version: 29.7.0(@babel/core@7.23.6)
eslint-config-formbricks:
specifier: workspace:*
version: link:../eslint-config-formbricks
jest:
specifier: ^29.7.0
version: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2)
jest-mock-extended:
specifier: ^3.0.5
version: 3.0.5(jest@29.7.0)(typescript@5.3.3)
ts-jest:
specifier: ^29.1.1
version: 29.1.1(@babel/core@7.23.6)(babel-jest@29.7.0)(jest@29.7.0)(typescript@5.3.3)
ts-node:
specifier: ^10.9.2
version: 10.9.2(@types/node@20.10.4)(typescript@5.3.3)
packages/prettier-config:
devDependencies:
@@ -1097,7 +1112,6 @@ packages:
dependencies:
'@jridgewell/gen-mapping': 0.3.3
'@jridgewell/trace-mapping': 0.3.20
dev: true
/@aws-crypto/crc32@3.0.0:
resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==}
@@ -1738,7 +1752,6 @@ packages:
/@babel/compat-data@7.23.5:
resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==}
engines: {node: '>=6.9.0'}
dev: true
/@babel/core@7.23.6:
resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==}
@@ -1761,7 +1774,6 @@ packages:
semver: 6.3.1
transitivePeerDependencies:
- supports-color
dev: true
/@babel/generator@7.17.7:
resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==}
@@ -1780,7 +1792,6 @@ packages:
'@jridgewell/gen-mapping': 0.3.3
'@jridgewell/trace-mapping': 0.3.20
jsesc: 2.5.2
dev: true
/@babel/helper-annotate-as-pure@7.22.5:
resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
@@ -1805,7 +1816,6 @@ packages:
browserslist: 4.22.2
lru-cache: 5.1.1
semver: 6.3.1
dev: true
/@babel/helper-create-class-features-plugin@7.23.6(@babel/core@7.23.6):
resolution: {integrity: sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==}
@@ -1855,7 +1865,6 @@ packages:
/@babel/helper-environment-visitor@7.22.20:
resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
engines: {node: '>=6.9.0'}
dev: true
/@babel/helper-function-name@7.23.0:
resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
@@ -1863,14 +1872,12 @@ packages:
dependencies:
'@babel/template': 7.22.15
'@babel/types': 7.23.6
dev: true
/@babel/helper-hoist-variables@7.22.5:
resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.23.6
dev: true
/@babel/helper-member-expression-to-functions@7.23.0:
resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==}
@@ -1884,7 +1891,6 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.23.6
dev: true
/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6):
resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
@@ -1898,7 +1904,6 @@ packages:
'@babel/helper-simple-access': 7.22.5
'@babel/helper-split-export-declaration': 7.22.6
'@babel/helper-validator-identifier': 7.22.20
dev: true
/@babel/helper-optimise-call-expression@7.22.5:
resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
@@ -1941,7 +1946,6 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.23.6
dev: true
/@babel/helper-skip-transparent-expression-wrappers@7.22.5:
resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==}
@@ -1955,12 +1959,10 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.23.6
dev: true
/@babel/helper-string-parser@7.23.4:
resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
engines: {node: '>=6.9.0'}
dev: true
/@babel/helper-validator-identifier@7.22.20:
resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
@@ -1969,7 +1971,6 @@ packages:
/@babel/helper-validator-option@7.23.5:
resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==}
engines: {node: '>=6.9.0'}
dev: true
/@babel/helper-wrap-function@7.22.20:
resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==}
@@ -1989,7 +1990,6 @@ packages:
'@babel/types': 7.23.6
transitivePeerDependencies:
- supports-color
dev: true
/@babel/highlight@7.23.4:
resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==}
@@ -2005,7 +2005,6 @@ packages:
hasBin: true
dependencies:
'@babel/types': 7.23.6
dev: true
/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.6):
resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==}
@@ -2970,7 +2969,6 @@ packages:
'@babel/code-frame': 7.23.5
'@babel/parser': 7.23.6
'@babel/types': 7.23.6
dev: true
/@babel/traverse@7.23.2:
resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
@@ -3006,7 +3004,6 @@ packages:
globals: 11.12.0
transitivePeerDependencies:
- supports-color
dev: true
/@babel/types@7.17.0:
resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==}
@@ -3023,7 +3020,6 @@ packages:
'@babel/helper-string-parser': 7.23.4
'@babel/helper-validator-identifier': 7.22.20
to-fast-properties: 2.0.0
dev: true
/@base2/pretty-print-object@1.0.1:
resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==}
@@ -3067,6 +3063,13 @@ packages:
resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==}
dev: false
/@cspotcode/source-map-support@0.8.1:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
dependencies:
'@jridgewell/trace-mapping': 0.3.9
dev: true
/@docsearch/css@3.5.2:
resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==}
dev: false
@@ -3881,7 +3884,7 @@ packages:
slash: 3.0.0
dev: true
/@jest/core@29.7.0:
/@jest/core@29.7.0(ts-node@10.9.2):
resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
peerDependencies:
@@ -3902,7 +3905,7 @@ packages:
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
jest-config: 29.7.0(@types/node@20.10.4)
jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2)
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
@@ -4142,6 +4145,13 @@ packages:
'@jridgewell/resolve-uri': 3.1.1
'@jridgewell/sourcemap-codec': 1.4.15
/@jridgewell/trace-mapping@0.3.9:
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
dependencies:
'@jridgewell/resolve-uri': 3.1.1
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
/@json2csv/formatters@7.0.4:
resolution: {integrity: sha512-qdlLx0Pk/+BQnu6zreLgGrdLyUzLNVdsyCUU/+2aduHg4zemVo/e0iWjPk1sy/QZXXh+1RXBe+IiP9eDyj95qg==}
dev: false
@@ -4857,41 +4867,41 @@ packages:
engines: {node: '>=8.0.0'}
dev: true
/@opentelemetry/core@1.18.1(@opentelemetry/api@1.7.0):
resolution: {integrity: sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg==}
/@opentelemetry/core@1.19.0(@opentelemetry/api@1.7.0):
resolution: {integrity: sha512-w42AukJh3TP8R0IZZOVJVM/kMWu8g+lm4LzT70WtuKqhwq7KVhcDzZZuZinWZa6TtQCl7Smt2wolEYzpHabOgw==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.8.0'
dependencies:
'@opentelemetry/api': 1.7.0
'@opentelemetry/semantic-conventions': 1.18.1
'@opentelemetry/semantic-conventions': 1.19.0
dev: true
/@opentelemetry/resources@1.18.1(@opentelemetry/api@1.7.0):
resolution: {integrity: sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA==}
/@opentelemetry/resources@1.19.0(@opentelemetry/api@1.7.0):
resolution: {integrity: sha512-RgxvKuuMOf7nctOeOvpDjt2BpZvZGr9Y0vf7eGtY5XYZPkh2p7e2qub1S2IArdBMf9kEbz0SfycqCviOu9isqg==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.8.0'
dependencies:
'@opentelemetry/api': 1.7.0
'@opentelemetry/core': 1.18.1(@opentelemetry/api@1.7.0)
'@opentelemetry/semantic-conventions': 1.18.1
'@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0)
'@opentelemetry/semantic-conventions': 1.19.0
dev: true
/@opentelemetry/sdk-trace-base@1.18.1(@opentelemetry/api@1.7.0):
resolution: {integrity: sha512-tRHfDxN5dO+nop78EWJpzZwHsN1ewrZRVVwo03VJa3JQZxToRDH29/+MB24+yoa+IArerdr7INFJiX/iN4gjqg==}
/@opentelemetry/sdk-trace-base@1.19.0(@opentelemetry/api@1.7.0):
resolution: {integrity: sha512-+IRvUm+huJn2KqfFW3yW/cjvRwJ8Q7FzYHoUNx5Fr0Lws0LxjMJG1uVB8HDpLwm7mg5XXH2M5MF+0jj5cM8BpQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.8.0'
dependencies:
'@opentelemetry/api': 1.7.0
'@opentelemetry/core': 1.18.1(@opentelemetry/api@1.7.0)
'@opentelemetry/resources': 1.18.1(@opentelemetry/api@1.7.0)
'@opentelemetry/semantic-conventions': 1.18.1
'@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0)
'@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0)
'@opentelemetry/semantic-conventions': 1.19.0
dev: true
/@opentelemetry/semantic-conventions@1.18.1:
resolution: {integrity: sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA==}
/@opentelemetry/semantic-conventions@1.19.0:
resolution: {integrity: sha512-14jRpC8f5c0gPSwoZ7SbEJni1PqI+AhAE8m1bMz6v+RPM4OlP1PT2UHBJj5Qh/ALLPjhVU/aZUK3YyjTUqqQVg==}
engines: {node: '>=14'}
dev: true
@@ -5054,7 +5064,7 @@ packages:
resolution: {integrity: sha512-JtvdEy9GeGU/xeTYOq3SEN4DiAytHoQty/4pJTZ5vNoGMnu7XF1ToprOCPzyT5oSgm3oQQuwpXMVaebJegwA4Q==}
dependencies:
'@opentelemetry/api': 1.7.0
'@opentelemetry/sdk-trace-base': 1.18.1(@opentelemetry/api@1.7.0)
'@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0)
'@prisma/debug': 4.6.1
'@prisma/engines': 4.6.1
'@prisma/generator-helper': 4.6.1
@@ -6891,7 +6901,7 @@ packages:
'@sentry/vercel-edge': 7.87.0
'@sentry/webpack-plugin': 1.21.0(encoding@0.1.13)
chalk: 3.0.0
next: 14.0.4(react-dom@18.2.0)(react@18.2.0)
next: 14.0.4(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
resolve: 1.22.8
rollup: 2.78.0
@@ -8050,7 +8060,7 @@ packages:
defer-to-connect: 1.1.3
dev: false
/@t3-oss/env-core@0.7.1(zod@3.22.4):
/@t3-oss/env-core@0.7.1(typescript@5.3.3)(zod@3.22.4):
resolution: {integrity: sha512-3+SQt39OlmSaRLqYVFv8uRm1BpFepM5TIiMytRqO9cjH+wB77o6BIJdeyM5h5U4qLBMEzOJWCY4MBaU/rLwbYw==}
peerDependencies:
typescript: '>=4.7.2'
@@ -8059,10 +8069,11 @@ packages:
typescript:
optional: true
dependencies:
typescript: 5.3.3
zod: 3.22.4
dev: false
/@t3-oss/env-nextjs@0.7.1(zod@3.22.4):
/@t3-oss/env-nextjs@0.7.1(typescript@5.3.3)(zod@3.22.4):
resolution: {integrity: sha512-tQDbNLGCOvKGi+JoGuJ/CJInJI7/kLWJqtgGppAKS7ZFLdVOqZYR/uRjxlXOWPnxmUKF8VswOAsq7fXUpNZDhA==}
peerDependencies:
typescript: '>=4.7.2'
@@ -8071,7 +8082,8 @@ packages:
typescript:
optional: true
dependencies:
'@t3-oss/env-core': 0.7.1(zod@3.22.4)
'@t3-oss/env-core': 0.7.1(typescript@5.3.3)(zod@3.22.4)
typescript: 5.3.3
zod: 3.22.4
dev: false
@@ -8152,6 +8164,22 @@ packages:
path-browserify: 1.0.1
dev: true
/@tsconfig/node10@1.0.9:
resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
dev: true
/@tsconfig/node12@1.0.11:
resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
dev: true
/@tsconfig/node14@1.0.3:
resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
dev: true
/@tsconfig/node16@1.0.4:
resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
dev: true
/@types/acorn@4.0.6:
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
dependencies:
@@ -9303,6 +9331,10 @@ packages:
zip-stream: 4.1.1
dev: true
/arg@4.1.3:
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
dev: true
/arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
@@ -9794,6 +9826,13 @@ packages:
node-releases: 2.0.14
update-browserslist-db: 1.0.13(browserslist@4.22.2)
/bs-logger@0.2.6:
resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
engines: {node: '>= 6'}
dependencies:
fast-json-stable-stringify: 2.1.0
dev: true
/bser@2.1.1:
resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
dependencies:
@@ -10471,7 +10510,6 @@ packages:
/convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
dev: true
/cookie-signature@1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
@@ -10516,7 +10554,7 @@ packages:
capture-stack-trace: 1.0.2
dev: false
/create-jest@29.7.0:
/create-jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2):
resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
hasBin: true
@@ -10525,7 +10563,7 @@ packages:
chalk: 4.1.2
exit: 0.1.2
graceful-fs: 4.2.11
jest-config: 29.7.0(@types/node@20.10.4)
jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2)
jest-util: 29.7.0
prompts: 2.4.2
transitivePeerDependencies:
@@ -10535,6 +10573,10 @@ packages:
- ts-node
dev: true
/create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
dev: true
/cross-env@7.0.3:
resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
@@ -10885,6 +10927,11 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dev: true
/diff@4.0.2:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'}
dev: true
/diff@5.1.0:
resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
engines: {node: '>=0.3.1'}
@@ -12285,7 +12332,6 @@ packages:
/gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
dev: true
/get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
@@ -12502,7 +12548,6 @@ packages:
/globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
dev: true
/globals@13.24.0:
resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
@@ -13613,7 +13658,7 @@ packages:
- supports-color
dev: true
/jest-cli@29.7.0:
/jest-cli@29.7.0(@types/node@20.10.4)(ts-node@10.9.2):
resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
hasBin: true
@@ -13623,14 +13668,14 @@ packages:
node-notifier:
optional: true
dependencies:
'@jest/core': 29.7.0
'@jest/core': 29.7.0(ts-node@10.9.2)
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
chalk: 4.1.2
create-jest: 29.7.0
create-jest: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2)
exit: 0.1.2
import-local: 3.1.0
jest-config: 29.7.0(@types/node@20.10.4)
jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2)
jest-util: 29.7.0
jest-validate: 29.7.0
yargs: 17.7.2
@@ -13641,7 +13686,7 @@ packages:
- ts-node
dev: true
/jest-config@29.7.0(@types/node@20.10.4):
/jest-config@29.7.0(@types/node@20.10.4)(ts-node@10.9.2):
resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
peerDependencies:
@@ -13676,6 +13721,7 @@ packages:
pretty-format: 29.7.0
slash: 3.0.0
strip-json-comments: 3.1.1
ts-node: 10.9.2(@types/node@20.10.4)(typescript@5.3.3)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
@@ -13810,6 +13856,17 @@ packages:
stack-utils: 2.0.6
dev: true
/jest-mock-extended@3.0.5(jest@29.7.0)(typescript@5.3.3):
resolution: {integrity: sha512-/eHdaNPUAXe7f65gHH5urc8SbRVWjYxBqmCgax2uqOBJy8UUcCBMN1upj1eZ8y/i+IqpyEm4Kq0VKss/GCCTdw==}
peerDependencies:
jest: ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0
typescript: ^3.0.0 || ^4.0.0 || ^5.0.0
dependencies:
jest: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2)
ts-essentials: 7.0.3(typescript@5.3.3)
typescript: 5.3.3
dev: true
/jest-mock@27.5.1:
resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
@@ -14013,7 +14070,7 @@ packages:
supports-color: 8.1.1
dev: true
/jest@29.7.0:
/jest@29.7.0(@types/node@20.10.4)(ts-node@10.9.2):
resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
hasBin: true
@@ -14023,10 +14080,10 @@ packages:
node-notifier:
optional: true
dependencies:
'@jest/core': 29.7.0
'@jest/core': 29.7.0(ts-node@10.9.2)
'@jest/types': 29.6.3
import-local: 3.1.0
jest-cli: 29.7.0
jest-cli: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2)
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
@@ -14140,7 +14197,6 @@ packages:
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
engines: {node: '>=4'}
hasBin: true
dev: true
/json-bigint@1.0.0:
resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
@@ -14625,7 +14681,6 @@ packages:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
dependencies:
yallist: 3.1.1
dev: true
/lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
@@ -14679,6 +14734,10 @@ packages:
semver: 7.5.4
dev: true
/make-error@1.3.6:
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
dev: true
/make-event-props@1.6.2:
resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==}
dev: true
@@ -15652,7 +15711,7 @@ packages:
'@panva/hkdf': 1.1.1
cookie: 0.5.0
jose: 4.15.4
next: 14.0.4(react-dom@18.2.0)(react@18.2.0)
next: 14.0.4(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0)
nodemailer: 6.9.7
oauth: 0.9.15
openid-client: 5.6.1
@@ -15735,7 +15794,7 @@ packages:
postcss: 8.4.14
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
styled-jsx: 5.1.1(react@18.2.0)
styled-jsx: 5.1.1(@babel/core@7.23.6)(react@18.2.0)
watchpack: 2.4.0
zod: 3.21.4
optionalDependencies:
@@ -15753,7 +15812,7 @@ packages:
- babel-plugin-macros
dev: false
/next@14.0.4(react-dom@18.2.0)(react@18.2.0):
/next@14.0.4(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==}
engines: {node: '>=18.17.0'}
hasBin: true
@@ -15776,7 +15835,7 @@ packages:
postcss: 8.4.31
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
styled-jsx: 5.1.1(react@18.2.0)
styled-jsx: 5.1.1(@babel/core@7.23.6)(react@18.2.0)
watchpack: 2.4.0
optionalDependencies:
'@next/swc-darwin-arm64': 14.0.4
@@ -18604,7 +18663,7 @@ packages:
inline-style-parser: 0.1.1
dev: false
/styled-jsx@5.1.1(react@18.2.0):
/styled-jsx@5.1.1(@babel/core@7.23.6)(react@18.2.0):
resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
engines: {node: '>= 12.0.0'}
peerDependencies:
@@ -18617,6 +18676,7 @@ packages:
babel-plugin-macros:
optional: true
dependencies:
'@babel/core': 7.23.6
client-only: 0.0.1
react: 18.2.0
dev: false
@@ -18923,7 +18983,6 @@ packages:
/to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
dev: true
/to-readable-stream@1.0.0:
resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
@@ -19024,9 +19083,52 @@ packages:
resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==}
dev: false
/ts-essentials@7.0.3(typescript@5.3.3):
resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==}
peerDependencies:
typescript: '>=3.7.0'
dependencies:
typescript: 5.3.3
dev: true
/ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
/ts-jest@29.1.1(@babel/core@7.23.6)(babel-jest@29.7.0)(jest@29.7.0)(typescript@5.3.3):
resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
hasBin: true
peerDependencies:
'@babel/core': '>=7.0.0-beta.0 <8'
'@jest/types': ^29.0.0
babel-jest: ^29.0.0
esbuild: '*'
jest: ^29.0.0
typescript: '>=4.3 <6'
peerDependenciesMeta:
'@babel/core':
optional: true
'@jest/types':
optional: true
babel-jest:
optional: true
esbuild:
optional: true
dependencies:
'@babel/core': 7.23.6
babel-jest: 29.7.0(@babel/core@7.23.6)
bs-logger: 0.2.6
fast-json-stable-stringify: 2.1.0
jest: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2)
jest-util: 29.7.0
json5: 2.2.3
lodash.memoize: 4.1.2
make-error: 1.3.6
semver: 7.5.4
typescript: 5.3.3
yargs-parser: 21.1.1
dev: true
/ts-morph@13.0.3:
resolution: {integrity: sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==}
dependencies:
@@ -19034,6 +19136,37 @@ packages:
code-block-writer: 11.0.3
dev: true
/ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3):
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
hasBin: true
peerDependencies:
'@swc/core': '>=1.2.50'
'@swc/wasm': '>=1.2.50'
'@types/node': '*'
typescript: '>=2.7'
peerDependenciesMeta:
'@swc/core':
optional: true
'@swc/wasm':
optional: true
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.9
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
'@types/node': 20.10.4
acorn: 8.11.2
acorn-walk: 8.3.1
arg: 4.1.3
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
typescript: 5.3.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
dev: true
/ts-pattern@4.3.0:
resolution: {integrity: sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==}
dev: true
@@ -19315,7 +19448,6 @@ packages:
resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
engines: {node: '>=14.17'}
hasBin: true
dev: true
/ua-parser-js@1.0.37:
resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==}
@@ -19747,6 +19879,10 @@ packages:
sade: 1.8.1
dev: false
/v8-compile-cache-lib@3.0.1:
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
dev: true
/v8-to-istanbul@9.2.0:
resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==}
engines: {node: '>=10.12.0'}
@@ -20283,7 +20419,6 @@ packages:
/yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
dev: true
/yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
@@ -20365,6 +20500,11 @@ packages:
lib0: 0.2.88
dev: false
/yn@3.1.1:
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
engines: {node: '>=6'}
dev: true
/yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}