Openstatus www.openstatus.dev

🧪 move to bun test (#436)

authored by

Thibault Le Ouay and committed by
GitHub
23b17a78 eee0bbbf

+106 -406
+2 -2
apps/server/package.json
··· 7 7 "scripts": { 8 8 "dev": "bun run --hot src/index.ts", 9 9 "start": "NODE_ENV=production bun run src/index.ts", 10 - "test": "vitest run", 10 + "test": "bun test", 11 11 "lint": "eslint \"**/*.ts*\"" 12 12 }, 13 13 "dependencies": { ··· 28 28 }, 29 29 "devDependencies": { 30 30 "@openstatus/tsconfig": "workspace:*", 31 + "bun-types": "1.0.8", 31 32 "dotenv": "16.3.1", 32 - "vitest": "0.34.6", 33 33 "eslint": "8.50.0" 34 34 } 35 35 }
+11 -7
apps/server/src/checker/alerting.test.ts
··· 1 - import { expect, it, vi } from "vitest"; 1 + import { expect, mock, test } from "bun:test"; 2 2 3 3 import { triggerAlerting } from "./alerting"; 4 - import * as utils from "./utils"; 5 4 6 - it("should send email notification", async () => { 7 - vi.mock("utils"); 8 - const mockedFn = vi.fn(); 9 - utils.providerToFunction["email"] = mockedFn; 5 + test("should send email notification", async () => { 6 + const fn = mock(() => {}); 7 + mock.module("./utils.ts", () => { 8 + return { 9 + providerToFunction: { 10 + email: fn, 11 + }, 12 + }; 13 + }); 10 14 await triggerAlerting({ monitorId: "1" }); 11 - expect(mockedFn).toHaveBeenCalledTimes(1); 15 + expect(fn).toHaveBeenCalled(); 12 16 });
+29 -25
apps/server/src/checker/checker.test.ts
··· 1 - /* eslint-disable @typescript-eslint/no-unused-vars */ 2 - /* eslint-disable @typescript-eslint/ban-ts-comment */ 3 - import { expect, it, vi } from "vitest"; 4 - 5 - // REMINDER: keep it here for the mock 6 - import type { Tinybird } from "@openstatus/tinybird"; 7 - import { 8 - publishPingResponse, 9 - tbIngestPingResponse, 10 - } from "@openstatus/tinybird"; 1 + import { expect, mock, test } from "bun:test"; 11 2 12 - import * as alerts from "./alerting"; 13 3 import { checkerRetryPolicy } from "./checker"; 14 4 15 - vi.mock("@openstatus/tinybird", async () => { 16 - const actual = await vi.importActual("@openstatus/tinybird"); 5 + mock.module("./ping.ts", () => { 17 6 return { 18 - // @ts-ignore 19 - ...actual, 20 - publishPingResponse: vi.fn().mockResolvedValue({ successful_rows: 1 }), 7 + publishPing: () => {}, 21 8 }; 22 9 }); 23 10 24 - it("should call updateMonitorStatus when we can fetch", async () => { 25 - const spyOn = vi.spyOn(alerts, "updateMonitorStatus").mockReturnThis(); 11 + test("should call updateMonitorStatus when we can fetch", async () => { 12 + const fn = mock(() => {}); 13 + 14 + mock.module("./alerting.ts", () => { 15 + return { 16 + updateMonitorStatus: fn, 17 + }; 18 + }); 26 19 await checkerRetryPolicy({ 27 20 workspaceId: "1", 28 21 monitorId: "1", ··· 32 25 pageIds: [], 33 26 method: "GET", 34 27 }); 35 - expect(spyOn).toHaveBeenCalledTimes(1); 28 + expect(fn).toHaveBeenCalledTimes(1); 36 29 }); 37 30 38 - it("should call updateMonitorStatus when status error", async () => { 39 - const spyOn = vi.spyOn(alerts, "updateMonitorStatus").mockReturnThis(); 31 + test("should call updateMonitorStatus when status error", async () => { 32 + const fn = mock(() => {}); 33 + 34 + mock.module("./alerting.ts", () => { 35 + return { 36 + updateMonitorStatus: fn, 37 + }; 38 + }); 40 39 try { 41 40 await checkerRetryPolicy({ 42 41 workspaceId: "1", ··· 50 49 } catch (e) { 51 50 expect(e).toBeInstanceOf(Error); 52 51 } 53 - expect(spyOn).toHaveBeenCalledTimes(1); 52 + expect(fn).toHaveBeenCalledTimes(1); 54 53 }); 55 54 56 - it("What should we do when redirect ", async () => { 57 - const spyOn = vi.spyOn(alerts, "updateMonitorStatus").mockReturnThis(); 55 + test("What should we do when redirect ", async () => { 56 + const fn = mock(() => {}); 58 57 58 + mock.module("./alerting.ts", () => { 59 + return { 60 + updateMonitorStatus: fn, 61 + }; 62 + }); 59 63 try { 60 64 await checkerRetryPolicy({ 61 65 workspaceId: "1", ··· 69 73 } catch (e) { 70 74 expect(e).toBeInstanceOf(Error); 71 75 } 72 - expect(spyOn).toHaveBeenCalledTimes(0); 76 + expect(fn).toHaveBeenCalledTimes(0); 73 77 });
+5 -5
apps/server/src/v1/monitor.test.ts
··· 1 - import { expect, it } from "vitest"; 1 + import { expect, test } from "bun:test"; 2 2 3 3 import { api } from "."; 4 4 5 - it("GET one monitor", async () => { 5 + test("GET one monitor", async () => { 6 6 const res = await api.request("/monitor/1", { 7 7 headers: { 8 8 "x-openstatus-key": "1", ··· 10 10 }); 11 11 expect(res.status).toBe(200); 12 12 13 - expect(await res.json()).toEqual({ 13 + expect(await res.json()).toMatchObject({ 14 14 id: 1, 15 15 periodicity: "1m", 16 16 url: "https://www.openstatus.dev", ··· 24 24 }); 25 25 }); 26 26 27 - it("GET all monitor", async () => { 27 + test("GET all monitor", async () => { 28 28 const res = await api.request("/monitor", { 29 29 headers: { 30 30 "x-openstatus-key": "1", ··· 32 32 }); 33 33 expect(res.status).toBe(200); 34 34 35 - expect(await res.json()).toEqual([ 35 + expect(await res.json()).toMatchObject([ 36 36 { 37 37 id: 1, 38 38 periodicity: "1m",
+4 -1
apps/server/tsconfig.json
··· 1 1 { 2 2 "extends": "@openstatus/tsconfig/base.json", 3 - "include": ["src", "*.ts", "**/*.ts"] 3 + "include": ["src", "*.ts", "**/*.ts"], 4 + "compilerOptions": { 5 + "types": ["bun-types"] 6 + } 4 7 }
-11
apps/server/vitest.config.ts
··· 1 - import { defineConfig } from "vitest/config"; 2 - 3 - export default defineConfig({ 4 - test: { 5 - // setupFiles: ["dotenv/config"], //this line, 6 - globals: true, 7 - }, 8 - define: { 9 - "process.env.FLY_REGION": `"ams"`, 10 - }, 11 - });
+2
apps/web/src/app/_components/input-search.tsx
··· 1 + /// <reference lib="dom" /> 2 + 1 3 "use client"; 2 4 3 5 import React, { useEffect, useMemo, useRef, useState } from "react";
+2 -2
packages/api/package.json
··· 4 4 "description": "", 5 5 "main": "index.ts", 6 6 "scripts": { 7 - "test": "vitest run" 7 + "test": "bun test" 8 8 }, 9 9 "dependencies": { 10 10 "@clerk/nextjs": "4.25.1", ··· 24 24 "devDependencies": { 25 25 "@openstatus/tsconfig": "workspace:*", 26 26 "typescript": "5.2.2", 27 - "vitest": "0.34.6" 27 + "bun-types": "1.0.8" 28 28 }, 29 29 "keywords": [], 30 30 "author": "",
+6 -7
packages/api/src/router/page.test.ts
··· 1 - import { expect, test, vi } from "vitest"; 1 + import { expect, test } from "bun:test"; 2 2 3 3 import { edgeRouter } from "../edge"; 4 - import { createTRPCContext } from "../trpc"; 4 + import { createInnerTRPCContext } from "../trpc"; 5 5 6 - vi.mock("@clerk/nextjs/server"); 7 6 test("Get Test Page", async () => { 8 - const ctx = createTRPCContext({ 7 + const ctx = createInnerTRPCContext({ 8 + req: undefined, 9 9 // @ts-expect-error 10 - req: {}, 11 10 auth: { 12 11 userId: "1", 13 12 sessionId: "1", ··· 45 44 }); 46 45 47 46 test("No Page", async () => { 48 - const ctx = createTRPCContext({ 47 + const ctx = createInnerTRPCContext({ 48 + req: undefined, 49 49 // @ts-expect-error 50 - req: {}, 51 50 auth: { 52 51 userId: "1", 53 52 sessionId: "1",
+24 -12
packages/api/src/router/workspace.test.ts
··· 1 - import { expect, test, vi } from "vitest"; 1 + import { expect, test } from "bun:test"; 2 2 3 3 import { edgeRouter } from "../edge"; 4 - import { createTRPCContext } from "../trpc"; 4 + import { createInnerTRPCContext } from "../trpc"; 5 5 6 - vi.mock("@clerk/nextjs/server"); 7 6 test("Get Test Workspace", async () => { 8 - const ctx = createTRPCContext({ 7 + const ctx = createInnerTRPCContext({ 8 + req: undefined, 9 9 // @ts-expect-error 10 - req: {}, 11 10 auth: { 12 11 userId: "1", 13 12 sessionId: "1", 14 13 }, 14 + //@ts-expect-error 15 15 workspace: { 16 16 id: 1, 17 17 }, ··· 20 20 const caller = edgeRouter.createCaller(ctx); 21 21 const result = await caller.workspace.getWorkspace(); 22 22 23 - expect(result).toEqual({ 23 + expect(result).toMatchObject({ 24 24 id: 1, 25 25 slug: "test", 26 26 name: "test", ··· 34 34 }); 35 35 }); 36 36 37 - test("No workspace", async () => { 38 - const ctx = createTRPCContext({ 37 + test("by default we get the first workspace", async () => { 38 + const ctx = createInnerTRPCContext({ 39 + req: undefined, 39 40 // @ts-expect-error 40 - req: {}, 41 41 auth: { 42 42 userId: "1", 43 43 sessionId: "1", ··· 47 47 48 48 const caller = edgeRouter.createCaller(ctx); 49 49 const result = await caller.workspace.getWorkspace(); 50 - expect(result).toBeUndefined(); 50 + 51 + expect(result).toMatchObject({ 52 + id: 1, 53 + slug: "test", 54 + name: "test", 55 + plan: "free", 56 + paidUntil: null, 57 + stripeId: "stripeId", 58 + subscriptionId: "subscriptionId", 59 + updatedAt: expect.any(Date), 60 + createdAt: expect.any(Date), 61 + endsAt: null, 62 + }); 51 63 }); 52 64 53 65 test("All workspaces", async () => { 54 - const ctx = createTRPCContext({ 66 + const ctx = createInnerTRPCContext({ 67 + req: undefined, 55 68 // @ts-expect-error 56 - req: {}, 57 69 auth: { 58 70 userId: "1", 59 71 sessionId: "1",
packages/api/src/utils.ts

This is a binary file and will not be displayed.

+4 -1
packages/api/tsconfig.json
··· 1 1 { 2 2 "extends": "@openstatus/tsconfig/nextjs.json", 3 - "include": ["src", "*.ts"] 3 + "include": ["src", "*.ts"], 4 + "compilerOptions": { 5 + "types": ["bun-types"] 6 + } 4 7 }
-17
packages/api/vitest.config.ts
··· 1 - import { fileURLToPath } from "url"; 2 - import { configDefaults, defineConfig } from "vitest/config"; 3 - 4 - export default defineConfig(() => { 5 - // import.meta.env.DATABASE_URL = 6 - // "postgres://postgres:postgres@localhost:5432/postgres"; 7 - return { 8 - test: { 9 - setupFiles: "dotenv/config", // load variables form .env file 10 - globals: true, 11 - exclude: [...configDefaults.exclude, "**/playwright/**"], 12 - alias: { 13 - "~/": fileURLToPath(new URL("./src/", import.meta.url)), 14 - }, 15 - }, 16 - }; 17 - });
+17 -316
pnpm-lock.yaml
··· 83 83 '@openstatus/tsconfig': 84 84 specifier: workspace:* 85 85 version: link:../../packages/tsconfig 86 + bun-types: 87 + specifier: 1.0.8 88 + version: 1.0.8 86 89 dotenv: 87 90 specifier: 16.3.1 88 91 version: 16.3.1 89 92 eslint: 90 93 specifier: 8.50.0 91 94 version: 8.50.0 92 - vitest: 93 - specifier: 0.34.6 94 - version: 0.34.6 95 95 96 96 apps/web: 97 97 dependencies: ··· 392 392 '@openstatus/tsconfig': 393 393 specifier: workspace:* 394 394 version: link:../tsconfig 395 + bun-types: 396 + specifier: 1.0.8 397 + version: 1.0.8 395 398 typescript: 396 399 specifier: 5.2.2 397 400 version: 5.2.2 398 - vitest: 399 - specifier: 0.34.6 400 - version: 0.34.6 401 401 402 402 packages/config/eslint: 403 403 dependencies: ··· 2312 2312 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2313 2313 dependencies: 2314 2314 '@sinclair/typebox': 0.27.8 2315 + dev: false 2315 2316 2316 2317 /@jest/types@29.6.3: 2317 2318 resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} ··· 4652 4653 4653 4654 /@sinclair/typebox@0.27.8: 4654 4655 resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 4656 + dev: false 4655 4657 4656 4658 /@sinonjs/commons@3.0.0: 4657 4659 resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} ··· 4910 4912 resolution: {integrity: sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g==} 4911 4913 dev: false 4912 4914 4913 - /@types/chai-subset@1.3.4: 4914 - resolution: {integrity: sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg==} 4915 - dependencies: 4916 - '@types/chai': 4.3.9 4917 - dev: true 4918 - 4919 - /@types/chai@4.3.9: 4920 - resolution: {integrity: sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==} 4921 - dev: true 4922 - 4923 4915 /@types/connect@3.4.37: 4924 4916 resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} 4925 4917 dependencies: ··· 5425 5417 - utf-8-validate 5426 5418 dev: false 5427 5419 5428 - /@vitest/expect@0.34.6: 5429 - resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} 5430 - dependencies: 5431 - '@vitest/spy': 0.34.6 5432 - '@vitest/utils': 0.34.6 5433 - chai: 4.3.10 5434 - dev: true 5435 - 5436 - /@vitest/runner@0.34.6: 5437 - resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} 5438 - dependencies: 5439 - '@vitest/utils': 0.34.6 5440 - p-limit: 4.0.0 5441 - pathe: 1.1.1 5442 - dev: true 5443 - 5444 - /@vitest/snapshot@0.34.6: 5445 - resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} 5446 - dependencies: 5447 - magic-string: 0.30.5 5448 - pathe: 1.1.1 5449 - pretty-format: 29.7.0 5450 - dev: true 5451 - 5452 - /@vitest/spy@0.34.6: 5453 - resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} 5454 - dependencies: 5455 - tinyspy: 2.2.0 5456 - dev: true 5457 - 5458 - /@vitest/utils@0.34.6: 5459 - resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} 5460 - dependencies: 5461 - diff-sequences: 29.6.3 5462 - loupe: 2.3.7 5463 - pretty-format: 29.7.0 5464 - dev: true 5465 - 5466 5420 /abab@2.0.6: 5467 5421 resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} 5468 5422 dev: false ··· 5602 5556 /ansi-styles@5.2.0: 5603 5557 resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 5604 5558 engines: {node: '>=10'} 5559 + dev: false 5605 5560 5606 5561 /any-promise@1.3.0: 5607 5562 resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} ··· 5730 5685 tslib: 2.6.2 5731 5686 dev: false 5732 5687 5733 - /assertion-error@1.1.0: 5734 - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 5735 - dev: true 5736 - 5737 5688 /ast-types-flow@0.0.7: 5738 5689 resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} 5739 5690 dev: false ··· 5918 5869 semver: 7.5.4 5919 5870 dev: true 5920 5871 5872 + /bun-types@1.0.8: 5873 + resolution: {integrity: sha512-2dNB+dBwAcFW7RSd4y5vKycRjouKVklSwPk4EjBKWvcMYUBOqZGGNzV7+b2tfKBG3BeRXnozbnegVKR1azuATg==} 5874 + dev: true 5875 + 5921 5876 /bundle-require@4.0.2(esbuild@0.18.20): 5922 5877 resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} 5923 5878 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} ··· 5998 5953 5999 5954 /ccount@2.0.1: 6000 5955 resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 6001 - 6002 - /chai@4.3.10: 6003 - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} 6004 - engines: {node: '>=4'} 6005 - dependencies: 6006 - assertion-error: 1.1.0 6007 - check-error: 1.0.3 6008 - deep-eql: 4.1.3 6009 - get-func-name: 2.0.2 6010 - loupe: 2.3.7 6011 - pathval: 1.1.1 6012 - type-detect: 4.0.8 6013 - dev: true 6014 5956 6015 5957 /chainsaw@0.1.0: 6016 5958 resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} ··· 6088 6030 resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 6089 6031 dev: true 6090 6032 6091 - /check-error@1.0.3: 6092 - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} 6093 - dependencies: 6094 - get-func-name: 2.0.2 6095 - dev: true 6096 - 6097 6033 /chokidar@3.5.3: 6098 6034 resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 6099 6035 engines: {node: '>= 8.10.0'} ··· 6543 6479 mimic-response: 3.1.0 6544 6480 dev: false 6545 6481 6546 - /deep-eql@4.1.3: 6547 - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} 6548 - engines: {node: '>=6'} 6549 - dependencies: 6550 - type-detect: 4.0.8 6551 - dev: true 6552 - 6553 6482 /deep-extend@0.6.0: 6554 6483 resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 6555 6484 engines: {node: '>=4.0.0'} ··· 6663 6592 6664 6593 /didyoumean@1.2.2: 6665 6594 resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 6666 - 6667 - /diff-sequences@29.6.3: 6668 - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 6669 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 6670 - dev: true 6671 6595 6672 6596 /diff@4.0.2: 6673 6597 resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} ··· 7879 7803 engines: {node: 6.* || 8.* || >= 10.*} 7880 7804 dev: false 7881 7805 7882 - /get-func-name@2.0.2: 7883 - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 7884 - dev: true 7885 - 7886 7806 /get-intrinsic@1.2.1: 7887 7807 resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 7888 7808 dependencies: ··· 9139 9059 9140 9060 /jsonc-parser@3.2.0: 9141 9061 resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} 9062 + dev: false 9142 9063 9143 9064 /jsonfile@4.0.0: 9144 9065 resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} ··· 9241 9162 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 9242 9163 dev: true 9243 9164 9244 - /local-pkg@0.4.3: 9245 - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} 9246 - engines: {node: '>=14'} 9247 - dev: true 9248 - 9249 9165 /localforage@1.10.0: 9250 9166 resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} 9251 9167 dependencies: ··· 9315 9231 dependencies: 9316 9232 js-tokens: 4.0.0 9317 9233 9318 - /loupe@2.3.7: 9319 - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} 9320 - dependencies: 9321 - get-func-name: 2.0.2 9322 - dev: true 9323 - 9324 9234 /lower-case-first@1.0.2: 9325 9235 resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} 9326 9236 dependencies: ··· 9382 9292 dependencies: 9383 9293 '@jridgewell/sourcemap-codec': 1.4.15 9384 9294 dev: false 9385 - 9386 - /magic-string@0.30.5: 9387 - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} 9388 - engines: {node: '>=12'} 9389 - dependencies: 9390 - '@jridgewell/sourcemap-codec': 1.4.15 9391 - dev: true 9392 9295 9393 9296 /make-error@1.3.6: 9394 9297 resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} ··· 10042 9945 dependencies: 10043 9946 minimist: 1.2.8 10044 9947 10045 - /mlly@1.4.2: 10046 - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} 10047 - dependencies: 10048 - acorn: 8.10.0 10049 - pathe: 1.1.1 10050 - pkg-types: 1.0.3 10051 - ufo: 1.3.1 10052 - dev: true 10053 - 10054 9948 /mri@1.2.0: 10055 9949 resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 10056 9950 engines: {node: '>=4'} ··· 10429 10323 dependencies: 10430 10324 yocto-queue: 0.1.0 10431 10325 10432 - /p-limit@4.0.0: 10433 - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} 10434 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 10435 - dependencies: 10436 - yocto-queue: 1.0.0 10437 - dev: true 10438 - 10439 10326 /p-locate@4.1.0: 10440 10327 resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 10441 10328 engines: {node: '>=8'} ··· 10585 10472 resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 10586 10473 engines: {node: '>=8'} 10587 10474 10588 - /pathe@1.1.1: 10589 - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} 10590 - dev: true 10591 - 10592 - /pathval@1.1.1: 10593 - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 10594 - dev: true 10595 - 10596 10475 /peberminta@0.8.0: 10597 10476 resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} 10598 10477 dev: false ··· 10625 10504 resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 10626 10505 engines: {node: '>= 6'} 10627 10506 10628 - /pkg-types@1.0.3: 10629 - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} 10630 - dependencies: 10631 - jsonc-parser: 3.2.0 10632 - mlly: 1.4.2 10633 - pathe: 1.1.1 10634 - dev: true 10635 - 10636 10507 /postcss-css-variables@0.18.0(postcss@8.4.21): 10637 10508 resolution: {integrity: sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q==} 10638 10509 peerDependencies: ··· 10878 10749 '@jest/schemas': 29.6.3 10879 10750 ansi-styles: 5.2.0 10880 10751 react-is: 18.2.0 10752 + dev: false 10881 10753 10882 10754 /pretty@2.0.0: 10883 10755 resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} ··· 11090 10962 11091 10963 /react-is@18.2.0: 11092 10964 resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 10965 + dev: false 11093 10966 11094 10967 /react-lifecycles-compat@3.0.4: 11095 10968 resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} ··· 11768 11641 object-inspect: 1.13.1 11769 11642 dev: false 11770 11643 11771 - /siginfo@2.0.0: 11772 - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 11773 - dev: true 11774 - 11775 11644 /signal-exit@3.0.7: 11776 11645 resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 11777 11646 ··· 11918 11787 dependencies: 11919 11788 escape-string-regexp: 2.0.0 11920 11789 dev: false 11921 - 11922 - /stackback@0.0.2: 11923 - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 11924 - dev: true 11925 11790 11926 11791 /stacktrace-parser@0.1.10: 11927 11792 resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} ··· 11935 11800 engines: {node: '>= 0.6'} 11936 11801 dev: false 11937 11802 11938 - /std-env@3.4.3: 11939 - resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} 11940 - dev: true 11941 - 11942 11803 /stream-events@1.0.5: 11943 11804 resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} 11944 11805 dependencies: ··· 12045 11906 /strip-json-comments@3.1.1: 12046 11907 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 12047 11908 engines: {node: '>=8'} 12048 - 12049 - /strip-literal@1.3.0: 12050 - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} 12051 - dependencies: 12052 - acorn: 8.10.0 12053 - dev: true 12054 11909 12055 11910 /stripe@13.8.0: 12056 11911 resolution: {integrity: sha512-QFOOeaEwNOAj4k/T9OtSb9sKx9oLVI5y9HrJJn3XN9RJYKGAuE+fMD+rHA5u9ILmf3FDx99jaEvVvykftJtBGA==} ··· 12335 12190 resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} 12336 12191 dev: false 12337 12192 12338 - /tinybench@2.5.1: 12339 - resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} 12340 - dev: true 12341 - 12342 - /tinypool@0.7.0: 12343 - resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} 12344 - engines: {node: '>=14.0.0'} 12345 - dev: true 12346 - 12347 - /tinyspy@2.2.0: 12348 - resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} 12349 - engines: {node: '>=14.0.0'} 12350 - dev: true 12351 - 12352 12193 /title-case@2.1.1: 12353 12194 resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} 12354 12195 dependencies: ··· 12654 12495 /type-detect@4.0.8: 12655 12496 resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 12656 12497 engines: {node: '>=4'} 12498 + dev: false 12657 12499 12658 12500 /type-fest@0.20.2: 12659 12501 resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} ··· 12745 12587 engines: {node: '>=14.17'} 12746 12588 hasBin: true 12747 12589 12748 - /ufo@1.3.1: 12749 - resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} 12750 - dev: true 12751 - 12752 12590 /uglify-js@3.17.4: 12753 12591 resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} 12754 12592 engines: {node: '>=0.8.0'} ··· 13049 12887 d3-timer: 3.0.1 13050 12888 dev: false 13051 12889 13052 - /vite-node@0.34.6(@types/node@20.8.0): 13053 - resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} 13054 - engines: {node: '>=v14.18.0'} 13055 - hasBin: true 13056 - dependencies: 13057 - cac: 6.7.14 13058 - debug: 4.3.4 13059 - mlly: 1.4.2 13060 - pathe: 1.1.1 13061 - picocolors: 1.0.0 13062 - vite: 4.5.0(@types/node@20.8.0) 13063 - transitivePeerDependencies: 13064 - - '@types/node' 13065 - - less 13066 - - lightningcss 13067 - - sass 13068 - - stylus 13069 - - sugarss 13070 - - supports-color 13071 - - terser 13072 - dev: true 13073 - 13074 - /vite@4.5.0(@types/node@20.8.0): 13075 - resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} 13076 - engines: {node: ^14.18.0 || >=16.0.0} 13077 - hasBin: true 13078 - peerDependencies: 13079 - '@types/node': '>= 14' 13080 - less: '*' 13081 - lightningcss: ^1.21.0 13082 - sass: '*' 13083 - stylus: '*' 13084 - sugarss: '*' 13085 - terser: ^5.4.0 13086 - peerDependenciesMeta: 13087 - '@types/node': 13088 - optional: true 13089 - less: 13090 - optional: true 13091 - lightningcss: 13092 - optional: true 13093 - sass: 13094 - optional: true 13095 - stylus: 13096 - optional: true 13097 - sugarss: 13098 - optional: true 13099 - terser: 13100 - optional: true 13101 - dependencies: 13102 - '@types/node': 20.8.0 13103 - esbuild: 0.18.20 13104 - postcss: 8.4.31 13105 - rollup: 3.29.4 13106 - optionalDependencies: 13107 - fsevents: 2.3.3 13108 - dev: true 13109 - 13110 - /vitest@0.34.6: 13111 - resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} 13112 - engines: {node: '>=v14.18.0'} 13113 - hasBin: true 13114 - peerDependencies: 13115 - '@edge-runtime/vm': '*' 13116 - '@vitest/browser': '*' 13117 - '@vitest/ui': '*' 13118 - happy-dom: '*' 13119 - jsdom: '*' 13120 - playwright: '*' 13121 - safaridriver: '*' 13122 - webdriverio: '*' 13123 - peerDependenciesMeta: 13124 - '@edge-runtime/vm': 13125 - optional: true 13126 - '@vitest/browser': 13127 - optional: true 13128 - '@vitest/ui': 13129 - optional: true 13130 - happy-dom: 13131 - optional: true 13132 - jsdom: 13133 - optional: true 13134 - playwright: 13135 - optional: true 13136 - safaridriver: 13137 - optional: true 13138 - webdriverio: 13139 - optional: true 13140 - dependencies: 13141 - '@types/chai': 4.3.9 13142 - '@types/chai-subset': 1.3.4 13143 - '@types/node': 20.8.0 13144 - '@vitest/expect': 0.34.6 13145 - '@vitest/runner': 0.34.6 13146 - '@vitest/snapshot': 0.34.6 13147 - '@vitest/spy': 0.34.6 13148 - '@vitest/utils': 0.34.6 13149 - acorn: 8.10.0 13150 - acorn-walk: 8.2.0 13151 - cac: 6.7.14 13152 - chai: 4.3.10 13153 - debug: 4.3.4 13154 - local-pkg: 0.4.3 13155 - magic-string: 0.30.5 13156 - pathe: 1.1.1 13157 - picocolors: 1.0.0 13158 - std-env: 3.4.3 13159 - strip-literal: 1.3.0 13160 - tinybench: 2.5.1 13161 - tinypool: 0.7.0 13162 - vite: 4.5.0(@types/node@20.8.0) 13163 - vite-node: 0.34.6(@types/node@20.8.0) 13164 - why-is-node-running: 2.2.2 13165 - transitivePeerDependencies: 13166 - - less 13167 - - lightningcss 13168 - - sass 13169 - - stylus 13170 - - sugarss 13171 - - supports-color 13172 - - terser 13173 - dev: true 13174 - 13175 12890 /vscode-oniguruma@1.7.0: 13176 12891 resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} 13177 12892 dev: false ··· 13330 13045 dependencies: 13331 13046 isexe: 2.0.0 13332 13047 13333 - /why-is-node-running@2.2.2: 13334 - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} 13335 - engines: {node: '>=8'} 13336 - hasBin: true 13337 - dependencies: 13338 - siginfo: 2.0.0 13339 - stackback: 0.0.2 13340 - dev: true 13341 - 13342 13048 /wordwrap@1.0.0: 13343 13049 resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} 13344 13050 dev: true ··· 13440 13146 /yocto-queue@0.1.0: 13441 13147 resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 13442 13148 engines: {node: '>=10'} 13443 - 13444 - /yocto-queue@1.0.0: 13445 - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} 13446 - engines: {node: '>=12.20'} 13447 - dev: true 13448 13149 13449 13150 /zod@3.21.4: 13450 13151 resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}