diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index c012c8baa7..42e4010a6c 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -39,4 +39,7 @@ jobs: E2E_USER_ID: ${{ secrets.E2E_USER_ID }} E2E_USER_ID_OLD: ${{ secrets.E2E_USER_ID_OLD }} E2E_WORKSPACE_ID: ${{ secrets.E2E_WORKSPACE_ID }} + QSTASH_TOKEN: ${{ secrets.QSTASH_TOKEN }} + QSTASH_CURRENT_SIGNING_KEY: ${{ secrets.QSTASH_CURRENT_SIGNING_KEY }} + NEXT_PUBLIC_NGROK_URL: ${{ github.event.deployment_status.environment_url }} run: pnpm test diff --git a/apps/web/lib/webhook/qstash.ts b/apps/web/lib/webhook/qstash.ts index df67ae7ec1..29817b6a87 100644 --- a/apps/web/lib/webhook/qstash.ts +++ b/apps/web/lib/webhook/qstash.ts @@ -68,6 +68,7 @@ const publishWebhookEventToQStash = async ({ }, callback: callbackUrl.href, failureCallback: callbackUrl.href, + ...(process.env.NODE_ENV === "test" && { delay: 2 }), }); if (!response.messageId) { diff --git a/apps/web/lib/webhook/sample-events/lead-created.json b/apps/web/lib/webhook/sample-events/lead-created.json index de07874092..5da24119d0 100644 --- a/apps/web/lib/webhook/sample-events/lead-created.json +++ b/apps/web/lib/webhook/sample-events/lead-created.json @@ -1,41 +1,44 @@ { - "eventName": "Sign up", + "eventName": "Signup", "customer": { - "id": "oU5P0SqI8fpwx5bxw1", - "name": "John", - "email": "john@example.com", - "avatar": "https://example.com/john.jpeg" + "id": "cus_Ql3PvCTbPXBpp6vn7x5oHb5G", + "externalId": "cus_BH6tDUWc9n0Y2pf55tVbk1hc", + "name": "Tiny Beige Badger", + "email": "tiny.beige.badger@example.com", + "avatar": "https://api.dicebear.com/9.x/notionists/png?seed=cus_BH6tDUWc9n0Y2pf55tVbk1hc", + "createdAt": "2025-01-14T04:49:23.385Z" }, "click": { - "id": "d0UtZqE0BZuBPrJS", + "id": "GWGrkftJdYlZD2mq", "url": "https://github.com/dubinc/dub", - "ip": "63.141.57.109", - "continent": "NA", "country": "US", - "city": "San Francisco", + "city": "San Jose", + "region": "sfo1", + "continent": "NA", "device": "Desktop", "browser": "Chrome", "os": "Mac OS", - "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36", - "bot": false, + "referer": "(direct)", + "refererUrl": "(direct)", "qr": false, - "referer": "(direct)" + "ip": "185.211.32.242" }, "link": { - "id": "cm0faqkyn0001txvfwjfeq7gl", + "id": "cm0lcuvtz000xcutmqw4a7wi3", "domain": "dub.sh", - "key": "79ys3WA", - "externalId": null, + "key": "track-test", "url": "https://github.com/dubinc/dub", "trackConversion": true, + "externalId": null, + "tenantId": null, "archived": false, - "expiresAt": null, + "expiresAt": "1970-01-01T00:00:00.000Z", "expiredUrl": null, "password": null, "proxy": false, - "title": null, - "description": null, - "image": null, + "title": "GitHub - dubinc/dub: Open-source link management infrastructure. Loved by modern marketing teams like Vercel, Raycast...", + "description": "Open-source link management infrastructure. Loved by modern marketing teams like Vercel, Raycast, and Perplexity. - dubinc/dub", + "image": "https://repository-images.githubusercontent.com/529708137/419e9be4-a9d1-4c85-9f83-47a78ad92583", "video": null, "rewrite": false, "doIndex": false, @@ -43,22 +46,27 @@ "android": null, "geo": null, "publicStats": false, + "tagId": null, + "tags": [], + "webhookIds": [], "comments": null, - "shortLink": "https://dub.sh/79ys3WA", - "qrCode": "https://api.dub.co/qr?url=https://dub.sh/79ys3WA?qr=1", + "shortLink": "https://dub.sh/track-test", + "qrCode": "https://api.dub.co/qr?url=https://dub.sh/track-test?qr=1", "utm_source": null, "utm_medium": null, "utm_campaign": null, "utm_term": null, "utm_content": null, - "userId": "cm022rkcw0000ikt14mscg9sg", - "workspaceId": "ws_cm022sis60003ikt1syy7kfhl", - "clicks": 10, - "lastClicked": "2024-08-30T07:45:09.000Z", - "leads": 5, - "sales": 0, - "saleAmount": 0, - "createdAt": "2024-08-29T13:03:59.098Z", - "updatedAt": "2024-08-30T09:53:49.505Z" + "userId": "cludszk1h0000wmd2e0ea2b0p", + "workspaceId": "ws_clrei1gld0002vs9mzn93p8ik", + "clicks": 882, + "lastClicked": "2025-01-14T04:49:10.000Z", + "leads": 3632, + "sales": 2811, + "saleAmount": 290300, + "createdAt": "2024-09-02T18:49:56.136Z", + "updatedAt": "2025-01-14T04:49:23.740Z", + "projectId": "clrei1gld0002vs9mzn93p8ik", + "programId": "prog_CYCu7IMAapjkRpTnr8F1azjN" } } diff --git a/apps/web/lib/webhook/sample-events/link-clicked.json b/apps/web/lib/webhook/sample-events/link-clicked.json index b1c6115b74..20fe2cbb84 100644 --- a/apps/web/lib/webhook/sample-events/link-clicked.json +++ b/apps/web/lib/webhook/sample-events/link-clicked.json @@ -1,34 +1,35 @@ { "click": { - "id": "CvQhPEXvqRYG4mqL", - "url": "https://github.com/dubinc", - "continent": "AS", - "country": "IN", - "city": "Thalassery", + "id": "yNrYm0F6r1KMnq6N", + "url": "https://github.com/dubinc/dub", + "country": "US", + "city": "San Jose", + "region": "CA", + "continent": "NA", "device": "Desktop", - "browser": "Chrome", - "os": "Mac OS", + "browser": "Unknown", + "os": "Unknown", "referer": "(direct)", "refererUrl": "(direct)", "qr": false, - "ip": "103.181.40.30" + "ip": "52.234.41.119" }, "link": { - "id": "cm2a01bzt0001jc3nzycksls1", + "id": "cm0lcuvtz000xcutmqw4a7wi3", "domain": "dub.sh", - "key": "qviSU44", - "url": "https://github.com/dubinc", - "trackConversion": false, + "key": "track-test", + "url": "https://github.com/dubinc/dub", + "trackConversion": true, "externalId": null, - "identifier": null, + "tenantId": null, "archived": false, "expiresAt": "1970-01-01T00:00:00.000Z", "expiredUrl": null, "password": null, "proxy": false, - "title": null, - "description": null, - "image": null, + "title": "GitHub - dubinc/dub: Open-source link management infrastructure. Loved by modern marketing teams like Vercel, Raycast...", + "description": "Open-source link management infrastructure. Loved by modern marketing teams like Vercel, Raycast, and Perplexity. - dubinc/dub", + "image": "https://repository-images.githubusercontent.com/529708137/419e9be4-a9d1-4c85-9f83-47a78ad92583", "video": null, "rewrite": false, "doIndex": false, @@ -40,22 +41,23 @@ "tags": [], "webhookIds": [], "comments": null, - "shortLink": "https://dub.sh/qviSU44", - "qrCode": "https://api.dub.co/qr?url=https://dub.sh/qviSU44?qr=1", + "shortLink": "https://dub.sh/track-test", + "qrCode": "https://api.dub.co/qr?url=https://dub.sh/track-test?qr=1", "utm_source": null, "utm_medium": null, "utm_campaign": null, "utm_term": null, "utm_content": null, - "userId": "clxz1q7c7000hbqx5ckv4r82h", + "userId": "cludszk1h0000wmd2e0ea2b0p", "workspaceId": "ws_clrei1gld0002vs9mzn93p8ik", - "clicks": 1, - "lastClicked": "2024-10-15T06:35:33.000Z", - "leads": 0, - "sales": 0, - "saleAmount": 0, - "createdAt": "2024-10-15T05:24:58.744Z", - "updatedAt": "2024-10-15T05:24:58.744Z", - "projectId": "clrei1gld0002vs9mzn93p8ik" + "clicks": 882, + "lastClicked": "2025-01-14T04:49:10.000Z", + "leads": 3631, + "sales": 2811, + "saleAmount": 290300, + "createdAt": "2024-09-02T18:49:56.136Z", + "updatedAt": "2025-01-13T22:46:22.152Z", + "projectId": "clrei1gld0002vs9mzn93p8ik", + "programId": "prog_CYCu7IMAapjkRpTnr8F1azjN" } } diff --git a/apps/web/lib/webhook/sample-events/link-created.json b/apps/web/lib/webhook/sample-events/link-created.json index f8b5cefa6d..a3f267faa0 100644 --- a/apps/web/lib/webhook/sample-events/link-created.json +++ b/apps/web/lib/webhook/sample-events/link-created.json @@ -3,6 +3,7 @@ "domain": "dub.sh", "key": "sOvvXDT", "externalId": null, + "tenantId": null, "url": "https://github.com/stack-auth/stack", "trackConversion": false, "archived": false, @@ -22,6 +23,8 @@ "publicStats": false, "tagId": null, "tags": [], + "webhookIds": [], + "programId": null, "comments": null, "shortLink": "https://dub.sh/sOvvXDT", "qrCode": "https://api.dub.co/qr?url=https://dub.sh/sOvvXDT?qr=1", diff --git a/apps/web/lib/webhook/sample-events/link-deleted.json b/apps/web/lib/webhook/sample-events/link-deleted.json index f8b5cefa6d..a3f267faa0 100644 --- a/apps/web/lib/webhook/sample-events/link-deleted.json +++ b/apps/web/lib/webhook/sample-events/link-deleted.json @@ -3,6 +3,7 @@ "domain": "dub.sh", "key": "sOvvXDT", "externalId": null, + "tenantId": null, "url": "https://github.com/stack-auth/stack", "trackConversion": false, "archived": false, @@ -22,6 +23,8 @@ "publicStats": false, "tagId": null, "tags": [], + "webhookIds": [], + "programId": null, "comments": null, "shortLink": "https://dub.sh/sOvvXDT", "qrCode": "https://api.dub.co/qr?url=https://dub.sh/sOvvXDT?qr=1", diff --git a/apps/web/lib/webhook/sample-events/link-updated.json b/apps/web/lib/webhook/sample-events/link-updated.json index f8b5cefa6d..a3f267faa0 100644 --- a/apps/web/lib/webhook/sample-events/link-updated.json +++ b/apps/web/lib/webhook/sample-events/link-updated.json @@ -3,6 +3,7 @@ "domain": "dub.sh", "key": "sOvvXDT", "externalId": null, + "tenantId": null, "url": "https://github.com/stack-auth/stack", "trackConversion": false, "archived": false, @@ -22,6 +23,8 @@ "publicStats": false, "tagId": null, "tags": [], + "webhookIds": [], + "programId": null, "comments": null, "shortLink": "https://dub.sh/sOvvXDT", "qrCode": "https://api.dub.co/qr?url=https://dub.sh/sOvvXDT?qr=1", diff --git a/apps/web/lib/webhook/sample-events/sale-created.json b/apps/web/lib/webhook/sample-events/sale-created.json index e73332ca05..81b4585a23 100644 --- a/apps/web/lib/webhook/sample-events/sale-created.json +++ b/apps/web/lib/webhook/sample-events/sale-created.json @@ -1,41 +1,44 @@ { - "eventName": "Purchased", + "eventName": "Subscription", "customer": { - "id": "cm0gjdvr20001dkbha2n9gt2b", - "name": "John", - "email": "john@example.com", - "avatar": "https://example.com/john.jpeg" + "id": "cm25onzuv0001s1bbxchrc0ae", + "externalId": "cus_jTrfVKYN3Buc3F80JoqBiY0g", + "name": "Rural Red Goldfish", + "email": "rural.red.goldfish@example.com", + "avatar": "https://api.dicebear.com/9.x/notionists/png?seed=cus_jTrfVKYN3Buc3F80JoqBiY0g", + "createdAt": "2024-10-12T04:55:36.007Z" }, "click": { - "id": "d0UtZqE0BZuBPrJS", + "id": "GWGrkftJdYlZD2mq", "url": "https://github.com/dubinc/dub", - "ip": "63.141.57.109", - "continent": "NA", "country": "US", - "city": "San Francisco", + "city": "San Jose", + "region": "sfo1", + "continent": "NA", "device": "Desktop", "browser": "Chrome", "os": "Mac OS", - "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36", - "bot": false, + "referer": "(direct)", + "refererUrl": "(direct)", "qr": false, - "referer": "(direct)" + "ip": "185.211.32.242" }, "link": { - "id": "cm0faqkyn0001txvfwjfeq7gl", + "id": "cm0lcuvtz000xcutmqw4a7wi3", "domain": "dub.sh", - "key": "79ys3WA", - "externalId": null, + "key": "track-test", "url": "https://github.com/dubinc/dub", "trackConversion": true, + "externalId": null, + "tenantId": null, "archived": false, - "expiresAt": null, + "expiresAt": "1970-01-01T00:00:00.000Z", "expiredUrl": null, "password": null, "proxy": false, - "title": null, - "description": null, - "image": null, + "title": "GitHub - dubinc/dub: Open-source link management infrastructure. Loved by modern marketing teams like Vercel, Raycast...", + "description": "Open-source link management infrastructure. Loved by modern marketing teams like Vercel, Raycast, and Perplexity. - dubinc/dub", + "image": "https://repository-images.githubusercontent.com/529708137/419e9be4-a9d1-4c85-9f83-47a78ad92583", "video": null, "rewrite": false, "doIndex": false, @@ -43,28 +46,33 @@ "android": null, "geo": null, "publicStats": false, + "tagId": null, + "tags": [], + "webhookIds": [], "comments": null, - "shortLink": "https://dub.sh/79ys3WA", - "qrCode": "https://api.dub.co/qr?url=https://dub.sh/79ys3WA?qr=1", + "shortLink": "https://dub.sh/track-test", + "qrCode": "https://api.dub.co/qr?url=https://dub.sh/track-test?qr=1", "utm_source": null, "utm_medium": null, "utm_campaign": null, "utm_term": null, "utm_content": null, - "userId": "cm022rkcw0000ikt14mscg9sg", - "workspaceId": "ws_cm022sis60003ikt1syy7kfhl", - "clicks": 10, - "lastClicked": "2024-08-30T07:45:09.000Z", - "leads": 5, - "sales": 1, - "saleAmount": 20000, - "createdAt": "2024-08-29T13:03:59.098Z", - "updatedAt": "2024-08-30T09:57:50.891Z" + "userId": "cludszk1h0000wmd2e0ea2b0p", + "workspaceId": "ws_clrei1gld0002vs9mzn93p8ik", + "clicks": 882, + "lastClicked": "2025-01-14T04:49:10.000Z", + "leads": 3632, + "sales": 2812, + "saleAmount": 290400, + "createdAt": "2024-09-02T18:49:56.136Z", + "updatedAt": "2025-01-14T04:49:30.459Z", + "projectId": "clrei1gld0002vs9mzn93p8ik", + "programId": "prog_CYCu7IMAapjkRpTnr8F1azjN" }, "sale": { - "amount": 4500, + "amount": 100, "currency": "usd", "paymentProcessor": "stripe", - "invoiceId": null + "invoiceId": "INV_AUTi534JCiBUVdYmevCSYQ9G" } } diff --git a/apps/web/package.json b/apps/web/package.json index 56777a8274..b780874a8d 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -143,7 +143,7 @@ "typescript": "^5.4.4", "vite": "5.2.9", "vite-tsconfig-paths": "^4.3.2", - "vitest": "1.5.0" + "vitest": "2.1.8" }, "browser": { "crypto": false diff --git a/apps/web/tests/setupTests.ts b/apps/web/tests/setupTests.ts new file mode 100644 index 0000000000..f6af3b91a4 --- /dev/null +++ b/apps/web/tests/setupTests.ts @@ -0,0 +1,7 @@ +import crypto from "node:crypto"; + +Object.defineProperty(globalThis, "crypto", { + value: crypto, + writable: false, // Ensure it's not writable + configurable: true, // Allow reconfiguration if needed +}); diff --git a/apps/web/tests/utils/integration.ts b/apps/web/tests/utils/integration.ts index 79cf6566fb..479483b1ec 100644 --- a/apps/web/tests/utils/integration.ts +++ b/apps/web/tests/utils/integration.ts @@ -6,7 +6,7 @@ import { env, integrationTestEnv } from "./env"; interface Resources { user: Pick; - workspace: Pick; + workspace: Pick; apiKey: { token: string }; } @@ -42,6 +42,7 @@ export class IntegrationHarness { id: this.env.E2E_WORKSPACE_ID, slug: "acme", name: "Acme, Inc.", + webhookEnabled: true, }; this.resources = { diff --git a/apps/web/tests/webhooks/index.test.ts b/apps/web/tests/webhooks/index.test.ts new file mode 100644 index 0000000000..c334cbcaa0 --- /dev/null +++ b/apps/web/tests/webhooks/index.test.ts @@ -0,0 +1,104 @@ +import { qstash } from "@/lib/cron"; +import { WebhookTrigger } from "@/lib/types"; +import { WEBHOOK_TRIGGERS } from "@/lib/webhook/constants"; +import { sendWebhooks } from "@/lib/webhook/qstash"; +import { samplePayload } from "@/lib/webhook/sample-events/payload"; +import { + clickWebhookEventSchema, + leadWebhookEventSchema, + saleWebhookEventSchema, +} from "@/lib/webhook/schemas"; +import z from "@/lib/zod"; +import { CustomerSchema } from "@/lib/zod/schemas/customers"; +import { linkEventSchema } from "@/lib/zod/schemas/links"; +import { Message } from "@upstash/qstash/."; +import { WebhookEvent } from "dub/models/components"; +import { describe, expect, it } from "vitest"; + +const webhook = { + id: "wh_IFL4j0toU6RAMz4R7mXjJ6C5", // dummy id + url: "https://webhook.site/30fb66a9-3611-4878-a8c9-49ab4806a2c0", + secret: "whsec_6f9f3a63705c44206ca655813bf91b61", // dummy secret +}; + +const customerSchemaExtended = CustomerSchema.extend({ + createdAt: z.string().transform((str) => new Date(str)), // because the date is in UTC string in JSON +}); + +const leadWebhookEventSchemaExtended = leadWebhookEventSchema.extend({ + customer: customerSchemaExtended, +}); + +const saleWebhookEventSchemaExtended = saleWebhookEventSchema.extend({ + customer: customerSchemaExtended, +}); + +const eventSchemas: Record = { + "link.created": linkEventSchema, + "link.updated": linkEventSchema, + "link.deleted": linkEventSchema, + "link.clicked": clickWebhookEventSchema, + "lead.created": leadWebhookEventSchemaExtended, + "sale.created": saleWebhookEventSchemaExtended, +}; + +describe.concurrent("suite", () => { + WEBHOOK_TRIGGERS.forEach((trigger) => { + it(`webhook event - ${trigger}`, async () => { + await testWebhookEvent(trigger); + }); + }); +}); + +const testWebhookEvent = async (trigger: WebhookTrigger) => { + const data = samplePayload[trigger]; + + const response = await sendWebhooks({ + webhooks: [webhook], + trigger, + data, + }); + + if (!response) { + throw new Error("No response from sendWebhooks"); + } + + const messageId = response[0].messageId; + const qstashMessage = await qstash.messages.get(messageId); + + assertQstashMessage(qstashMessage, data, trigger); +}; + +const assertQstashMessage = async ( + qstashMessage: Message, + body: any, + trigger: WebhookTrigger, +) => { + const callbackUrl = new URL(qstashMessage.callback!); + const failureCallbackUrl = new URL(qstashMessage.failureCallback!); + const receivedBody = JSON.parse(qstashMessage.body!) as WebhookEvent; + + expect(qstashMessage.url).toEqual(webhook.url); + expect(qstashMessage.method).toEqual("POST"); + + expect(callbackUrl.searchParams.get("webhookId")).toEqual(webhook.id); + expect(callbackUrl.searchParams.get("event")).toEqual(trigger); + expect(callbackUrl.searchParams.get("eventId")?.startsWith("evt_")).toBe( + true, + ); + + expect(failureCallbackUrl.searchParams.get("webhookId")).toEqual(webhook.id); + expect(failureCallbackUrl.searchParams.get("event")).toEqual(trigger); + expect( + failureCallbackUrl.searchParams.get("eventId")?.startsWith("evt_"), + ).toBe(true); + + expect(receivedBody.event).toEqual(trigger); + expect(receivedBody.data).toEqual(body); + + expect(eventSchemas[trigger].safeParse(receivedBody.data).success).toBe(true); +}; + +// TODO: +// Assert the signature is correct +// Check the webhook URL received the event diff --git a/apps/web/vitest.config.ts b/apps/web/vitest.config.ts index 78ff229db2..7bc66d0e7a 100644 --- a/apps/web/vitest.config.ts +++ b/apps/web/vitest.config.ts @@ -10,5 +10,6 @@ export default defineConfig({ globals: true, testTimeout: 50000, env: loadEnv("", process.cwd(), ""), + setupFiles: ["./tests/setupTests.ts"], }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5795ee78a4..ebd06e364d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -416,8 +416,8 @@ importers: specifier: ^4.3.2 version: 4.3.2(typescript@5.4.4)(vite@5.2.9) vitest: - specifier: 1.5.0 - version: 1.5.0(@types/node@18.11.9) + specifier: 2.1.8 + version: 2.1.8(@types/node@18.11.9) packages/cli: dependencies: @@ -4835,6 +4835,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.27.8 + dev: false /@jest/source-map@27.5.1: resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} @@ -4961,6 +4962,10 @@ packages: /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: true + /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: @@ -8965,6 +8970,7 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: false /@sindresorhus/is@5.6.0: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} @@ -10550,43 +10556,65 @@ packages: internmap: 2.0.3 dev: false - /@vitest/expect@1.5.0: - resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==} + /@vitest/expect@2.1.8: + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + dependencies: + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + tinyrainbow: 1.2.0 + dev: true + + /@vitest/mocker@2.1.8(vite@5.2.9): + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true dependencies: - '@vitest/spy': 1.5.0 - '@vitest/utils': 1.5.0 - chai: 4.4.1 + '@vitest/spy': 2.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.17 + vite: 5.2.9(@types/node@18.11.9) dev: true - /@vitest/runner@1.5.0: - resolution: {integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==} + /@vitest/pretty-format@2.1.8: + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} dependencies: - '@vitest/utils': 1.5.0 - p-limit: 5.0.0 + tinyrainbow: 1.2.0 + dev: true + + /@vitest/runner@2.1.8: + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + dependencies: + '@vitest/utils': 2.1.8 pathe: 1.1.2 dev: true - /@vitest/snapshot@1.5.0: - resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==} + /@vitest/snapshot@2.1.8: + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} dependencies: - magic-string: 0.30.9 + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.17 pathe: 1.1.2 - pretty-format: 29.7.0 dev: true - /@vitest/spy@1.5.0: - resolution: {integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==} + /@vitest/spy@2.1.8: + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} dependencies: - tinyspy: 2.2.1 + tinyspy: 3.0.2 dev: true - /@vitest/utils@1.5.0: - resolution: {integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==} + /@vitest/utils@2.1.8: + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + '@vitest/pretty-format': 2.1.8 + loupe: 3.1.2 + tinyrainbow: 1.2.0 dev: true /@webassemblyjs/ast@1.11.6: @@ -11079,8 +11107,9 @@ packages: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} dev: false - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} dev: true /ast-types@0.15.2: @@ -11617,17 +11646,15 @@ packages: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + /chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 dev: true /chalk@2.4.2: @@ -11671,10 +11698,9 @@ packages: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} dev: false - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} dev: true /chokidar@3.5.3: @@ -12375,6 +12401,18 @@ packages: dependencies: ms: 2.1.2 + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -12406,11 +12444,9 @@ packages: engines: {node: '>= 16'} dev: false - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 dev: true /deep-extend@0.6.0: @@ -12574,11 +12610,6 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -13027,6 +13058,10 @@ packages: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} dev: false + /es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + dev: true + /es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -13650,26 +13685,16 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true + /expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + dev: true + /expect@27.5.1: resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -14048,10 +14073,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -14085,11 +14106,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -14578,11 +14594,6 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - /hyphen@1.10.6: resolution: {integrity: sha512-fXHXcGFTXOvZTSkPJuGOQf5Lv5T/R2itiiCVPg9LxAje5D00O0pP83yJShFq5V89Ly//Gt6acj7z8pbBr34stw==} dev: false @@ -14978,11 +14989,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -15822,10 +15828,6 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - dev: true - /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -15989,10 +15991,6 @@ packages: engines: {node: '>=6'} hasBin: true - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - /jsondiffpatch@0.6.0: resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -16164,14 +16162,6 @@ packages: engines: {node: '>=6.11.5'} dev: false - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 - dev: true - /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -16293,10 +16283,8 @@ packages: dependencies: js-tokens: 4.0.0 - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 + /loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} dev: true /lowercase-keys@3.0.0: @@ -16338,11 +16326,10 @@ packages: react: 18.2.0 dev: false - /magic-string@0.30.9: - resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} - engines: {node: '>=12'} + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /make-dir@2.1.0: @@ -17393,11 +17380,6 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -17453,15 +17435,6 @@ packages: hasBin: true dev: false - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.5.3 - dev: true - /mnemonist@0.38.3: resolution: {integrity: sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==} dependencies: @@ -17522,7 +17495,6 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false /mssql@10.0.2: resolution: {integrity: sha512-GrQ6gzv2xA7ndOvONyZ++4RZsNkr8qDiIpvuFn2pR3TPiSk/cKdmvOrDU3jWgon7EPj7CPgmDiMh7Hgtft2xLg==} @@ -17918,13 +17890,6 @@ packages: dependencies: path-key: 3.1.1 - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: @@ -18078,13 +18043,6 @@ packages: dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - /open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -18197,13 +18155,6 @@ packages: dependencies: yocto-queue: 0.1.0 - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -18343,11 +18294,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -18367,8 +18313,9 @@ packages: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + /pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} dev: true /peberminta@0.9.0: @@ -18478,14 +18425,6 @@ packages: find-up: 4.1.0 dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.6.1 - pathe: 1.1.2 - dev: true - /possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -18782,6 +18721,7 @@ packages: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 + dev: false /pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} @@ -20456,8 +20396,8 @@ packages: engines: {node: '>= 0.8'} dev: false - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + /std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} dev: true /stdin-discarder@0.1.0: @@ -20638,11 +20578,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -20652,12 +20587,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - /strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - dependencies: - js-tokens: 9.0.0 - dev: true - /stripe@12.12.0: resolution: {integrity: sha512-aM9xfyDryiaf/qSWMtJaTMrlc/he3qyx3aVHMqOZqUiMdgTV6lt7tLpFrU0pG+QURm1LAP9GYZ+EcA17446YoQ==} engines: {node: '>=12.*'} @@ -21014,17 +20943,26 @@ packages: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} dev: false - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} dev: true - /tinypool@0.8.3: - resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + /tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + dev: true + + /tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: true + + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} dev: true - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + /tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} dev: true @@ -21677,10 +21615,6 @@ packages: hasBin: true dev: true - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: true - /uglify-es@3.3.9: resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} engines: {node: '>=0.8.0'} @@ -22131,15 +22065,15 @@ packages: util-deprecate: 1.0.2 dev: false - /vite-node@1.5.0(@types/node@18.11.9): - resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==} + /vite-node@2.1.8(@types/node@18.11.9): + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4 + debug: 4.4.0 + es-module-lexer: 1.6.0 pathe: 1.1.2 - picocolors: 1.0.0 vite: 5.2.9(@types/node@18.11.9) transitivePeerDependencies: - '@types/node' @@ -22204,15 +22138,15 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vitest@1.5.0(@types/node@18.11.9): - resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==} + /vitest@2.1.8(@types/node@18.11.9): + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.5.0 - '@vitest/ui': 1.5.0 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -22230,29 +22164,30 @@ packages: optional: true dependencies: '@types/node': 18.11.9 - '@vitest/expect': 1.5.0 - '@vitest/runner': 1.5.0 - '@vitest/snapshot': 1.5.0 - '@vitest/spy': 1.5.0 - '@vitest/utils': 1.5.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.9 + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.2.9) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.6.0 - tinypool: 0.8.3 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 vite: 5.2.9(@types/node@18.11.9) - vite-node: 1.5.0(@types/node@18.11.9) - why-is-node-running: 2.2.2 + vite-node: 2.1.8(@types/node@18.11.9) + why-is-node-running: 2.3.0 transitivePeerDependencies: - less - lightningcss + - msw - sass - stylus - sugarss @@ -22489,8 +22424,8 @@ packages: dependencies: isexe: 2.0.0 - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true dependencies: @@ -22742,11 +22677,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - /yoga-layout@2.0.1: resolution: {integrity: sha512-tT/oChyDXelLo2A+UVnlW9GU7CsvFMaEnd9kVFsaiCQonFAXd3xrHhkLYu+suwwosrAEQ746xBU+HvYtm1Zs2Q==} dev: false