chore: Test performance (#5786)

This commit is contained in:
Tom Moor
2023-09-06 17:19:21 -04:00
committed by GitHub
parent 3eb947e9a5
commit ec0564eb32
69 changed files with 449 additions and 617 deletions

View File

@@ -82,7 +82,7 @@ jobs:
command: yarn test:shared command: yarn test:shared
test-server: test-server:
<<: *defaults <<: *defaults
parallelism: 4 parallelism: 3
steps: steps:
- checkout - checkout
- restore_cache: - restore_cache:
@@ -94,7 +94,7 @@ jobs:
name: test name: test
command: | command: |
TESTFILES=$(circleci tests glob "server/**/*.test.ts" | circleci tests split) TESTFILES=$(circleci tests glob "server/**/*.test.ts" | circleci tests split)
yarn test $TESTFILES --forceExit yarn test $TESTFILES
bundle-size: bundle-size:
<<: *defaults <<: *defaults
environment: environment:

View File

@@ -1,5 +1,6 @@
{ {
"workerIdleMemoryLimit": "0.75", "workerIdleMemoryLimit": "0.75",
"maxWorkers": "1",
"projects": [ "projects": [
{ {
"displayName": "server", "displayName": "server",
@@ -13,8 +14,9 @@
"<rootDir>/server/test/env.ts" "<rootDir>/server/test/env.ts"
], ],
"setupFilesAfterEnv": ["<rootDir>/server/test/setup.ts"], "setupFilesAfterEnv": ["<rootDir>/server/test/setup.ts"],
"testEnvironment": "node", "globalSetup": "<rootDir>/server/test/globalSetup.ts",
"runner": "@getoutline/jest-runner-serial" "globalTeardown": "<rootDir>/server/test/globalTeardown.ts",
"testEnvironment": "node"
}, },
{ {
"displayName": "app", "displayName": "app",

View File

@@ -231,7 +231,6 @@
"@babel/cli": "^7.21.5", "@babel/cli": "^7.21.5",
"@babel/preset-typescript": "^7.21.4", "@babel/preset-typescript": "^7.21.4",
"@faker-js/faker": "^8.0.2", "@faker-js/faker": "^8.0.2",
"@getoutline/jest-runner-serial": "^2.0.0",
"@relative-ci/agent": "^4.1.3", "@relative-ci/agent": "^4.1.3",
"@types/addressparser": "^1.0.1", "@types/addressparser": "^1.0.1",
"@types/body-scroll-lock": "^3.1.0", "@types/body-scroll-lock": "^3.1.0",
@@ -296,7 +295,7 @@
"@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0", "@typescript-eslint/parser": "^5.62.0",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"babel-jest": "^29.6.3", "babel-jest": "^29.6.4",
"babel-plugin-transform-inline-environment-variables": "^0.4.4", "babel-plugin-transform-inline-environment-variables": "^0.4.4",
"babel-plugin-transform-typescript-metadata": "^0.3.2", "babel-plugin-transform-typescript-metadata": "^0.3.2",
"babel-plugin-tsconfig-paths-module-resolver": "^1.0.4", "babel-plugin-tsconfig-paths-module-resolver": "^1.0.4",
@@ -318,8 +317,8 @@
"fetch-test-server": "^1.1.0", "fetch-test-server": "^1.1.0",
"husky": "^8.0.2", "husky": "^8.0.2",
"i18next-parser": "^7.9.0", "i18next-parser": "^7.9.0",
"jest-cli": "^29.6.1", "jest-cli": "^29.6.4",
"jest-environment-jsdom": "^29.5.0", "jest-environment-jsdom": "^29.6.4",
"jest-fetch-mock": "^3.0.3", "jest-fetch-mock": "^3.0.3",
"lint-staged": "^13.2.3", "lint-staged": "^13.2.3",
"nodemon": "^2.0.22", "nodemon": "^2.0.22",

View File

@@ -152,22 +152,15 @@ describe("#hooks.slack", () => {
}, },
}); });
return new Promise((resolve) => { const searchQuery = await SearchQuery.findAll({
// setTimeout is needed here because SearchQuery is saved asynchronously where: {
// in order to not slow down the response time. teamId: team.id,
setTimeout(async () => { query: "contains",
const searchQuery = await SearchQuery.findAll({ },
where: {
teamId: team.id,
query: "contains",
},
});
expect(searchQuery.length).toBe(1);
expect(searchQuery[0].results).toBe(0);
expect(searchQuery[0].source).toBe("slack");
resolve(undefined);
}, 250);
}); });
expect(searchQuery.length).toBe(1);
expect(searchQuery[0].results).toBe(0);
expect(searchQuery[0].source).toBe("slack");
}); });
it("should respond with help content for help keyword", async () => { it("should respond with help content for help keyword", async () => {

View File

@@ -335,14 +335,12 @@ router.post(
? await SearchHelper.searchForUser(user, text, options) ? await SearchHelper.searchForUser(user, text, options)
: await SearchHelper.searchForTeam(team, text, options); : await SearchHelper.searchForTeam(team, text, options);
void SearchQuery.create({ await SearchQuery.create({
userId: user ? user.id : null, userId: user ? user.id : null,
teamId: team.id, teamId: team.id,
source: "slack", source: "slack",
query: text, query: text,
results: totalCount, results: totalCount,
}).catch((err) => {
Logger.error("Failed to create search query", err);
}); });
const haventSignedIn = t( const haventSignedIn = t(

View File

@@ -1,5 +1,4 @@
import { buildUser, buildWebhookSubscription } from "@server/test/factories"; import { buildUser, buildWebhookSubscription } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import { UserEvent } from "@server/types"; import { UserEvent } from "@server/types";
import DeliverWebhookTask from "../tasks/DeliverWebhookTask"; import DeliverWebhookTask from "../tasks/DeliverWebhookTask";
import WebhookProcessor from "./WebhookProcessor"; import WebhookProcessor from "./WebhookProcessor";
@@ -7,8 +6,6 @@ import WebhookProcessor from "./WebhookProcessor";
jest.mock("../tasks/DeliverWebhookTask"); jest.mock("../tasks/DeliverWebhookTask");
const ip = "127.0.0.1"; const ip = "127.0.0.1";
setupTestDatabase();
beforeEach(async () => { beforeEach(async () => {
jest.resetAllMocks(); jest.resetAllMocks();
}); });

View File

@@ -1,11 +1,8 @@
import { subDays } from "date-fns"; import { subDays } from "date-fns";
import { WebhookDelivery } from "@server/models"; import { WebhookDelivery } from "@server/models";
import { buildWebhookDelivery } from "@server/test/factories"; import { buildWebhookDelivery } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import CleanupWebhookDeliveriesTask from "./CleanupWebhookDeliveriesTask"; import CleanupWebhookDeliveriesTask from "./CleanupWebhookDeliveriesTask";
setupTestDatabase();
const deliveryExists = async (delivery: WebhookDelivery) => { const deliveryExists = async (delivery: WebhookDelivery) => {
const results = await WebhookDelivery.findOne({ where: { id: delivery.id } }); const results = await WebhookDelivery.findOne({ where: { id: delivery.id } });
return !!results; return !!results;

View File

@@ -6,12 +6,9 @@ import {
buildWebhookDelivery, buildWebhookDelivery,
buildWebhookSubscription, buildWebhookSubscription,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import { UserEvent } from "@server/types"; import { UserEvent } from "@server/types";
import DeliverWebhookTask from "./DeliverWebhookTask"; import DeliverWebhookTask from "./DeliverWebhookTask";
setupTestDatabase();
beforeEach(async () => { beforeEach(async () => {
jest.resetAllMocks(); jest.resetAllMocks();
fetchMock.resetMocks(); fetchMock.resetMocks();

View File

@@ -5,15 +5,9 @@ import { TeamDomain } from "@server/models";
import Collection from "@server/models/Collection"; import Collection from "@server/models/Collection";
import UserAuthentication from "@server/models/UserAuthentication"; import UserAuthentication from "@server/models/UserAuthentication";
import { buildUser, buildTeam, buildAdmin } from "@server/test/factories"; import { buildUser, buildTeam, buildAdmin } from "@server/test/factories";
import { import { setCloudHosted, setSelfHosted } from "@server/test/support";
setupTestDatabase,
setCloudHosted,
setSelfHosted,
} from "@server/test/support";
import accountProvisioner from "./accountProvisioner"; import accountProvisioner from "./accountProvisioner";
setupTestDatabase();
describe("accountProvisioner", () => { describe("accountProvisioner", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";
@@ -371,7 +365,7 @@ describe("accountProvisioner", () => {
}, },
authenticationProvider: { authenticationProvider: {
name: "google", name: "google",
providerId: "example-company.com", providerId: faker.internet.domainName(),
}, },
authentication: { authentication: {
providerId: uuidv4(), providerId: uuidv4(),
@@ -390,6 +384,7 @@ describe("accountProvisioner", () => {
it("should always use existing team if self-hosted", async () => { it("should always use existing team if self-hosted", async () => {
const team = await buildTeam(); const team = await buildTeam();
const domain = faker.internet.domainName();
const { user, isNewUser } = await accountProvisioner({ const { user, isNewUser } = await accountProvisioner({
ip, ip,
user: { user: {
@@ -402,11 +397,11 @@ describe("accountProvisioner", () => {
name: team.name, name: team.name,
avatarUrl: team.avatarUrl, avatarUrl: team.avatarUrl,
subdomain: faker.internet.domainWord(), subdomain: faker.internet.domainWord(),
domain: "allowed-domain.com", domain,
}, },
authenticationProvider: { authenticationProvider: {
name: "google", name: "google",
providerId: "allowed-domain.com", providerId: domain,
}, },
authentication: { authentication: {
providerId: uuidv4(), providerId: uuidv4(),

View File

@@ -1,9 +1,7 @@
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import commentCreator from "./commentCreator"; import commentCreator from "./commentCreator";
setupTestDatabase();
describe("commentCreator", () => { describe("commentCreator", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,10 +1,8 @@
import { Comment } from "@server/models"; import { Comment } from "@server/models";
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import commentDestroyer from "./commentDestroyer"; import commentDestroyer from "./commentDestroyer";
setupTestDatabase();
describe("commentDestroyer", () => { describe("commentDestroyer", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -2,13 +2,10 @@ import path from "path";
import fs from "fs-extra"; import fs from "fs-extra";
import Attachment from "@server/models/Attachment"; import Attachment from "@server/models/Attachment";
import { buildUser } from "@server/test/factories"; import { buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import documentImporter from "./documentImporter"; import documentImporter from "./documentImporter";
jest.mock("@server/storage/files"); jest.mock("@server/storage/files");
setupTestDatabase();
describe("documentImporter", () => { describe("documentImporter", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -6,11 +6,8 @@ import {
buildTeam, buildTeam,
buildUser, buildUser,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import documentMover from "./documentMover"; import documentMover from "./documentMover";
setupTestDatabase();
describe("documentMover", () => { describe("documentMover", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -2,13 +2,10 @@ import { subDays } from "date-fns";
import { Attachment, Document } from "@server/models"; import { Attachment, Document } from "@server/models";
import DeleteAttachmentTask from "@server/queues/tasks/DeleteAttachmentTask"; import DeleteAttachmentTask from "@server/queues/tasks/DeleteAttachmentTask";
import { buildAttachment, buildDocument } from "@server/test/factories"; import { buildAttachment, buildDocument } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import documentPermanentDeleter from "./documentPermanentDeleter"; import documentPermanentDeleter from "./documentPermanentDeleter";
jest.mock("@server/queues/tasks/DeleteAttachmentTask"); jest.mock("@server/queues/tasks/DeleteAttachmentTask");
setupTestDatabase();
describe("documentPermanentDeleter", () => { describe("documentPermanentDeleter", () => {
it("should destroy documents", async () => { it("should destroy documents", async () => {
const document = await buildDocument({ const document = await buildDocument({

View File

@@ -1,10 +1,8 @@
import { sequelize } from "@server/storage/database"; import { sequelize } from "@server/storage/database";
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import documentUpdater from "./documentUpdater"; import documentUpdater from "./documentUpdater";
setupTestDatabase();
describe("documentUpdater", () => { describe("documentUpdater", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,10 +1,7 @@
import { FileOperation } from "@server/models"; import { FileOperation } from "@server/models";
import { buildAdmin, buildFileOperation } from "@server/test/factories"; import { buildAdmin, buildFileOperation } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import fileOperationDeleter from "./fileOperationDeleter"; import fileOperationDeleter from "./fileOperationDeleter";
setupTestDatabase();
describe("fileOperationDeleter", () => { describe("fileOperationDeleter", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -6,11 +6,9 @@ import {
buildDocument, buildDocument,
buildCollection, buildCollection,
} from "@server/test/factories"; } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import notificationUpdater from "./notificationUpdater"; import notificationUpdater from "./notificationUpdater";
setupTestDatabase();
describe("notificationUpdater", () => { describe("notificationUpdater", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";
@@ -48,7 +46,7 @@ describe("notificationUpdater", () => {
transaction, transaction,
}) })
); );
const event = await findLatestEvent({}); const event = await findLatestEvent();
expect(notification.viewedAt).not.toBe(null); expect(notification.viewedAt).not.toBe(null);
expect(notification.archivedAt).toBe(null); expect(notification.archivedAt).toBe(null);

View File

@@ -1,9 +1,7 @@
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import pinCreator from "./pinCreator"; import pinCreator from "./pinCreator";
setupTestDatabase();
describe("pinCreator", () => { describe("pinCreator", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,10 +1,8 @@
import { Pin } from "@server/models"; import { Pin } from "@server/models";
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import pinDestroyer from "./pinDestroyer"; import pinDestroyer from "./pinDestroyer";
setupTestDatabase();
describe("pinCreator", () => { describe("pinCreator", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,9 +1,7 @@
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import revisionCreator from "./revisionCreator"; import revisionCreator from "./revisionCreator";
setupTestDatabase();
describe("revisionCreator", () => { describe("revisionCreator", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";
@@ -18,7 +16,9 @@ describe("revisionCreator", () => {
user, user,
ip, ip,
}); });
const event = await findLatestEvent(); const event = await findLatestEvent({
teamId: user.teamId,
});
expect(revision.documentId).toEqual(document.id); expect(revision.documentId).toEqual(document.id);
expect(revision.userId).toEqual(user.id); expect(revision.userId).toEqual(user.id);
expect(revision.createdAt).toEqual(document.updatedAt); expect(revision.createdAt).toEqual(document.updatedAt);

View File

@@ -1,11 +1,9 @@
import { Star, Event } from "@server/models"; import { Star, Event } from "@server/models";
import { sequelize } from "@server/storage/database"; import { sequelize } from "@server/storage/database";
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import starCreator from "./starCreator"; import starCreator from "./starCreator";
setupTestDatabase();
describe("starCreator", () => { describe("starCreator", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,10 +1,8 @@
import { Star } from "@server/models"; import { Star } from "@server/models";
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import starDestroyer from "./starDestroyer"; import starDestroyer from "./starDestroyer";
setupTestDatabase();
describe("starDestroyer", () => { describe("starDestroyer", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,10 +1,8 @@
import { Star } from "@server/models"; import { Star } from "@server/models";
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { findLatestEvent, setupTestDatabase } from "@server/test/support"; import { findLatestEvent } from "@server/test/support";
import starUpdater from "./starUpdater"; import starUpdater from "./starUpdater";
setupTestDatabase();
describe("starUpdater", () => { describe("starUpdater", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,12 +1,9 @@
import { Subscription, Event } from "@server/models"; import { Subscription, Event } from "@server/models";
import { sequelize } from "@server/storage/database"; import { sequelize } from "@server/storage/database";
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import subscriptionCreator from "./subscriptionCreator"; import subscriptionCreator from "./subscriptionCreator";
import subscriptionDestroyer from "./subscriptionDestroyer"; import subscriptionDestroyer from "./subscriptionDestroyer";
setupTestDatabase();
describe("subscriptionCreator", () => { describe("subscriptionCreator", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";
const subscribedEvent = "documents.update"; const subscribedEvent = "documents.update";

View File

@@ -5,11 +5,8 @@ import {
buildSubscription, buildSubscription,
buildUser, buildUser,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import subscriptionDestroyer from "./subscriptionDestroyer"; import subscriptionDestroyer from "./subscriptionDestroyer";
setupTestDatabase();
describe("subscriptionDestroyer", () => { describe("subscriptionDestroyer", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -6,11 +6,8 @@ import {
buildTeam, buildTeam,
buildDocument, buildDocument,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import teamPermanentDeleter from "./teamPermanentDeleter"; import teamPermanentDeleter from "./teamPermanentDeleter";
setupTestDatabase();
describe("teamPermanentDeleter", () => { describe("teamPermanentDeleter", () => {
it("should destroy related data", async () => { it("should destroy related data", async () => {
const team = await buildTeam({ const team = await buildTeam({

View File

@@ -1,15 +1,9 @@
import { faker } from "@faker-js/faker"; import { faker } from "@faker-js/faker";
import TeamDomain from "@server/models/TeamDomain"; import TeamDomain from "@server/models/TeamDomain";
import { buildTeam, buildUser } from "@server/test/factories"; import { buildTeam, buildUser } from "@server/test/factories";
import { import { setCloudHosted, setSelfHosted } from "@server/test/support";
setCloudHosted,
setSelfHosted,
setupTestDatabase,
} from "@server/test/support";
import teamProvisioner from "./teamProvisioner"; import teamProvisioner from "./teamProvisioner";
setupTestDatabase();
describe("teamProvisioner", () => { describe("teamProvisioner", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";
@@ -104,12 +98,14 @@ describe("teamProvisioner", () => {
}); });
it("should error on mismatched team and authentication provider", async () => { it("should error on mismatched team and authentication provider", async () => {
const subdomain = faker.internet.domainWord();
const exampleTeam = await buildTeam({ const exampleTeam = await buildTeam({
subdomain: faker.internet.domainWord(), subdomain,
authenticationProviders: [ authenticationProviders: [
{ {
name: "google", name: "google",
providerId: "teamProvisioner3.com", providerId: `${subdomain}.com`,
}, },
], ],
}); });
@@ -215,9 +211,11 @@ describe("teamProvisioner", () => {
const user = await buildUser({ const user = await buildUser({
teamId: existing.id, teamId: existing.id,
}); });
const allowedDomain = faker.internet.domainName();
const otherDomain = faker.internet.domainName();
await TeamDomain.create({ await TeamDomain.create({
teamId: existing.id, teamId: existing.id,
name: "allowed-domain.com", name: allowedDomain,
createdById: user.id, createdById: user.id,
}); });
@@ -226,11 +224,11 @@ describe("teamProvisioner", () => {
await teamProvisioner({ await teamProvisioner({
name: "Updated name", name: "Updated name",
subdomain: faker.internet.domainWord(), subdomain: faker.internet.domainWord(),
domain: "other-domain.com", domain: otherDomain,
teamId: existing.id, teamId: existing.id,
authenticationProvider: { authenticationProvider: {
name: "google", name: "google",
providerId: "other-domain.com", providerId: otherDomain,
}, },
ip, ip,
}); });

View File

@@ -1,11 +1,8 @@
import { CollectionPermission, UserRole } from "@shared/types"; import { CollectionPermission, UserRole } from "@shared/types";
import { CollectionUser } from "@server/models"; import { CollectionUser } from "@server/models";
import { buildUser, buildAdmin, buildCollection } from "@server/test/factories"; import { buildUser, buildAdmin, buildCollection } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import userDemoter from "./userDemoter"; import userDemoter from "./userDemoter";
setupTestDatabase();
describe("userDemoter", () => { describe("userDemoter", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,9 +1,6 @@
import { buildUser, buildAdmin } from "@server/test/factories"; import { buildUser, buildAdmin } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import userDestroyer from "./userDestroyer"; import userDestroyer from "./userDestroyer";
setupTestDatabase();
describe("userDestroyer", () => { describe("userDestroyer", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,11 +1,8 @@
import { faker } from "@faker-js/faker"; import { faker } from "@faker-js/faker";
import { UserRole } from "@shared/types"; import { UserRole } from "@shared/types";
import { buildUser } from "@server/test/factories"; import { buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import userInviter from "./userInviter"; import userInviter from "./userInviter";
setupTestDatabase();
describe("userInviter", () => { describe("userInviter", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,3 +1,4 @@
import { faker } from "@faker-js/faker";
import { v4 as uuidv4 } from "uuid"; import { v4 as uuidv4 } from "uuid";
import { TeamDomain } from "@server/models"; import { TeamDomain } from "@server/models";
import { import {
@@ -6,11 +7,8 @@ import {
buildInvite, buildInvite,
buildAdmin, buildAdmin,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import userProvisioner from "./userProvisioner"; import userProvisioner from "./userProvisioner";
setupTestDatabase();
describe("userProvisioner", () => { describe("userProvisioner", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";
@@ -338,17 +336,19 @@ describe("userProvisioner", () => {
it("should create a user from allowed domain", async () => { it("should create a user from allowed domain", async () => {
const team = await buildTeam(); const team = await buildTeam();
const admin = await buildAdmin({ teamId: team.id }); const admin = await buildAdmin({ teamId: team.id });
const domain = faker.internet.domainName();
await TeamDomain.create({ await TeamDomain.create({
teamId: team.id, teamId: team.id,
name: "example-company.com", name: domain,
createdById: admin.id, createdById: admin.id,
}); });
const authenticationProviders = await team.$get("authenticationProviders"); const authenticationProviders = await team.$get("authenticationProviders");
const authenticationProvider = authenticationProviders[0]; const authenticationProvider = authenticationProviders[0];
const email = faker.internet.email({ provider: domain });
const result = await userProvisioner({ const result = await userProvisioner({
name: "Test Name", name: faker.person.fullName(),
email: "user@example-company.com", email,
teamId: team.id, teamId: team.id,
ip, ip,
authentication: { authentication: {
@@ -363,28 +363,31 @@ describe("userProvisioner", () => {
expect(authentication?.accessToken).toEqual("123"); expect(authentication?.accessToken).toEqual("123");
expect(authentication?.scopes.length).toEqual(1); expect(authentication?.scopes.length).toEqual(1);
expect(authentication?.scopes[0]).toEqual("read"); expect(authentication?.scopes[0]).toEqual("read");
expect(user.email).toEqual("user@example-company.com"); expect(user.email).toEqual(email);
expect(isNewUser).toEqual(true); expect(isNewUser).toEqual(true);
}); });
it("should create a user from allowed domain with emailMatchOnly", async () => { it("should create a user from allowed domain with emailMatchOnly", async () => {
const team = await buildTeam(); const team = await buildTeam();
const admin = await buildAdmin({ teamId: team.id }); const admin = await buildAdmin({ teamId: team.id });
const domain = faker.internet.domainName();
const email = faker.internet.email({ provider: domain });
await TeamDomain.create({ await TeamDomain.create({
teamId: team.id, teamId: team.id,
name: "example-company.com", name: domain,
createdById: admin.id, createdById: admin.id,
}); });
const result = await userProvisioner({ const result = await userProvisioner({
name: "Test Name", name: "Test Name",
email: "user@example-company.com", email,
teamId: team.id, teamId: team.id,
ip, ip,
}); });
const { user, authentication, isNewUser } = result; const { user, authentication, isNewUser } = result;
expect(authentication).toBeUndefined(); expect(authentication).toBeUndefined();
expect(user.email).toEqual("user@example-company.com"); expect(user.email).toEqual(email);
expect(isNewUser).toEqual(true); expect(isNewUser).toEqual(true);
}); });
@@ -395,7 +398,7 @@ describe("userProvisioner", () => {
try { try {
await userProvisioner({ await userProvisioner({
name: "Test Name", name: "Test Name",
email: "user@example-company.com", email: faker.internet.email(),
teamId: team.id, teamId: team.id,
ip, ip,
}); });
@@ -411,7 +414,7 @@ describe("userProvisioner", () => {
const admin = await buildAdmin({ teamId: team.id }); const admin = await buildAdmin({ teamId: team.id });
await TeamDomain.create({ await TeamDomain.create({
teamId: team.id, teamId: team.id,
name: "other.com", name: faker.internet.domainName(),
createdById: admin.id, createdById: admin.id,
}); });
@@ -422,7 +425,7 @@ describe("userProvisioner", () => {
try { try {
await userProvisioner({ await userProvisioner({
name: "Bad Domain User", name: "Bad Domain User",
email: "user@example.com", email: faker.internet.domainName(),
teamId: team.id, teamId: team.id,
ip, ip,
authentication: { authentication: {

View File

@@ -1,10 +1,7 @@
import GroupUser from "@server/models/GroupUser"; import GroupUser from "@server/models/GroupUser";
import { buildGroup, buildAdmin, buildUser } from "@server/test/factories"; import { buildGroup, buildAdmin, buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import userSuspender from "./userSuspender"; import userSuspender from "./userSuspender";
setupTestDatabase();
describe("userSuspender", () => { describe("userSuspender", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -1,9 +1,6 @@
import { buildAdmin, buildUser } from "@server/test/factories"; import { buildAdmin, buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import userUnsuspender from "./userUnsuspender"; import userUnsuspender from "./userUnsuspender";
setupTestDatabase();
describe("userUnsuspender", () => { describe("userUnsuspender", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";

View File

@@ -2,11 +2,8 @@ import { DefaultState } from "koa";
import randomstring from "randomstring"; import randomstring from "randomstring";
import ApiKey from "@server/models/ApiKey"; import ApiKey from "@server/models/ApiKey";
import { buildUser, buildTeam } from "@server/test/factories"; import { buildUser, buildTeam } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import auth from "./authentication"; import auth from "./authentication";
setupTestDatabase();
describe("Authentication middleware", () => { describe("Authentication middleware", () => {
describe("with JWT", () => { describe("with JWT", () => {
it("should authenticate with correct token", async () => { it("should authenticate with correct token", async () => {

View File

@@ -7,13 +7,10 @@ import {
buildTeam, buildTeam,
buildDocument, buildDocument,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import slugify from "@server/utils/slugify"; import slugify from "@server/utils/slugify";
import Collection from "./Collection"; import Collection from "./Collection";
import Document from "./Document"; import Document from "./Document";
setupTestDatabase();
beforeEach(() => { beforeEach(() => {
jest.resetAllMocks(); jest.resetAllMocks();
}); });

View File

@@ -6,11 +6,8 @@ import {
buildTeam, buildTeam,
buildUser, buildUser,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import slugify from "@server/utils/slugify"; import slugify from "@server/utils/slugify";
setupTestDatabase();
beforeEach(() => { beforeEach(() => {
jest.resetAllMocks(); jest.resetAllMocks();
}); });

View File

@@ -1,9 +1,6 @@
import { buildDocument } from "@server/test/factories"; import { buildDocument } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import Revision from "./Revision"; import Revision from "./Revision";
setupTestDatabase();
describe("#findLatest", () => { describe("#findLatest", () => {
test("should return latest revision", async () => { test("should return latest revision", async () => {
const document = await buildDocument({ const document = await buildDocument({

View File

@@ -1,7 +1,4 @@
import { buildTeam, buildCollection } from "@server/test/factories"; import { buildTeam, buildCollection } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
setupTestDatabase();
describe("collectionIds", () => { describe("collectionIds", () => {
it("should return non-private collection ids", async () => { it("should return non-private collection ids", async () => {

View File

@@ -1,9 +1,7 @@
import { buildAdmin, buildTeam } from "@server/test/factories"; import { buildAdmin, buildTeam } from "@server/test/factories";
import { setCloudHosted, setupTestDatabase } from "@server/test/support"; import { setCloudHosted } from "@server/test/support";
import TeamDomain from "./TeamDomain"; import TeamDomain from "./TeamDomain";
setupTestDatabase();
describe("team domain model", () => { describe("team domain model", () => {
beforeEach(setCloudHosted); beforeEach(setCloudHosted);

View File

@@ -1,11 +1,8 @@
import { CollectionPermission } from "@shared/types"; import { CollectionPermission } from "@shared/types";
import { buildUser, buildTeam, buildCollection } from "@server/test/factories"; import { buildUser, buildTeam, buildCollection } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import CollectionUser from "./CollectionUser"; import CollectionUser from "./CollectionUser";
import UserAuthentication from "./UserAuthentication"; import UserAuthentication from "./UserAuthentication";
setupTestDatabase();
beforeAll(() => { beforeAll(() => {
jest.useFakeTimers().setSystemTime(new Date("2018-01-02T00:00:00.000Z")); jest.useFakeTimers().setSystemTime(new Date("2018-01-02T00:00:00.000Z"));
}); });

View File

@@ -7,9 +7,6 @@ import {
buildUser, buildUser,
buildShare, buildShare,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
setupTestDatabase();
beforeEach(() => { beforeEach(() => {
jest.resetAllMocks(); jest.resetAllMocks();

View File

@@ -6,11 +6,8 @@ import {
buildCollection, buildCollection,
buildAdmin, buildAdmin,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import { serialize } from "./index"; import { serialize } from "./index";
setupTestDatabase();
describe("admin", () => { describe("admin", () => {
it("should allow updating collection but not reading documents", async () => { it("should allow updating collection but not reading documents", async () => {
const team = await buildTeam(); const team = await buildTeam();

View File

@@ -6,11 +6,8 @@ import {
buildDraftDocument, buildDraftDocument,
buildCollection, buildCollection,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import { serialize } from "./index"; import { serialize } from "./index";
setupTestDatabase();
describe("read_write collection", () => { describe("read_write collection", () => {
it("should allow read write permissions for member", async () => { it("should allow read write permissions for member", async () => {
const team = await buildTeam(); const team = await buildTeam();

View File

@@ -1,9 +1,6 @@
import { buildUser, buildTeam } from "@server/test/factories"; import { buildUser, buildTeam } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import { serialize } from "./index"; import { serialize } from "./index";
setupTestDatabase();
it("should serialize policy", async () => { it("should serialize policy", async () => {
const user = await buildUser(); const user = await buildUser();
const response = serialize(user, user); const response = serialize(user, user);

View File

@@ -1,13 +1,7 @@
import { buildUser, buildTeam, buildAdmin } from "@server/test/factories"; import { buildUser, buildTeam, buildAdmin } from "@server/test/factories";
import { import { setCloudHosted, setSelfHosted } from "@server/test/support";
setCloudHosted,
setSelfHosted,
setupTestDatabase,
} from "@server/test/support";
import { serialize } from "./index"; import { serialize } from "./index";
setupTestDatabase();
it("should allow reading only", async () => { it("should allow reading only", async () => {
await setSelfHosted(); await setSelfHosted();

View File

@@ -1,12 +1,9 @@
import { Backlink } from "@server/models"; import { Backlink } from "@server/models";
import { buildDocument } from "@server/test/factories"; import { buildDocument } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import BacklinksProcessor from "./BacklinksProcessor"; import BacklinksProcessor from "./BacklinksProcessor";
const ip = "127.0.0.1"; const ip = "127.0.0.1";
setupTestDatabase();
describe("documents.publish", () => { describe("documents.publish", () => {
test("should create new backlink records", async () => { test("should create new backlink records", async () => {
const otherDocument = await buildDocument(); const otherDocument = await buildDocument();

View File

@@ -1,12 +1,9 @@
import { Revision } from "@server/models"; import { Revision } from "@server/models";
import { buildDocument } from "@server/test/factories"; import { buildDocument } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import RevisionsProcessor from "./RevisionsProcessor"; import RevisionsProcessor from "./RevisionsProcessor";
const ip = "127.0.0.1"; const ip = "127.0.0.1";
setupTestDatabase();
describe("documents.update.debounced", () => { describe("documents.update.debounced", () => {
test("should create a revision", async () => { test("should create a revision", async () => {
const document = await buildDocument(); const document = await buildDocument();

View File

@@ -1,10 +1,12 @@
import path from "path"; import path from "path";
import { glob } from "glob"; import { glob } from "glob";
import env from "@server/env";
import Logger from "@server/logging/Logger"; import Logger from "@server/logging/Logger";
import { requireDirectory } from "@server/utils/fs"; import { requireDirectory } from "@server/utils/fs";
import BaseProcessor from "./BaseProcessor"; import BaseProcessor from "./BaseProcessor";
const processors = {}; const processors = {};
const rootDir = env.ENVIRONMENT === "test" ? "" : "build";
requireDirectory<{ default: BaseProcessor }>(__dirname).forEach( requireDirectory<{ default: BaseProcessor }>(__dirname).forEach(
([module, id]) => { ([module, id]) => {
@@ -16,7 +18,7 @@ requireDirectory<{ default: BaseProcessor }>(__dirname).forEach(
); );
glob glob
.sync("build/plugins/*/server/processors/!(*.test).js") .sync(path.join(rootDir, "plugins/*/server/processors/!(*.test).[jt]s"))
.forEach((filePath: string) => { .forEach((filePath: string) => {
// eslint-disable-next-line @typescript-eslint/no-var-requires // eslint-disable-next-line @typescript-eslint/no-var-requires
const processor = require(path.join(process.cwd(), filePath)).default; const processor = require(path.join(process.cwd(), filePath)).default;

View File

@@ -1,11 +1,8 @@
import { subDays } from "date-fns"; import { subDays } from "date-fns";
import { Document } from "@server/models"; import { Document } from "@server/models";
import { buildDocument, buildTeam } from "@server/test/factories"; import { buildDocument, buildTeam } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import CleanupDeletedDocumentsTask from "./CleanupDeletedDocumentsTask"; import CleanupDeletedDocumentsTask from "./CleanupDeletedDocumentsTask";
setupTestDatabase();
describe("CleanupDeletedDocumentsTask", () => { describe("CleanupDeletedDocumentsTask", () => {
it("should not destroy documents not deleted", async () => { it("should not destroy documents not deleted", async () => {
const team = await buildTeam(); const team = await buildTeam();

View File

@@ -6,11 +6,8 @@ import {
buildWebhookSubscription, buildWebhookSubscription,
buildViewer, buildViewer,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import CleanupDemotedUserTask from "./CleanupDemotedUserTask"; import CleanupDemotedUserTask from "./CleanupDemotedUserTask";
setupTestDatabase();
describe("CleanupDemotedUserTask", () => { describe("CleanupDemotedUserTask", () => {
it("should delete api keys for suspended user", async () => { it("should delete api keys for suspended user", async () => {
const admin = await buildAdmin(); const admin = await buildAdmin();

View File

@@ -2,11 +2,8 @@ import { subDays } from "date-fns";
import { FileOperationState, FileOperationType } from "@shared/types"; import { FileOperationState, FileOperationType } from "@shared/types";
import { FileOperation } from "@server/models"; import { FileOperation } from "@server/models";
import { buildFileOperation, buildTeam } from "@server/test/factories"; import { buildFileOperation, buildTeam } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import CleanupExpiredFileOperationsTask from "./CleanupExpiredFileOperationsTask"; import CleanupExpiredFileOperationsTask from "./CleanupExpiredFileOperationsTask";
setupTestDatabase();
describe("CleanupExpiredFileOperationsTask", () => { describe("CleanupExpiredFileOperationsTask", () => {
it("should expire exports older than 15 days ago", async () => { it("should expire exports older than 15 days ago", async () => {
const team = await buildTeam(); const team = await buildTeam();

View File

@@ -1,10 +1,7 @@
import { Document } from "@server/models"; import { Document } from "@server/models";
import { buildCollection, buildDocument } from "@server/test/factories"; import { buildCollection, buildDocument } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import DetachDraftsFromCollectionTask from "./DetachDraftsFromCollectionTask"; import DetachDraftsFromCollectionTask from "./DetachDraftsFromCollectionTask";
setupTestDatabase();
describe("DetachDraftsFromCollectionTask", () => { describe("DetachDraftsFromCollectionTask", () => {
const ip = "127.0.0.1"; const ip = "127.0.0.1";
it("should detach drafts from deleted collection", async () => { it("should detach drafts from deleted collection", async () => {

View File

@@ -5,13 +5,10 @@ import {
buildCollection, buildCollection,
buildUser, buildUser,
} from "@server/test/factories"; } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import DocumentPublishedNotificationsTask from "./DocumentPublishedNotificationsTask"; import DocumentPublishedNotificationsTask from "./DocumentPublishedNotificationsTask";
const ip = "127.0.0.1"; const ip = "127.0.0.1";
setupTestDatabase();
beforeEach(async () => { beforeEach(async () => {
jest.resetAllMocks(); jest.resetAllMocks();
}); });

View File

@@ -2,11 +2,8 @@ import { subDays } from "date-fns";
import { FileOperationState, FileOperationType } from "@shared/types"; import { FileOperationState, FileOperationType } from "@shared/types";
import { FileOperation } from "@server/models"; import { FileOperation } from "@server/models";
import { buildFileOperation, buildTeam } from "@server/test/factories"; import { buildFileOperation, buildTeam } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import ErrorTimedOutFileOperationsTask from "./ErrorTimedOutFileOperationsTask"; import ErrorTimedOutFileOperationsTask from "./ErrorTimedOutFileOperationsTask";
setupTestDatabase();
describe("ErrorTimedOutFileOperationsTask", () => { describe("ErrorTimedOutFileOperationsTask", () => {
it("should error exports older than 12 hours", async () => { it("should error exports older than 12 hours", async () => {
const team = await buildTeam(); const team = await buildTeam();

View File

@@ -2,11 +2,8 @@ import fs from "fs";
import path from "path"; import path from "path";
import { FileOperation } from "@server/models"; import { FileOperation } from "@server/models";
import { buildFileOperation } from "@server/test/factories"; import { buildFileOperation } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import ImportMarkdownZipTask from "./ImportMarkdownZipTask"; import ImportMarkdownZipTask from "./ImportMarkdownZipTask";
setupTestDatabase();
describe("ImportMarkdownZipTask", () => { describe("ImportMarkdownZipTask", () => {
it("should import the documents, attachments", async () => { it("should import the documents, attachments", async () => {
const fileOperation = await buildFileOperation(); const fileOperation = await buildFileOperation();

View File

@@ -2,11 +2,8 @@ import fs from "fs";
import path from "path"; import path from "path";
import { FileOperation } from "@server/models"; import { FileOperation } from "@server/models";
import { buildFileOperation } from "@server/test/factories"; import { buildFileOperation } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import ImportNotionTask from "./ImportNotionTask"; import ImportNotionTask from "./ImportNotionTask";
setupTestDatabase();
describe("ImportNotionTask", () => { describe("ImportNotionTask", () => {
it("should import successfully from a Markdown export", async () => { it("should import successfully from a Markdown export", async () => {
const fileOperation = await buildFileOperation(); const fileOperation = await buildFileOperation();

View File

@@ -1,11 +1,8 @@
import { subDays } from "date-fns"; import { subDays } from "date-fns";
import InviteReminderEmail from "@server/emails/templates/InviteReminderEmail"; import InviteReminderEmail from "@server/emails/templates/InviteReminderEmail";
import { buildInvite } from "@server/test/factories"; import { buildInvite } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import InviteReminderTask from "./InviteReminderTask"; import InviteReminderTask from "./InviteReminderTask";
setupTestDatabase();
describe("InviteReminderTask", () => { describe("InviteReminderTask", () => {
it("should not destroy documents not deleted", async () => { it("should not destroy documents not deleted", async () => {
const spy = jest.spyOn(InviteReminderEmail.prototype, "schedule"); const spy = jest.spyOn(InviteReminderEmail.prototype, "schedule");

View File

@@ -6,13 +6,10 @@ import {
Revision, Revision,
} from "@server/models"; } from "@server/models";
import { buildDocument, buildUser } from "@server/test/factories"; import { buildDocument, buildUser } from "@server/test/factories";
import { setupTestDatabase } from "@server/test/support";
import RevisionCreatedNotificationsTask from "./RevisionCreatedNotificationsTask"; import RevisionCreatedNotificationsTask from "./RevisionCreatedNotificationsTask";
const ip = "127.0.0.1"; const ip = "127.0.0.1";
setupTestDatabase();
beforeEach(async () => { beforeEach(async () => {
jest.resetAllMocks(); jest.resetAllMocks();
}); });

View File

@@ -1,10 +1,12 @@
import path from "path"; import path from "path";
import { glob } from "glob"; import { glob } from "glob";
import env from "@server/env";
import Logger from "@server/logging/Logger"; import Logger from "@server/logging/Logger";
import { requireDirectory } from "@server/utils/fs"; import { requireDirectory } from "@server/utils/fs";
import BaseTask from "./BaseTask"; import BaseTask from "./BaseTask";
const tasks = {}; const tasks = {};
const rootDir = env.ENVIRONMENT === "test" ? "" : "build";
requireDirectory<{ default: BaseTask<any> }>(__dirname).forEach( requireDirectory<{ default: BaseTask<any> }>(__dirname).forEach(
([module, id]) => { ([module, id]) => {
@@ -16,7 +18,7 @@ requireDirectory<{ default: BaseTask<any> }>(__dirname).forEach(
); );
glob glob
.sync("build/plugins/*/server/tasks/!(*.test).js") .sync(path.join(rootDir, "plugins/*/server/tasks/!(*.test).[jt]s"))
.forEach((filePath: string) => { .forEach((filePath: string) => {
// eslint-disable-next-line @typescript-eslint/no-var-requires // eslint-disable-next-line @typescript-eslint/no-var-requires
const task = require(path.join(process.cwd(), filePath)).default; const task = require(path.join(process.cwd(), filePath)).default;

View File

@@ -39,9 +39,10 @@ describe("#auth.info", () => {
}, },
}); });
const body = await res.json(); const body = await res.json();
expect(res.status).toEqual(200);
const availableTeamIds = body.data.availableTeams.map((t: any) => t.id); const availableTeamIds = body.data.availableTeams.map((t: any) => t.id);
expect(res.status).toEqual(200);
expect(availableTeamIds.length).toEqual(3); expect(availableTeamIds.length).toEqual(3);
expect(availableTeamIds).toContain(team.id); expect(availableTeamIds).toContain(team.id);
expect(availableTeamIds).toContain(team2.id); expect(availableTeamIds).toContain(team2.id);

View File

@@ -1726,10 +1726,6 @@ describe("#documents.search", () => {
}, },
}); });
// setTimeout is needed here because SearchQuery is saved asynchronously
// in order to not slow down the response time.
await new Promise((resolve) => setTimeout(resolve, 100));
const searchQuery = await SearchQuery.findAll({ const searchQuery = await SearchQuery.findAll({
where: { where: {
teamId: user.teamId, teamId: user.teamId,

View File

@@ -20,7 +20,6 @@ import {
ValidationError, ValidationError,
IncorrectEditionError, IncorrectEditionError,
} from "@server/errors"; } from "@server/errors";
import Logger from "@server/logging/Logger";
import auth from "@server/middlewares/authentication"; import auth from "@server/middlewares/authentication";
import { rateLimiter } from "@server/middlewares/rateLimiter"; import { rateLimiter } from "@server/middlewares/rateLimiter";
import { transaction } from "@server/middlewares/transaction"; import { transaction } from "@server/middlewares/transaction";
@@ -818,15 +817,13 @@ router.post(
// When requesting subsequent pages of search results we don't want to record // When requesting subsequent pages of search results we don't want to record
// duplicate search query records // duplicate search query records
if (offset === 0) { if (offset === 0) {
void SearchQuery.create({ await SearchQuery.create({
userId: user?.id, userId: user?.id,
teamId, teamId,
shareId, shareId,
source: ctx.state.auth.type || "app", // we'll consider anything that isn't "api" to be "app" source: ctx.state.auth.type || "app", // we'll consider anything that isn't "api" to be "app"
query, query,
results: totalCount, results: totalCount,
}).catch((err) => {
Logger.error("Failed to create search query", err);
}); });
} }

View File

@@ -76,32 +76,24 @@ describe("#team.update", () => {
it("should add new allowed Domains, removing empty string values", async () => { it("should add new allowed Domains, removing empty string values", async () => {
const team = await buildTeam(); const team = await buildTeam();
const admin = await buildAdmin({ teamId: team.id }); const admin = await buildAdmin({ teamId: team.id });
const domain1 = faker.internet.domainName();
const domain2 = faker.internet.domainName();
const res = await server.post("/api/team.update", { const res = await server.post("/api/team.update", {
body: { body: {
token: admin.getJwtToken(), token: admin.getJwtToken(),
allowedDomains: [ allowedDomains: [domain1, "", domain2, "", ""],
"example-company.com",
"",
"example-company.org",
"",
"",
],
}, },
}); });
const body = await res.json(); const body = await res.json();
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(body.data.allowedDomains.sort()).toEqual([ expect(body.data.allowedDomains.includes(domain1)).toBe(true);
"example-company.com", expect(body.data.allowedDomains.includes(domain2)).toBe(true);
"example-company.org",
]);
const teamDomains: TeamDomain[] = await TeamDomain.findAll({ const teamDomains: TeamDomain[] = await TeamDomain.findAll({
where: { teamId: team.id }, where: { teamId: team.id },
}); });
expect(teamDomains.map((d) => d.name).sort()).toEqual([ expect(teamDomains.map((d) => d.name).includes(domain1)).toBe(true);
"example-company.com", expect(teamDomains.map((d) => d.name).includes(domain2)).toBe(true);
"example-company.org",
]);
}); });
it("should remove old allowed Domains", async () => { it("should remove old allowed Domains", async () => {
@@ -139,27 +131,25 @@ describe("#team.update", () => {
name: faker.internet.domainName(), name: faker.internet.domainName(),
createdById: admin.id, createdById: admin.id,
}); });
const domain1 = faker.internet.domainName();
const domain2 = faker.internet.domainName();
const res = await server.post("/api/team.update", { const res = await server.post("/api/team.update", {
body: { body: {
token: admin.getJwtToken(), token: admin.getJwtToken(),
allowedDomains: ["example-company.org", "example-company.net"], allowedDomains: [domain1, domain2],
}, },
}); });
const body = await res.json(); const body = await res.json();
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(body.data.allowedDomains.sort()).toEqual([ expect(body.data.allowedDomains.includes(domain1)).toBe(true);
"example-company.net", expect(body.data.allowedDomains.includes(domain2)).toBe(true);
"example-company.org",
]);
const teamDomains: TeamDomain[] = await TeamDomain.findAll({ const teamDomains: TeamDomain[] = await TeamDomain.findAll({
where: { teamId: team.id }, where: { teamId: team.id },
}); });
expect(teamDomains.map((d) => d.name).sort()).toEqual( expect(teamDomains.map((d) => d.name).includes(domain1)).toBe(true);
["example-company.org", "example-company.net"].sort() expect(teamDomains.map((d) => d.name).includes(domain2)).toBe(true);
);
expect(await TeamDomain.findByPk(existingTeamDomain.id)).toBeNull(); expect(await TeamDomain.findByPk(existingTeamDomain.id)).toBeNull();
}); });

View File

@@ -129,7 +129,7 @@ export function buildTeam(overrides: Record<string, any> = {}) {
authenticationProviders: [ authenticationProviders: [
{ {
name: "slack", name: "slack",
providerId: uuidv4(), providerId: uuidv4().replace(/-/g, ""),
}, },
], ],
...overrides, ...overrides,
@@ -188,7 +188,7 @@ export async function buildUser(overrides: Partial<User> = {}) {
authentications: [ authentications: [
{ {
authenticationProviderId: authenticationProvider!.id, authenticationProviderId: authenticationProvider!.id,
providerId: uuidv4(), providerId: uuidv4().replace(/-/g, ""),
}, },
], ],
...overrides, ...overrides,

View File

@@ -0,0 +1,15 @@
import "./env";
import { sequelize } from "@server/storage/database";
module.exports = async function () {
const sql = sequelize.getQueryInterface();
const tables = Object.keys(sequelize.models).map((model) => {
const n = sequelize.models[model].getTableName();
return (sql.queryGenerator as any).quoteTable(
typeof n === "string" ? n : n.tableName
);
});
const flushQuery = `TRUNCATE ${tables.join(", ")} CASCADE`;
await sequelize.query(flushQuery);
};

View File

@@ -0,0 +1,5 @@
import { sequelize } from "@server/storage/database";
module.exports = async function () {
await sequelize.close();
};

View File

@@ -1,7 +1,5 @@
import Redis from "@server/storage/redis"; import Redis from "@server/storage/redis";
// NOTE: this require must come after the ENV var override
// so that sequelize uses the test config variables
require("@server/storage/database"); require("@server/storage/database");
jest.mock("bull"); jest.mock("bull");

View File

@@ -17,35 +17,10 @@ export function getTestServer() {
server.close(); server.close();
}; };
setupTestDatabase();
afterAll(server.disconnect); afterAll(server.disconnect);
return server; return server;
} }
export function setupTestDatabase() {
const flush = async () => {
const sql = sequelize.getQueryInterface();
const tables = Object.keys(sequelize.models).map((model) => {
const n = sequelize.models[model].getTableName();
return (sql.queryGenerator as any).quoteTable(
typeof n === "string" ? n : n.tableName
);
});
const flushQuery = `TRUNCATE ${tables.join(", ")} CASCADE`;
await sequelize.query(flushQuery);
};
const disconnect = async () => {
await sequelize.close();
};
beforeAll(flush);
afterAll(disconnect);
}
/** /**
* Set the environment to be cloud hosted * Set the environment to be cloud hosted
*/ */

678
yarn.lock
View File

@@ -1647,11 +1647,6 @@
dependencies: dependencies:
tslib "2.4.0" tslib "2.4.0"
"@getoutline/jest-runner-serial@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@getoutline/jest-runner-serial/-/jest-runner-serial-2.0.0.tgz#a5b7eba7e5ce198b6fef8f27a79060af6cc2ded0"
integrity sha512-sV0a/FbPuT5sf4iotQm7/GY6KtseXvlmNLEOmtXkZ9hZ0NjFzro62G8C4J/e71NJWudhQsKgrxa6Zq8G7F3mnw==
"@getoutline/y-prosemirror@^1.0.18": "@getoutline/y-prosemirror@^1.0.18":
version "1.0.18" version "1.0.18"
resolved "https://registry.yarnpkg.com/@getoutline/y-prosemirror/-/y-prosemirror-1.0.18.tgz#17245c0362d30adb85131c86fb9a59358884b234" resolved "https://registry.yarnpkg.com/@getoutline/y-prosemirror/-/y-prosemirror-1.0.18.tgz#17245c0362d30adb85131c86fb9a59358884b234"
@@ -1771,109 +1766,109 @@
resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd"
integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==
"@jest/console@^29.6.1": "@jest/console@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.1.tgz#b48ba7b9c34b51483e6d590f46e5837f1ab5f639" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.4.tgz#a7e2d84516301f986bba0dd55af9d5fe37f46527"
integrity sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q== integrity sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==
dependencies: dependencies:
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/node" "*" "@types/node" "*"
chalk "^4.0.0" chalk "^4.0.0"
jest-message-util "^29.6.1" jest-message-util "^29.6.3"
jest-util "^29.6.1" jest-util "^29.6.3"
slash "^3.0.0" slash "^3.0.0"
"@jest/core@^29.6.1": "@jest/core@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.1.tgz#fac0d9ddf320490c93356ba201451825231e95f6" resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.4.tgz#265ebee05ec1ff3567757e7a327155c8d6bdb126"
integrity sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ== integrity sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==
dependencies: dependencies:
"@jest/console" "^29.6.1" "@jest/console" "^29.6.4"
"@jest/reporters" "^29.6.1" "@jest/reporters" "^29.6.4"
"@jest/test-result" "^29.6.1" "@jest/test-result" "^29.6.4"
"@jest/transform" "^29.6.1" "@jest/transform" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/node" "*" "@types/node" "*"
ansi-escapes "^4.2.1" ansi-escapes "^4.2.1"
chalk "^4.0.0" chalk "^4.0.0"
ci-info "^3.2.0" ci-info "^3.2.0"
exit "^0.1.2" exit "^0.1.2"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
jest-changed-files "^29.5.0" jest-changed-files "^29.6.3"
jest-config "^29.6.1" jest-config "^29.6.4"
jest-haste-map "^29.6.1" jest-haste-map "^29.6.4"
jest-message-util "^29.6.1" jest-message-util "^29.6.3"
jest-regex-util "^29.4.3" jest-regex-util "^29.6.3"
jest-resolve "^29.6.1" jest-resolve "^29.6.4"
jest-resolve-dependencies "^29.6.1" jest-resolve-dependencies "^29.6.4"
jest-runner "^29.6.1" jest-runner "^29.6.4"
jest-runtime "^29.6.1" jest-runtime "^29.6.4"
jest-snapshot "^29.6.1" jest-snapshot "^29.6.4"
jest-util "^29.6.1" jest-util "^29.6.3"
jest-validate "^29.6.1" jest-validate "^29.6.3"
jest-watcher "^29.6.1" jest-watcher "^29.6.4"
micromatch "^4.0.4" micromatch "^4.0.4"
pretty-format "^29.6.1" pretty-format "^29.6.3"
slash "^3.0.0" slash "^3.0.0"
strip-ansi "^6.0.0" strip-ansi "^6.0.0"
"@jest/environment@^29.5.0", "@jest/environment@^29.6.1": "@jest/environment@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.1.tgz#ee358fff2f68168394b4a50f18c68278a21fe82f" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.4.tgz#78ec2c9f8c8829a37616934ff4fea0c028c79f4f"
integrity sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A== integrity sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==
dependencies: dependencies:
"@jest/fake-timers" "^29.6.1" "@jest/fake-timers" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/node" "*" "@types/node" "*"
jest-mock "^29.6.1" jest-mock "^29.6.3"
"@jest/expect-utils@^29.6.1": "@jest/expect-utils@^29.6.1", "@jest/expect-utils@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.1.tgz#ab83b27a15cdd203fe5f68230ea22767d5c3acc5" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.4.tgz#17c7dfe6cec106441f218b0aff4b295f98346679"
integrity sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw== integrity sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==
dependencies: dependencies:
jest-get-type "^29.4.3" jest-get-type "^29.6.3"
"@jest/expect@^29.6.1": "@jest/expect@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.1.tgz#fef18265188f6a97601f1ea0a2912d81a85b4657" resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.4.tgz#1d6ae17dc68d906776198389427ab7ce6179dba6"
integrity sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg== integrity sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==
dependencies: dependencies:
expect "^29.6.1" expect "^29.6.4"
jest-snapshot "^29.6.1" jest-snapshot "^29.6.4"
"@jest/fake-timers@^29.5.0", "@jest/fake-timers@^29.6.1": "@jest/fake-timers@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.1.tgz#c773efddbc61e1d2efcccac008139f621de57c69" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.4.tgz#45a27f093c43d5d989362a3e7a8c70c83188b4f6"
integrity sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg== integrity sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==
dependencies: dependencies:
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@sinonjs/fake-timers" "^10.0.2" "@sinonjs/fake-timers" "^10.0.2"
"@types/node" "*" "@types/node" "*"
jest-message-util "^29.6.1" jest-message-util "^29.6.3"
jest-mock "^29.6.1" jest-mock "^29.6.3"
jest-util "^29.6.1" jest-util "^29.6.3"
"@jest/globals@^29.6.1": "@jest/globals@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.1.tgz#c8a8923e05efd757308082cc22893d82b8aa138f" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.4.tgz#4f04f58731b062b44ef23036b79bdb31f40c7f63"
integrity sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A== integrity sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==
dependencies: dependencies:
"@jest/environment" "^29.6.1" "@jest/environment" "^29.6.4"
"@jest/expect" "^29.6.1" "@jest/expect" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
jest-mock "^29.6.1" jest-mock "^29.6.3"
"@jest/reporters@^29.6.1": "@jest/reporters@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.1.tgz#3325a89c9ead3cf97ad93df3a427549d16179863" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.4.tgz#9d6350c8a2761ece91f7946e97ab0dabc06deab7"
integrity sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA== integrity sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==
dependencies: dependencies:
"@bcoe/v8-coverage" "^0.2.3" "@bcoe/v8-coverage" "^0.2.3"
"@jest/console" "^29.6.1" "@jest/console" "^29.6.4"
"@jest/test-result" "^29.6.1" "@jest/test-result" "^29.6.4"
"@jest/transform" "^29.6.1" "@jest/transform" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@jridgewell/trace-mapping" "^0.3.18" "@jridgewell/trace-mapping" "^0.3.18"
"@types/node" "*" "@types/node" "*"
chalk "^4.0.0" chalk "^4.0.0"
@@ -1882,13 +1877,13 @@
glob "^7.1.3" glob "^7.1.3"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
istanbul-lib-coverage "^3.0.0" istanbul-lib-coverage "^3.0.0"
istanbul-lib-instrument "^5.1.0" istanbul-lib-instrument "^6.0.0"
istanbul-lib-report "^3.0.0" istanbul-lib-report "^3.0.0"
istanbul-lib-source-maps "^4.0.0" istanbul-lib-source-maps "^4.0.0"
istanbul-reports "^3.1.3" istanbul-reports "^3.1.3"
jest-message-util "^29.6.1" jest-message-util "^29.6.3"
jest-util "^29.6.1" jest-util "^29.6.3"
jest-worker "^29.6.1" jest-worker "^29.6.4"
slash "^3.0.0" slash "^3.0.0"
string-length "^4.0.1" string-length "^4.0.1"
strip-ansi "^6.0.0" strip-ansi "^6.0.0"
@@ -1901,39 +1896,39 @@
dependencies: dependencies:
"@sinclair/typebox" "^0.27.8" "@sinclair/typebox" "^0.27.8"
"@jest/source-map@^29.6.0": "@jest/source-map@^29.6.3":
version "29.6.0" version "29.6.3"
resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.0.tgz#bd34a05b5737cb1a99d43e1957020ac8e5b9ddb1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4"
integrity sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA== integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==
dependencies: dependencies:
"@jridgewell/trace-mapping" "^0.3.18" "@jridgewell/trace-mapping" "^0.3.18"
callsites "^3.0.0" callsites "^3.0.0"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
"@jest/test-result@^29.6.1": "@jest/test-result@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.1.tgz#850e565a3f58ee8ca6ec424db00cb0f2d83c36ba" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.4.tgz#adf5c79f6e1fb7405ad13d67d9e2b6ff54b54c6b"
integrity sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw== integrity sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==
dependencies: dependencies:
"@jest/console" "^29.6.1" "@jest/console" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-lib-coverage" "^2.0.0"
collect-v8-coverage "^1.0.0" collect-v8-coverage "^1.0.0"
"@jest/test-sequencer@^29.6.1": "@jest/test-sequencer@^29.6.4":
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz#e3e582ee074dd24ea9687d7d1aaf05ee3a9b068e" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz#86aef66aaa22b181307ed06c26c82802fb836d7b"
integrity sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg== integrity sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==
dependencies: dependencies:
"@jest/test-result" "^29.6.1" "@jest/test-result" "^29.6.4"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
jest-haste-map "^29.6.1" jest-haste-map "^29.6.4"
slash "^3.0.0" slash "^3.0.0"
"@jest/transform@^29.6.1", "@jest/transform@^29.6.3": "@jest/transform@^29.6.4":
version "29.6.3" version "29.6.4"
resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.3.tgz#e8e376f56fffe827b529bf03a9881e58d152c14b" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.4.tgz#a6bc799ef597c5d85b2e65a11fd96b6b239bab5a"
integrity sha512-dPIc3DsvMZ/S8ut4L2ViCj265mKO0owB0wfzBv2oGzL9pQ+iRvJewHqLBmsGb7XFb5UotWIEtvY5A/lnylaIoQ== integrity sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==
dependencies: dependencies:
"@babel/core" "^7.11.6" "@babel/core" "^7.11.6"
"@jest/types" "^29.6.3" "@jest/types" "^29.6.3"
@@ -1943,7 +1938,7 @@
convert-source-map "^2.0.0" convert-source-map "^2.0.0"
fast-json-stable-stringify "^2.1.0" fast-json-stable-stringify "^2.1.0"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
jest-haste-map "^29.6.3" jest-haste-map "^29.6.4"
jest-regex-util "^29.6.3" jest-regex-util "^29.6.3"
jest-util "^29.6.3" jest-util "^29.6.3"
micromatch "^4.0.4" micromatch "^4.0.4"
@@ -1951,7 +1946,7 @@
slash "^3.0.0" slash "^3.0.0"
write-file-atomic "^4.0.2" write-file-atomic "^4.0.2"
"@jest/types@^29.5.0", "@jest/types@^29.6.1", "@jest/types@^29.6.3": "@jest/types@^29.6.1", "@jest/types@^29.6.3":
version "29.6.3" version "29.6.3"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59"
integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==
@@ -3273,11 +3268,6 @@
dependencies: dependencies:
"@types/express" "*" "@types/express" "*"
"@types/prettier@^2.1.5":
version "2.4.2"
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281"
integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==
"@types/prismjs@*": "@types/prismjs@*":
version "1.26.0" version "1.26.0"
resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654" resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654"
@@ -4086,12 +4076,12 @@ babel-helper-get-function-arity@^6.24.1:
babel-runtime "^6.22.0" babel-runtime "^6.22.0"
babel-types "^6.24.1" babel-types "^6.24.1"
babel-jest@^29.6.1, babel-jest@^29.6.3: babel-jest@^29.6.4:
version "29.6.3" version "29.6.4"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.6.3.tgz#e62f6c38f3ec8c147244168ee18ef0b919f10348" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.6.4.tgz#98dbc45d1c93319c82a8ab4a478b670655dd2585"
integrity sha512-1Ne93zZZEy5XmTa4Q+W5+zxBrDpExX8E3iy+xJJ+24ewlfo/T3qHfQJCzi/MMVFmBQDNxtRR/Gfd2dwb/0yrQw== integrity sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==
dependencies: dependencies:
"@jest/transform" "^29.6.3" "@jest/transform" "^29.6.4"
"@types/babel__core" "^7.1.14" "@types/babel__core" "^7.1.14"
babel-plugin-istanbul "^6.1.1" babel-plugin-istanbul "^6.1.1"
babel-preset-jest "^29.6.3" babel-preset-jest "^29.6.3"
@@ -5629,10 +5619,10 @@ decode-uri-component@^0.2.2:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
dedent@^0.7.0: dedent@^1.0.0:
version "0.7.0" version "1.5.1"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff"
integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==
deep-equal@~1.0.1: deep-equal@~1.0.1:
version "1.0.1" version "1.0.1"
@@ -5742,10 +5732,10 @@ diagnostics_channel@^1.1.0:
resolved "https://registry.yarnpkg.com/diagnostics_channel/-/diagnostics_channel-1.1.0.tgz#bd66c49124ce3bac697dff57466464487f57cea5" resolved "https://registry.yarnpkg.com/diagnostics_channel/-/diagnostics_channel-1.1.0.tgz#bd66c49124ce3bac697dff57466464487f57cea5"
integrity sha512-OE1ngLDjSBPG6Tx0YATELzYzy3RKHC+7veQ8gLa8yS7AAgw65mFbVdcsu3501abqOZCEZqZyAIemB0zXlqDSuw== integrity sha512-OE1ngLDjSBPG6Tx0YATELzYzy3RKHC+7veQ8gLa8yS7AAgw65mFbVdcsu3501abqOZCEZqZyAIemB0zXlqDSuw==
diff-sequences@^29.4.3: diff-sequences@^29.4.3, diff-sequences@^29.6.3:
version "29.4.3" version "29.6.3"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921"
integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==
dingbat-to-unicode@^1.0.1: dingbat-to-unicode@^1.0.1:
version "1.0.1" version "1.0.1"
@@ -6675,17 +6665,16 @@ exit@^0.1.2:
resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
expect@^29.0.0, expect@^29.6.1: expect@^29.0.0, expect@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.1.tgz#64dd1c8f75e2c0b209418f2b8d36a07921adfdf1" resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.4.tgz#a6e6f66d4613717859b2fe3da98a739437b6f4b8"
integrity sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g== integrity sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==
dependencies: dependencies:
"@jest/expect-utils" "^29.6.1" "@jest/expect-utils" "^29.6.4"
"@types/node" "*" jest-get-type "^29.6.3"
jest-get-type "^29.4.3" jest-matcher-utils "^29.6.4"
jest-matcher-utils "^29.6.1" jest-message-util "^29.6.3"
jest-message-util "^29.6.1" jest-util "^29.6.3"
jest-util "^29.6.1"
express-useragent@^1.0.15: express-useragent@^1.0.15:
version "1.0.15" version "1.0.15"
@@ -8240,7 +8229,7 @@ istanbul-lib-coverage@3.2.0, istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-instrument@^5.0.4:
version "5.2.0" version "5.2.0"
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f"
integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==
@@ -8251,6 +8240,17 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
istanbul-lib-coverage "^3.2.0" istanbul-lib-coverage "^3.2.0"
semver "^6.3.0" semver "^6.3.0"
istanbul-lib-instrument@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz#7a8af094cbfff1d5bb280f62ce043695ae8dd5b8"
integrity sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==
dependencies:
"@babel/core" "^7.12.3"
"@babel/parser" "^7.14.7"
"@istanbuljs/schema" "^0.1.2"
istanbul-lib-coverage "^3.2.0"
semver "^7.5.4"
istanbul-lib-report@^3.0.0: istanbul-lib-report@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
@@ -8292,139 +8292,140 @@ java-properties@^1.0.0:
resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211"
integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==
jest-changed-files@^29.5.0: jest-changed-files@^29.6.3:
version "29.5.0" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.6.3.tgz#97cfdc93f74fb8af2a1acb0b78f836f1fb40c449"
integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== integrity sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==
dependencies: dependencies:
execa "^5.0.0" execa "^5.0.0"
jest-util "^29.6.3"
p-limit "^3.1.0" p-limit "^3.1.0"
jest-circus@^29.6.1: jest-circus@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.1.tgz#861dab37e71a89907d1c0fabc54a0019738ed824" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.4.tgz#f074c8d795e0cc0f2ebf0705086b1be6a9a8722f"
integrity sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ== integrity sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==
dependencies: dependencies:
"@jest/environment" "^29.6.1" "@jest/environment" "^29.6.4"
"@jest/expect" "^29.6.1" "@jest/expect" "^29.6.4"
"@jest/test-result" "^29.6.1" "@jest/test-result" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/node" "*" "@types/node" "*"
chalk "^4.0.0" chalk "^4.0.0"
co "^4.6.0" co "^4.6.0"
dedent "^0.7.0" dedent "^1.0.0"
is-generator-fn "^2.0.0" is-generator-fn "^2.0.0"
jest-each "^29.6.1" jest-each "^29.6.3"
jest-matcher-utils "^29.6.1" jest-matcher-utils "^29.6.4"
jest-message-util "^29.6.1" jest-message-util "^29.6.3"
jest-runtime "^29.6.1" jest-runtime "^29.6.4"
jest-snapshot "^29.6.1" jest-snapshot "^29.6.4"
jest-util "^29.6.1" jest-util "^29.6.3"
p-limit "^3.1.0" p-limit "^3.1.0"
pretty-format "^29.6.1" pretty-format "^29.6.3"
pure-rand "^6.0.0" pure-rand "^6.0.0"
slash "^3.0.0" slash "^3.0.0"
stack-utils "^2.0.3" stack-utils "^2.0.3"
jest-cli@^29.6.1: jest-cli@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.1.tgz#99d9afa7449538221c71f358f0fdd3e9c6e89f72" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.4.tgz#ad52f2dfa1b0291de7ec7f8d7c81ac435521ede0"
integrity sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing== integrity sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==
dependencies: dependencies:
"@jest/core" "^29.6.1" "@jest/core" "^29.6.4"
"@jest/test-result" "^29.6.1" "@jest/test-result" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
chalk "^4.0.0" chalk "^4.0.0"
exit "^0.1.2" exit "^0.1.2"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
import-local "^3.0.2" import-local "^3.0.2"
jest-config "^29.6.1" jest-config "^29.6.4"
jest-util "^29.6.1" jest-util "^29.6.3"
jest-validate "^29.6.1" jest-validate "^29.6.3"
prompts "^2.0.1" prompts "^2.0.1"
yargs "^17.3.1" yargs "^17.3.1"
jest-config@^29.6.1: jest-config@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.1.tgz#d785344509065d53a238224c6cdc0ed8e2f2f0dd" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.4.tgz#eff958ee41d4e1ee7a6106d02b74ad9fc427d79e"
integrity sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ== integrity sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==
dependencies: dependencies:
"@babel/core" "^7.11.6" "@babel/core" "^7.11.6"
"@jest/test-sequencer" "^29.6.1" "@jest/test-sequencer" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
babel-jest "^29.6.1" babel-jest "^29.6.4"
chalk "^4.0.0" chalk "^4.0.0"
ci-info "^3.2.0" ci-info "^3.2.0"
deepmerge "^4.2.2" deepmerge "^4.2.2"
glob "^7.1.3" glob "^7.1.3"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
jest-circus "^29.6.1" jest-circus "^29.6.4"
jest-environment-node "^29.6.1" jest-environment-node "^29.6.4"
jest-get-type "^29.4.3" jest-get-type "^29.6.3"
jest-regex-util "^29.4.3" jest-regex-util "^29.6.3"
jest-resolve "^29.6.1" jest-resolve "^29.6.4"
jest-runner "^29.6.1" jest-runner "^29.6.4"
jest-util "^29.6.1" jest-util "^29.6.3"
jest-validate "^29.6.1" jest-validate "^29.6.3"
micromatch "^4.0.4" micromatch "^4.0.4"
parse-json "^5.2.0" parse-json "^5.2.0"
pretty-format "^29.6.1" pretty-format "^29.6.3"
slash "^3.0.0" slash "^3.0.0"
strip-json-comments "^3.1.1" strip-json-comments "^3.1.1"
jest-diff@^29.6.1: jest-diff@^29.6.1, jest-diff@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.1.tgz#13df6db0a89ee6ad93c747c75c85c70ba941e545" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.4.tgz#85aaa6c92a79ae8cd9a54ebae8d5b6d9a513314a"
integrity sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg== integrity sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==
dependencies: dependencies:
chalk "^4.0.0" chalk "^4.0.0"
diff-sequences "^29.4.3" diff-sequences "^29.6.3"
jest-get-type "^29.4.3" jest-get-type "^29.6.3"
pretty-format "^29.6.1" pretty-format "^29.6.3"
jest-docblock@^29.4.3: jest-docblock@^29.6.3:
version "29.4.3" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.6.3.tgz#293dca5188846c9f7c0c2b1bb33e5b11f21645f2"
integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== integrity sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==
dependencies: dependencies:
detect-newline "^3.0.0" detect-newline "^3.0.0"
jest-each@^29.6.1: jest-each@^29.6.3:
version "29.6.1" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.1.tgz#975058e5b8f55c6780beab8b6ab214921815c89c" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.3.tgz#1956f14f5f0cb8ae0b2e7cabc10bb03ec817c142"
integrity sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ== integrity sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==
dependencies: dependencies:
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
chalk "^4.0.0" chalk "^4.0.0"
jest-get-type "^29.4.3" jest-get-type "^29.6.3"
jest-util "^29.6.1" jest-util "^29.6.3"
pretty-format "^29.6.1" pretty-format "^29.6.3"
jest-environment-jsdom@^29.5.0: jest-environment-jsdom@^29.6.4:
version "29.5.0" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz#0daf44454041f9e1ef7fa82eb1bd43426a82eb1c"
integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== integrity sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA==
dependencies: dependencies:
"@jest/environment" "^29.5.0" "@jest/environment" "^29.6.4"
"@jest/fake-timers" "^29.5.0" "@jest/fake-timers" "^29.6.4"
"@jest/types" "^29.5.0" "@jest/types" "^29.6.3"
"@types/jsdom" "^20.0.0" "@types/jsdom" "^20.0.0"
"@types/node" "*" "@types/node" "*"
jest-mock "^29.5.0" jest-mock "^29.6.3"
jest-util "^29.5.0" jest-util "^29.6.3"
jsdom "^20.0.0" jsdom "^20.0.0"
jest-environment-node@^29.6.1: jest-environment-node@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.1.tgz#08a122dece39e58bc388da815a2166c58b4abec6" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.4.tgz#4ce311549afd815d3cafb49e60a1e4b25f06d29f"
integrity sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ== integrity sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==
dependencies: dependencies:
"@jest/environment" "^29.6.1" "@jest/environment" "^29.6.4"
"@jest/fake-timers" "^29.6.1" "@jest/fake-timers" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/node" "*" "@types/node" "*"
jest-mock "^29.6.1" jest-mock "^29.6.3"
jest-util "^29.6.1" jest-util "^29.6.3"
jest-fetch-mock@^3.0.3: jest-fetch-mock@^3.0.3:
version "3.0.3" version "3.0.3"
@@ -8434,15 +8435,15 @@ jest-fetch-mock@^3.0.3:
cross-fetch "^3.0.4" cross-fetch "^3.0.4"
promise-polyfill "^8.1.3" promise-polyfill "^8.1.3"
jest-get-type@^29.4.3: jest-get-type@^29.4.3, jest-get-type@^29.6.3:
version "29.4.3"
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5"
integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==
jest-haste-map@^29.6.1, jest-haste-map@^29.6.3:
version "29.6.3" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.3.tgz#a53ac35a137fd32d932039aab29d02a9dab30689" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1"
integrity sha512-GecR5YavfjkhOytEFHAeI6aWWG3f/cOKNB1YJvj/B76xAmeVjy4zJUYobGF030cRmKaO1FBw3V8CZZ6KVh9ZSw== integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==
jest-haste-map@^29.6.4:
version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.4.tgz#97143ce833829157ea7025204b08f9ace609b96a"
integrity sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==
dependencies: dependencies:
"@jest/types" "^29.6.3" "@jest/types" "^29.6.3"
"@types/graceful-fs" "^4.1.3" "@types/graceful-fs" "^4.1.3"
@@ -8452,170 +8453,169 @@ jest-haste-map@^29.6.1, jest-haste-map@^29.6.3:
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
jest-regex-util "^29.6.3" jest-regex-util "^29.6.3"
jest-util "^29.6.3" jest-util "^29.6.3"
jest-worker "^29.6.3" jest-worker "^29.6.4"
micromatch "^4.0.4" micromatch "^4.0.4"
walker "^1.0.8" walker "^1.0.8"
optionalDependencies: optionalDependencies:
fsevents "^2.3.2" fsevents "^2.3.2"
jest-leak-detector@^29.6.1: jest-leak-detector@^29.6.3:
version "29.6.1" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz#66a902c81318e66e694df7d096a95466cb962f8e" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz#b9661bc3aec8874e59aff361fa0c6d7cd507ea01"
integrity sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ== integrity sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==
dependencies: dependencies:
jest-get-type "^29.4.3" jest-get-type "^29.6.3"
pretty-format "^29.6.1" pretty-format "^29.6.3"
jest-matcher-utils@^29.6.1: jest-matcher-utils@^29.6.1, jest-matcher-utils@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz#6c60075d84655d6300c5d5128f46531848160b53" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz#327db7ababea49455df3b23e5d6109fe0c709d24"
integrity sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA== integrity sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==
dependencies: dependencies:
chalk "^4.0.0" chalk "^4.0.0"
jest-diff "^29.6.1" jest-diff "^29.6.4"
jest-get-type "^29.4.3" jest-get-type "^29.6.3"
pretty-format "^29.6.1" pretty-format "^29.6.3"
jest-message-util@^29.6.1: jest-message-util@^29.6.1, jest-message-util@^29.6.3:
version "29.6.1" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.1.tgz#d0b21d87f117e1b9e165e24f245befd2ff34ff8d" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.3.tgz#bce16050d86801b165f20cfde34dc01d3cf85fbf"
integrity sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ== integrity sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==
dependencies: dependencies:
"@babel/code-frame" "^7.12.13" "@babel/code-frame" "^7.12.13"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/stack-utils" "^2.0.0" "@types/stack-utils" "^2.0.0"
chalk "^4.0.0" chalk "^4.0.0"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
micromatch "^4.0.4" micromatch "^4.0.4"
pretty-format "^29.6.1" pretty-format "^29.6.3"
slash "^3.0.0" slash "^3.0.0"
stack-utils "^2.0.3" stack-utils "^2.0.3"
jest-mock@^29.5.0, jest-mock@^29.6.1: jest-mock@^29.6.3:
version "29.6.1" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.1.tgz#049ee26aea8cbf54c764af649070910607316517" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.3.tgz#433f3fd528c8ec5a76860177484940628bdf5e0a"
integrity sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw== integrity sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==
dependencies: dependencies:
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/node" "*" "@types/node" "*"
jest-util "^29.6.1" jest-util "^29.6.3"
jest-pnp-resolver@^1.2.2: jest-pnp-resolver@^1.2.2:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
jest-regex-util@^29.4.3, jest-regex-util@^29.6.3: jest-regex-util@^29.6.3:
version "29.6.3" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52"
integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==
jest-resolve-dependencies@^29.6.1: jest-resolve-dependencies@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz#b85b06670f987a62515bbf625d54a499e3d708f5" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz#20156b33c7eacbb6bb77aeba4bed0eab4a3f8734"
integrity sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw== integrity sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==
dependencies: dependencies:
jest-regex-util "^29.4.3" jest-regex-util "^29.6.3"
jest-snapshot "^29.6.1" jest-snapshot "^29.6.4"
jest-resolve@^29.6.1: jest-resolve@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.1.tgz#4c3324b993a85e300add2f8609f51b80ddea39ee" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.4.tgz#e34cb06f2178b429c38455d98d1a07572ac9faa3"
integrity sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg== integrity sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==
dependencies: dependencies:
chalk "^4.0.0" chalk "^4.0.0"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
jest-haste-map "^29.6.1" jest-haste-map "^29.6.4"
jest-pnp-resolver "^1.2.2" jest-pnp-resolver "^1.2.2"
jest-util "^29.6.1" jest-util "^29.6.3"
jest-validate "^29.6.1" jest-validate "^29.6.3"
resolve "^1.20.0" resolve "^1.20.0"
resolve.exports "^2.0.0" resolve.exports "^2.0.0"
slash "^3.0.0" slash "^3.0.0"
jest-runner@^29.6.1: jest-runner@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.1.tgz#54557087e7972d345540d622ab5bfc3d8f34688c" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.4.tgz#b3b8ccb85970fde0fae40c73ee11eb75adccfacf"
integrity sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ== integrity sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==
dependencies: dependencies:
"@jest/console" "^29.6.1" "@jest/console" "^29.6.4"
"@jest/environment" "^29.6.1" "@jest/environment" "^29.6.4"
"@jest/test-result" "^29.6.1" "@jest/test-result" "^29.6.4"
"@jest/transform" "^29.6.1" "@jest/transform" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/node" "*" "@types/node" "*"
chalk "^4.0.0" chalk "^4.0.0"
emittery "^0.13.1" emittery "^0.13.1"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
jest-docblock "^29.4.3" jest-docblock "^29.6.3"
jest-environment-node "^29.6.1" jest-environment-node "^29.6.4"
jest-haste-map "^29.6.1" jest-haste-map "^29.6.4"
jest-leak-detector "^29.6.1" jest-leak-detector "^29.6.3"
jest-message-util "^29.6.1" jest-message-util "^29.6.3"
jest-resolve "^29.6.1" jest-resolve "^29.6.4"
jest-runtime "^29.6.1" jest-runtime "^29.6.4"
jest-util "^29.6.1" jest-util "^29.6.3"
jest-watcher "^29.6.1" jest-watcher "^29.6.4"
jest-worker "^29.6.1" jest-worker "^29.6.4"
p-limit "^3.1.0" p-limit "^3.1.0"
source-map-support "0.5.13" source-map-support "0.5.13"
jest-runtime@^29.6.1: jest-runtime@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.1.tgz#8a0fc9274ef277f3d70ba19d238e64334958a0dc" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.4.tgz#b0bc495c9b6b12a0a7042ac34ca9bb85f8cd0ded"
integrity sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ== integrity sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==
dependencies: dependencies:
"@jest/environment" "^29.6.1" "@jest/environment" "^29.6.4"
"@jest/fake-timers" "^29.6.1" "@jest/fake-timers" "^29.6.4"
"@jest/globals" "^29.6.1" "@jest/globals" "^29.6.4"
"@jest/source-map" "^29.6.0" "@jest/source-map" "^29.6.3"
"@jest/test-result" "^29.6.1" "@jest/test-result" "^29.6.4"
"@jest/transform" "^29.6.1" "@jest/transform" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/node" "*" "@types/node" "*"
chalk "^4.0.0" chalk "^4.0.0"
cjs-module-lexer "^1.0.0" cjs-module-lexer "^1.0.0"
collect-v8-coverage "^1.0.0" collect-v8-coverage "^1.0.0"
glob "^7.1.3" glob "^7.1.3"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
jest-haste-map "^29.6.1" jest-haste-map "^29.6.4"
jest-message-util "^29.6.1" jest-message-util "^29.6.3"
jest-mock "^29.6.1" jest-mock "^29.6.3"
jest-regex-util "^29.4.3" jest-regex-util "^29.6.3"
jest-resolve "^29.6.1" jest-resolve "^29.6.4"
jest-snapshot "^29.6.1" jest-snapshot "^29.6.4"
jest-util "^29.6.1" jest-util "^29.6.3"
slash "^3.0.0" slash "^3.0.0"
strip-bom "^4.0.0" strip-bom "^4.0.0"
jest-snapshot@^29.6.1: jest-snapshot@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.1.tgz#0d083cb7de716d5d5cdbe80d598ed2fbafac0239" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.4.tgz#9833eb6b66ff1541c7fd8ceaa42d541f407b4876"
integrity sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A== integrity sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==
dependencies: dependencies:
"@babel/core" "^7.11.6" "@babel/core" "^7.11.6"
"@babel/generator" "^7.7.2" "@babel/generator" "^7.7.2"
"@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-jsx" "^7.7.2"
"@babel/plugin-syntax-typescript" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2"
"@babel/types" "^7.3.3" "@babel/types" "^7.3.3"
"@jest/expect-utils" "^29.6.1" "@jest/expect-utils" "^29.6.4"
"@jest/transform" "^29.6.1" "@jest/transform" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/prettier" "^2.1.5"
babel-preset-current-node-syntax "^1.0.0" babel-preset-current-node-syntax "^1.0.0"
chalk "^4.0.0" chalk "^4.0.0"
expect "^29.6.1" expect "^29.6.4"
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
jest-diff "^29.6.1" jest-diff "^29.6.4"
jest-get-type "^29.4.3" jest-get-type "^29.6.3"
jest-matcher-utils "^29.6.1" jest-matcher-utils "^29.6.4"
jest-message-util "^29.6.1" jest-message-util "^29.6.3"
jest-util "^29.6.1" jest-util "^29.6.3"
natural-compare "^1.4.0" natural-compare "^1.4.0"
pretty-format "^29.6.1" pretty-format "^29.6.3"
semver "^7.5.3" semver "^7.5.3"
jest-util@^29.5.0, jest-util@^29.6.1, jest-util@^29.6.3: jest-util@^29.6.1, jest-util@^29.6.3:
version "29.6.3" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.3.tgz#e15c3eac8716440d1ed076f09bc63ace1aebca63" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.3.tgz#e15c3eac8716440d1ed076f09bc63ace1aebca63"
integrity sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA== integrity sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==
@@ -8627,30 +8627,30 @@ jest-util@^29.5.0, jest-util@^29.6.1, jest-util@^29.6.3:
graceful-fs "^4.2.9" graceful-fs "^4.2.9"
picomatch "^2.2.3" picomatch "^2.2.3"
jest-validate@^29.6.1: jest-validate@^29.6.3:
version "29.6.1" version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.1.tgz#765e684af6e2c86dce950aebefbbcd4546d69f7b" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.3.tgz#a75fca774cfb1c5758c70d035d30a1f9c2784b4d"
integrity sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA== integrity sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==
dependencies: dependencies:
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
camelcase "^6.2.0" camelcase "^6.2.0"
chalk "^4.0.0" chalk "^4.0.0"
jest-get-type "^29.4.3" jest-get-type "^29.6.3"
leven "^3.1.0" leven "^3.1.0"
pretty-format "^29.6.1" pretty-format "^29.6.3"
jest-watcher@^29.6.1: jest-watcher@^29.6.4:
version "29.6.1" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.1.tgz#7c0c43ddd52418af134c551c92c9ea31e5ec942e" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.4.tgz#633eb515ae284aa67fd6831f1c9d1b534cf0e0ba"
integrity sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA== integrity sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==
dependencies: dependencies:
"@jest/test-result" "^29.6.1" "@jest/test-result" "^29.6.4"
"@jest/types" "^29.6.1" "@jest/types" "^29.6.3"
"@types/node" "*" "@types/node" "*"
ansi-escapes "^4.2.1" ansi-escapes "^4.2.1"
chalk "^4.0.0" chalk "^4.0.0"
emittery "^0.13.1" emittery "^0.13.1"
jest-util "^29.6.1" jest-util "^29.6.3"
string-length "^4.0.1" string-length "^4.0.1"
jest-worker@^26.2.1: jest-worker@^26.2.1:
@@ -8662,10 +8662,10 @@ jest-worker@^26.2.1:
merge-stream "^2.0.0" merge-stream "^2.0.0"
supports-color "^7.0.0" supports-color "^7.0.0"
jest-worker@^29.6.1, jest-worker@^29.6.3: jest-worker@^29.6.4:
version "29.6.3" version "29.6.4"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.3.tgz#7b1a47bbb6559f3c0882d16595938590e63915d5" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.4.tgz#f34279f4afc33c872b470d4af21b281ac616abd3"
integrity sha512-wacANXecZ/GbQakpf2CClrqrlwsYYDSXFd4fIGdL+dXpM2GWoJ+6bhQ7vR3TKi3+gkSfBkjy1/khH/WrYS4Q6g== integrity sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
jest-util "^29.6.3" jest-util "^29.6.3"
@@ -10673,12 +10673,12 @@ pretty-bytes@^6.0.0:
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.1.0.tgz#1d1cc9aae1939012c74180b679da6684616bf804" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.1.0.tgz#1d1cc9aae1939012c74180b679da6684616bf804"
integrity sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ== integrity sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==
pretty-format@^29.0.0, pretty-format@^29.6.1: pretty-format@^29.0.0, pretty-format@^29.6.1, pretty-format@^29.6.3:
version "29.6.1" version "29.6.3"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.1.tgz#ec838c288850b7c4f9090b867c2d4f4edbfb0f3e" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.3.tgz#d432bb4f1ca6f9463410c3fb25a0ba88e594ace7"
integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== integrity sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==
dependencies: dependencies:
"@jest/schemas" "^29.6.0" "@jest/schemas" "^29.6.3"
ansi-styles "^5.0.0" ansi-styles "^5.0.0"
react-is "^18.0.0" react-is "^18.0.0"