Openstatus www.openstatus.dev

refactor(api): improve api and error handling (#848)

* wip:

* [ Enhance ] Status Report Endpoint to Support Additional Params and Return Neccessary Details (#760)

* enhance: create, get and get-all status report endpoints

* enhance: update status report endpoint with error handling

* fix: create report to handle non exisiting monitor and pages id

* test: added more data for seeding database

* fix: update report to give appriopriate error message and code

* test: added test for statusReport

* enhance: seeding to insert multiple records

* fix: openapi defination to have optional field

* fix: eslint warnings

* fix: create report date issue

* fix(test): status page router

* fix: statusReportUpdate endpoint test

* fix: more status report cases

* fix: all statusReport test

* ๐Ÿ”ฅ Improve rum page (#843)

* ๐Ÿšง wip rum

* ๐Ÿšง wip rum

* ๐Ÿšง wip rum

* ๐Ÿšง wip rum

* ๐Ÿ”ฅ rum

* ๐Ÿ”ฅ feat: posthog (#842)

* feat: posthog

* wip:

* fix: suspense issue

* ๐Ÿš€ post hog

* ๐Ÿš€ post hog

---------

Co-authored-by: Thibault Le Ouay <thibaultleouay@gmail.Com>

* ๐ŸŒ improve metadata

* ๐ŸŒ improve metadata

* ๐ŸŽฅ add video (#844)

* ๐Ÿ› fix badge size (#845)

* ๐Ÿ”ฅ Add inp (#846)

* ๐Ÿšง wip rum

* ๐Ÿšง wip rum

* ๐Ÿšง wip rum

---------

Co-authored-by: Thibault Le Ouay <thibaultleouay@gmail.Com>
Co-authored-by: Maximilian Kaske <56969857+mxkaske@users.noreply.github.com>
Co-authored-by: mxkaske <maximilian@kaske.org>

* wip:

* fix: tb client

* fix: register notification api

* fix: tests

* chore: improve middleware

* chore: include handle zod error

* feat: include docs

* chore: change api reference page order

* fix: test race condition

* chore: deprecate enpoint

* chore: small stuff

* chore: small stuff

* chore: typo

* chore: small stuff

* docs: update error pages

---------

Co-authored-by: Nabhag Motivaras <65061890+Nabhag8848@users.noreply.github.com>
Co-authored-by: Thibault Le Ouay <thibaultleouay@gmail.Com>

+7365 -3262
+14
apps/docs/api-reference/errors/code/BAD_REQUEST.mdx
··· 1 + --- 2 + title: BAD_REQUEST 3 + openapi-schema: ErrBadRequest 4 + --- 5 + 6 + ## Problem 7 + 8 + The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). 9 + 10 + ## Solution 11 + 12 + Check the request response and making sure it's correct. 13 + 14 + If that doesn't help, ask for help on [Discord](https://openstatus.dev/discord).
+14
apps/docs/api-reference/errors/code/CONFLICT.mdx
··· 1 + --- 2 + title: CONFLICT 3 + openapi-schema: ErrConflict 4 + --- 5 + 6 + ## Problem 7 + 8 + The request could not be completed due to a conflict most likely due to unique constraints like subdomain slugs. 9 + 10 + ## Solution 11 + 12 + Make sure to send a unique value for the conflicting field. 13 + 14 + If that doesn't help, ask for help on [Discord](https://openstatus.dev/discord).
+14
apps/docs/api-reference/errors/code/FORBIDDEN.mdx
··· 1 + --- 2 + title: FORBIDDEN 3 + openapi-schema: ErrForbidden 4 + --- 5 + 6 + ## Problem 7 + 8 + The server understood the request, but is refusing to fulfill it. Authorization will not help. That most likely indicates your account doesn't have the necessary permissions to execute the request. 9 + 10 + ## Solution 11 + 12 + Make sure you have the necessary permissions to execute the request. You might want to upgrade your workspace plan. 13 + 14 + If that doesn't help, ask for help on [Discord](https://openstatus.dev/discord).
+14
apps/docs/api-reference/errors/code/INTERNAL_SERVER_ERROR.mdx
··· 1 + --- 2 + title: INTERNAL_SERVER_ERROR 3 + openapi-schema: ErrInternalServerError 4 + --- 5 + 6 + ## Problem 7 + 8 + The server encountered an unexpected condition that prevented it from fulfilling the request. 9 + 10 + ## Solution 11 + 12 + Please try again. 13 + 14 + If that doesn't help, ask for help on [Discord](https://openstatus.dev/discord).
+14
apps/docs/api-reference/errors/code/NOT_FOUND.mdx
··· 1 + --- 2 + title: NOT_FOUND 3 + openapi-schema: ErrNotFound 4 + --- 5 + 6 + ## Problem 7 + 8 + The requested resource could not be found. You might not be eligible to access the resource or the resource might not exist. 9 + 10 + ## Solution 11 + 12 + Make sure you're sending the correct request to the correct endpoint. 13 + 14 + If that doesn't help, ask for help on [Discord](https://openstatus.dev/discord).
+14
apps/docs/api-reference/errors/code/UNAUTHORIZED.mdx
··· 1 + --- 2 + title: UNAUTHORIZED 3 + openapi-schema: ErrUnauthorized 4 + --- 5 + 6 + ## Problem 7 + 8 + The request has not been applied because it lacks valid authentication credentials for the target resource. 9 + 10 + ## Solution 11 + 12 + Make sure you're sending the correct authentication credentials with your request. 13 + 14 + If that doesn't help, ask for help on [Discord](https://openstatus.dev/discord).
+2
apps/docs/api-reference/status_report/post-status_report-id/update.mdx
··· 2 2 title: Create Status Report Update 3 3 openapi: post /status_report/:id/update 4 4 --- 5 + 6 + That endpoint is `@deprecated` in favor of [`/status_report_update`](/api-reference/status_report_update/post-status_report_update/) **POST** request.
+28 -17
apps/docs/mint.json
··· 134 134 "pages": [ 135 135 "api-reference/auth", 136 136 { 137 - "group": "Incident", 138 - "pages": [ 139 - "api-reference/incident/get-incident-id", 140 - "api-reference/incident/get-incident", 141 - "api-reference/incident/put-incident-id" 142 - ] 143 - }, 144 - { 145 137 "group": "Monitor", 146 138 "pages": [ 147 139 "api-reference/monitor/get-monitor-id", ··· 152 144 ] 153 145 }, 154 146 { 155 - "group": "Notification", 156 - "pages": [ 157 - "api-reference/notification/get-notification", 158 - "api-reference/notification/get-notification-id", 159 - "api-reference/notification/post-notification" 160 - ] 161 - }, 162 - { 163 147 "group": "Status Page", 164 148 "pages": [ 165 149 "api-reference/page/get-page", ··· 180 164 ] 181 165 }, 182 166 { 183 - "group": "Status Report Udpate", 167 + "group": "Status Report Update", 184 168 "pages": [ 185 169 "api-reference/status_report_update/get-status_report_update-id", 186 170 "api-reference/status_report_update/post-status_report_update" 171 + ] 172 + }, 173 + { 174 + "group": "Notification", 175 + "pages": [ 176 + "api-reference/notification/get-notification", 177 + "api-reference/notification/get-notification-id", 178 + "api-reference/notification/post-notification" 179 + ] 180 + }, 181 + { 182 + "group": "Incident", 183 + "pages": [ 184 + "api-reference/incident/get-incident-id", 185 + "api-reference/incident/get-incident", 186 + "api-reference/incident/put-incident-id" 187 + ] 188 + }, 189 + { 190 + "group": "Errors", 191 + "pages": [ 192 + "api-reference/errors/code/BAD_REQUEST", 193 + "api-reference/errors/code/UNAUTHORIZED", 194 + "api-reference/errors/code/FORBIDDEN", 195 + "api-reference/errors/code/NOT_FOUND", 196 + "api-reference/errors/code/CONFLICT", 197 + "api-reference/errors/code/INTERNAL_SERVER_ERROR" 187 198 ] 188 199 }, 189 200 "api-reference/checker"
+1
apps/server/package.json
··· 16 16 "@openstatus/analytics": "workspace:^", 17 17 "@openstatus/db": "workspace:*", 18 18 "@openstatus/emails": "workspace:*", 19 + "@openstatus/error": "workspace:*", 19 20 "@openstatus/notification-discord": "workspace:*", 20 21 "@openstatus/notification-emails": "workspace:*", 21 22 "@openstatus/notification-slack": "workspace:*",
+2
apps/server/src/index.ts
··· 7 7 import { env } from "./env"; 8 8 import { publicRoute } from "./public"; 9 9 import { api } from "./v1"; 10 + import { handleError } from "./libs/errors"; 10 11 11 12 const app = new Hono({ strict: false }); 12 13 app.use("*", sentry({ dsn: process.env.SENTRY_DSN })); 14 + app.onError(handleError); 13 15 14 16 /** 15 17 * Public Routes
+1
apps/server/src/libs/errors/index.ts
··· 1 + export * from "./utils";
+59
apps/server/src/libs/errors/openapi-error-responses.ts
··· 1 + import { createErrorSchema } from "./utils"; 2 + 3 + export const openApiErrorResponses = { 4 + 400: { 5 + description: 6 + "The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).", 7 + content: { 8 + "application/json": { 9 + schema: createErrorSchema("BAD_REQUEST").openapi("ErrBadRequest"), 10 + }, 11 + }, 12 + }, 13 + 401: { 14 + description: 15 + "The client must authenticate itself to get the requested response.", 16 + content: { 17 + "application/json": { 18 + schema: createErrorSchema("UNAUTHORIZED").openapi("ErrUnauthorized"), 19 + }, 20 + }, 21 + }, 22 + 403: { 23 + description: 24 + "The client does not have the necessary permissions to access the resource.", 25 + content: { 26 + "application/json": { 27 + schema: createErrorSchema("FORBIDDEN").openapi("ErrForbidden"), 28 + }, 29 + }, 30 + }, 31 + 404: { 32 + description: "The server can't find the requested resource.", 33 + content: { 34 + "application/json": { 35 + schema: createErrorSchema("NOT_FOUND").openapi("ErrNotFound"), 36 + }, 37 + }, 38 + }, 39 + 409: { 40 + description: 41 + "The request could not be completed due to a conflict mainly due to unique constraints.", 42 + content: { 43 + "application/json": { 44 + schema: createErrorSchema("CONFLICT").openapi("ErrConflict"), 45 + }, 46 + }, 47 + }, 48 + 500: { 49 + description: 50 + "The server has encountered a situation it doesn't know how to handle.", 51 + content: { 52 + "application/json": { 53 + schema: createErrorSchema("INTERNAL_SERVER_ERROR").openapi( 54 + "ErrInternalServerError" 55 + ), 56 + }, 57 + }, 58 + }, 59 + };
+88
apps/server/src/libs/errors/utils.ts
··· 1 + import type { Context } from "hono"; 2 + import { HTTPException } from "hono/http-exception"; 3 + 4 + import { 5 + type ErrorCode, 6 + ErrorCodeEnum, 7 + SchemaError, 8 + statusToCode, 9 + } from "@openstatus/error"; 10 + 11 + import { ZodError, z } from "zod"; 12 + 13 + export function handleError(err: Error, c: Context): Response { 14 + if (err instanceof ZodError) { 15 + const error = SchemaError.fromZod(err, c); 16 + return c.json<ErrorSchema>( 17 + { 18 + code: "BAD_REQUEST", 19 + message: error.message, 20 + docs: "https://docs.openstatus.dev/api-references/errors/code/BAD_REQUEST", 21 + }, 22 + { status: 400 } 23 + ); 24 + } 25 + if (err instanceof HTTPException) { 26 + const code = statusToCode(err.status); 27 + return c.json<ErrorSchema>( 28 + { 29 + code: code, 30 + message: err.message, 31 + docs: `https://docs.openstatus.dev/api-references/errors/code/${code}`, 32 + }, 33 + { status: err.status } 34 + ); 35 + } 36 + return c.json<ErrorSchema>( 37 + { 38 + code: "INTERNAL_SERVER_ERROR", 39 + message: err.message ?? "Something went wrong", 40 + docs: "https://docs.openstatus.dev/api-references/errors/code/INTERNAL_SERVER_ERROR", 41 + }, 42 + 43 + { status: 500 } 44 + ); 45 + } 46 + 47 + export function handleZodError( 48 + result: 49 + | { 50 + success: true; 51 + data: unknown; 52 + } 53 + | { 54 + success: false; 55 + error: ZodError; 56 + }, 57 + c: Context 58 + ) { 59 + if (!result.success) { 60 + const error = SchemaError.fromZod(result.error, c); 61 + return c.json<z.infer<ReturnType<typeof createErrorSchema>>>( 62 + { 63 + code: "BAD_REQUEST", 64 + docs: "https://docs.openstatus.dev/api-references/errors/code/BAD_REQUEST", 65 + message: error.message, 66 + }, 67 + { status: 400 } 68 + ); 69 + } 70 + } 71 + export type ErrorSchema = z.infer<ReturnType<typeof createErrorSchema>>; 72 + 73 + export function createErrorSchema(code: ErrorCode) { 74 + return z.object({ 75 + code: ErrorCodeEnum.openapi({ 76 + example: code, 77 + description: "The error code related to the status code.", 78 + }), 79 + message: z.string().openapi({ 80 + description: "A human readable message describing the issue.", 81 + example: "Missing required field 'name'.", 82 + }), 83 + docs: z.string().openapi({ 84 + description: "A link to the documentation for the error.", 85 + example: `https://docs.openstatus.dev/api-references/errors/code/${code}`, 86 + }), 87 + }); 88 + }
+12 -16
apps/server/src/v1/incidents.test.ts apps/server/src/v1/incidents/incidents.test.ts
··· 1 1 import { expect, test } from "bun:test"; 2 2 3 - import { api } from "."; 4 - import { iso8601Regex } from "./test-utils"; 3 + import { api } from "../index"; 4 + import { iso8601Regex } from "../test-utils"; 5 + 6 + import type { IncidentSchema } from "./schema"; 5 7 6 8 test("GET one Incident", async () => { 7 9 const res = await api.request("/incident/2", { ··· 21 23 }); 22 24 }); 23 25 24 - test("Update an incident ", async () => { 26 + test("Update an incident", async () => { 25 27 const res = await api.request("/incident/2", { 26 28 method: "PUT", 27 29 headers: { ··· 32 34 acknowledgedAt: "2023-11-08T21:03:13.000Z", 33 35 }), 34 36 }); 37 + const json = await res.json(); 35 38 expect(res.status).toBe(200); 36 - expect(await res.json()).toMatchObject({ 39 + expect(json).toMatchObject({ 37 40 acknowledgedAt: expect.stringMatching(iso8601Regex), 38 41 monitorId: 1, 39 42 id: 2, ··· 56 59 acknowledgedAt: "2023-11-08T21:03:13.000Z", 57 60 }), 58 61 }); 62 + 59 63 expect(res.status).toBe(404); 60 - expect(await res.json()).toMatchObject({ 61 - code: 404, 62 - message: "Not Found", 63 - }); 64 64 }); 65 65 66 66 test("Update an incident without auth key should return 401", async () => { ··· 90 90 }), 91 91 }); 92 92 expect(res.status).toBe(400); 93 - expect(await res.json()).toMatchObject({ 94 - error: { 95 - issues: expect.any(Array), 96 - name: "ZodError", 97 - }, 98 - success: false, 99 - }); 100 93 }); 101 94 102 95 test("Get all Incidents", async () => { ··· 106 99 "x-openstatus-key": "1", 107 100 }, 108 101 }); 102 + 103 + const body = (await res.json()) as IncidentSchema[]; 104 + 109 105 expect(res.status).toBe(200); 110 - expect((await res.json())[0]).toMatchObject({ 106 + expect(body[0]).toMatchObject({ 111 107 acknowledgedAt: null, 112 108 monitorId: 1, 113 109 id: 1,
-239
apps/server/src/v1/incidents.ts
··· 1 - import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi"; 2 - 3 - import { and, db, eq } from "@openstatus/db"; 4 - import { incidentTable } from "@openstatus/db/src/schema/incidents"; 5 - 6 - import type { Variables } from "./index"; 7 - import { ErrorSchema } from "./shared"; 8 - import { isoDate } from "./utils"; 9 - 10 - const incidentsApi = new OpenAPIHono<{ Variables: Variables }>(); 11 - 12 - const ParamsSchema = z.object({ 13 - id: z 14 - .string() 15 - .min(1) 16 - .openapi({ 17 - param: { 18 - name: "id", 19 - in: "path", 20 - }, 21 - description: "The id of the Incident", 22 - example: "1", 23 - }), 24 - }); 25 - 26 - const IncidentSchema = z.object({ 27 - id: z.number().openapi({ 28 - description: "The id of the incident", 29 - example: 1, 30 - }), 31 - startedAt: isoDate.openapi({ 32 - description: "The date the incident started", 33 - }), 34 - 35 - monitorId: z 36 - .number() 37 - .openapi({ 38 - description: "The id of the monitor associated with the incident", 39 - example: 1, 40 - }) 41 - .nullable(), 42 - 43 - acknowledgedAt: isoDate 44 - .openapi({ 45 - description: "The date the incident was acknowledged", 46 - }) 47 - .optional() 48 - .nullable(), 49 - 50 - acknowledgedBy: z 51 - .number() 52 - .openapi({ 53 - description: "The user who acknowledged the incident", 54 - }) 55 - .nullable(), 56 - 57 - resolvedAt: isoDate 58 - .openapi({ 59 - description: "The date the incident was resolved", 60 - }) 61 - .optional() 62 - .nullable(), 63 - resolvedBy: z 64 - .number() 65 - .openapi({ 66 - description: "The user who resolved the incident", 67 - }) 68 - .nullable(), 69 - }); 70 - 71 - const getAllRoute = createRoute({ 72 - method: "get", 73 - tags: ["incident"], 74 - description: "Get all incidents", 75 - path: "/", 76 - request: {}, 77 - responses: { 78 - 200: { 79 - content: { 80 - "application/json": { 81 - schema: z.array(IncidentSchema), 82 - }, 83 - }, 84 - description: "Get all incidents", 85 - }, 86 - 400: { 87 - content: { 88 - "application/json": { 89 - schema: ErrorSchema, 90 - }, 91 - }, 92 - description: "Returns an error", 93 - }, 94 - }, 95 - }); 96 - 97 - incidentsApi.openapi(getAllRoute, async (c) => { 98 - const workspaceId = Number(c.get("workspaceId")); 99 - const result = await db 100 - .select() 101 - .from(incidentTable) 102 - .where(eq(incidentTable.workspaceId, workspaceId)) 103 - .all(); 104 - 105 - if (!result) return c.json({ code: 404, message: "Not Found" }, 404); 106 - 107 - const data = z.array(IncidentSchema).parse(result); 108 - return c.json(data); 109 - }); 110 - 111 - const getRoute = createRoute({ 112 - method: "get", 113 - tags: ["incident"], 114 - description: "Get an incident", 115 - path: "/:id", 116 - request: { 117 - params: ParamsSchema, 118 - }, 119 - responses: { 120 - 200: { 121 - content: { 122 - "application/json": { 123 - schema: IncidentSchema, 124 - }, 125 - }, 126 - description: "Get an incident", 127 - }, 128 - 400: { 129 - content: { 130 - "application/json": { 131 - schema: ErrorSchema, 132 - }, 133 - }, 134 - description: "Returns an error", 135 - }, 136 - }, 137 - }); 138 - 139 - incidentsApi.openapi(getRoute, async (c) => { 140 - const workspaceId = Number(c.get("workspaceId")); 141 - const { id } = c.req.valid("param"); 142 - 143 - const incidentId = Number(id); 144 - const result = await db 145 - .select() 146 - .from(incidentTable) 147 - .where( 148 - and( 149 - eq(incidentTable.workspaceId, workspaceId), 150 - eq(incidentTable.id, incidentId), 151 - ), 152 - ) 153 - .get(); 154 - 155 - if (!result) return c.json({ code: 404, message: "Not Found" }, 404); 156 - const data = IncidentSchema.parse(result); 157 - 158 - return c.json(data); 159 - }); 160 - 161 - const incidentInputSchema = z 162 - .object({ 163 - acknowledgedAt: z.coerce.date().optional(), 164 - resolvedAt: z.coerce.date().optional(), 165 - }) 166 - .openapi({ description: "The incident to create" }); 167 - const putRoute = createRoute({ 168 - method: "put", 169 - tags: ["incident"], 170 - description: "Update an incident", 171 - path: "/:id", 172 - request: { 173 - params: ParamsSchema, 174 - body: { 175 - description: "The incident to update", 176 - content: { 177 - "application/json": { 178 - schema: incidentInputSchema, 179 - }, 180 - }, 181 - }, 182 - }, 183 - responses: { 184 - 200: { 185 - content: { 186 - "application/json": { 187 - schema: IncidentSchema, 188 - }, 189 - }, 190 - description: "Update a monitor", 191 - }, 192 - 400: { 193 - content: { 194 - "application/json": { 195 - schema: ErrorSchema, 196 - }, 197 - }, 198 - description: "Returns an error", 199 - }, 200 - }, 201 - }); 202 - 203 - incidentsApi.openapi(putRoute, async (c) => { 204 - const input = c.req.valid("json"); 205 - const workspaceId = Number(c.get("workspaceId")); 206 - const { id } = c.req.valid("param"); 207 - if (!id) return c.json({ code: 400, message: "Bad Request" }, 400); 208 - 209 - const _incident = await db 210 - .select() 211 - .from(incidentTable) 212 - .where( 213 - and( 214 - eq(incidentTable.id, Number(id)), 215 - eq(incidentTable.workspaceId, workspaceId), 216 - ), 217 - ) 218 - .get(); 219 - 220 - if (!_incident) return c.json({ code: 404, message: "Not Found" }, 404); 221 - 222 - if (workspaceId !== _incident.workspaceId) 223 - return c.json({ code: 401, message: "Unauthorized" }, 401); 224 - 225 - const _newIncident = await db 226 - .update(incidentTable) 227 - .set({ 228 - ...input, 229 - }) 230 - .where(eq(incidentTable.id, Number(id))) 231 - .returning() 232 - .get(); 233 - 234 - const data = IncidentSchema.parse(_newIncident); 235 - 236 - return c.json(data); 237 - }); 238 - 239 - export { incidentsApi };
+56
apps/server/src/v1/incidents/get.ts
··· 1 + import { createRoute } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq } from "@openstatus/db"; 4 + import { incidentTable } from "@openstatus/db/src/schema/incidents"; 5 + 6 + import { IncidentSchema, ParamsSchema } from "./schema"; 7 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 8 + import type { incidentsApi } from "./index"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const getRoute = createRoute({ 12 + method: "get", 13 + tags: ["incident"], 14 + description: "Get an incident", 15 + path: "/:id", 16 + request: { 17 + params: ParamsSchema, 18 + }, 19 + responses: { 20 + 200: { 21 + content: { 22 + "application/json": { 23 + schema: IncidentSchema, 24 + }, 25 + }, 26 + description: "Get an incident", 27 + }, 28 + ...openApiErrorResponses, 29 + }, 30 + }); 31 + 32 + export function registerGetIncident(app: typeof incidentsApi) { 33 + return app.openapi(getRoute, async (c) => { 34 + const workspaceId = c.get("workspaceId"); 35 + const { id } = c.req.valid("param"); 36 + 37 + const _incident = await db 38 + .select() 39 + .from(incidentTable) 40 + .where( 41 + and( 42 + eq(incidentTable.workspaceId, Number(workspaceId)), 43 + eq(incidentTable.id, Number(id)), 44 + ), 45 + ) 46 + .get(); 47 + 48 + if (!_incident) { 49 + throw new HTTPException(404, { message: "Not Found" }); 50 + } 51 + 52 + const data = IncidentSchema.parse(_incident); 53 + 54 + return c.json(data); 55 + }); 56 + }
+47
apps/server/src/v1/incidents/get_all.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { db, eq } from "@openstatus/db"; 4 + import { incidentTable } from "@openstatus/db/src/schema/incidents"; 5 + 6 + import { IncidentSchema } from "./schema"; 7 + import type { incidentsApi } from "./index"; 8 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const getAllRoute = createRoute({ 12 + method: "get", 13 + tags: ["incident"], 14 + description: "Get all incidents", 15 + path: "/", 16 + request: {}, 17 + responses: { 18 + 200: { 19 + content: { 20 + "application/json": { 21 + schema: z.array(IncidentSchema), 22 + }, 23 + }, 24 + description: "Get all incidents", 25 + }, 26 + ...openApiErrorResponses, 27 + }, 28 + }); 29 + 30 + export function registerGetAllIncidents(app: typeof incidentsApi) { 31 + app.openapi(getAllRoute, async (c) => { 32 + const workspaceId = c.get("workspaceId"); 33 + 34 + const _incidents = await db 35 + .select() 36 + .from(incidentTable) 37 + .where(eq(incidentTable.workspaceId, Number(workspaceId))) 38 + .all(); 39 + 40 + if (!_incidents) { 41 + throw new HTTPException(404, { message: "Not Found" }); 42 + } 43 + 44 + const returnValues = z.array(IncidentSchema).parse(_incidents); // TODO: think of using safeParse with SchemaError.fromZod 45 + return c.json(returnValues); 46 + }); 47 + }
+17
apps/server/src/v1/incidents/index.ts
··· 1 + import { OpenAPIHono } from "@hono/zod-openapi"; 2 + 3 + import type { Variables } from "../index"; 4 + import { registerGetAllIncidents } from "./get_all"; 5 + import { registerGetIncident } from "./get"; 6 + import { registerPutIncident } from "./put"; 7 + import { handleZodError } from "../../libs/errors"; 8 + 9 + const incidentsApi = new OpenAPIHono<{ Variables: Variables }>({ 10 + defaultHook: handleZodError, 11 + }); 12 + 13 + registerGetAllIncidents(incidentsApi); 14 + registerGetIncident(incidentsApi); 15 + registerPutIncident(incidentsApi); 16 + 17 + export { incidentsApi };
+86
apps/server/src/v1/incidents/put.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq } from "@openstatus/db"; 4 + import { incidentTable } from "@openstatus/db/src/schema/incidents"; 5 + 6 + import { IncidentSchema, ParamsSchema } from "./schema"; 7 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 8 + import type { incidentsApi } from "./index"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const putRoute = createRoute({ 12 + method: "put", 13 + tags: ["incident"], 14 + description: "Update an incident", 15 + path: "/:id", 16 + request: { 17 + params: ParamsSchema, 18 + body: { 19 + description: "The incident to update", 20 + content: { 21 + "application/json": { 22 + schema: IncidentSchema.pick({ 23 + acknowledgedAt: true, 24 + resolvedAt: true, 25 + }) 26 + .extend({ 27 + acknowledgedAt: z.coerce.date().optional(), 28 + resolvedAt: z.coerce.date().optional(), 29 + }) 30 + .openapi({ 31 + description: "The incident to update", 32 + }), 33 + }, 34 + }, 35 + }, 36 + }, 37 + responses: { 38 + 200: { 39 + content: { 40 + "application/json": { 41 + schema: IncidentSchema, 42 + }, 43 + }, 44 + description: "Update a monitor", 45 + }, 46 + ...openApiErrorResponses, 47 + }, 48 + }); 49 + 50 + export function registerPutIncident(app: typeof incidentsApi) { 51 + return app.openapi(putRoute, async (c) => { 52 + const inputValues = c.req.valid("json"); 53 + const workspaceId = c.get("workspaceId"); 54 + const { id } = c.req.valid("param"); 55 + 56 + const _incident = await db 57 + .select() 58 + .from(incidentTable) 59 + .where( 60 + and( 61 + eq(incidentTable.id, Number(id)), 62 + eq(incidentTable.workspaceId, Number(workspaceId)) 63 + ) 64 + ) 65 + .get(); 66 + 67 + if (!_incident) { 68 + throw new HTTPException(404, { message: "Not Found" }); 69 + } 70 + 71 + if (Number(workspaceId) !== _incident.workspaceId) { 72 + throw new HTTPException(401, { message: "Unauthorized" }); 73 + } 74 + 75 + const _newIncident = await db 76 + .update(incidentTable) 77 + .set({ ...inputValues }) 78 + .where(eq(incidentTable.id, Number(id))) 79 + .returning() 80 + .get(); 81 + 82 + const data = IncidentSchema.parse(_newIncident); 83 + 84 + return c.json(data); 85 + }); 86 + }
+60
apps/server/src/v1/incidents/schema.ts
··· 1 + import { z } from "@hono/zod-openapi"; 2 + 3 + import { isoDate } from "../utils"; 4 + 5 + export const ParamsSchema = z.object({ 6 + id: z 7 + .string() 8 + .min(1) 9 + .openapi({ 10 + param: { 11 + name: "id", 12 + in: "path", 13 + }, 14 + description: "The id of the Incident", 15 + example: "1", 16 + }), 17 + }); 18 + 19 + export const IncidentSchema = z.object({ 20 + id: z.number().openapi({ 21 + description: "The id of the incident", 22 + example: 1, 23 + }), 24 + startedAt: isoDate.openapi({ 25 + description: "The date the incident started", 26 + }), 27 + monitorId: z 28 + .number() 29 + .openapi({ 30 + description: "The id of the monitor associated with the incident", 31 + example: 1, 32 + }) 33 + .nullable(), 34 + acknowledgedAt: isoDate 35 + .openapi({ 36 + description: "The date the incident was acknowledged", 37 + }) 38 + .optional() 39 + .nullable(), 40 + acknowledgedBy: z 41 + .number() 42 + .openapi({ 43 + description: "The user who acknowledged the incident", 44 + }) 45 + .nullable(), 46 + resolvedAt: isoDate 47 + .openapi({ 48 + description: "The date the incident was resolved", 49 + }) 50 + .optional() 51 + .nullable(), 52 + resolvedBy: z 53 + .number() 54 + .openapi({ 55 + description: "The user who resolved the incident", 56 + }) 57 + .nullable(), 58 + }); 59 + 60 + export type IncidentSchema = z.infer<typeof IncidentSchema>;
+23 -13
apps/server/src/v1/index.ts
··· 6 6 7 7 import { incidentsApi } from "./incidents"; 8 8 import { middleware } from "./middleware"; 9 - import { monitorApi } from "./monitor"; 10 - import { notificationApi } from "./notification"; 11 - import { pageApi } from "./page"; 12 - import { statusReportApi } from "./statusReport"; 13 - import { statusReportUpdateApi } from "./statusReportUpdate"; 9 + import { monitorsApi } from "./monitors"; 10 + import { notificationsApi } from "./notifications"; 11 + import { pagesApi } from "./pages"; 12 + import { pageSubscribersApi } from "./pageSubscribers"; 13 + import { statusReportsApi } from "./statusReports"; 14 + import { statusReportUpdatesApi } from "./statusReportUpdates"; 15 + import { handleError, handleZodError } from "../libs/errors"; 14 16 15 17 export type Variables = { 16 18 workspaceId: string; 17 19 workspacePlan: { 18 - title: string; 20 + title: "Hobby" | "Starter" | "Growth" | "Pro"; 19 21 description: string; 20 22 price: number; 21 23 limits: Limits; 22 24 }; 23 25 }; 24 26 25 - export const api = new OpenAPIHono<{ Variables: Variables }>(); 27 + export const api = new OpenAPIHono<{ Variables: Variables }>({ 28 + defaultHook: handleZodError, 29 + }); 30 + 31 + api.onError(handleError); 26 32 27 33 api.use("/openapi", cors()); 28 34 ··· 39 45 */ 40 46 api.use("/*", middleware); 41 47 api.use("/*", logger()); 42 - api.route("/incident", incidentsApi); 43 - api.route("/monitor", monitorApi); 44 - api.route("/notification", notificationApi); 45 - api.route("/page", pageApi); 46 48 47 - api.route("/status_report", statusReportApi); 48 - api.route("/status_report_update", statusReportUpdateApi); 49 + /** 50 + * Routes 51 + */ 52 + api.route("/incident", incidentsApi); 53 + api.route("/monitor", monitorsApi); 54 + api.route("/notification", notificationsApi); 55 + api.route("/page", pagesApi); 56 + api.route("/page_subscriber", pageSubscribersApi); 57 + api.route("/status_report", statusReportsApi); 58 + api.route("/status_report_update", statusReportUpdatesApi);
+29 -18
apps/server/src/v1/middleware.ts
··· 2 2 import type { Context, Next } from "hono"; 3 3 4 4 import type { Variables } from "./index"; 5 - import { getLimitByWorkspaceId } from "./utils"; 5 + import { workspace } from "@openstatus/db/src/schema"; 6 + import { db, eq } from "@openstatus/db"; 7 + import { getPlanConfig } from "@openstatus/plans"; 6 8 7 9 export async function middleware( 8 10 c: Context<{ Variables: Variables }, "/*">, 9 - next: Next, 11 + next: Next 10 12 ) { 11 13 const key = c.req.header("x-openstatus-key"); 12 14 if (!key) return c.text("Unauthorized", 401); 13 - if (process.env.NODE_ENV === "production") { 14 - const { error, result } = await verifyKey(key); 15 15 16 - if (error) return c.text("Internal Server Error", 500); 16 + const { error, result } = 17 + process.env.NODE_ENV === "production" 18 + ? await verifyKey(key) 19 + : { result: { valid: true, ownerId: "1" }, error: null }; 17 20 18 - if (!result.valid) return c.text("Unauthorized", 401); 21 + if (error) return c.text("Internal Server Error", 500); 22 + if (!result.valid) return c.text("Unauthorized", 401); 23 + if (!result.ownerId) return c.text("Unauthorized", 401); 19 24 20 - if (!result.ownerId) return c.text("Unauthorized", 401); 25 + const _workspace = await db 26 + .select() 27 + .from(workspace) 28 + .where(eq(workspace.id, Number.parseInt(result.ownerId))) 29 + .get(); 21 30 22 - const plan = await getLimitByWorkspaceId(Number.parseInt(result.ownerId)); 31 + if (!_workspace) { 32 + console.error("Workspace not found"); 33 + return c.text("Unauthorized", 401); 34 + } 23 35 24 - c.set("workspacePlan", plan); 25 - c.set("workspaceId", `${result.ownerId}`); 26 - } else { 27 - // REMINDER: localhost only 28 - const ownerId = 1; 36 + c.set("workspacePlan", getPlanConfig(_workspace.plan)); 37 + c.set("workspaceId", `${result.ownerId}`); 29 38 30 - const plan = await getLimitByWorkspaceId(ownerId); 31 - 32 - c.set("workspacePlan", plan); 33 - c.set("workspaceId", `${ownerId}`); 34 - } 35 39 await next(); 36 40 } 41 + 42 + /** 43 + * TODO: move the plan limit into the Unkey `{ meta }` to avoid an additional db call. 44 + * When an API Key is created, we need to include the `{ meta: { plan: "free" } }` to the key. 45 + * Then, we can just read the plan from the key and use it in the middleware. 46 + * Don't forget to update the key whenever a user changes their plan. (via `stripeRoute` webhook) 47 + */
+14 -36
apps/server/src/v1/monitor.test.ts apps/server/src/v1/monitors/monitors.test.ts
··· 1 1 import { expect, test } from "bun:test"; 2 2 3 - import { api } from "."; 3 + import { api } from "../index"; 4 + import type { MonitorSchema } from "./schema"; 4 5 5 6 test("GET one monitor", async () => { 6 7 const res = await api.request("/monitor/1", { ··· 8 9 "x-openstatus-key": "1", 9 10 }, 10 11 }); 11 - expect(res.status).toBe(200); 12 + const json = await res.json(); 12 13 13 - expect(await res.json()).toMatchObject({ 14 + expect(res.status).toBe(200); 15 + expect(json).toMatchObject({ 14 16 id: 1, 15 17 periodicity: "1m", 16 18 url: "https://www.openstatus.dev", ··· 31 33 "x-openstatus-key": "1", 32 34 }, 33 35 }); 36 + const json = (await res.json()) as MonitorSchema[]; 37 + 34 38 expect(res.status).toBe(200); 35 - expect((await res.json())[0]).toMatchObject({ 39 + expect(json[0]).toMatchObject({ 36 40 id: 1, 37 41 periodicity: "1m", 38 42 url: "https://www.openstatus.dev", ··· 60 64 active: true, 61 65 public: true, 62 66 }; 67 + 63 68 const res = await api.request("/monitor", { 64 69 method: "POST", 65 70 headers: { ··· 68 73 }, 69 74 body: JSON.stringify(data), 70 75 }); 76 + 71 77 expect(res.status).toBe(200); 72 78 73 79 expect(await res.json()).toMatchObject({ 74 80 id: expect.any(Number), 75 - periodicity: "10m", 76 - url: "https://www.openstatus.dev", 77 - regions: ["ams", "gru"], 78 - name: "OpenStatus", 79 - description: "OpenStatus website", 80 - method: "POST", 81 - body: '{"hello":"world"}', 82 - headers: [{ key: "key", value: "value" }], 83 - active: true, 84 - public: true, 81 + ...data, 85 82 }); 86 83 }); 87 84 ··· 129 126 }, 130 127 body: JSON.stringify(data), 131 128 }); 129 + 132 130 expect(res.status).toBe(400); 133 - expect(await res.json()).toMatchObject({ 134 - error: { 135 - issues: expect.any(Array), 136 - name: "ZodError", 137 - }, 138 - success: false, 139 - }); 140 131 }); 141 132 142 133 test("Update a Monitor ", async () => { ··· 202 193 body: JSON.stringify(data), 203 194 }); 204 195 expect(res.status).toBe(404); 205 - 206 - expect(await res.json()).toMatchObject({ 207 - code: 404, 208 - message: "Not Found", 209 - }); 210 196 }); 211 197 212 198 test("Update a monitor without auth key should return 401", async () => { ··· 252 238 }, 253 239 body: JSON.stringify(data), 254 240 }); 241 + 255 242 expect(res.status).toBe(400); 256 - expect(await res.json()).toMatchObject({ 257 - error: { 258 - issues: expect.any(Array), 259 - name: "ZodError", 260 - }, 261 - success: false, 262 - }); 263 243 }); 264 244 265 245 test("Delete one monitor", async () => { ··· 271 251 }); 272 252 expect(res.status).toBe(200); 273 253 274 - expect(await res.json()).toMatchObject({ 275 - message: "Deleted", 276 - }); 254 + expect(await res.json()).toMatchObject({}); 277 255 }); 278 256 279 257 test.todo("Get monitor daily Summary");
-592
apps/server/src/v1/monitor.ts
··· 1 - import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi"; 2 - 3 - import { trackAnalytics } from "@openstatus/analytics"; 4 - import { and, db, eq, isNull, sql } from "@openstatus/db"; 5 - import { 6 - flyRegions, 7 - monitor, 8 - monitorMethods, 9 - monitorPeriodicity, 10 - } from "@openstatus/db/src/schema"; 11 - import { OSTinybird } from "@openstatus/tinybird"; 12 - import { Redis } from "@openstatus/upstash"; 13 - 14 - import { env } from "../env"; 15 - import type { Variables } from "./index"; 16 - import { ErrorSchema } from "./shared"; 17 - import { isoDate } from "./utils"; 18 - 19 - const tb = new OSTinybird({ token: env.TINY_BIRD_API_KEY }); 20 - const redis = Redis.fromEnv(); 21 - 22 - const ParamsSchema = z.object({ 23 - id: z 24 - .string() 25 - .min(1) 26 - .openapi({ 27 - param: { 28 - name: "id", 29 - in: "path", 30 - }, 31 - description: "The id of the monitor", 32 - example: "1", 33 - }), 34 - }); 35 - 36 - export const periodicityEnum = z.enum(monitorPeriodicity); 37 - 38 - const regionInput = z.array(z.enum(flyRegions)).transform((val) => String(val)); 39 - 40 - const MonitorSchema = z 41 - .object({ 42 - id: z.number().openapi({ 43 - example: 123, 44 - description: "The id of the monitor", 45 - }), 46 - periodicity: periodicityEnum.openapi({ 47 - example: "1m", 48 - description: "How often the monitor should run", 49 - }), 50 - url: z.string().url().openapi({ 51 - example: "https://www.documenso.co", 52 - description: "The url to monitor", 53 - }), 54 - regions: z 55 - .preprocess( 56 - (val) => { 57 - if (String(val).length > 0) { 58 - return String(val).split(","); 59 - } 60 - return []; 61 - }, 62 - z.array(z.enum(flyRegions)), 63 - ) 64 - .default([]) 65 - .openapi({ 66 - example: ["ams"], 67 - description: "Where we should monitor it", 68 - }), 69 - name: z 70 - .string() 71 - .openapi({ 72 - example: "Documenso", 73 - description: "The name of the monitor", 74 - }) 75 - .nullable(), 76 - description: z 77 - .string() 78 - .openapi({ 79 - example: "Documenso website", 80 - description: "The description of your monitor", 81 - }) 82 - .nullish(), 83 - method: z.enum(monitorMethods).default("GET").openapi({ example: "GET" }), 84 - body: z 85 - .preprocess((val) => { 86 - return String(val); 87 - }, z.string()) 88 - .nullish() 89 - .default("") 90 - .openapi({ 91 - example: "Hello World", 92 - description: "The body", 93 - }), 94 - headers: z 95 - .preprocess( 96 - (val) => { 97 - if (String(val).length > 0) { 98 - return JSON.parse(String(val)); 99 - } 100 - return []; 101 - }, 102 - z.array(z.object({ key: z.string(), value: z.string() })).default([]), 103 - ) 104 - .nullish() 105 - .openapi({ 106 - description: "The headers of your request", 107 - example: [{ key: "x-apikey", value: "supersecrettoken" }], 108 - }), 109 - active: z 110 - .boolean() 111 - .default(false) 112 - .openapi({ description: "If the monitor is active" }), 113 - public: z 114 - .boolean() 115 - .default(false) 116 - .openapi({ description: "If the monitor is public" }), 117 - }) 118 - .openapi({ 119 - description: "The monitor", 120 - required: ["periodicity", "url", "regions", "method"], 121 - }); 122 - 123 - const monitorInput = z 124 - .object({ 125 - periodicity: periodicityEnum.openapi({ 126 - example: "1m", 127 - description: "How often the monitor should run", 128 - }), 129 - url: z.string().url().openapi({ 130 - example: "https://www.documenso.co", 131 - description: "The url to monitor", 132 - }), 133 - regions: regionInput.openapi({ 134 - example: "ams", 135 - description: "The regions where we should monitor your endpoint", 136 - }), 137 - name: z.string().openapi({ 138 - example: "Documenso", 139 - description: "The name of the monitor", 140 - }), 141 - description: z.string().openapi({ 142 - example: "Documenso website", 143 - description: "The description of your monitor", 144 - }), 145 - method: z.enum(monitorMethods).default("GET").openapi({ example: "GET" }), 146 - body: z.string().openapi({ 147 - example: "Hello World", 148 - description: "The body of your request", 149 - }), 150 - active: z.boolean().default(false).openapi({ 151 - description: "If the monitor is active", 152 - }), 153 - public: z.boolean().default(false).openapi({ 154 - description: "If the monitor is public", 155 - }), 156 - headers: z 157 - .preprocess( 158 - (val) => { 159 - if (val) { 160 - return val; 161 - } 162 - return []; 163 - }, 164 - z.array(z.object({ key: z.string(), value: z.string() })).default([]), 165 - ) 166 - .openapi({ 167 - description: "The headers of your request", 168 - example: [{ key: "x-apikey", value: "supersecrettoken" }], 169 - }), 170 - }) 171 - .openapi({ 172 - required: ["periodicity", "url", "regions", "method"], 173 - }); 174 - 175 - const monitorApi = new OpenAPIHono<{ Variables: Variables }>(); 176 - 177 - const getAllRoute = createRoute({ 178 - method: "get", 179 - tags: ["monitor"], 180 - description: "Get all monitors", 181 - path: "/", 182 - request: {}, 183 - responses: { 184 - 200: { 185 - content: { 186 - "application/json": { 187 - schema: z.array(MonitorSchema), 188 - }, 189 - }, 190 - description: "All the monitors", 191 - }, 192 - 404: { 193 - content: { 194 - "application/json": { 195 - schema: ErrorSchema, 196 - }, 197 - }, 198 - description: "Not found", 199 - }, 200 - 401: { 201 - content: { 202 - "application/json": { 203 - schema: ErrorSchema, 204 - }, 205 - }, 206 - description: "Returns an error", 207 - }, 208 - }, 209 - }); 210 - monitorApi.openapi(getAllRoute, async (c) => { 211 - const workspaceId = Number(c.get("workspaceId")); 212 - 213 - const _monitor = await db 214 - .select() 215 - .from(monitor) 216 - .where(eq(monitor.workspaceId, workspaceId)) 217 - .all(); 218 - 219 - if (!_monitor) return c.json({ code: 404, message: "Not Found" }, 404); 220 - 221 - const data = z.array(MonitorSchema).parse(_monitor); 222 - 223 - return c.json(data); 224 - }); 225 - 226 - const getRoute = createRoute({ 227 - method: "get", 228 - tags: ["monitor"], 229 - description: "Get a monitor", 230 - path: "/:id", 231 - request: { 232 - params: ParamsSchema, 233 - }, 234 - responses: { 235 - 200: { 236 - content: { 237 - "application/json": { 238 - schema: MonitorSchema, 239 - }, 240 - }, 241 - description: "The monitor", 242 - }, 243 - 401: { 244 - content: { 245 - "application/json": { 246 - schema: ErrorSchema, 247 - }, 248 - }, 249 - description: "Returns an error", 250 - }, 251 - 404: { 252 - content: { 253 - "application/json": { 254 - schema: ErrorSchema, 255 - }, 256 - }, 257 - description: "Returns an error", 258 - }, 259 - }, 260 - }); 261 - 262 - monitorApi.openapi(getRoute, async (c) => { 263 - const workspaceId = Number(c.get("workspaceId")); 264 - const { id } = c.req.valid("param"); 265 - 266 - const monitorId = Number(id); 267 - const _monitor = await db 268 - .select() 269 - .from(monitor) 270 - .where(eq(monitor.id, monitorId)) 271 - .get(); 272 - 273 - if (!_monitor) return c.json({ code: 404, message: "Not Found" }, 404); 274 - 275 - if (workspaceId !== _monitor.workspaceId) 276 - return c.json({ code: 401, message: "Unauthorized" }, 401); 277 - 278 - const data = MonitorSchema.parse(_monitor); 279 - 280 - return c.json(data); 281 - }); 282 - 283 - const postRoute = createRoute({ 284 - method: "post", 285 - tags: ["monitor"], 286 - description: "Create a monitor", 287 - path: "/", 288 - request: { 289 - body: { 290 - description: "The monitor to create", 291 - content: { 292 - "application/json": { 293 - schema: monitorInput, 294 - }, 295 - }, 296 - }, 297 - }, 298 - responses: { 299 - 200: { 300 - content: { 301 - "application/json": { 302 - schema: MonitorSchema, 303 - }, 304 - }, 305 - description: "Create a monitor", 306 - }, 307 - 400: { 308 - content: { 309 - "application/json": { 310 - schema: ErrorSchema, 311 - }, 312 - }, 313 - description: "Returns an error", 314 - }, 315 - 403: { 316 - content: { 317 - "application/json": { 318 - schema: ErrorSchema, 319 - }, 320 - }, 321 - description: "Returns an error", 322 - }, 323 - }, 324 - }); 325 - 326 - monitorApi.openapi(postRoute, async (c) => { 327 - const workspaceId = Number(c.get("workspaceId")); 328 - const workspacePlan = c.get("workspacePlan"); 329 - const input = c.req.valid("json"); 330 - 331 - const count = ( 332 - await db 333 - .select({ count: sql<number>`count(*)` }) 334 - .from(monitor) 335 - .where( 336 - and( 337 - eq(monitor.workspaceId, Number(workspaceId)), 338 - isNull(monitor.deletedAt), 339 - ), 340 - ) 341 - .all() 342 - )[0].count; 343 - 344 - if (count >= workspacePlan.limits.monitors) 345 - return c.json({ code: 403, message: "Forbidden" }, 403); 346 - if (!workspacePlan.limits.periodicity.includes(input.periodicity)) 347 - return c.json({ code: 403, message: "Forbidden" }, 403); 348 - 349 - const { headers, ...rest } = input; 350 - const _newMonitor = await db 351 - .insert(monitor) 352 - .values({ 353 - ...rest, 354 - workspaceId: workspaceId, 355 - headers: input.headers ? JSON.stringify(input.headers) : undefined, 356 - }) 357 - .returning() 358 - .get(); 359 - 360 - const data = MonitorSchema.parse(_newMonitor); 361 - 362 - if (env.JITSU_WRITE_KEY) { 363 - trackAnalytics({ 364 - event: "Monitor Created", 365 - url: input.url, 366 - periodicity: input.periodicity, 367 - api: true, 368 - workspaceId: String(workspaceId), 369 - }); 370 - } 371 - return c.json(data); 372 - }); 373 - 374 - const putRoute = createRoute({ 375 - method: "put", 376 - tags: ["monitor"], 377 - description: "Update a monitor", 378 - path: "/:id", 379 - request: { 380 - params: ParamsSchema, 381 - body: { 382 - description: "The monitor to update", 383 - content: { 384 - "application/json": { 385 - schema: monitorInput, 386 - }, 387 - }, 388 - }, 389 - }, 390 - responses: { 391 - 200: { 392 - content: { 393 - "application/json": { 394 - schema: MonitorSchema, 395 - }, 396 - }, 397 - description: "Update a monitor", 398 - }, 399 - 400: { 400 - content: { 401 - "application/json": { 402 - schema: ErrorSchema, 403 - }, 404 - }, 405 - description: "Returns an error", 406 - }, 407 - }, 408 - }); 409 - 410 - monitorApi.openapi(putRoute, async (c) => { 411 - const input = c.req.valid("json"); 412 - const workspaceId = Number(c.get("workspaceId")); 413 - const workspacePlan = c.get("workspacePlan"); 414 - const { id } = c.req.valid("param"); 415 - 416 - if (!id) return c.json({ code: 400, message: "Bad Request" }, 400); 417 - 418 - if (!workspacePlan.limits.periodicity.includes(input.periodicity)) 419 - return c.json({ code: 403, message: "Forbidden" }, 403); 420 - 421 - const _monitor = await db 422 - .select() 423 - .from(monitor) 424 - .where(eq(monitor.id, Number(id))) 425 - .get(); 426 - 427 - if (!_monitor) return c.json({ code: 404, message: "Not Found" }, 404); 428 - 429 - if (workspaceId !== _monitor.workspaceId) 430 - return c.json({ code: 401, message: "Unauthorized" }, 401); 431 - 432 - const { headers, ...rest } = input; 433 - const _newMonitor = await db 434 - .update(monitor) 435 - .set({ 436 - ...rest, 437 - headers: input.headers ? JSON.stringify(input.headers) : undefined, 438 - }) 439 - .returning() 440 - .get(); 441 - 442 - const data = MonitorSchema.parse(_newMonitor); 443 - 444 - return c.json(data); 445 - }); 446 - 447 - const deleteRoute = createRoute({ 448 - method: "delete", 449 - tags: ["monitor"], 450 - description: "Delete a monitor", 451 - path: "/:id", 452 - request: { 453 - params: ParamsSchema, 454 - }, 455 - responses: { 456 - 200: { 457 - content: { 458 - "application/json": { 459 - schema: z.object({ 460 - message: z.string().openapi({ 461 - example: "Deleted", 462 - }), 463 - }), 464 - }, 465 - }, 466 - description: "Delete the monitor", 467 - }, 468 - 400: { 469 - content: { 470 - "application/json": { 471 - schema: ErrorSchema, 472 - }, 473 - }, 474 - description: "Returns an error", 475 - }, 476 - }, 477 - }); 478 - 479 - monitorApi.openapi(deleteRoute, async (c) => { 480 - const workspaceId = Number(c.get("workspaceId")); 481 - const { id } = c.req.valid("param"); 482 - 483 - const monitorId = Number(id); 484 - const _monitor = await db 485 - .select() 486 - .from(monitor) 487 - .where(eq(monitor.id, monitorId)) 488 - .get(); 489 - 490 - if (!_monitor) return c.json({ code: 404, message: "Not Found" }, 404); 491 - 492 - if (workspaceId !== _monitor.workspaceId) 493 - return c.json({ code: 401, message: "Unauthorized" }, 401); 494 - 495 - await db 496 - .update(monitor) 497 - .set({ active: false, deletedAt: new Date() }) 498 - .where(eq(monitor.id, monitorId)) 499 - .run(); 500 - return c.json({ message: "Deleted" }); 501 - }); 502 - 503 - const dailyStatsSchema = z.object({ 504 - ok: z.number().int().openapi({ 505 - description: "The number of ok responses", 506 - }), 507 - count: z 508 - .number() 509 - .int() 510 - .openapi({ description: "The total number of request" }), 511 - day: isoDate, 512 - }); 513 - 514 - const dailyStatsSchemaArray = z 515 - .array(dailyStatsSchema) 516 - .openapi({ description: "The daily stats" }); 517 - 518 - const getMonitorStats = createRoute({ 519 - method: "get", 520 - tags: ["monitor"], 521 - description: "Get monitor daily summary", 522 - path: "/:id/summary", 523 - request: { 524 - params: ParamsSchema, 525 - }, 526 - responses: { 527 - 200: { 528 - content: { 529 - "application/json": { 530 - schema: z.object({ 531 - data: dailyStatsSchemaArray, 532 - }), 533 - }, 534 - }, 535 - description: "All the historical metrics", 536 - }, 537 - 404: { 538 - content: { 539 - "application/json": { 540 - schema: ErrorSchema, 541 - }, 542 - }, 543 - description: "Not found", 544 - }, 545 - 401: { 546 - content: { 547 - "application/json": { 548 - schema: ErrorSchema, 549 - }, 550 - }, 551 - description: "Returns an error", 552 - }, 553 - }, 554 - }); 555 - monitorApi.openapi(getMonitorStats, async (c) => { 556 - const workspaceId = Number(c.get("workspaceId")); 557 - const { id } = c.req.valid("param"); 558 - 559 - const monitorId = Number(id); 560 - const _monitor = await db 561 - .select() 562 - .from(monitor) 563 - .where(eq(monitor.id, monitorId)) 564 - .get(); 565 - 566 - if (!_monitor) return c.json({ code: 404, message: "Not Found" }, 404); 567 - 568 - if (workspaceId !== _monitor.workspaceId) 569 - return c.json({ code: 401, message: "Unauthorized" }, 401); 570 - 571 - const cache = await redis.get<z.infer<typeof dailyStatsSchemaArray>>( 572 - `${monitorId}-daily-stats`, 573 - ); 574 - if (cache) { 575 - console.log("fetching from cache"); 576 - return c.json({ 577 - data: cache, 578 - }); 579 - } 580 - 581 - // FIXME: we should use the OSTinybird client 582 - console.log("fetching from tinybird"); 583 - const res = await tb.endpointStatusPeriod("45d")({ 584 - monitorId: String(monitorId), 585 - }); 586 - 587 - await redis.set(`${monitorId}-daily-stats`, res, { ex: 600 }); 588 - 589 - return c.json({ data: res }); 590 - }); 591 - 592 - export { monitorApi };
+61
apps/server/src/v1/monitors/delete.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { db, eq } from "@openstatus/db"; 4 + import { monitor } from "@openstatus/db/src/schema"; 5 + 6 + import { ParamsSchema } from "./schema"; 7 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 8 + import type { monitorsApi } from "./index"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const deleteRoute = createRoute({ 12 + method: "delete", 13 + tags: ["monitor"], 14 + description: "Delete a monitor", 15 + path: "/:id", 16 + request: { 17 + params: ParamsSchema, 18 + }, 19 + responses: { 20 + 200: { 21 + content: { 22 + "application/json": { 23 + schema: z.object({}), 24 + }, 25 + }, 26 + description: "Delete the monitor", 27 + }, 28 + ...openApiErrorResponses, 29 + }, 30 + }); 31 + 32 + export function registerDeleteMonitor(app: typeof monitorsApi) { 33 + return app.openapi(deleteRoute, async (c) => { 34 + const workspaceId = c.get("workspaceId"); 35 + const { id } = c.req.valid("param"); 36 + 37 + const _monitor = await db 38 + .select() 39 + .from(monitor) 40 + .where(eq(monitor.id, Number(id))) 41 + .get(); 42 + 43 + if (!_monitor) { 44 + throw new HTTPException(404, { message: "Not Found" }); 45 + } 46 + 47 + if (Number(workspaceId) !== _monitor.workspaceId) { 48 + throw new HTTPException(401, { message: "Unauthorized" }); 49 + } 50 + 51 + await db 52 + .update(monitor) 53 + .set({ active: false, deletedAt: new Date() }) 54 + .where(eq(monitor.id, Number(id))) 55 + .run(); 56 + 57 + // FIXME: Remove all relations of the monitor from all notifications, pages,.... 58 + 59 + return c.json({}); 60 + }); 61 + }
+57
apps/server/src/v1/monitors/get.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq, isNull } from "@openstatus/db"; 4 + import { monitor } from "@openstatus/db/src/schema"; 5 + 6 + import type { monitorsApi } from "./index"; 7 + import { MonitorSchema, ParamsSchema } from "./schema"; 8 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const getRoute = createRoute({ 12 + method: "get", 13 + tags: ["monitor"], 14 + description: "Get a monitor", 15 + path: "/:id", 16 + request: { 17 + params: ParamsSchema, 18 + }, 19 + responses: { 20 + 200: { 21 + content: { 22 + "application/json": { 23 + schema: MonitorSchema, 24 + }, 25 + }, 26 + description: "The monitor", 27 + }, 28 + ...openApiErrorResponses, 29 + }, 30 + }); 31 + 32 + export function registerGetMonitor(api: typeof monitorsApi) { 33 + return api.openapi(getRoute, async (c) => { 34 + const workspaceId = c.get("workspaceId"); 35 + const { id } = c.req.valid("param"); 36 + 37 + const _monitor = await db 38 + .select() 39 + .from(monitor) 40 + .where( 41 + and( 42 + eq(monitor.id, Number(id)), 43 + eq(monitor.workspaceId, Number(workspaceId)), 44 + isNull(monitor.deletedAt) 45 + ) 46 + ) 47 + .get(); 48 + 49 + if (!_monitor) { 50 + throw new HTTPException(404, { message: "Not Found" }); 51 + } 52 + 53 + const data = MonitorSchema.parse(_monitor); 54 + 55 + return c.json(data); 56 + }); 57 + }
+53
apps/server/src/v1/monitors/get_all.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq, isNull } from "@openstatus/db"; 4 + import { monitor } from "@openstatus/db/src/schema"; 5 + 6 + import type { monitorsApi } from "./index"; 7 + import { MonitorSchema } from "./schema"; 8 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const getAllRoute = createRoute({ 12 + method: "get", 13 + tags: ["monitor"], 14 + description: "Get all monitors", 15 + path: "/", 16 + request: {}, 17 + responses: { 18 + 200: { 19 + content: { 20 + "application/json": { 21 + schema: z.array(MonitorSchema), 22 + }, 23 + }, 24 + description: "All the monitors", 25 + }, 26 + ...openApiErrorResponses, 27 + }, 28 + }); 29 + 30 + export function registerGetAllMonitors(app: typeof monitorsApi) { 31 + return app.openapi(getAllRoute, async (c) => { 32 + const workspaceId = c.get("workspaceId"); 33 + 34 + const _monitors = await db 35 + .select() 36 + .from(monitor) 37 + .where( 38 + and( 39 + eq(monitor.workspaceId, Number(workspaceId)), 40 + isNull(monitor.deletedAt) 41 + ) 42 + ) 43 + .all(); 44 + 45 + if (!_monitors) { 46 + throw new HTTPException(404, { message: "Not Found" }); 47 + } 48 + 49 + const data = z.array(MonitorSchema).parse(_monitors); 50 + 51 + return c.json(data); 52 + }); 53 + }
+23
apps/server/src/v1/monitors/index.ts
··· 1 + import { OpenAPIHono } from "@hono/zod-openapi"; 2 + 3 + import type { Variables } from "../index"; 4 + import { registerGetAllMonitors } from "./get_all"; 5 + import { registerGetMonitor } from "./get"; 6 + import { registerPutMonitor } from "./put"; 7 + import { registerDeleteMonitor } from "./delete"; 8 + import { registerGetMonitorSummary } from "./summary/get"; 9 + import { registerPostMonitor } from "./post"; 10 + import { handleZodError } from "../../libs/errors"; 11 + 12 + const monitorsApi = new OpenAPIHono<{ Variables: Variables }>({ 13 + defaultHook: handleZodError, 14 + }); 15 + 16 + registerGetAllMonitors(monitorsApi); 17 + registerGetMonitor(monitorsApi); 18 + registerPutMonitor(monitorsApi); 19 + registerDeleteMonitor(monitorsApi); 20 + registerGetMonitorSummary(monitorsApi); 21 + registerPostMonitor(monitorsApi); 22 + 23 + export { monitorsApi };
+96
apps/server/src/v1/monitors/post.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { trackAnalytics } from "@openstatus/analytics"; 4 + import { and, db, eq, isNull, sql } from "@openstatus/db"; 5 + import { monitor } from "@openstatus/db/src/schema"; 6 + 7 + import type { monitorsApi } from "./index"; 8 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 9 + import { MonitorSchema } from "./schema"; 10 + import { env } from "../../env"; 11 + import { HTTPException } from "hono/http-exception"; 12 + 13 + const postRoute = createRoute({ 14 + method: "post", 15 + tags: ["monitor"], 16 + description: "Create a monitor", 17 + path: "/", 18 + request: { 19 + body: { 20 + description: "The monitor to create", 21 + content: { 22 + "application/json": { 23 + schema: MonitorSchema.omit({ id: true }), 24 + }, 25 + }, 26 + }, 27 + }, 28 + responses: { 29 + 200: { 30 + content: { 31 + "application/json": { 32 + schema: MonitorSchema, 33 + }, 34 + }, 35 + description: "Create a monitor", 36 + }, 37 + ...openApiErrorResponses, 38 + }, 39 + }); 40 + 41 + export function registerPostMonitor(api: typeof monitorsApi) { 42 + return api.openapi(postRoute, async (c) => { 43 + const workspaceId = c.get("workspaceId"); 44 + const workspacePlan = c.get("workspacePlan"); 45 + const input = c.req.valid("json"); 46 + 47 + const count = ( 48 + await db 49 + .select({ count: sql<number>`count(*)` }) 50 + .from(monitor) 51 + .where( 52 + and( 53 + eq(monitor.workspaceId, Number(workspaceId)), 54 + isNull(monitor.deletedAt) 55 + ) 56 + ) 57 + .all() 58 + )[0].count; 59 + 60 + if (count >= workspacePlan.limits.monitors) { 61 + throw new HTTPException(403, { 62 + message: "Upgrade for more monitors", 63 + }); 64 + } 65 + 66 + if (!workspacePlan.limits.periodicity.includes(input.periodicity)) { 67 + throw new HTTPException(403, { message: "Forbidden" }); 68 + } 69 + 70 + const { headers, regions, ...rest } = input; 71 + const _newMonitor = await db 72 + .insert(monitor) 73 + .values({ 74 + ...rest, 75 + workspaceId: Number(workspaceId), 76 + regions: regions ? regions.join(",") : undefined, 77 + headers: input.headers ? JSON.stringify(input.headers) : undefined, 78 + }) 79 + .returning() 80 + .get(); 81 + 82 + if (env.JITSU_WRITE_KEY) { 83 + trackAnalytics({ 84 + event: "Monitor Created", 85 + url: input.url, 86 + periodicity: input.periodicity, 87 + api: true, 88 + workspaceId: String(workspaceId), 89 + }); 90 + } 91 + 92 + const data = MonitorSchema.parse(_newMonitor); 93 + 94 + return c.json(data); 95 + }); 96 + }
+81
apps/server/src/v1/monitors/put.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { db, eq } from "@openstatus/db"; 4 + import { monitor } from "@openstatus/db/src/schema"; 5 + 6 + import { MonitorSchema, ParamsSchema } from "./schema"; 7 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 8 + import type { monitorsApi } from "./index"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const putRoute = createRoute({ 12 + method: "put", 13 + tags: ["monitor"], 14 + description: "Update a monitor", 15 + path: "/:id", 16 + request: { 17 + params: ParamsSchema, 18 + body: { 19 + description: "The monitor to update", 20 + content: { 21 + "application/json": { 22 + schema: MonitorSchema.omit({ id: true }), 23 + }, 24 + }, 25 + }, 26 + }, 27 + responses: { 28 + 200: { 29 + content: { 30 + "application/json": { 31 + schema: MonitorSchema, 32 + }, 33 + }, 34 + description: "Update a monitor", 35 + }, 36 + ...openApiErrorResponses, 37 + }, 38 + }); 39 + 40 + export function registerPutMonitor(api: typeof monitorsApi) { 41 + return api.openapi(putRoute, async (c) => { 42 + const workspaceId = c.get("workspaceId"); 43 + const workspacePlan = c.get("workspacePlan"); 44 + const { id } = c.req.valid("param"); 45 + const input = c.req.valid("json"); 46 + 47 + if (!workspacePlan.limits.periodicity.includes(input.periodicity)) { 48 + throw new HTTPException(403, { message: "Forbidden" }); 49 + } 50 + 51 + const _monitor = await db 52 + .select() 53 + .from(monitor) 54 + .where(eq(monitor.id, Number(id))) 55 + .get(); 56 + 57 + if (!_monitor) { 58 + throw new HTTPException(404, { message: "Not Found" }); 59 + } 60 + 61 + if (Number(workspaceId) !== _monitor.workspaceId) { 62 + throw new HTTPException(401, { message: "Unauthorized" }); 63 + } 64 + 65 + const { headers, regions, ...rest } = input; 66 + 67 + const _newMonitor = await db 68 + .update(monitor) 69 + .set({ 70 + ...rest, 71 + regions: regions ? regions.join(",") : undefined, 72 + headers: input.headers ? JSON.stringify(input.headers) : undefined, 73 + }) 74 + .returning() 75 + .get(); 76 + 77 + const data = MonitorSchema.parse(_newMonitor); 78 + 79 + return c.json(data); 80 + }); 81 + }
+120
apps/server/src/v1/monitors/schema.ts
··· 1 + import { z } from "@hono/zod-openapi"; 2 + 3 + import { 4 + flyRegions, 5 + monitorMethods, 6 + monitorPeriodicitySchema, 7 + } from "@openstatus/db/src/schema"; 8 + import { ZodError } from "zod"; 9 + 10 + export const ParamsSchema = z.object({ 11 + id: z 12 + .string() 13 + .min(1) 14 + .openapi({ 15 + param: { 16 + name: "id", 17 + in: "path", 18 + }, 19 + description: "The id of the monitor", 20 + example: "1", 21 + }), 22 + }); 23 + 24 + export const MonitorSchema = z 25 + .object({ 26 + id: z.number().openapi({ 27 + example: 123, 28 + description: "The id of the monitor", 29 + }), 30 + periodicity: monitorPeriodicitySchema.openapi({ 31 + example: "1m", 32 + description: "How often the monitor should run", 33 + }), 34 + url: z.string().url().openapi({ 35 + example: "https://www.documenso.co", 36 + description: "The url to monitor", 37 + }), 38 + regions: z 39 + .preprocess((val) => { 40 + try { 41 + if (Array.isArray(val)) return val; 42 + if (String(val).length > 0) { 43 + return String(val).split(","); 44 + } 45 + return []; 46 + } catch (e) { 47 + throw new ZodError([ 48 + { 49 + code: "custom", 50 + path: ["headers"], 51 + message: e instanceof Error ? e.message : "Invalid value", 52 + }, 53 + ]); 54 + } 55 + }, z.array(z.enum(flyRegions))) 56 + .default([]) 57 + .openapi({ 58 + example: ["ams"], 59 + description: "Where we should monitor it", 60 + }), 61 + name: z.string().openapi({ 62 + example: "Documenso", 63 + description: "The name of the monitor", 64 + }), 65 + description: z 66 + .string() 67 + .openapi({ 68 + example: "Documenso website", 69 + description: "The description of your monitor", 70 + }) 71 + .optional(), 72 + method: z.enum(monitorMethods).default("GET").openapi({ example: "GET" }), 73 + body: z 74 + .preprocess((val) => { 75 + return String(val); 76 + }, z.string()) 77 + .nullish() 78 + .default("") 79 + .openapi({ 80 + example: "Hello World", 81 + description: "The body", 82 + }), 83 + headers: z 84 + .preprocess((val) => { 85 + try { 86 + if (Array.isArray(val)) return val; 87 + if (String(val).length > 0) { 88 + return JSON.parse(String(val)); 89 + } 90 + return []; 91 + } catch (e) { 92 + throw new ZodError([ 93 + { 94 + code: "custom", 95 + path: ["headers"], 96 + message: e instanceof Error ? e.message : "Invalid value", 97 + }, 98 + ]); 99 + } 100 + }, z.array(z.object({ key: z.string(), value: z.string() })).default([])) 101 + .nullish() 102 + .openapi({ 103 + description: "The headers of your request", 104 + example: [{ key: "x-apikey", value: "supersecrettoken" }], 105 + }), 106 + active: z 107 + .boolean() 108 + .default(false) 109 + .openapi({ description: "If the monitor is active" }), 110 + public: z 111 + .boolean() 112 + .default(false) 113 + .openapi({ description: "If the monitor is public" }), 114 + }) 115 + .openapi({ 116 + description: "The monitor", 117 + required: ["periodicity", "url", "regions", "method"], 118 + }); 119 + 120 + export type MonitorSchema = z.infer<typeof MonitorSchema>;
+97
apps/server/src/v1/monitors/summary/get.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq, isNull } from "@openstatus/db"; 4 + import { monitor } from "@openstatus/db/src/schema"; 5 + import { OSTinybird } from "@openstatus/tinybird"; 6 + import { Redis } from "@openstatus/upstash"; 7 + 8 + import { isoDate } from "../../utils"; 9 + import { env } from "../../../env"; 10 + import { ParamsSchema } from "../schema"; 11 + import { openApiErrorResponses } from "../../../libs/errors/openapi-error-responses"; 12 + import type { monitorsApi } from "../index"; 13 + import { HTTPException } from "hono/http-exception"; 14 + 15 + const tb = new OSTinybird({ token: env.TINY_BIRD_API_KEY }); 16 + const redis = Redis.fromEnv(); 17 + 18 + const dailyStatsSchema = z.object({ 19 + ok: z.number().int().openapi({ 20 + description: "The number of ok responses", 21 + }), 22 + count: z 23 + .number() 24 + .int() 25 + .openapi({ description: "The total number of request" }), 26 + day: isoDate, 27 + }); 28 + 29 + const dailyStatsSchemaArray = z 30 + .array(dailyStatsSchema) 31 + .openapi({ description: "The daily stats" }); 32 + 33 + const getMonitorStats = createRoute({ 34 + method: "get", 35 + tags: ["monitor"], 36 + description: "Get monitor daily summary", 37 + path: "/:id/summary", 38 + request: { 39 + params: ParamsSchema, 40 + }, 41 + responses: { 42 + 200: { 43 + content: { 44 + "application/json": { 45 + schema: z.object({ 46 + data: dailyStatsSchemaArray, 47 + }), 48 + }, 49 + }, 50 + description: "All the historical metrics", 51 + }, 52 + ...openApiErrorResponses, 53 + }, 54 + }); 55 + 56 + export function registerGetMonitorSummary(api: typeof monitorsApi) { 57 + return api.openapi(getMonitorStats, async (c) => { 58 + const workspaceId = c.get("workspaceId"); 59 + const { id } = c.req.valid("param"); 60 + 61 + const _monitor = await db 62 + .select() 63 + .from(monitor) 64 + .where( 65 + and( 66 + eq(monitor.id, Number(id)), 67 + eq(monitor.workspaceId, Number(workspaceId)), 68 + isNull(monitor.deletedAt) 69 + ) 70 + ) 71 + .get(); 72 + 73 + if (!_monitor) { 74 + throw new HTTPException(404, { message: "Not Found" }); 75 + } 76 + 77 + const cache = await redis.get<z.infer<typeof dailyStatsSchemaArray>>( 78 + `${id}-daily-stats` 79 + ); 80 + if (cache) { 81 + console.log("fetching from cache"); 82 + return c.json({ 83 + data: cache, 84 + }); 85 + } 86 + 87 + // FIXME: we should use the OSTinybird client 88 + console.log("fetching from tinybird"); 89 + const res = await tb.endpointStatusPeriod("45d")({ 90 + monitorId: id, 91 + }); 92 + 93 + await redis.set(`${id}-daily-stats`, res, { ex: 600 }); 94 + 95 + return c.json({ data: res }); 96 + }); 97 + }
+5 -3
apps/server/src/v1/notification.test.ts apps/server/src/v1/notifications/notifications.test.ts
··· 1 1 import { expect, test } from "bun:test"; 2 2 3 - import { api } from "."; 4 - import { iso8601Regex } from "./test-utils"; 3 + import { api } from "../index"; 5 4 6 5 test("Create a notification", async () => { 7 6 const data = { ··· 17 16 }, 18 17 body: JSON.stringify(data), 19 18 }); 19 + 20 + const json = await res.json(); 21 + 20 22 expect(res.status).toBe(200); 21 23 22 - expect(await res.json()).toMatchObject({ 24 + expect(json).toMatchObject({ 23 25 id: expect.any(Number), 24 26 provider: "email", 25 27 payload: { email: "ping@openstatus.dev" },
-289
apps/server/src/v1/notification.ts
··· 1 - import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi"; 2 - import isEmail from "validator/lib/isEmail"; 3 - import isMobilePhone from "validator/lib/isMobilePhone"; 4 - 5 - import { and, db, eq, inArray } from "@openstatus/db"; 6 - import { 7 - NotificationDataSchema, 8 - monitor, 9 - notification, 10 - notificationProvider, 11 - notificationsToMonitors, 12 - page, 13 - selectNotificationSchema, 14 - } from "@openstatus/db/src/schema"; 15 - 16 - import type { Variables } from "."; 17 - import { ErrorSchema } from "./shared"; 18 - 19 - const notificationApi = new OpenAPIHono<{ Variables: Variables }>(); 20 - 21 - const ParamsSchema = z.object({ 22 - id: z 23 - .string() 24 - .min(1) 25 - .openapi({ 26 - param: { 27 - name: "id", 28 - in: "path", 29 - }, 30 - description: "The id of the notification", 31 - example: "1", 32 - }), 33 - }); 34 - 35 - const NotificationSchema = z.object({ 36 - id: z 37 - .number() 38 - .openapi({ description: "The id of the notification", example: 1 }), 39 - name: z.string().openapi({ 40 - description: "The name of the notification", 41 - example: "OpenStatus Discord", 42 - }), 43 - provider: z.enum(notificationProvider).openapi({ 44 - description: "The provider of the notification", 45 - example: "discord", 46 - }), 47 - payload: NotificationDataSchema.openapi({ 48 - description: "The data of the notification", 49 - }), 50 - monitors: z 51 - .array(z.number()) 52 - .openapi({ 53 - description: "The monitors that the notification is linked to", 54 - example: [1, 2], 55 - }) 56 - .nullish(), 57 - }); 58 - 59 - const CreateNotificationSchema = z.object({ 60 - name: z.string().openapi({ 61 - description: "The name of the notification", 62 - example: "OpenStatus Discord", 63 - }), 64 - provider: z.enum(notificationProvider).openapi({ 65 - description: "The provider of the notification", 66 - example: "discord", 67 - }), 68 - payload: NotificationDataSchema.openapi({ 69 - description: "The data of the notification", 70 - }), 71 - monitors: z 72 - .array(z.number()) 73 - .openapi({ 74 - description: "The monitors that the notification is linked to", 75 - example: [1, 2], 76 - }) 77 - .nullish(), 78 - }); 79 - 80 - const getAllRoute = createRoute({ 81 - method: "get", 82 - tags: ["notification"], 83 - description: "Get a notification", 84 - path: "/", 85 - 86 - responses: { 87 - 200: { 88 - content: { 89 - "application/json": { 90 - schema: z.array(NotificationSchema), 91 - }, 92 - }, 93 - description: "Get all your workspace notification", 94 - }, 95 - 400: { 96 - content: { 97 - "application/json": { 98 - schema: ErrorSchema, 99 - }, 100 - }, 101 - description: "Returns an error", 102 - }, 103 - }, 104 - }); 105 - 106 - notificationApi.openapi(getAllRoute, async (c) => { 107 - const workspaceId = Number(c.get("workspaceId")); 108 - 109 - const result = await db 110 - .select() 111 - .from(notification) 112 - .where(and(eq(page.workspaceId, workspaceId))) 113 - .all(); 114 - 115 - if (!result) return c.json({ code: 404, message: "Not Found" }, 404); 116 - const data = []; 117 - 118 - for (const r of result) { 119 - const linkedMonitors = await db 120 - .select() 121 - .from(notificationsToMonitors) 122 - .where(eq(notificationsToMonitors.notificationId, r.id)) 123 - .all(); 124 - 125 - const monitorsId = linkedMonitors.map((m) => m.monitorId); 126 - 127 - const p = NotificationSchema.parse({ 128 - ...result, 129 - payload: JSON.parse(r.data || "{}"), 130 - monitors: monitorsId, 131 - }); 132 - data.push(p); 133 - } 134 - 135 - return c.json(data); 136 - }); 137 - 138 - const getRoute = createRoute({ 139 - method: "get", 140 - tags: ["notification"], 141 - description: "Get a notification", 142 - path: "/:id", 143 - request: { 144 - params: ParamsSchema, 145 - }, 146 - responses: { 147 - 200: { 148 - content: { 149 - "application/json": { 150 - schema: NotificationSchema, 151 - }, 152 - }, 153 - description: "Get an Status page", 154 - }, 155 - 400: { 156 - content: { 157 - "application/json": { 158 - schema: ErrorSchema, 159 - }, 160 - }, 161 - description: "Returns an error", 162 - }, 163 - }, 164 - }); 165 - 166 - notificationApi.openapi(getRoute, async (c) => { 167 - const workspaceId = Number(c.get("workspaceId")); 168 - const { id } = c.req.valid("param"); 169 - 170 - const notificationId = Number(id); 171 - const result = await db 172 - .select() 173 - .from(notification) 174 - .where( 175 - and( 176 - eq(page.workspaceId, workspaceId), 177 - eq(notification.id, notificationId), 178 - ), 179 - ) 180 - .get(); 181 - 182 - if (!result) return c.json({ code: 404, message: "Not Found" }, 404); 183 - const linkedMonitors = await db 184 - .select() 185 - .from(notificationsToMonitors) 186 - .where(eq(notificationsToMonitors.notificationId, notificationId)) 187 - .all(); 188 - 189 - const monitorsId = linkedMonitors.map((m) => m.monitorId); 190 - 191 - const data = NotificationSchema.parse({ 192 - ...result, 193 - payload: JSON.parse(result.data || "{}"), 194 - monitors: monitorsId, 195 - }); 196 - 197 - return c.json(data); 198 - }); 199 - 200 - const postRoute = createRoute({ 201 - method: "post", 202 - tags: ["page"], 203 - description: "Create a notification", 204 - path: "/", 205 - request: { 206 - body: { 207 - description: "The notification to create", 208 - content: { 209 - "application/json": { 210 - schema: CreateNotificationSchema, 211 - }, 212 - }, 213 - }, 214 - }, 215 - responses: { 216 - 200: { 217 - content: { 218 - "application/json": { 219 - schema: NotificationSchema, 220 - }, 221 - }, 222 - description: "Return the created notification", 223 - }, 224 - 400: { 225 - content: { 226 - "application/json": { 227 - schema: ErrorSchema, 228 - }, 229 - }, 230 - description: "Returns an error", 231 - }, 232 - }, 233 - }); 234 - 235 - notificationApi.openapi(postRoute, async (c) => { 236 - const workspaceId = Number(c.get("workspaceId")); 237 - const workspacePlan = c.get("workspacePlan"); 238 - const input = c.req.valid("json"); 239 - if (input.provider === "sms" && workspacePlan.title === "free") { 240 - return c.json({ code: 403, message: "Forbidden" }, 403); 241 - } 242 - 243 - const { payload, monitors, ...rest } = input; 244 - if (monitors) { 245 - const monitorsData = await db 246 - .select() 247 - .from(monitor) 248 - .where( 249 - and( 250 - inArray(monitor.id, monitors), 251 - eq(monitor.workspaceId, workspaceId), 252 - ), 253 - ) 254 - .all(); 255 - if (monitorsData.length !== monitors.length) 256 - return c.json({ code: 400, message: "Monitor not found" }, 400); 257 - } 258 - 259 - const newNotif = await db 260 - .insert(notification) 261 - .values({ 262 - workspaceId, 263 - ...rest, 264 - data: JSON.stringify(payload), 265 - }) 266 - .returning() 267 - .get(); 268 - 269 - console.log(newNotif); 270 - if (monitors) { 271 - for (const monitorId of monitors) { 272 - await db 273 - .insert(notificationsToMonitors) 274 - .values({ notificationId: newNotif.id, monitorId }) 275 - .run(); 276 - } 277 - } 278 - const d = selectNotificationSchema.parse(newNotif); 279 - 280 - const p = NotificationDataSchema.parse(JSON.parse(d.data)); 281 - const data = NotificationSchema.parse({ 282 - ...newNotif, 283 - monitors: monitors, 284 - payload: p, 285 - }); 286 - return c.json(data); 287 - }); 288 - 289 - export { notificationApi };
+71
apps/server/src/v1/notifications/get.ts
··· 1 + import { createRoute } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq } from "@openstatus/db"; 4 + import { 5 + notification, 6 + notificationsToMonitors, 7 + page, 8 + } from "@openstatus/db/src/schema"; 9 + import { NotificationSchema, ParamsSchema } from "./schema"; 10 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 11 + import type { notificationsApi } from "./index"; 12 + import { HTTPException } from "hono/http-exception"; 13 + 14 + const getRoute = createRoute({ 15 + method: "get", 16 + tags: ["notification"], 17 + description: "Get a notification", 18 + path: "/:id", 19 + request: { 20 + params: ParamsSchema, 21 + }, 22 + responses: { 23 + 200: { 24 + content: { 25 + "application/json": { 26 + schema: NotificationSchema, 27 + }, 28 + }, 29 + description: "Get an Status page", 30 + }, 31 + ...openApiErrorResponses, 32 + }, 33 + }); 34 + 35 + export function registerGetNotification(api: typeof notificationsApi) { 36 + return api.openapi(getRoute, async (c) => { 37 + const workspaceId = c.get("workspaceId"); 38 + const { id } = c.req.valid("param"); 39 + 40 + const _notification = await db 41 + .select() 42 + .from(notification) 43 + .where( 44 + and( 45 + eq(page.workspaceId, Number(workspaceId)), 46 + eq(notification.id, Number(id)), 47 + ), 48 + ) 49 + .get(); 50 + 51 + if (!_notification) { 52 + throw new HTTPException(404, { message: "Not Found" }); 53 + } 54 + 55 + const linkedMonitors = await db 56 + .select() 57 + .from(notificationsToMonitors) 58 + .where(eq(notificationsToMonitors.notificationId, Number(id))) 59 + .all(); 60 + 61 + const monitors = linkedMonitors.map((m) => m.monitorId); 62 + 63 + const data = NotificationSchema.parse({ 64 + ..._notification, 65 + payload: JSON.parse(_notification.data || "{}"), 66 + monitors, 67 + }); 68 + 69 + return c.json(data); 70 + }); 71 + }
+69
apps/server/src/v1/notifications/get_all.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq } from "@openstatus/db"; 4 + import { 5 + notification, 6 + notificationsToMonitors, 7 + page, 8 + } from "@openstatus/db/src/schema"; 9 + import { NotificationSchema } from "./schema"; 10 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 11 + import type { notificationsApi } from "./index"; 12 + import { HTTPException } from "hono/http-exception"; 13 + 14 + const getAllRoute = createRoute({ 15 + method: "get", 16 + tags: ["notification"], 17 + description: "Get a notification", 18 + path: "/", 19 + 20 + responses: { 21 + 200: { 22 + content: { 23 + "application/json": { 24 + schema: z.array(NotificationSchema), 25 + }, 26 + }, 27 + description: "Get all your workspace notification", 28 + }, 29 + ...openApiErrorResponses, 30 + }, 31 + }); 32 + 33 + export function registerGetAllNotifications(app: typeof notificationsApi) { 34 + return app.openapi(getAllRoute, async (c) => { 35 + const workspaceId = c.get("workspaceId"); 36 + 37 + const _incidents = await db 38 + .select() 39 + .from(notification) 40 + .where(and(eq(page.workspaceId, Number(workspaceId)))) 41 + .all(); 42 + 43 + if (!_incidents) { 44 + throw new HTTPException(404, { message: "Not Found" }); 45 + } 46 + 47 + const data = []; 48 + 49 + for (const _incident of _incidents) { 50 + const linkedMonitors = await db 51 + .select() 52 + .from(notificationsToMonitors) 53 + .where(eq(notificationsToMonitors.notificationId, _incident.id)) 54 + .all(); 55 + 56 + const monitors = linkedMonitors.map((m) => m.monitorId); 57 + 58 + const p = NotificationSchema.parse({ 59 + ..._incidents, 60 + payload: JSON.parse(_incident.data || "{}"), 61 + monitors, 62 + }); 63 + 64 + data.push(p); 65 + } 66 + 67 + return c.json(data); 68 + }); 69 + }
+15
apps/server/src/v1/notifications/index.ts
··· 1 + import { OpenAPIHono } from "@hono/zod-openapi"; 2 + 3 + import type { Variables } from "../index"; 4 + import { registerGetAllNotifications } from "./get_all"; 5 + import { registerGetNotification } from "./get"; 6 + import { registerPostNotification } from "./post"; 7 + import { handleZodError } from "../../libs/errors"; 8 + 9 + export const notificationsApi = new OpenAPIHono<{ Variables: Variables }>({ 10 + defaultHook: handleZodError, 11 + }); 12 + 13 + registerGetAllNotifications(notificationsApi); 14 + registerGetNotification(notificationsApi); 15 + registerPostNotification(notificationsApi);
+118
apps/server/src/v1/notifications/post.ts
··· 1 + import { createRoute } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq, inArray, isNull, sql } from "@openstatus/db"; 4 + import { 5 + NotificationDataSchema, 6 + monitor, 7 + notification, 8 + notificationsToMonitors, 9 + selectNotificationSchema, 10 + } from "@openstatus/db/src/schema"; 11 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 12 + import { NotificationSchema } from "./schema"; 13 + import type { notificationsApi } from "./index"; 14 + import { HTTPException } from "hono/http-exception"; 15 + 16 + const postRoute = createRoute({ 17 + method: "post", 18 + tags: ["notification"], 19 + description: "Create a notification", 20 + path: "/", 21 + request: { 22 + body: { 23 + description: "The notification to create", 24 + content: { 25 + "application/json": { 26 + schema: NotificationSchema.omit({ id: true }), 27 + }, 28 + }, 29 + }, 30 + }, 31 + responses: { 32 + 200: { 33 + content: { 34 + "application/json": { 35 + schema: NotificationSchema, 36 + }, 37 + }, 38 + description: "Return the created notification", 39 + }, 40 + ...openApiErrorResponses, 41 + }, 42 + }); 43 + 44 + export function registerPostNotification(api: typeof notificationsApi) { 45 + return api.openapi(postRoute, async (c) => { 46 + const workspaceId = c.get("workspaceId"); 47 + const workspacePlan = c.get("workspacePlan"); 48 + const input = c.req.valid("json"); 49 + 50 + if (input.provider === "sms" && workspacePlan.title === "Hobby") { 51 + throw new HTTPException(403, { message: "Upgrade for SMS" }); 52 + } 53 + 54 + const count = ( 55 + await db 56 + .select({ count: sql<number>`count(*)` }) 57 + .from(notification) 58 + .where(eq(notification.workspaceId, Number(workspaceId))) 59 + .all() 60 + )[0].count; 61 + 62 + if (count >= workspacePlan.limits["notification-channels"]) { 63 + throw new HTTPException(403, { 64 + message: "Upgrade for more notification channels", 65 + }); 66 + } 67 + 68 + const { payload, monitors, ...rest } = input; 69 + 70 + if (monitors?.length) { 71 + const _monitors = await db 72 + .select() 73 + .from(monitor) 74 + .where( 75 + and( 76 + inArray(monitor.id, monitors), 77 + eq(monitor.workspaceId, Number(workspaceId)), 78 + isNull(monitor.deletedAt) 79 + ) 80 + ) 81 + .all(); 82 + 83 + if (_monitors.length !== monitors.length) { 84 + throw new HTTPException(400, { message: "Monitor not found" }); 85 + } 86 + } 87 + 88 + const _notification = await db 89 + .insert(notification) 90 + .values({ 91 + ...rest, 92 + workspaceId: Number(workspaceId), 93 + data: JSON.stringify(payload), 94 + }) 95 + .returning() 96 + .get(); 97 + 98 + if (monitors?.length) { 99 + for (const monitorId of monitors) { 100 + await db 101 + .insert(notificationsToMonitors) 102 + .values({ notificationId: _notification.id, monitorId }) 103 + .run(); 104 + } 105 + } 106 + 107 + // FIXME: too complex 108 + const d = selectNotificationSchema.parse(_notification); 109 + 110 + const _payload = NotificationDataSchema.parse(JSON.parse(d.data)); 111 + const data = NotificationSchema.parse({ 112 + ..._notification, 113 + monitors, 114 + payload: _payload, 115 + }); 116 + return c.json(data); 117 + }); 118 + }
+45
apps/server/src/v1/notifications/schema.ts
··· 1 + import { z } from "@hono/zod-openapi"; 2 + import { 3 + NotificationDataSchema, 4 + notificationProviderSchema, 5 + } from "@openstatus/db/src/schema"; 6 + 7 + export const ParamsSchema = z.object({ 8 + id: z 9 + .string() 10 + .min(1) 11 + .openapi({ 12 + param: { 13 + name: "id", 14 + in: "path", 15 + }, 16 + description: "The id of the notification", 17 + example: "1", 18 + }), 19 + }); 20 + 21 + export const NotificationSchema = z.object({ 22 + id: z 23 + .number() 24 + .openapi({ description: "The id of the notification", example: 1 }), 25 + name: z.string().openapi({ 26 + description: "The name of the notification", 27 + example: "OpenStatus Discord", 28 + }), 29 + provider: notificationProviderSchema.openapi({ 30 + description: "The provider of the notification", 31 + example: "discord", 32 + }), 33 + payload: NotificationDataSchema.openapi({ 34 + description: "The data of the notification", 35 + }), 36 + monitors: z 37 + .array(z.number()) 38 + .openapi({ 39 + description: "The monitors that the notification is linked to", 40 + example: [1, 2], 41 + }) 42 + .nullish(), 43 + }); 44 + 45 + export type NotificationSchema = z.infer<typeof NotificationSchema>;
+8 -10
apps/server/src/v1/page.test.ts apps/server/src/v1/pages/pages.test.ts
··· 1 1 import { expect, test } from "bun:test"; 2 2 3 - import { api } from "."; 3 + import { api } from "../index"; 4 4 5 5 test("Create a page", async () => { 6 6 const data = { ··· 41 41 }, 42 42 body: JSON.stringify(data), 43 43 }); 44 + 45 + const json = await res.json(); 46 + 44 47 expect(res.status).toBe(200); 45 48 46 - expect(await res.json()).toMatchObject({ 49 + expect(json).toMatchObject({ 47 50 id: expect.any(Number), 48 51 title: "OpenStatus", 49 52 description: "OpenStatus website", ··· 66 69 }, 67 70 body: JSON.stringify(data), 68 71 }); 72 + 73 + const json = await res.json(); 69 74 70 75 expect(res.status).toBe(200); 71 76 72 - expect(await res.json()).toMatchObject({ 77 + expect(json).toMatchObject({ 73 78 id: 3, 74 79 }); 75 80 }); ··· 104 109 body: JSON.stringify(data), 105 110 }); 106 111 expect(res.status).toBe(400); 107 - expect(await res.json()).toMatchObject({ 108 - error: { 109 - issues: expect.any(Array), 110 - name: "ZodError", 111 - }, 112 - success: false, 113 - }); 114 112 });
-696
apps/server/src/v1/page.ts
··· 1 - import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi"; 2 - 3 - import { and, eq, inArray, sql } from "@openstatus/db"; 4 - import { db } from "@openstatus/db/src/db"; 5 - import { 6 - monitor, 7 - monitorsToPages, 8 - page, 9 - pageSubscriber, 10 - } from "@openstatus/db/src/schema"; 11 - import { SubscribeEmail } from "@openstatus/emails"; 12 - import { sendEmail } from "@openstatus/emails/emails/send"; 13 - 14 - import type { Variables } from "."; 15 - import { ErrorSchema } from "./shared"; 16 - import { isNumberArray } from "./utils"; 17 - 18 - const pageApi = new OpenAPIHono<{ Variables: Variables }>(); 19 - 20 - const ParamsSchema = z.object({ 21 - id: z 22 - .string() 23 - .min(1) 24 - .openapi({ 25 - param: { 26 - name: "id", 27 - in: "path", 28 - }, 29 - description: "The id of the page", 30 - example: "1", 31 - }), 32 - }); 33 - 34 - const PageSchema = z.object({ 35 - id: z.number().openapi({ 36 - description: "The id of the page", 37 - example: 1, 38 - }), 39 - title: z.string().openapi({ 40 - description: "The title of the page", 41 - example: "My Page", 42 - }), 43 - description: z.string().openapi({ 44 - description: "The description of the page", 45 - example: "My awesome status page", 46 - }), 47 - slug: z.string().openapi({ 48 - description: "The slug of the page", 49 - example: "my-page", 50 - }), 51 - customDomain: z 52 - .string() 53 - .openapi({ 54 - description: "The custom domain of the page", 55 - example: "my-page.com", 56 - }) 57 - .transform((val) => (val ? val : undefined)) 58 - .nullish(), 59 - 60 - icon: z 61 - .string() 62 - .openapi({ 63 - description: "The icon of the page", 64 - example: "https://example.com/icon.png", 65 - }) 66 - .url() 67 - .or(z.literal("")) 68 - .transform((val) => (val ? val : undefined)) 69 - .nullish(), 70 - 71 - passwordProtected: z 72 - .boolean() 73 - .openapi({ 74 - description: 75 - "Make the page password protected. Used with the 'passwordProtected' property.", 76 - example: true, 77 - }) 78 - .default(false) 79 - .optional(), 80 - 81 - password: z 82 - .string() 83 - .openapi({ 84 - description: "Your password to protect the page from the publi", 85 - example: "hidden-password", 86 - }) 87 - .optional() 88 - .nullish(), 89 - 90 - monitors: z 91 - .array(z.number()) 92 - .openapi({ 93 - description: "The monitors of the page as an array of ids", 94 - example: [1, 2], 95 - }) 96 - .or( 97 - z.array(z.object({ monitorId: z.number(), order: z.number() })).openapi({ 98 - description: "The monitor as object allowing to pass id and order", 99 - example: [ 100 - { monitorId: 1, order: 0 }, 101 - { monitorId: 2, order: 1 }, 102 - ], 103 - }) 104 - ) 105 - .optional(), 106 - }); 107 - 108 - const CreatePageSchema = z.object({ 109 - title: z.string().openapi({ 110 - description: "The title of the page", 111 - example: "My Page", 112 - }), 113 - description: z.string().openapi({ 114 - description: "The description of the page", 115 - example: "My awesome status page", 116 - }), 117 - icon: z 118 - .string() 119 - .url() 120 - .openapi({ 121 - description: "The icon of the page", 122 - example: "https://example.com/icon.png", 123 - }) 124 - .optional(), 125 - slug: z.string().openapi({ 126 - description: "The slug of the page", 127 - example: "my-page", 128 - }), 129 - customDomain: z 130 - .string() 131 - .openapi({ 132 - description: "The custom domain of the page", 133 - example: "my-page.com", 134 - }) 135 - .optional() 136 - .default(""), 137 - monitors: z 138 - .array(z.number()) 139 - .openapi({ 140 - description: "The monitors of the page as an array of ids", 141 - example: [1, 2], 142 - }) 143 - .or( 144 - z.array(z.object({ monitorId: z.number(), order: z.number() })).openapi({ 145 - description: "The monitor as object allowing to pass id and order", 146 - example: [ 147 - { monitorId: 1, order: 0 }, 148 - { monitorId: 2, order: 1 }, 149 - ], 150 - }) 151 - ) 152 - .nullish(), 153 - 154 - passwordProtected: z 155 - .boolean() 156 - .openapi({ 157 - description: "Make the page password protected", 158 - example: true, 159 - }) 160 - .default(false) 161 - .optional(), 162 - 163 - password: z 164 - .string() 165 - .openapi({ 166 - description: "Your password to protect the page from the publi", 167 - example: "hidden-password", 168 - }) 169 - .optional() 170 - .nullish(), 171 - }); 172 - 173 - const UpdatePageSchema = z.object({ 174 - title: z 175 - .string() 176 - .openapi({ 177 - description: "The title of the page", 178 - example: "My Page", 179 - }) 180 - .optional(), 181 - description: z 182 - .string() 183 - .openapi({ 184 - description: "The description of the page", 185 - example: "My awesome status page", 186 - }) 187 - .optional(), 188 - icon: z 189 - .string() 190 - .url() 191 - .openapi({ 192 - description: "The icon of the page", 193 - example: "https://example.com/icon.png", 194 - }) 195 - .optional(), 196 - slug: z 197 - .string() 198 - .openapi({ 199 - description: "The slug of the page", 200 - example: "my-page", 201 - }) 202 - .optional(), 203 - customDomain: z 204 - .string() 205 - .openapi({ 206 - description: "The custom domain of the page", 207 - example: "my-page.com", 208 - }) 209 - .optional() 210 - .default(""), 211 - monitors: z 212 - .array(z.number()) 213 - .openapi({ 214 - description: "The monitors of the page as an array of ids", 215 - example: [1, 2], 216 - }) 217 - .or( 218 - z.array(z.object({ monitorId: z.number(), order: z.number() })).openapi({ 219 - description: "The monitor as object allowing to pass id and order", 220 - example: [ 221 - { monitorId: 1, order: 0 }, 222 - { monitorId: 2, order: 1 }, 223 - ], 224 - }) 225 - ) 226 - .nullish(), 227 - 228 - passwordProtected: z 229 - .boolean() 230 - .openapi({ 231 - description: "Make the page password protected", 232 - example: true, 233 - }) 234 - .default(false) 235 - .optional(), 236 - 237 - password: z 238 - .string() 239 - .openapi({ 240 - description: "Your password to protect the page from the publi", 241 - example: "hidden-password", 242 - }) 243 - .optional() 244 - .nullish(), 245 - }); 246 - 247 - const pageSubscriberSchema = z.object({ 248 - email: z.string().email().openapi({ 249 - description: "The email of the subscriber", 250 - }), 251 - }); 252 - 253 - const postRouteSubscriber = createRoute({ 254 - method: "post", 255 - tags: ["page"], 256 - path: "/:id/update", 257 - description: "Add a subscriber to a status page", 258 - request: { 259 - params: ParamsSchema, 260 - body: { 261 - description: "the subscriber payload", 262 - content: { 263 - "application/json": { 264 - schema: z.object({ 265 - email: z 266 - .string() 267 - .email() 268 - .openapi({ description: "The email of the subscriber" }), 269 - }), 270 - }, 271 - }, 272 - }, 273 - }, 274 - responses: { 275 - 200: { 276 - content: { 277 - "application/json": { 278 - schema: pageSubscriberSchema, 279 - }, 280 - }, 281 - description: "The user", 282 - }, 283 - 400: { 284 - content: { 285 - "application/json": { 286 - schema: ErrorSchema, 287 - }, 288 - }, 289 - description: "Returns an error", 290 - }, 291 - }, 292 - }); 293 - 294 - pageApi.openapi(postRouteSubscriber, async (c) => { 295 - const input = c.req.valid("json"); 296 - const { id } = c.req.valid("param"); 297 - const workspaceId = Number(c.get("workspaceId")); 298 - 299 - const pageId = Number(id); 300 - const _page = await db 301 - .select() 302 - .from(page) 303 - .where(and(eq(page.id, pageId), eq(page.workspaceId, workspaceId))) 304 - .get(); 305 - 306 - if (!_page) return c.json({ code: 401, message: "Not authorized" }, 401); 307 - 308 - const alreadySubscribed = await db 309 - .select() 310 - .from(pageSubscriber) 311 - .where( 312 - and( 313 - eq(pageSubscriber.email, input.email), 314 - eq(pageSubscriber.pageId, pageId) 315 - ) 316 - ) 317 - .get(); 318 - if (alreadySubscribed) 319 - return c.json({ code: 401, message: "Already subscribed" }, 401); 320 - 321 - // TODO: send email for verification 322 - const token = (Math.random() + 1).toString(36).substring(10); 323 - 324 - await sendEmail({ 325 - react: SubscribeEmail({ 326 - domain: _page.slug, 327 - token: token, 328 - page: page.title, 329 - }), 330 - from: "OpenStatus <notification@notifications.openstatus.dev>", 331 - to: [input.email], 332 - subject: "Verify your subscription", 333 - }); 334 - const _statusReportSubscriberUpdate = await db 335 - .insert(pageSubscriber) 336 - .values({ 337 - pageId: _page.id, 338 - email: input.email, 339 - token, 340 - expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 7), 341 - }) 342 - .returning() 343 - .get(); 344 - 345 - const data = pageSubscriberSchema.parse(_statusReportSubscriberUpdate); 346 - 347 - return c.json({ 348 - ...data, 349 - }); 350 - }); 351 - 352 - const getRoute = createRoute({ 353 - method: "get", 354 - tags: ["page"], 355 - description: "Get a status page", 356 - path: "/:id", 357 - request: { 358 - params: ParamsSchema, 359 - }, 360 - responses: { 361 - 200: { 362 - content: { 363 - "application/json": { 364 - schema: PageSchema, 365 - }, 366 - }, 367 - description: "Get an Status page", 368 - }, 369 - 400: { 370 - content: { 371 - "application/json": { 372 - schema: ErrorSchema, 373 - }, 374 - }, 375 - description: "Returns an error", 376 - }, 377 - }, 378 - }); 379 - 380 - pageApi.openapi(getRoute, async (c) => { 381 - const workspaceId = Number(c.get("workspaceId")); 382 - const { id } = c.req.valid("param"); 383 - 384 - const pageId = Number(id); 385 - const result = await db 386 - .select() 387 - .from(page) 388 - .where(and(eq(page.workspaceId, workspaceId), eq(page.id, pageId))) 389 - .get(); 390 - 391 - if (!result) return c.json({ code: 404, message: "Not Found" }, 404); 392 - const data = PageSchema.parse(result); 393 - 394 - return c.json(data); 395 - }); 396 - 397 - const getAllRoute = createRoute({ 398 - method: "get", 399 - tags: ["page"], 400 - description: "Get all your status page", 401 - path: "/", 402 - responses: { 403 - 200: { 404 - content: { 405 - "application/json": { 406 - schema: z.array(PageSchema), 407 - }, 408 - }, 409 - description: "Get an Status page", 410 - }, 411 - 400: { 412 - content: { 413 - "application/json": { 414 - schema: ErrorSchema, 415 - }, 416 - }, 417 - description: "Returns an error", 418 - }, 419 - }, 420 - }); 421 - 422 - pageApi.openapi(getAllRoute, async (c) => { 423 - const workspaceId = Number(c.get("workspaceId")); 424 - 425 - const result = await db 426 - .select() 427 - .from(page) 428 - .where(and(eq(page.workspaceId, workspaceId))); 429 - 430 - if (!result) return c.json({ code: 404, message: "Not Found" }, 404); 431 - const data = z.array(PageSchema).parse(result); 432 - 433 - return c.json(data); 434 - }); 435 - 436 - const postRoute = createRoute({ 437 - method: "post", 438 - tags: ["page"], 439 - description: "Create a status page", 440 - path: "/", 441 - request: { 442 - body: { 443 - description: "The status page to create", 444 - content: { 445 - "application/json": { 446 - schema: CreatePageSchema, 447 - }, 448 - }, 449 - }, 450 - }, 451 - responses: { 452 - 200: { 453 - content: { 454 - "application/json": { 455 - schema: PageSchema, 456 - }, 457 - }, 458 - description: "Get an Status page", 459 - }, 460 - 400: { 461 - content: { 462 - "application/json": { 463 - schema: ErrorSchema, 464 - }, 465 - }, 466 - description: "Returns an error", 467 - }, 468 - }, 469 - }); 470 - 471 - pageApi.openapi(postRoute, async (c) => { 472 - const workspaceId = Number(c.get("workspaceId")); 473 - 474 - // Check if the user has reached the limit of pages 475 - const count = ( 476 - await db 477 - .select({ count: sql<number>`count(*)` }) 478 - .from(page) 479 - .where(eq(page.workspaceId, workspaceId)) 480 - .all() 481 - )[0].count; 482 - 483 - const workspacePlan = c.get("workspacePlan"); 484 - 485 - if (count >= workspacePlan.limits["status-pages"]) 486 - return c.json({ code: 403, message: "Forbidden" }, 403); 487 - 488 - const input = c.req.valid("json"); 489 - 490 - if ( 491 - workspacePlan.limits["password-protection"] === false && 492 - input?.passwordProtected === true 493 - ) { 494 - return c.json({ code: 403, message: "Forbidden" }, 403); 495 - } 496 - 497 - const countSlug = ( 498 - await db 499 - .select({ count: sql<number>`count(*)` }) 500 - .from(page) 501 - .where(eq(page.slug, input.slug)) 502 - .all() 503 - )[0].count; 504 - 505 - if (countSlug > 0) 506 - return c.json({ code: 400, message: "Slug already taken" }, 400); 507 - 508 - const { monitors, ...rest } = input; 509 - 510 - if (monitors?.length) { 511 - const monitorIds = isNumberArray(monitors) 512 - ? monitors 513 - : monitors.map((m) => m.monitorId); 514 - 515 - const monitorsData = await db 516 - .select() 517 - .from(monitor) 518 - .where( 519 - and( 520 - inArray(monitor.id, monitorIds), 521 - eq(monitor.workspaceId, workspaceId) 522 - ) 523 - ) 524 - .all(); 525 - if (monitorsData.length !== monitors.length) 526 - return c.json({ code: 400, message: "Monitor not found" }, 400); 527 - } 528 - 529 - const newPage = await db 530 - .insert(page) 531 - .values({ workspaceId, ...rest }) 532 - .returning() 533 - .get(); 534 - 535 - if (monitors) { 536 - for (const monitor of monitors) { 537 - const values = 538 - typeof monitor === "number" ? { monitorId: monitor } : monitor; 539 - 540 - await db 541 - .insert(monitorsToPages) 542 - .values({ pageId: newPage.id, ...values }) 543 - .run(); 544 - } 545 - } 546 - const data = PageSchema.parse(newPage); 547 - return c.json(data); 548 - }); 549 - 550 - const putRoute = createRoute({ 551 - method: "put", 552 - tags: ["page"], 553 - description: "Update a status page", 554 - path: "/:id", 555 - request: { 556 - params: ParamsSchema, 557 - body: { 558 - description: "The monitor to update", 559 - content: { 560 - "application/json": { 561 - schema: UpdatePageSchema, 562 - }, 563 - }, 564 - }, 565 - }, 566 - responses: { 567 - 200: { 568 - content: { 569 - "application/json": { 570 - schema: PageSchema, 571 - }, 572 - }, 573 - description: "Get an Status page", 574 - }, 575 - 400: { 576 - content: { 577 - "application/json": { 578 - schema: ErrorSchema, 579 - }, 580 - }, 581 - description: "Returns an error", 582 - }, 583 - }, 584 - }); 585 - 586 - pageApi.openapi(putRoute, async (c) => { 587 - const input = c.req.valid("json"); 588 - 589 - const workspaceId = Number(c.get("workspaceId")); 590 - const { id } = c.req.valid("param"); 591 - 592 - if (!id) return c.json({ code: 400, message: "Bad Request" }, 400); 593 - 594 - const workspacePlan = c.get("workspacePlan"); 595 - 596 - if ( 597 - workspacePlan.limits["password-protection"] === false && 598 - input?.passwordProtected === true 599 - ) { 600 - return c.json({ code: 403, message: "Forbidden" }, 403); 601 - } 602 - 603 - const _page = await db 604 - .select() 605 - .from(page) 606 - .where(eq(page.id, Number(id))) 607 - .get(); 608 - 609 - if (!_page) return c.json({ code: 404, message: "Not Found" }, 404); 610 - 611 - if (workspaceId !== _page.workspaceId) 612 - return c.json({ code: 401, message: "Unauthorized" }, 401); 613 - 614 - if (input.slug) { 615 - const countSlug = ( 616 - await db 617 - .select({ count: sql<number>`count(*)` }) 618 - .from(page) 619 - .where(eq(page.slug, input.slug)) 620 - .all() 621 - )[0].count; 622 - 623 - if (countSlug > 0) 624 - return c.json({ code: 400, message: "Slug already taken" }, 400); 625 - } 626 - const { monitors, ...rest } = input; 627 - 628 - const monitorIds = monitors 629 - ? isNumberArray(monitors) 630 - ? monitors 631 - : monitors.map((m) => m.monitorId) 632 - : []; 633 - 634 - if (monitors?.length) { 635 - const monitorsData = await db 636 - .select() 637 - .from(monitor) 638 - .where( 639 - and( 640 - inArray(monitor.id, monitorIds), 641 - eq(monitor.workspaceId, workspaceId) 642 - ) 643 - ) 644 - .all(); 645 - if (monitorsData.length !== monitors.length) 646 - return c.json({ code: 400, message: "Monitor not found" }, 400); 647 - } 648 - 649 - const newPage = await db 650 - .update(page) 651 - .set({ ...rest }) 652 - .where(eq(page.id, _page.id)) 653 - .returning() 654 - .get(); 655 - 656 - const data = PageSchema.parse(newPage); 657 - 658 - const currentMonitorsToPages = await db 659 - .select() 660 - .from(monitorsToPages) 661 - .where(eq(monitorsToPages.pageId, _page.id)); 662 - 663 - const removedMonitors = currentMonitorsToPages 664 - .map(({ monitorId }) => monitorId) 665 - .filter((x) => !monitorIds?.includes(x)); 666 - 667 - if (removedMonitors.length) { 668 - await db 669 - .delete(monitorsToPages) 670 - .where( 671 - and( 672 - inArray(monitorsToPages.monitorId, removedMonitors), 673 - eq(monitorsToPages.pageId, newPage.id) 674 - ) 675 - ); 676 - } 677 - 678 - if (monitors) { 679 - for (const monitor of monitors) { 680 - const values = 681 - typeof monitor === "number" ? { monitorId: monitor } : monitor; 682 - 683 - await db 684 - .insert(monitorsToPages) 685 - .values({ pageId: newPage.id, ...values }) 686 - .onConflictDoUpdate({ 687 - target: [monitorsToPages.monitorId, monitorsToPages.pageId], 688 - set: { order: sql.raw("excluded.`order`") }, 689 - }); 690 - } 691 - } 692 - 693 - return c.json(data); 694 - }); 695 - 696 - export { pageApi };
+11
apps/server/src/v1/pageSubscribers/index.ts
··· 1 + import { OpenAPIHono } from "@hono/zod-openapi"; 2 + 3 + import type { Variables } from "../index"; 4 + import { registerPostPageSubscriber } from "./post"; 5 + import { handleZodError } from "../../libs/errors"; 6 + 7 + export const pageSubscribersApi = new OpenAPIHono<{ Variables: Variables }>({ 8 + defaultHook: handleZodError, 9 + }); 10 + 11 + registerPostPageSubscriber(pageSubscribersApi);
+106
apps/server/src/v1/pageSubscribers/post.ts
··· 1 + import { createRoute } from "@hono/zod-openapi"; 2 + 3 + import { and, eq } from "@openstatus/db"; 4 + import { db } from "@openstatus/db/src/db"; 5 + import { page, pageSubscriber } from "@openstatus/db/src/schema"; 6 + import { SubscribeEmail } from "@openstatus/emails"; 7 + import { sendEmail } from "@openstatus/emails/emails/send"; 8 + import { PageSubscriberSchema, ParamsSchema } from "./schema"; 9 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 10 + import type { pageSubscribersApi } from "./index"; 11 + import { HTTPException } from "hono/http-exception"; 12 + 13 + const postRouteSubscriber = createRoute({ 14 + method: "post", 15 + tags: ["page"], 16 + path: "/:id/update", 17 + description: "Add a subscriber to a status page", 18 + request: { 19 + params: ParamsSchema, 20 + body: { 21 + description: "the subscriber payload", 22 + content: { 23 + "application/json": { 24 + schema: PageSubscriberSchema, 25 + }, 26 + }, 27 + }, 28 + }, 29 + responses: { 30 + 200: { 31 + content: { 32 + "application/json": { 33 + schema: PageSubscriberSchema, 34 + }, 35 + }, 36 + description: "The user", 37 + }, 38 + ...openApiErrorResponses, 39 + }, 40 + }); 41 + 42 + export function registerPostPageSubscriber(api: typeof pageSubscribersApi) { 43 + return api.openapi(postRouteSubscriber, async (c) => { 44 + const workspaceId = c.get("workspaceId"); 45 + const input = c.req.valid("json"); 46 + const { id } = c.req.valid("param"); 47 + 48 + const _page = await db 49 + .select() 50 + .from(page) 51 + .where( 52 + and(eq(page.id, Number(id)), eq(page.workspaceId, Number(workspaceId))) 53 + ) 54 + .get(); 55 + 56 + if (!_page) { 57 + throw new HTTPException(401, { message: "Unauthorized" }); 58 + } 59 + 60 + const alreadySubscribed = await db 61 + .select() 62 + .from(pageSubscriber) 63 + .where( 64 + and( 65 + eq(pageSubscriber.email, input.email), 66 + eq(pageSubscriber.pageId, Number(id)) 67 + ) 68 + ) 69 + .get(); 70 + 71 + if (alreadySubscribed) { 72 + throw new HTTPException(400, { 73 + message: "Bad request - Already subscribed", 74 + }); 75 + } 76 + 77 + const token = (Math.random() + 1).toString(36).substring(10); 78 + const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 7); 79 + 80 + await sendEmail({ 81 + react: SubscribeEmail({ 82 + domain: _page.slug, 83 + token, 84 + page: _page.title, 85 + }), 86 + from: "OpenStatus <notification@notifications.openstatus.dev>", 87 + to: [input.email], 88 + subject: "Verify your subscription", 89 + }); 90 + 91 + const _statusReportSubscriberUpdate = await db 92 + .insert(pageSubscriber) 93 + .values({ 94 + pageId: _page.id, 95 + email: input.email, 96 + token, 97 + expiresAt, 98 + }) 99 + .returning() 100 + .get(); 101 + 102 + const data = PageSubscriberSchema.parse(_statusReportSubscriberUpdate); 103 + 104 + return c.json(data); 105 + }); 106 + }
+22
apps/server/src/v1/pageSubscribers/schema.ts
··· 1 + import { z } from "@hono/zod-openapi"; 2 + 3 + export const ParamsSchema = z.object({ 4 + id: z 5 + .string() 6 + .min(1) 7 + .openapi({ 8 + param: { 9 + name: "id", 10 + in: "path", 11 + }, 12 + description: "The id of the page", 13 + example: "1", 14 + }), 15 + }); 16 + export const PageSubscriberSchema = z.object({ 17 + email: z.string().email().openapi({ 18 + description: "The email of the subscriber", 19 + }), 20 + }); 21 + 22 + export type PageSubscriberSchema = z.infer<typeof PageSubscriberSchema>;
+53
apps/server/src/v1/pages/get.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { and, eq } from "@openstatus/db"; 4 + import { db } from "@openstatus/db/src/db"; 5 + import { page } from "@openstatus/db/src/schema"; 6 + import { PageSchema, ParamsSchema } from "./schema"; 7 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 8 + import type { pagesApi } from "./index"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const getRoute = createRoute({ 12 + method: "get", 13 + tags: ["page"], 14 + description: "Get a status page", 15 + path: "/:id", 16 + request: { 17 + params: ParamsSchema, 18 + }, 19 + responses: { 20 + 200: { 21 + content: { 22 + "application/json": { 23 + schema: PageSchema, 24 + }, 25 + }, 26 + description: "Get an Status page", 27 + }, 28 + ...openApiErrorResponses, 29 + }, 30 + }); 31 + 32 + export function registerGetPage(api: typeof pagesApi) { 33 + return api.openapi(getRoute, async (c) => { 34 + const workspaceId = c.get("workspaceId"); 35 + const { id } = c.req.valid("param"); 36 + 37 + const _page = await db 38 + .select() 39 + .from(page) 40 + .where( 41 + and(eq(page.workspaceId, Number(workspaceId)), eq(page.id, Number(id))), 42 + ) 43 + .get(); 44 + 45 + if (!_page) { 46 + throw new HTTPException(404, { message: "Not Found" }); 47 + } 48 + 49 + const data = PageSchema.parse(_page); 50 + 51 + return c.json(data); 52 + }); 53 + }
+45
apps/server/src/v1/pages/get_all.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import type { pagesApi } from "./index"; 4 + import { PageSchema } from "./schema"; 5 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 6 + import { db, eq } from "@openstatus/db"; 7 + import { page } from "@openstatus/db/src/schema"; 8 + import { HTTPException } from "hono/http-exception"; 9 + 10 + const getAllRoute = createRoute({ 11 + method: "get", 12 + tags: ["page"], 13 + description: "Get all your status page", 14 + path: "/", 15 + responses: { 16 + 200: { 17 + content: { 18 + "application/json": { 19 + schema: z.array(PageSchema), 20 + }, 21 + }, 22 + description: "Get an Status page", 23 + }, 24 + ...openApiErrorResponses, 25 + }, 26 + }); 27 + 28 + export function registerGetAllPages(api: typeof pagesApi) { 29 + return api.openapi(getAllRoute, async (c) => { 30 + const workspaceId = c.get("workspaceId"); 31 + 32 + const _pages = await db 33 + .select() 34 + .from(page) 35 + .where(eq(page.workspaceId, Number(workspaceId))); 36 + 37 + if (!_pages) { 38 + throw new HTTPException(404, { message: "Not Found" }); 39 + } 40 + 41 + const data = z.array(PageSchema).parse(_pages); 42 + 43 + return c.json(data); 44 + }); 45 + }
+17
apps/server/src/v1/pages/index.ts
··· 1 + import { OpenAPIHono } from "@hono/zod-openapi"; 2 + 3 + import type { Variables } from "../index"; 4 + import { registerGetPage } from "./get"; 5 + import { registerGetAllPages } from "./get_all"; 6 + import { registerPutPage } from "./put"; 7 + import { registerPostPage } from "./post"; 8 + import { handleZodError } from "../../libs/errors"; 9 + 10 + export const pagesApi = new OpenAPIHono<{ Variables: Variables }>({ 11 + defaultHook: handleZodError, 12 + }); 13 + 14 + registerGetPage(pagesApi); 15 + registerGetAllPages(pagesApi); 16 + registerPutPage(pagesApi); 17 + registerPostPage(pagesApi);
+133
apps/server/src/v1/pages/post.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { and, eq, inArray, isNull, sql } from "@openstatus/db"; 4 + import { db } from "@openstatus/db/src/db"; 5 + import { monitor, monitorsToPages, page } from "@openstatus/db/src/schema"; 6 + 7 + import type { pagesApi } from "./index"; 8 + import { isNumberArray } from "../utils"; 9 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 10 + import { PageSchema } from "./schema"; 11 + import { HTTPException } from "hono/http-exception"; 12 + 13 + const postRoute = createRoute({ 14 + method: "post", 15 + tags: ["page"], 16 + description: "Create a status page", 17 + path: "/", 18 + request: { 19 + body: { 20 + description: "The status page to create", 21 + content: { 22 + "application/json": { 23 + schema: PageSchema.omit({ id: true }), 24 + }, 25 + }, 26 + }, 27 + }, 28 + responses: { 29 + 200: { 30 + content: { 31 + "application/json": { 32 + schema: PageSchema, 33 + }, 34 + }, 35 + description: "Get an Status page", 36 + }, 37 + ...openApiErrorResponses, 38 + }, 39 + }); 40 + 41 + export function registerPostPage(api: typeof pagesApi) { 42 + return api.openapi(postRoute, async (c) => { 43 + const workspaceId = c.get("workspaceId"); 44 + const workspacePlan = c.get("workspacePlan"); 45 + const input = c.req.valid("json"); 46 + 47 + const count = ( 48 + await db 49 + .select({ count: sql<number>`count(*)` }) 50 + .from(page) 51 + .where(eq(page.workspaceId, Number(workspaceId))) 52 + .all() 53 + )[0].count; 54 + 55 + if (count >= workspacePlan.limits["status-pages"]) { 56 + throw new HTTPException(403, { 57 + message: "Upgrade for more status pages", 58 + }); 59 + } 60 + 61 + if ( 62 + workspacePlan.limits["password-protection"] === false && 63 + input?.passwordProtected === true 64 + ) { 65 + throw new HTTPException(403, { 66 + message: "Upgrade for password protection", 67 + }); 68 + } 69 + 70 + const countSlug = ( 71 + await db 72 + .select({ count: sql<number>`count(*)` }) 73 + .from(page) 74 + .where(eq(page.slug, input.slug)) 75 + .all() 76 + )[0].count; 77 + 78 + if (countSlug > 0) { 79 + throw new HTTPException(409, { 80 + message: "Slug has to be unique and has already been taken", 81 + }); 82 + } 83 + 84 + const { monitors, ...rest } = input; 85 + 86 + if (monitors?.length) { 87 + const monitorIds = isNumberArray(monitors) 88 + ? monitors 89 + : monitors.map((m) => m.monitorId); 90 + 91 + const _monitors = await db 92 + .select() 93 + .from(monitor) 94 + .where( 95 + and( 96 + inArray(monitor.id, monitorIds), 97 + eq(monitor.workspaceId, Number(workspaceId)), 98 + isNull(monitor.deletedAt) 99 + ) 100 + ) 101 + .all(); 102 + 103 + if (_monitors.length !== monitors.length) { 104 + throw new HTTPException(400, { message: "Monitor not found" }); 105 + } 106 + } 107 + 108 + const _page = await db 109 + .insert(page) 110 + .values({ 111 + ...rest, 112 + workspaceId: Number(workspaceId), 113 + customDomain: rest.customDomain ?? "", // TODO: make database migration to allow null 114 + }) 115 + .returning() 116 + .get(); 117 + 118 + // TODO: missing order 119 + if (monitors?.length) { 120 + for (const monitor of monitors) { 121 + const values = 122 + typeof monitor === "number" ? { monitorId: monitor } : monitor; 123 + 124 + await db 125 + .insert(monitorsToPages) 126 + .values({ pageId: _page.id, ...values }) 127 + .run(); 128 + } 129 + } 130 + const data = PageSchema.parse(_page); 131 + return c.json(data); 132 + }); 133 + }
+159
apps/server/src/v1/pages/put.ts
··· 1 + import { createRoute } from "@hono/zod-openapi"; 2 + 3 + import { and, eq, inArray, isNull, sql } from "@openstatus/db"; 4 + import { db } from "@openstatus/db/src/db"; 5 + import { monitor, monitorsToPages, page } from "@openstatus/db/src/schema"; 6 + import { PageSchema, ParamsSchema } from "./schema"; 7 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 8 + import type { pagesApi } from "./index"; 9 + import { isNumberArray } from "../utils"; 10 + import { HTTPException } from "hono/http-exception"; 11 + 12 + const putRoute = createRoute({ 13 + method: "put", 14 + tags: ["page"], 15 + description: "Update a status page", 16 + path: "/:id", 17 + request: { 18 + params: ParamsSchema, 19 + body: { 20 + description: "The monitor to update", 21 + content: { 22 + "application/json": { 23 + // REMINDER: allow only partial updates 24 + schema: PageSchema.omit({ id: true }).partial(), 25 + }, 26 + }, 27 + }, 28 + }, 29 + responses: { 30 + 200: { 31 + content: { 32 + "application/json": { 33 + schema: PageSchema, 34 + }, 35 + }, 36 + description: "Get an Status page", 37 + }, 38 + ...openApiErrorResponses, 39 + }, 40 + }); 41 + 42 + export function registerPutPage(api: typeof pagesApi) { 43 + return api.openapi(putRoute, async (c) => { 44 + const workspaceId = c.get("workspaceId"); 45 + const workspacePlan = c.get("workspacePlan"); 46 + const { id } = c.req.valid("param"); 47 + const input = c.req.valid("json"); 48 + 49 + if ( 50 + workspacePlan.limits["password-protection"] === false && 51 + input?.passwordProtected === true 52 + ) { 53 + throw new HTTPException(403, { 54 + message: "Forbidden - Upgrade for password protection", 55 + }); 56 + } 57 + 58 + const _page = await db 59 + .select() 60 + .from(page) 61 + .where( 62 + and(eq(page.id, Number(id)), eq(page.workspaceId, Number(workspaceId))) 63 + ) 64 + .get(); 65 + 66 + if (!_page) { 67 + throw new HTTPException(404, { message: "Not Found" }); 68 + } 69 + 70 + if (input.slug && _page.slug !== input.slug) { 71 + const countSlug = ( 72 + await db 73 + .select({ count: sql<number>`count(*)` }) 74 + .from(page) 75 + .where(eq(page.slug, input.slug)) 76 + .all() 77 + )[0].count; 78 + 79 + if (countSlug > 0) { 80 + throw new HTTPException(400, { 81 + message: "Forbidden - Slug already taken", 82 + }); 83 + } 84 + } 85 + const { monitors, ...rest } = input; 86 + 87 + const monitorIds = monitors 88 + ? isNumberArray(monitors) 89 + ? monitors 90 + : monitors.map((m) => m.monitorId) 91 + : []; 92 + 93 + if (monitors?.length) { 94 + const monitorsData = await db 95 + .select() 96 + .from(monitor) 97 + .where( 98 + and( 99 + inArray(monitor.id, monitorIds), 100 + eq(monitor.workspaceId, Number(workspaceId)), 101 + isNull(monitor.deletedAt) 102 + ) 103 + ) 104 + .all(); 105 + 106 + if (monitorsData.length !== monitors.length) { 107 + throw new HTTPException(400, { 108 + message: "Not Found - Wrong monitor configuration", 109 + }); 110 + } 111 + } 112 + 113 + const newPage = await db 114 + .update(page) 115 + .set({ ...rest, customDomain: input.customDomain ?? "" }) 116 + .where(eq(page.id, _page.id)) 117 + .returning() 118 + .get(); 119 + 120 + const currentMonitorsToPages = await db 121 + .select() 122 + .from(monitorsToPages) 123 + .where(eq(monitorsToPages.pageId, _page.id)); 124 + 125 + const removedMonitors = currentMonitorsToPages 126 + .map(({ monitorId }) => monitorId) 127 + .filter((x) => !monitorIds?.includes(x)); 128 + 129 + if (removedMonitors.length) { 130 + await db 131 + .delete(monitorsToPages) 132 + .where( 133 + and( 134 + inArray(monitorsToPages.monitorId, removedMonitors), 135 + eq(monitorsToPages.pageId, newPage.id) 136 + ) 137 + ); 138 + } 139 + 140 + if (monitors) { 141 + for (const monitor of monitors) { 142 + const values = 143 + typeof monitor === "number" ? { monitorId: monitor } : monitor; 144 + 145 + await db 146 + .insert(monitorsToPages) 147 + .values({ pageId: newPage.id, ...values }) 148 + .onConflictDoUpdate({ 149 + target: [monitorsToPages.monitorId, monitorsToPages.pageId], 150 + set: { order: sql.raw("excluded.`order`") }, 151 + }); 152 + } 153 + } 154 + 155 + const data = PageSchema.parse(newPage); 156 + 157 + return c.json(data); 158 + }); 159 + }
+89
apps/server/src/v1/pages/schema.ts
··· 1 + import { z } from "@hono/zod-openapi"; 2 + 3 + export const ParamsSchema = z.object({ 4 + id: z 5 + .string() 6 + .min(1) 7 + .openapi({ 8 + param: { 9 + name: "id", 10 + in: "path", 11 + }, 12 + description: "The id of the page", 13 + example: "1", 14 + }), 15 + }); 16 + 17 + export const PageSchema = z.object({ 18 + id: z.number().openapi({ 19 + description: "The id of the page", 20 + example: 1, 21 + }), 22 + title: z.string().openapi({ 23 + description: "The title of the page", 24 + example: "My Page", 25 + }), 26 + description: z.string().openapi({ 27 + description: "The description of the page", 28 + example: "My awesome status page", 29 + }), 30 + slug: z.string().openapi({ 31 + description: "The slug of the page", 32 + example: "my-page", 33 + }), 34 + // REMINDER: needs to be configured on Dashboard UI 35 + customDomain: z 36 + .string() 37 + .openapi({ 38 + description: 39 + "The custom domain of the page. To be configured within the dashboard.", 40 + example: "status.acme.com", 41 + }) 42 + .transform((val) => (val ? val : undefined)) 43 + .nullish(), 44 + icon: z 45 + .string() 46 + .openapi({ 47 + description: "The icon of the page", 48 + example: "https://example.com/icon.png", 49 + }) 50 + .url() 51 + .or(z.literal("")) 52 + .transform((val) => (val ? val : undefined)) 53 + .nullish(), 54 + passwordProtected: z 55 + .boolean() 56 + .openapi({ 57 + description: 58 + "Make the page password protected. Used with the 'passwordProtected' property.", 59 + example: true, 60 + }) 61 + .default(false) 62 + .optional(), 63 + password: z 64 + .string() 65 + .openapi({ 66 + description: "Your password to protect the page from the publi", 67 + example: "hidden-password", 68 + }) 69 + .optional() 70 + .nullish(), 71 + monitors: z 72 + .array(z.number()) 73 + .openapi({ 74 + description: "The monitors of the page as an array of ids", 75 + example: [1, 2], 76 + }) 77 + .or( 78 + z.array(z.object({ monitorId: z.number(), order: z.number() })).openapi({ 79 + description: "The monitor as object allowing to pass id and order", 80 + example: [ 81 + { monitorId: 1, order: 0 }, 82 + { monitorId: 2, order: 1 }, 83 + ], 84 + }) 85 + ) 86 + .optional(), 87 + }); 88 + 89 + export type PageSchema = z.infer<typeof PageSchema>;
-10
apps/server/src/v1/shared.ts
··· 1 - import { z } from "@hono/zod-openapi"; 2 - 3 - export const ErrorSchema = z.object({ 4 - code: z.number().openapi({ 5 - example: 400, 6 - }), 7 - message: z.string().openapi({ 8 - example: "Bad Request", 9 - }), 10 - });
-194
apps/server/src/v1/statusReport.test.ts
··· 1 - import { expect, test } from "bun:test"; 2 - 3 - import { api } from "."; 4 - import { iso8601Regex } from "./test-utils"; 5 - 6 - test("GET one status report", async () => { 7 - const res = await api.request("/status_report/1", { 8 - headers: { 9 - "x-openstatus-key": "1", 10 - }, 11 - }); 12 - expect(res.status).toBe(200); 13 - expect(await res.json()).toMatchObject({ 14 - id: 1, 15 - // TODO: discuss if we should return `updates` instead of `status_report_updates` 16 - status_report_updates: expect.any(Array), 17 - }); 18 - }); 19 - 20 - test("create one status report", async () => { 21 - const res = await api.request("/status_report", { 22 - method: "POST", 23 - headers: { 24 - "x-openstatus-key": "1", 25 - "content-type": "application/json", 26 - }, 27 - body: JSON.stringify({ 28 - status: "investigating", 29 - title: "Test Status Report", 30 - }), 31 - }); 32 - expect(res.status).toBe(200); 33 - expect(await res.json()).toMatchObject({ 34 - id: expect.any(Number), 35 - status_report_updates: expect.any(Array), 36 - }); 37 - }); 38 - 39 - test("Create one status report without auth key should return 401", async () => { 40 - const res = await api.request("/status_report", { 41 - method: "POST", 42 - headers: { 43 - "content-type": "application/json", 44 - }, 45 - body: JSON.stringify({ 46 - status: "investigating", 47 - title: "Test Status Report", 48 - }), 49 - }); 50 - expect(res.status).toBe(401); //unauthenticated 51 - }); 52 - 53 - test("Create one status report with invalid data should return 403", async () => { 54 - const res = await api.request("/status_report", { 55 - method: "POST", 56 - headers: { 57 - "x-openstatus-key": "1", 58 - "content-type": "application/json", 59 - }, 60 - body: JSON.stringify({ 61 - //passing incompelete body 62 - title: "Test Status Report", 63 - }), 64 - }); 65 - expect(res.status).toBe(400); 66 - expect(await res.json()).toMatchObject({ 67 - error: { 68 - issues: expect.any(Array), 69 - name: "ZodError", 70 - }, 71 - success: false, 72 - }); 73 - }); 74 - 75 - test("Get all status report", async () => { 76 - const res = await api.request("/status_report", { 77 - headers: { 78 - "x-openstatus-key": "1", 79 - }, 80 - }); 81 - expect(res.status).toBe(200); 82 - expect((await res.json())[0]).toMatchObject({ 83 - id: expect.any(Number), 84 - status_report_updates: expect.any(Array), 85 - }); 86 - }); 87 - 88 - test("Delete a status report", async () => { 89 - const res = await api.request("/status_report/2", { 90 - method: "DELETE", 91 - headers: { 92 - "x-openstatus-key": "1", 93 - }, 94 - }); 95 - expect(res.status).toBe(200); 96 - expect(await res.json()).toMatchObject({ 97 - message: "Deleted", 98 - }); 99 - }); 100 - 101 - test("create a status report update", async () => { 102 - const res = await api.request("/status_report/1/update", { 103 - method: "POST", 104 - headers: { 105 - "x-openstatus-key": "1", 106 - "content-type": "application/json", 107 - }, 108 - body: JSON.stringify({ 109 - status: "investigating", 110 - date: "2023-11-08T21:03:13.000Z", 111 - message: "Test Status Report", 112 - }), 113 - }); 114 - expect(res.status).toBe(200); 115 - expect(await res.json()).toMatchObject({ 116 - status: "investigating", 117 - id: expect.any(String), 118 - date: expect.stringMatching(iso8601Regex), 119 - message: "Test Status Report", 120 - }); 121 - }); 122 - 123 - test("Get Status Report should return current status of report", async () => { 124 - const res = await api.request("/status_report/1", { 125 - headers: { 126 - "x-openstatus-key": "1", 127 - }, 128 - }); 129 - expect(res.status).toBe(200); 130 - expect(await res.json()).toMatchObject({ 131 - id: 1, 132 - status: "investigating", 133 - status_report_updates: expect.any(Array), 134 - }); 135 - }); 136 - 137 - test("Create a status report update not in db should return 404", async () => { 138 - const res = await api.request("/status_report/404/update", { 139 - method: "POST", 140 - headers: { 141 - "x-openstatus-key": "1", 142 - "content-type": "application/json", 143 - }, 144 - body: JSON.stringify({ 145 - status: "investigating", 146 - date: "2023-11-08T21:03:13.000Z", 147 - message: "Test Status Report", 148 - }), 149 - }); 150 - expect(res.status).toBe(404); 151 - expect(await res.json()).toMatchObject({ 152 - code: 404, 153 - message: "Not Found", 154 - }); 155 - }); 156 - 157 - test("Create a status report update without auth key should return 401", async () => { 158 - const res = await api.request("/status_report/1/update", { 159 - method: "POST", 160 - headers: { 161 - //not having the key returns unauthorized 162 - "content-type": "application/json", 163 - }, 164 - body: JSON.stringify({ 165 - status: "investigating", 166 - date: "2023-11-08T21:03:13.000Z", 167 - message: "Test Status Report", 168 - }), 169 - }); 170 - expect(res.status).toBe(401); 171 - }); 172 - 173 - test("Create a status report update with invalid data should return 403", async () => { 174 - const res = await api.request("/status_report/1/update", { 175 - method: "POST", 176 - headers: { 177 - "x-openstatus-key": "1", 178 - "content-type": "application/json", 179 - }, 180 - body: JSON.stringify({ 181 - //passing in incompelete body 182 - date: "2023-11-08T21:03:13.000Z", 183 - message: "Test Status Report", 184 - }), 185 - }); 186 - expect(res.status).toBe(400); 187 - expect(await res.json()).toMatchObject({ 188 - error: { 189 - issues: expect.any(Array), 190 - name: "ZodError", 191 - }, 192 - success: false, 193 - }); 194 - });
-406
apps/server/src/v1/statusReport.ts
··· 1 - import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi"; 2 - 3 - import { and, db, eq, isNotNull } from "@openstatus/db"; 4 - import { 5 - page, 6 - pageSubscriber, 7 - pagesToStatusReports, 8 - statusReport, 9 - statusReportStatus, 10 - statusReportUpdate, 11 - } from "@openstatus/db/src/schema"; 12 - import { sendEmailHtml } from "@openstatus/emails/emails/send"; 13 - import { allPlans } from "@openstatus/plans"; 14 - 15 - import type { Variables } from "./index"; 16 - import { ErrorSchema } from "./shared"; 17 - import { statusUpdateSchema } from "./statusReportUpdate"; 18 - import { isoDate } from "./utils"; 19 - 20 - const statusReportApi = new OpenAPIHono<{ Variables: Variables }>(); 21 - 22 - const ParamsSchema = z.object({ 23 - id: z 24 - .string() 25 - .min(1) 26 - .openapi({ 27 - param: { 28 - name: "id", 29 - in: "path", 30 - }, 31 - description: "The id of the status report", 32 - example: "1", 33 - }), 34 - }); 35 - 36 - const createStatusReportUpdateSchema = z.object({ 37 - status: z.enum(statusReportStatus).openapi({ 38 - description: "The status of the update", 39 - }), 40 - date: isoDate.openapi({ 41 - description: "The date of the update in ISO8601 format", 42 - }), 43 - message: z.string().openapi({ 44 - description: "The message of the update", 45 - }), 46 - }); 47 - 48 - const statusSchema = z.object({ 49 - title: z.string().openapi({ 50 - example: "Documenso", 51 - description: "The title of the status report", 52 - }), 53 - status: z.enum(statusReportStatus).openapi({ 54 - description: "The current status of the report", 55 - }), 56 - }); 57 - 58 - const statusReportExtendedSchema = statusSchema.extend({ 59 - id: z.number().openapi({ description: "The id of the status report" }), 60 - status_report_updates: z 61 - .array(z.number()) 62 - .openapi({ 63 - description: "The ids of the status report updates", 64 - }) 65 - .default([]), 66 - }); 67 - 68 - const getAllRoute = createRoute({ 69 - method: "get", 70 - tags: ["status_report"], 71 - description: "Get all status reports", 72 - path: "/", 73 - request: {}, 74 - responses: { 75 - 200: { 76 - content: { 77 - "application/json": { 78 - schema: z.array(statusReportExtendedSchema), 79 - }, 80 - }, 81 - description: "Get all status reports", 82 - }, 83 - 400: { 84 - content: { 85 - "application/json": { 86 - schema: ErrorSchema, 87 - }, 88 - }, 89 - description: "Returns an error", 90 - }, 91 - }, 92 - }); 93 - 94 - statusReportApi.openapi(getAllRoute, async (c) => { 95 - const workspaceId = Number(c.get("workspaceId")); 96 - const _statusReports = await db.query.statusReport.findMany({ 97 - with: { 98 - statusReportUpdates: true, 99 - }, 100 - where: eq(statusReport.workspaceId, workspaceId), 101 - }); 102 - 103 - if (!_statusReports) return c.json({ code: 404, message: "Not Found" }, 404); 104 - 105 - const data = z.array(statusReportExtendedSchema).parse( 106 - _statusReports.map((statusReport) => ({ 107 - ...statusReport, 108 - status_report_updates: statusReport.statusReportUpdates.map( 109 - (statusReportUpdate) => { 110 - return statusReportUpdate.id; 111 - }, 112 - ), 113 - })), 114 - ); 115 - 116 - return c.json(data); 117 - }); 118 - 119 - const getRoute = createRoute({ 120 - method: "get", 121 - tags: ["status_report"], 122 - description: "Get an status report", 123 - path: "/:id", 124 - request: { 125 - params: ParamsSchema, 126 - }, 127 - responses: { 128 - 200: { 129 - content: { 130 - "application/json": { 131 - schema: statusReportExtendedSchema, 132 - }, 133 - }, 134 - description: "Get all status reports", 135 - }, 136 - 400: { 137 - content: { 138 - "application/json": { 139 - schema: ErrorSchema, 140 - }, 141 - }, 142 - description: "Returns an error", 143 - }, 144 - }, 145 - }); 146 - 147 - statusReportApi.openapi(getRoute, async (c) => { 148 - const workspaceId = Number(c.get("workspaceId")); 149 - const { id } = c.req.valid("param"); 150 - 151 - const statusUpdateId = Number(id); 152 - const _statusUpdate = await db.query.statusReport.findFirst({ 153 - with: { 154 - statusReportUpdates: true, 155 - }, 156 - where: and( 157 - eq(statusReport.workspaceId, workspaceId), 158 - eq(statusReport.id, statusUpdateId), 159 - ), 160 - }); 161 - 162 - if (!_statusUpdate) return c.json({ code: 404, message: "Not Found" }, 404); 163 - const data = statusReportExtendedSchema.parse({ 164 - ..._statusUpdate, 165 - status_report_updates: _statusUpdate.statusReportUpdates.map( 166 - (update) => update.id, 167 - ), 168 - }); 169 - 170 - return c.json(data); 171 - }); 172 - 173 - const postRoute = createRoute({ 174 - method: "post", 175 - tags: ["status_report"], 176 - description: "Create an status report", 177 - path: "/", 178 - request: { 179 - body: { 180 - description: "The status report to create", 181 - content: { 182 - "application/json": { 183 - schema: statusSchema, 184 - }, 185 - }, 186 - }, 187 - }, 188 - responses: { 189 - 200: { 190 - content: { 191 - "application/json": { 192 - schema: statusReportExtendedSchema, 193 - }, 194 - }, 195 - description: "Status report created", 196 - }, 197 - 400: { 198 - content: { 199 - "application/json": { 200 - schema: ErrorSchema, 201 - }, 202 - }, 203 - description: "Returns an error", 204 - }, 205 - }, 206 - }); 207 - 208 - statusReportApi.openapi(postRoute, async (c) => { 209 - const input = c.req.valid("json"); 210 - const workspaceId = Number(c.get("workspaceId")); 211 - 212 - const _newStatusReport = await db 213 - .insert(statusReport) 214 - .values({ 215 - ...input, 216 - workspaceId: workspaceId, 217 - }) 218 - .returning() 219 - .get(); 220 - 221 - const _statusReportHistory = await db 222 - .insert(statusReportUpdate) 223 - .values({ 224 - status: input.status, 225 - date: new Date(), 226 - message: "", 227 - statusReportId: _newStatusReport.id, 228 - }) 229 - .returning() 230 - .get(); 231 - 232 - const data = statusReportExtendedSchema.parse({ 233 - ..._newStatusReport, 234 - status_report_updates: [_statusReportHistory.id], 235 - }); 236 - 237 - return c.json(data); 238 - }); 239 - 240 - const deleteRoute = createRoute({ 241 - method: "delete", 242 - tags: ["status_report"], 243 - description: "Delete an status report", 244 - path: "/:id", 245 - request: { 246 - params: ParamsSchema, 247 - }, 248 - responses: { 249 - 200: { 250 - content: { 251 - "application/json": { 252 - schema: z.object({ 253 - message: z.string().openapi({ 254 - example: "Deleted", 255 - }), 256 - }), 257 - }, 258 - }, 259 - description: "Status report deleted", 260 - }, 261 - 400: { 262 - content: { 263 - "application/json": { 264 - schema: ErrorSchema, 265 - }, 266 - }, 267 - description: "Returns an error", 268 - }, 269 - }, 270 - }); 271 - 272 - statusReportApi.openapi(deleteRoute, async (c) => { 273 - const workspaceId = Number(c.get("workspaceId")); 274 - const { id } = c.req.valid("param"); 275 - 276 - const statusReportId = Number(id); 277 - const _statusReport = await db 278 - .select() 279 - .from(statusReport) 280 - .where(eq(statusReport.id, statusReportId)) 281 - .get(); 282 - 283 - if (!_statusReport) return c.json({ code: 404, message: "Not Found" }, 404); 284 - 285 - if (workspaceId !== _statusReport.workspaceId) 286 - return c.json({ code: 401, message: "Unauthorized" }, 401); 287 - 288 - await db 289 - .delete(statusReport) 290 - .where(eq(statusReport.id, statusReportId)) 291 - .run(); 292 - return c.json({ message: "Deleted" }); 293 - }); 294 - 295 - const postRouteUpdate = createRoute({ 296 - method: "post", 297 - tags: ["status_report"], 298 - path: "/:id/update", 299 - description: "Create an status report update", 300 - request: { 301 - params: ParamsSchema, 302 - body: { 303 - description: "the status report update", 304 - content: { 305 - "application/json": { 306 - schema: createStatusReportUpdateSchema, 307 - }, 308 - }, 309 - }, 310 - }, 311 - responses: { 312 - 200: { 313 - content: { 314 - "application/json": { 315 - schema: statusUpdateSchema, 316 - }, 317 - }, 318 - description: "Status report updated", 319 - }, 320 - 400: { 321 - content: { 322 - "application/json": { 323 - schema: ErrorSchema, 324 - }, 325 - }, 326 - description: "Returns an error", 327 - }, 328 - }, 329 - }); 330 - 331 - statusReportApi.openapi(postRouteUpdate, async (c) => { 332 - const input = c.req.valid("json"); 333 - const { id } = c.req.valid("param"); 334 - const workspaceId = Number(c.get("workspaceId")); 335 - 336 - const statusReportId = Number(id); 337 - 338 - const _updatedStatusReport = await db 339 - .update(statusReport) 340 - .set({ status: input.status }) 341 - .where( 342 - and( 343 - eq(statusReport.id, statusReportId), 344 - eq(statusReport.workspaceId, workspaceId), 345 - ), 346 - ) 347 - .returning() 348 - .get(); 349 - 350 - if (!_updatedStatusReport) 351 - return c.json({ code: 404, message: "Not Found" }, 404); 352 - 353 - const _statusReportUpdate = await db 354 - .insert(statusReportUpdate) 355 - .values({ 356 - ...input, 357 - date: new Date(input.date), 358 - statusReportId: Number(id), 359 - }) 360 - .returning() 361 - .get(); 362 - // send email 363 - const workspacePlan = c.get("workspacePlan"); 364 - if (workspacePlan !== allPlans.free) { 365 - const allPages = await db 366 - .select() 367 - .from(pagesToStatusReports) 368 - .where(eq(pagesToStatusReports.statusReportId, statusReportId)) 369 - .all(); 370 - for (const currentPage of allPages) { 371 - const subscribers = await db 372 - .select() 373 - .from(pageSubscriber) 374 - .where( 375 - and( 376 - eq(pageSubscriber.pageId, currentPage.pageId), 377 - isNotNull(pageSubscriber.acceptedAt), 378 - ), 379 - ) 380 - .all(); 381 - const pageInfo = await db 382 - .select() 383 - .from(page) 384 - .where(eq(page.id, currentPage.pageId)) 385 - .get(); 386 - if (!pageInfo) continue; 387 - const subscribersEmails = subscribers.map( 388 - (subscriber) => subscriber.email, 389 - ); 390 - await sendEmailHtml({ 391 - to: subscribersEmails, 392 - subject: `New status update for ${pageInfo.title}`, 393 - html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 394 - `, 395 - from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 396 - }); 397 - } 398 - } 399 - const data = statusUpdateSchema.parse(_statusReportUpdate); 400 - 401 - return c.json({ 402 - ...data, 403 - }); 404 - }); 405 - 406 - export { statusReportApi };
+9 -13
apps/server/src/v1/statusReportUpdate.test.ts apps/server/src/v1/statusReportUpdates/statusReportUpdates.test.ts
··· 1 1 import { expect, test } from "bun:test"; 2 2 3 - import { api } from "."; 4 - import { iso8601Regex } from "./test-utils"; 3 + import { api } from "../index"; 4 + import { iso8601Regex } from "../test-utils"; 5 5 6 6 test("GET one status report update ", async () => { 7 7 const res = await api.request("/status_report_update/1", { ··· 9 9 "x-openstatus-key": "1", 10 10 }, 11 11 }); 12 + const json = await res.json(); 13 + 12 14 expect(res.status).toBe(200); 13 - expect(await res.json()).toMatchObject({ 15 + expect(json).toMatchObject({ 14 16 status: "investigating", 15 - message: "", 17 + message: "Message", 16 18 date: expect.stringMatching(iso8601Regex), 17 19 }); 18 20 }); ··· 28 30 status: "investigating", 29 31 date: "2023-11-08T21:03:13.000Z", 30 32 message: "test", 31 - status_report_id: 1, 33 + statusReportId: 1, 32 34 }), 33 35 }); 34 36 expect(res.status).toBe(200); ··· 49 51 status: "investigating", 50 52 date: expect.stringMatching(iso8601Regex), 51 53 message: "test", 52 - status_report_id: 1, 54 + statusReportId: 1, 53 55 }), 54 56 }); 55 57 expect(res.status).toBe(401); ··· 68 70 date: "2023-11-08T21:03:13.000Z", 69 71 }), 70 72 }); 73 + 71 74 expect(res.status).toBe(400); 72 - expect(await res.json()).toMatchObject({ 73 - error: { 74 - issues: expect.any(Array), 75 - name: "ZodError", 76 - }, 77 - success: false, 78 - }); 79 75 });
-221
apps/server/src/v1/statusReportUpdate.ts
··· 1 - import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi"; 2 - 3 - import { and, db, eq, isNotNull } from "@openstatus/db"; 4 - import { 5 - page, 6 - pageSubscriber, 7 - pagesToStatusReports, 8 - statusReport, 9 - statusReportStatus, 10 - statusReportUpdate, 11 - } from "@openstatus/db/src/schema"; 12 - import { sendEmailHtml } from "@openstatus/emails"; 13 - import { allPlans } from "@openstatus/plans"; 14 - 15 - import type { Variables } from "."; 16 - import { ErrorSchema } from "./shared"; 17 - import { isoDate } from "./utils"; 18 - 19 - const statusReportUpdateApi = new OpenAPIHono<{ Variables: Variables }>(); 20 - 21 - const ParamsSelectSchema = z.object({ 22 - id: z 23 - .string() 24 - .min(1) 25 - .openapi({ 26 - param: { 27 - name: "id", 28 - in: "path", 29 - }, 30 - description: "The id of the update", 31 - example: "1", 32 - }), 33 - }); 34 - 35 - export const statusUpdateSchema = z.object({ 36 - status: z.enum(statusReportStatus).openapi({ 37 - description: "The status of the update", 38 - }), 39 - id: z.coerce.string().openapi({ description: "The id of the update" }), 40 - date: isoDate.openapi({ 41 - description: "The date of the update in ISO8601 format", 42 - }), 43 - message: z.string().openapi({ 44 - description: "The message of the update", 45 - }), 46 - }); 47 - 48 - const createStatusReportUpdateSchema = z.object({ 49 - status_report_id: z.number().openapi({ 50 - description: "The id of the status report", 51 - }), 52 - status: z.enum(statusReportStatus).openapi({ 53 - description: "The status of the update", 54 - }), 55 - date: isoDate.openapi({ 56 - description: "The date of the update in ISO8601 format", 57 - }), 58 - message: z.string().openapi({ 59 - description: "The message of the update", 60 - }), 61 - }); 62 - const getUpdateRoute = createRoute({ 63 - method: "get", 64 - tags: ["status_report_update"], 65 - path: "/:id", 66 - request: { 67 - params: ParamsSelectSchema, 68 - }, 69 - responses: { 70 - 200: { 71 - content: { 72 - "application/json": { 73 - schema: statusUpdateSchema, 74 - }, 75 - }, 76 - description: "Get all status report updates", 77 - }, 78 - 400: { 79 - content: { 80 - "application/json": { 81 - schema: ErrorSchema, 82 - }, 83 - }, 84 - description: "Returns an error", 85 - }, 86 - }, 87 - }); 88 - 89 - statusReportUpdateApi.openapi(getUpdateRoute, async (c) => { 90 - const workspaceId = Number(c.get("workspaceId")); 91 - const { id } = c.req.valid("param"); 92 - 93 - const update = await db 94 - .select() 95 - .from(statusReportUpdate) 96 - .where(eq(statusReportUpdate.id, Number(id))) 97 - .get(); 98 - 99 - if (!update) return c.json({ code: 404, message: "Not Found" }, 404); 100 - 101 - const currentStatusReport = await db 102 - .select() 103 - .from(statusReport) 104 - .where( 105 - and( 106 - eq(statusReport.id, update.statusReportId), 107 - eq(statusReport.workspaceId, workspaceId), 108 - ), 109 - ) 110 - .get(); 111 - if (!currentStatusReport) 112 - return c.json({ code: 401, message: "Not Authorized" }, 401); 113 - 114 - const data = statusUpdateSchema.parse(update); 115 - 116 - return c.json(data); 117 - }); 118 - 119 - const createStatusUpdate = createRoute({ 120 - method: "post", 121 - tags: ["status_report_update"], 122 - path: "/", 123 - request: { 124 - body: { 125 - description: "the status report update", 126 - content: { 127 - "application/json": { 128 - schema: createStatusReportUpdateSchema, 129 - }, 130 - }, 131 - }, 132 - }, 133 - responses: { 134 - 200: { 135 - content: { 136 - "application/json": { 137 - schema: statusUpdateSchema, 138 - }, 139 - }, 140 - description: "Get all status report updates", 141 - }, 142 - 400: { 143 - content: { 144 - "application/json": { 145 - schema: ErrorSchema, 146 - }, 147 - }, 148 - description: "Returns an error", 149 - }, 150 - }, 151 - }); 152 - 153 - statusReportUpdateApi.openapi(createStatusUpdate, async (c) => { 154 - const workspaceId = Number(c.get("workspaceId")); 155 - const input = c.req.valid("json"); 156 - 157 - const _currentStatusReport = await db 158 - .select() 159 - .from(statusReport) 160 - .where( 161 - and( 162 - eq(statusReport.id, input.status_report_id), 163 - eq(statusReport.workspaceId, workspaceId), 164 - ), 165 - ) 166 - .get(); 167 - if (!_currentStatusReport) 168 - return c.json({ code: 401, message: "Not Authorized" }, 401); 169 - 170 - const res = await db 171 - .insert(statusReportUpdate) 172 - .values({ 173 - ...input, 174 - date: new Date(input.date), 175 - statusReportId: input.status_report_id, 176 - }) 177 - .returning() 178 - .get(); 179 - // send email 180 - const workspacePlan = c.get("workspacePlan"); 181 - 182 - if (workspacePlan !== allPlans.free) { 183 - const allPages = await db 184 - .select() 185 - .from(pagesToStatusReports) 186 - .where(eq(pagesToStatusReports.statusReportId, input.status_report_id)) 187 - .all(); 188 - for (const currentPage of allPages) { 189 - const subscribers = await db 190 - .select() 191 - .from(pageSubscriber) 192 - .where( 193 - and( 194 - eq(pageSubscriber.pageId, currentPage.pageId), 195 - isNotNull(pageSubscriber.acceptedAt), 196 - ), 197 - ) 198 - .all(); 199 - const pageInfo = await db 200 - .select() 201 - .from(page) 202 - .where(eq(page.id, currentPage.pageId)) 203 - .get(); 204 - if (!pageInfo) continue; 205 - const subscribersEmails = subscribers.map( 206 - (subscriber) => subscriber.email, 207 - ); 208 - await sendEmailHtml({ 209 - to: subscribersEmails, 210 - subject: `New status update for ${pageInfo.title}`, 211 - html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 212 - `, 213 - from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 214 - }); 215 - } 216 - } 217 - const data = statusUpdateSchema.parse(res); 218 - return c.json(data); 219 - }); 220 - 221 - export { statusReportUpdateApi };
+61
apps/server/src/v1/statusReportUpdates/get.ts
··· 1 + import { createRoute } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq } from "@openstatus/db"; 4 + import { statusReport, statusReportUpdate } from "@openstatus/db/src/schema"; 5 + 6 + import type { statusReportUpdatesApi } from "./index"; 7 + import { ParamsSchema, StatusReportUpdateSchema } from "./schema"; 8 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const getRoute = createRoute({ 12 + method: "get", 13 + tags: ["status_report_update"], 14 + path: "/:id", 15 + request: { 16 + params: ParamsSchema, 17 + }, 18 + responses: { 19 + 200: { 20 + content: { 21 + "application/json": { 22 + schema: StatusReportUpdateSchema, 23 + }, 24 + }, 25 + description: "Get all status report updates", 26 + }, 27 + ...openApiErrorResponses, 28 + }, 29 + }); 30 + 31 + export function registerGetStatusReportUpdate( 32 + api: typeof statusReportUpdatesApi 33 + ) { 34 + return api.openapi(getRoute, async (c) => { 35 + const workspaceId = c.get("workspaceId"); 36 + const { id } = c.req.valid("param"); 37 + 38 + const _statusReportJoin = await db 39 + .select() 40 + .from(statusReportUpdate) 41 + .innerJoin( 42 + statusReport, 43 + and( 44 + eq(statusReport.id, statusReportUpdate.statusReportId), 45 + eq(statusReport.workspaceId, Number(workspaceId)) 46 + ) 47 + ) 48 + .where(eq(statusReportUpdate.id, Number(id))) 49 + .get(); 50 + 51 + if (!_statusReportJoin) { 52 + throw new HTTPException(404, { message: "Not Found" }); 53 + } 54 + 55 + const data = StatusReportUpdateSchema.parse( 56 + _statusReportJoin.status_report_update 57 + ); 58 + 59 + return c.json(data); 60 + }); 61 + }
+15
apps/server/src/v1/statusReportUpdates/index.ts
··· 1 + import { OpenAPIHono } from "@hono/zod-openapi"; 2 + 3 + import type { Variables } from "../index"; 4 + import { registerGetStatusReportUpdate } from "./get"; 5 + import { registerPostStatusReportUpdate } from "./post"; 6 + import { handleZodError } from "../../libs/errors"; 7 + 8 + export const statusReportUpdatesApi = new OpenAPIHono<{ 9 + Variables: Variables; 10 + }>({ 11 + defaultHook: handleZodError, 12 + }); 13 + 14 + registerGetStatusReportUpdate(statusReportUpdatesApi); 15 + registerPostStatusReportUpdate(statusReportUpdatesApi);
+127
apps/server/src/v1/statusReportUpdates/post.ts
··· 1 + import { createRoute } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq, isNotNull } from "@openstatus/db"; 4 + import { 5 + page, 6 + pageSubscriber, 7 + pagesToStatusReports, 8 + statusReport, 9 + statusReportUpdate, 10 + } from "@openstatus/db/src/schema"; 11 + import { sendEmailHtml } from "@openstatus/emails"; 12 + 13 + import type { statusReportUpdatesApi } from "./index"; 14 + import { StatusReportUpdateSchema } from "./schema"; 15 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 16 + import { HTTPException } from "hono/http-exception"; 17 + 18 + const createStatusUpdate = createRoute({ 19 + method: "post", 20 + tags: ["status_report_update"], 21 + path: "/", 22 + request: { 23 + body: { 24 + description: "the status report update", 25 + content: { 26 + "application/json": { 27 + schema: StatusReportUpdateSchema.omit({ id: true }), 28 + }, 29 + }, 30 + }, 31 + }, 32 + responses: { 33 + 200: { 34 + content: { 35 + "application/json": { 36 + schema: StatusReportUpdateSchema, 37 + }, 38 + }, 39 + description: "Get all status report updates", 40 + }, 41 + ...openApiErrorResponses, 42 + }, 43 + }); 44 + 45 + export function registerPostStatusReportUpdate( 46 + api: typeof statusReportUpdatesApi 47 + ) { 48 + return api.openapi(createStatusUpdate, async (c) => { 49 + const workspaceId = c.get("workspaceId"); 50 + const workspacePlan = c.get("workspacePlan"); 51 + const input = c.req.valid("json"); 52 + 53 + const _statusReport = await db 54 + .select() 55 + .from(statusReport) 56 + .where( 57 + and( 58 + eq(statusReport.id, input.statusReportId), 59 + eq(statusReport.workspaceId, Number(workspaceId)) 60 + ) 61 + ) 62 + .get(); 63 + 64 + if (!_statusReport) { 65 + throw new HTTPException(404, { 66 + message: 67 + "Not Found - Status report id does not exist within your workspace", 68 + }); 69 + } 70 + 71 + const _statusReportUpdate = await db 72 + .insert(statusReportUpdate) 73 + .values({ 74 + ...input, 75 + date: new Date(input.date), 76 + statusReportId: _statusReport.id, 77 + }) 78 + .returning() 79 + .get(); 80 + 81 + // send email 82 + 83 + if (workspacePlan.title !== "Hobby") { 84 + const allPages = await db 85 + .select() 86 + .from(pagesToStatusReports) 87 + .where(eq(pagesToStatusReports.statusReportId, _statusReport.id)) 88 + .all(); 89 + 90 + for (const currentPage of allPages) { 91 + const subscribers = await db 92 + .select() 93 + .from(pageSubscriber) 94 + .where( 95 + and( 96 + eq(pageSubscriber.pageId, currentPage.pageId), 97 + isNotNull(pageSubscriber.acceptedAt) 98 + ) 99 + ) 100 + .all(); 101 + 102 + const pageInfo = await db 103 + .select() 104 + .from(page) 105 + .where(eq(page.id, currentPage.pageId)) 106 + .get(); 107 + if (!pageInfo) continue; 108 + const subscribersEmails = subscribers.map( 109 + (subscriber) => subscriber.email 110 + ); 111 + 112 + // TODO: verify if we leak any email data here 113 + await sendEmailHtml({ 114 + to: subscribersEmails, 115 + subject: `New status update for ${pageInfo.title}`, 116 + html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 117 + `, 118 + from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 119 + }); 120 + } 121 + } 122 + 123 + const data = StatusReportUpdateSchema.parse(_statusReportUpdate); 124 + 125 + return c.json(data); 126 + }); 127 + }
+37
apps/server/src/v1/statusReportUpdates/schema.ts
··· 1 + import { z } from "@hono/zod-openapi"; 2 + 3 + import { statusReportStatus } from "@openstatus/db/src/schema"; 4 + 5 + import { isoDate } from "../utils"; 6 + 7 + export const ParamsSchema = z.object({ 8 + id: z 9 + .string() 10 + .min(1) 11 + .openapi({ 12 + param: { 13 + name: "id", 14 + in: "path", 15 + }, 16 + description: "The id of the update", 17 + example: "1", 18 + }), 19 + }); 20 + 21 + export const StatusReportUpdateSchema = z.object({ 22 + id: z.coerce.string().openapi({ description: "The id of the update" }), 23 + status: z.enum(statusReportStatus).openapi({ 24 + description: "The status of the update", 25 + }), 26 + date: isoDate.openapi({ 27 + description: "The date of the update in ISO8601 format", 28 + }), 29 + message: z.string().openapi({ 30 + description: "The message of the update", 31 + }), 32 + statusReportId: z.number().openapi({ 33 + description: "The id of the status report", 34 + }), 35 + }); 36 + 37 + export type StatusReportUpdateSchema = z.infer<typeof StatusReportUpdateSchema>;
+59
apps/server/src/v1/statusReports/delete.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq } from "@openstatus/db"; 4 + import { statusReport } from "@openstatus/db/src/schema"; 5 + 6 + import type { statusReportsApi } from "./index"; 7 + import { ParamsSchema } from "./schema"; 8 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const deleteRoute = createRoute({ 12 + method: "delete", 13 + tags: ["status_report"], 14 + description: "Delete an status report", 15 + path: "/:id", 16 + request: { 17 + params: ParamsSchema, 18 + }, 19 + responses: { 20 + 200: { 21 + content: { 22 + "application/json": { 23 + schema: z.object({}), 24 + }, 25 + }, 26 + description: "Status report deleted", 27 + }, 28 + ...openApiErrorResponses, 29 + }, 30 + }); 31 + 32 + export function registerDeleteStatusReport(api: typeof statusReportsApi) { 33 + return api.openapi(deleteRoute, async (c) => { 34 + const workspaceId = c.get("workspaceId"); 35 + const { id } = c.req.valid("param"); 36 + 37 + const _statusReport = await db 38 + .select() 39 + .from(statusReport) 40 + .where( 41 + and( 42 + eq(statusReport.id, Number(id)), 43 + eq(statusReport.workspaceId, Number(workspaceId)) 44 + ) 45 + ) 46 + .get(); 47 + 48 + if (!_statusReport) { 49 + throw new HTTPException(404, { message: "Not Found" }); 50 + } 51 + 52 + await db 53 + .delete(statusReport) 54 + .where(eq(statusReport.id, Number(id))) 55 + .run(); 56 + 57 + return c.json({}); 58 + }); 59 + }
+78
apps/server/src/v1/statusReports/get.ts
··· 1 + import { createRoute } from "@hono/zod-openapi"; 2 + 3 + import { and, db, eq } from "@openstatus/db"; 4 + import { statusReport } from "@openstatus/db/src/schema"; 5 + 6 + import type { statusReportsApi } from "./index"; 7 + import { ParamsSchema, StatusReportSchema } from "./schema"; 8 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const getRoute = createRoute({ 12 + method: "get", 13 + tags: ["status_report"], 14 + description: "Get an status report", 15 + path: "/:id", 16 + request: { 17 + params: ParamsSchema, 18 + }, 19 + responses: { 20 + 200: { 21 + content: { 22 + "application/json": { 23 + schema: StatusReportSchema, 24 + }, 25 + }, 26 + description: "Get all status reports", 27 + }, 28 + ...openApiErrorResponses, 29 + }, 30 + }); 31 + 32 + export function regsiterGetStatusReport(api: typeof statusReportsApi) { 33 + return api.openapi(getRoute, async (c) => { 34 + const workspaceId = c.get("workspaceId"); 35 + const { id } = c.req.valid("param"); 36 + 37 + const _statusUpdate = await db.query.statusReport.findFirst({ 38 + with: { 39 + statusReportUpdates: true, 40 + monitorsToStatusReports: true, 41 + pagesToStatusReports: true, 42 + }, 43 + where: and( 44 + eq(statusReport.workspaceId, Number(workspaceId)), 45 + eq(statusReport.id, Number(id)) 46 + ), 47 + }); 48 + 49 + if (!_statusUpdate) { 50 + throw new HTTPException(404, { message: "Not Found" }); 51 + } 52 + 53 + const { 54 + statusReportUpdates, 55 + monitorsToStatusReports, 56 + pagesToStatusReports, 57 + } = _statusUpdate; 58 + 59 + // most recent report information 60 + const { message, date } = 61 + statusReportUpdates[statusReportUpdates.length - 1]; 62 + 63 + const data = StatusReportSchema.parse({ 64 + ..._statusUpdate, 65 + message, 66 + date, 67 + monitorIds: monitorsToStatusReports.length 68 + ? monitorsToStatusReports.map((monitor) => monitor.monitorId) 69 + : null, 70 + pageIds: pagesToStatusReports.length 71 + ? pagesToStatusReports.map((page) => page.pageId) 72 + : null, 73 + statusReportUpdateIds: statusReportUpdates.map((update) => update.id), 74 + }); 75 + 76 + return c.json(data); 77 + }); 78 + }
+58
apps/server/src/v1/statusReports/get_all.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { db, eq } from "@openstatus/db"; 4 + import { statusReport } from "@openstatus/db/src/schema"; 5 + 6 + import type { statusReportsApi } from "./index"; 7 + import { StatusReportSchema } from "./schema"; 8 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 9 + import { HTTPException } from "hono/http-exception"; 10 + 11 + const getAllRoute = createRoute({ 12 + method: "get", 13 + tags: ["status_report"], 14 + description: "Get all status reports", 15 + path: "/", 16 + request: {}, 17 + responses: { 18 + 200: { 19 + content: { 20 + "application/json": { 21 + schema: z.array(StatusReportSchema), 22 + }, 23 + }, 24 + description: "Get all status reports", 25 + }, 26 + ...openApiErrorResponses, 27 + }, 28 + }); 29 + 30 + export function registerGetAllStatusReports(api: typeof statusReportsApi) { 31 + return api.openapi(getAllRoute, async (c) => { 32 + const workspaceId = c.get("workspaceId"); 33 + 34 + const _statusReports = await db.query.statusReport.findMany({ 35 + with: { 36 + statusReportUpdates: true, 37 + monitorsToStatusReports: true, 38 + pagesToStatusReports: true, 39 + }, 40 + where: eq(statusReport.workspaceId, Number(workspaceId)), 41 + }); 42 + 43 + if (!_statusReports) { 44 + throw new HTTPException(404, { message: "Not Found" }); 45 + } 46 + 47 + const data = z.array(StatusReportSchema).parse( 48 + _statusReports.map((r) => ({ 49 + ...r, 50 + statusReportUpdateIds: r.statusReportUpdates.map((u) => u.id), 51 + pageIds: r.pagesToStatusReports.map((p) => p.pageId), 52 + monitorIds: r.monitorsToStatusReports.map((m) => m.monitorId), 53 + })) 54 + ); 55 + 56 + return c.json(data); 57 + }); 58 + }
+23
apps/server/src/v1/statusReports/index.ts
··· 1 + import { OpenAPIHono } from "@hono/zod-openapi"; 2 + 3 + import type { Variables } from "../index"; 4 + import { registerGetAllStatusReports } from "./get_all"; 5 + import { registerDeleteStatusReport } from "./delete"; 6 + import { regsiterGetStatusReport } from "./get"; 7 + import { registerPostStatusReport } from "./post"; 8 + import { handleZodError } from "../../libs/errors"; 9 + import { registerStatusReportUpdateRoutes } from "./update/post"; 10 + 11 + export const statusReportsApi = new OpenAPIHono<{ Variables: Variables }>({ 12 + defaultHook: handleZodError, 13 + }); 14 + 15 + registerGetAllStatusReports(statusReportsApi); 16 + registerDeleteStatusReport(statusReportsApi); 17 + regsiterGetStatusReport(statusReportsApi); 18 + registerPostStatusReport(statusReportsApi); 19 + 20 + /** 21 + * @deprecated in favor of `/status_report_updates` 22 + */ 23 + registerStatusReportUpdateRoutes(statusReportsApi);
+196
apps/server/src/v1/statusReports/post.ts
··· 1 + import { createRoute, z } from "@hono/zod-openapi"; 2 + 3 + import { and, asc, db, eq, inArray, isNotNull, isNull } from "@openstatus/db"; 4 + import { 5 + monitor, 6 + monitorsToStatusReport, 7 + page, 8 + pageSubscriber, 9 + pagesToStatusReports, 10 + statusReport, 11 + statusReportUpdate, 12 + } from "@openstatus/db/src/schema"; 13 + 14 + import type { statusReportsApi } from "./index"; 15 + import { StatusReportSchema } from "./schema"; 16 + import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 17 + import { HTTPException } from "hono/http-exception"; 18 + import { isoDate } from "../utils"; 19 + import { sendEmailHtml } from "@openstatus/emails"; 20 + 21 + const postRoute = createRoute({ 22 + method: "post", 23 + tags: ["status_report"], 24 + description: "Create an status report", 25 + path: "/", 26 + request: { 27 + body: { 28 + description: "The status report to create", 29 + content: { 30 + "application/json": { 31 + schema: StatusReportSchema.omit({ 32 + id: true, 33 + statusReportUpdateIds: true, 34 + }).extend({ 35 + date: isoDate.optional().openapi({ 36 + description: "The date of the report in ISO8601 format", 37 + }), 38 + message: z.string().openapi({ 39 + description: "The message of the current status of incident", 40 + }), 41 + }), 42 + }, 43 + }, 44 + }, 45 + }, 46 + responses: { 47 + 200: { 48 + content: { 49 + "application/json": { 50 + schema: StatusReportSchema, 51 + }, 52 + }, 53 + description: "Status report created", 54 + }, 55 + ...openApiErrorResponses, 56 + }, 57 + }); 58 + 59 + export function registerPostStatusReport(api: typeof statusReportsApi) { 60 + return api.openapi(postRoute, async (c) => { 61 + const input = c.req.valid("json"); 62 + const workspaceId = c.get("workspaceId"); 63 + const workspacePlan = c.get("workspacePlan"); 64 + 65 + const { pageIds, monitorIds, date, ...rest } = input; 66 + 67 + if (monitorIds?.length) { 68 + const _monitors = await db 69 + .select() 70 + .from(monitor) 71 + .where( 72 + and( 73 + eq(monitor.workspaceId, Number(workspaceId)), 74 + inArray(monitor.id, monitorIds), 75 + isNull(monitor.deletedAt) 76 + ) 77 + ) 78 + .all(); 79 + 80 + if (_monitors.length !== monitorIds.length) { 81 + throw new HTTPException(400, { message: "Monitor not found" }); 82 + } 83 + } 84 + 85 + if (pageIds?.length) { 86 + const _pages = await db 87 + .select() 88 + .from(page) 89 + .where( 90 + and( 91 + eq(page.workspaceId, Number(workspaceId)), 92 + inArray(page.id, pageIds) 93 + ) 94 + ) 95 + .all(); 96 + 97 + if (_pages.length !== pageIds.length) { 98 + throw new HTTPException(400, { message: "Page not found" }); 99 + } 100 + } 101 + 102 + const _newStatusReport = await db 103 + .insert(statusReport) 104 + .values({ 105 + ...rest, 106 + workspaceId: Number(workspaceId), 107 + }) 108 + .returning() 109 + .get(); 110 + 111 + const _newStatusReportUpdate = await db 112 + .insert(statusReportUpdate) 113 + .values({ 114 + ...input, 115 + date: date ? new Date(date) : new Date(), 116 + statusReportId: _newStatusReport.id, 117 + }) 118 + .returning() 119 + .get(); 120 + 121 + if (pageIds?.length) { 122 + await db 123 + .insert(pagesToStatusReports) 124 + .values( 125 + pageIds.map((id) => { 126 + return { 127 + pageId: id, 128 + statusReportId: _newStatusReport.id, 129 + }; 130 + }) 131 + ) 132 + .returning(); 133 + } 134 + 135 + if (monitorIds?.length) { 136 + await db 137 + .insert(monitorsToStatusReport) 138 + .values( 139 + monitorIds.map((id) => { 140 + return { 141 + monitorId: id, 142 + statusReportId: _newStatusReport.id, 143 + }; 144 + }) 145 + ) 146 + .returning(); 147 + } 148 + 149 + if (workspacePlan.title !== "Hobby") { 150 + const allPages = await db 151 + .select() 152 + .from(pagesToStatusReports) 153 + .where( 154 + eq(pagesToStatusReports.statusReportId, Number(_newStatusReport.id)) 155 + ) 156 + .all(); 157 + for (const currentPage of allPages) { 158 + const subscribers = await db 159 + .select() 160 + .from(pageSubscriber) 161 + .where( 162 + and( 163 + eq(pageSubscriber.pageId, currentPage.pageId), 164 + isNotNull(pageSubscriber.acceptedAt) 165 + ) 166 + ) 167 + .all(); 168 + const pageInfo = await db 169 + .select() 170 + .from(page) 171 + .where(eq(page.id, currentPage.pageId)) 172 + .get(); 173 + if (!pageInfo) continue; 174 + const subscribersEmails = subscribers.map( 175 + (subscriber) => subscriber.email 176 + ); 177 + await sendEmailHtml({ 178 + to: subscribersEmails, 179 + subject: `New status update for ${pageInfo.title}`, 180 + html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 181 + `, 182 + from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 183 + }); 184 + } 185 + } 186 + 187 + const data = StatusReportSchema.parse({ 188 + ..._newStatusReport, 189 + monitorIds, 190 + pageIds, 191 + statusReportUpdateIds: [_newStatusReportUpdate.id], 192 + }); 193 + 194 + return c.json(data); 195 + }); 196 + }
+63
apps/server/src/v1/statusReports/schema.ts
··· 1 + import { z } from "@hono/zod-openapi"; 2 + 3 + import { statusReportStatusSchema } from "@openstatus/db/src/schema"; 4 + 5 + export const ParamsSchema = z.object({ 6 + id: z 7 + .string() 8 + .min(1) 9 + .openapi({ 10 + param: { 11 + name: "id", 12 + in: "path", 13 + }, 14 + description: "The id of the status report", 15 + example: "1", 16 + }), 17 + }); 18 + 19 + export const StatusReportSchema = z.object({ 20 + id: z.number().openapi({ description: "The id of the status report" }), 21 + title: z.string().openapi({ 22 + example: "Documenso", 23 + description: "The title of the status report", 24 + }), 25 + status: statusReportStatusSchema.openapi({ 26 + description: "The current status of the report", 27 + }), 28 + // REMINDER: extended only on POST requests 29 + // date: isoDate.openapi({ 30 + // description: "The date of the report in ISO8601 format", 31 + // }), 32 + // message: z.string().openapi({ 33 + // description: "The message of the current status of incident", 34 + // }), 35 + statusReportUpdateIds: z 36 + .array(z.number()) 37 + .optional() 38 + .nullable() 39 + .default([]) 40 + .openapi({ 41 + description: "The ids of the status report updates", 42 + }), 43 + monitorIds: z 44 + .array(z.number()) 45 + .optional() 46 + .nullable() 47 + .default([]) 48 + .openapi({ 49 + description: "id of monitors this report needs to refer", 50 + }) 51 + .nullable(), 52 + pageIds: z 53 + .array(z.number()) 54 + .optional() 55 + .nullable() 56 + .default([]) 57 + .openapi({ 58 + description: "id of status pages this report needs to refer", 59 + }) 60 + .nullable(), 61 + }); 62 + 63 + export type StatusReportSchema = z.infer<typeof StatusReportSchema>;
+156
apps/server/src/v1/statusReports/statusReports.test.ts
··· 1 + import { expect, test } from "bun:test"; 2 + 3 + import { api } from "../index"; 4 + 5 + test("GET one status report", async () => { 6 + const res = await api.request("/status_report/1", { 7 + headers: { 8 + "x-openstatus-key": "1", 9 + }, 10 + }); 11 + expect(res.status).toBe(200); 12 + expect(await res.json()).toMatchObject({ 13 + id: 1, 14 + title: "Test Status Report", 15 + status: "monitoring", 16 + statusReportUpdateIds: expect.arrayContaining([1, 3]), // depending on the order of the updates 17 + monitorIds: null, 18 + pageIds: [1], 19 + }); 20 + }); 21 + 22 + test("Get all status report", async () => { 23 + const res = await api.request("/status_report", { 24 + headers: { 25 + "x-openstatus-key": "1", 26 + }, 27 + }); 28 + expect(res.status).toBe(200); 29 + expect({ data: await res.json() }).toMatchObject({ 30 + data: [ 31 + { 32 + id: 1, 33 + title: "Test Status Report", 34 + status: "monitoring", 35 + statusReportUpdateIds: expect.arrayContaining([1, 3]), // depending on the order of the updates 36 + monitorIds: [], 37 + pageIds: [1], 38 + }, 39 + { 40 + id: 2, 41 + title: "Test Status Report", 42 + status: "investigating", 43 + statusReportUpdateIds: expect.arrayContaining([2]), // depending on the order of the updates 44 + monitorIds: [1, 2], 45 + pageIds: [1], 46 + }, 47 + ], 48 + }); 49 + }); 50 + 51 + test("Create one status report including passing optional fields", async () => { 52 + const res = await api.request("/status_report", { 53 + method: "POST", 54 + headers: { 55 + "x-openstatus-key": "1", 56 + "content-type": "application/json", 57 + }, 58 + body: JSON.stringify({ 59 + status: "investigating", 60 + title: "New Status Report", 61 + message: "Message", 62 + monitorIds: [1], 63 + pageIds: [1], 64 + }), 65 + }); 66 + const json = await res.json(); 67 + 68 + expect(res.status).toBe(200); 69 + 70 + expect(json).toMatchObject({ 71 + id: expect.any(Number), 72 + title: "New Status Report", 73 + status: "investigating", 74 + statusReportUpdateIds: [expect.any(Number)], 75 + monitorIds: [1], 76 + pageIds: [1], 77 + }); 78 + }); 79 + 80 + test("Create one status report without auth key should return 401", async () => { 81 + const res = await api.request("/status_report", { 82 + method: "POST", 83 + headers: { 84 + "content-type": "application/json", 85 + }, 86 + body: JSON.stringify({ 87 + status: "investigating", 88 + title: "Test Status Report", 89 + }), 90 + }); 91 + expect(res.status).toBe(401); //unauthenticated 92 + }); 93 + 94 + test("Create one status report with invalid data should return 403", async () => { 95 + const res = await api.request("/status_report", { 96 + method: "POST", 97 + headers: { 98 + "x-openstatus-key": "1", 99 + "content-type": "application/json", 100 + }, 101 + body: JSON.stringify({ 102 + //passing incompelete body 103 + title: "Test Status Report", 104 + }), 105 + }); 106 + expect(res.status).toBe(400); 107 + }); 108 + 109 + test("Create status report with non existing monitor ids should return 400", async () => { 110 + const res = await api.request("/status_report", { 111 + method: "POST", 112 + headers: { 113 + "x-openstatus-key": "1", 114 + "content-type": "application/json", 115 + }, 116 + body: JSON.stringify({ 117 + status: "investigating", 118 + title: "New Status Report", 119 + message: "Message", 120 + monitorIds: [100], 121 + pageIds: [1], 122 + }), 123 + }); 124 + 125 + expect(res.status).toBe(400); 126 + }); 127 + 128 + test("Create status report with non existing page ids should return 400", async () => { 129 + const res = await api.request("/status_report", { 130 + method: "POST", 131 + headers: { 132 + "x-openstatus-key": "1", 133 + "content-type": "application/json", 134 + }, 135 + body: JSON.stringify({ 136 + status: "investigating", 137 + title: "New Status Report", 138 + message: "Message", 139 + monitorIds: [1], 140 + pageIds: [100], 141 + }), 142 + }); 143 + 144 + expect(res.status).toBe(400); 145 + }); 146 + 147 + test("Delete a status report", async () => { 148 + const res = await api.request("/status_report/3", { 149 + method: "DELETE", 150 + headers: { 151 + "x-openstatus-key": "1", 152 + }, 153 + }); 154 + expect(res.status).toBe(200); 155 + expect(await res.json()).toMatchObject({}); 156 + });
+120
apps/server/src/v1/statusReports/update/post.ts
··· 1 + import { createRoute } from "@hono/zod-openapi"; 2 + import { ParamsSchema, StatusReportSchema } from "../schema"; 3 + import { StatusReportUpdateSchema } from "../../statusReportUpdates/schema"; 4 + import { openApiErrorResponses } from "../../../libs/errors/openapi-error-responses"; 5 + import type { statusReportsApi } from "../index"; 6 + import { 7 + page, 8 + pageSubscriber, 9 + pagesToStatusReports, 10 + statusReport, 11 + statusReportUpdate, 12 + } from "@openstatus/db/src/schema"; 13 + import { and, db, eq, isNotNull } from "@openstatus/db"; 14 + import { sendEmailHtml } from "@openstatus/emails"; 15 + import { HTTPException } from "hono/http-exception"; 16 + 17 + const postRouteUpdate = createRoute({ 18 + method: "post", 19 + tags: ["status_report"], 20 + path: "/:id/update", 21 + description: 22 + "Create an status report update. Deprecated, please use /status-report-updates instead.", 23 + request: { 24 + params: ParamsSchema, 25 + body: { 26 + description: "the status report update", 27 + content: { 28 + "application/json": { 29 + schema: StatusReportUpdateSchema.omit({ id: true }), 30 + }, 31 + }, 32 + }, 33 + }, 34 + responses: { 35 + 200: { 36 + content: { 37 + "application/json": { 38 + schema: StatusReportSchema, 39 + }, 40 + }, 41 + description: "Status report updated", 42 + }, 43 + ...openApiErrorResponses, 44 + }, 45 + }); 46 + 47 + export function registerStatusReportUpdateRoutes(api: typeof statusReportsApi) { 48 + return api.openapi(postRouteUpdate, async (c) => { 49 + const input = c.req.valid("json"); 50 + const { id } = c.req.valid("param"); 51 + const workspaceId = c.get("workspaceId"); 52 + const workspacePlan = c.get("workspacePlan"); 53 + 54 + const _statusReport = await db 55 + .update(statusReport) 56 + .set({ status: input.status }) 57 + .where( 58 + and( 59 + eq(statusReport.id, Number(id)), 60 + eq(statusReport.workspaceId, Number(workspaceId)) 61 + ) 62 + ) 63 + .returning() 64 + .get(); 65 + 66 + if (!_statusReport) { 67 + throw new HTTPException(404, { message: "Not Found" }); 68 + } 69 + 70 + const _statusReportUpdate = await db 71 + .insert(statusReportUpdate) 72 + .values({ 73 + ...input, 74 + date: new Date(input.date), 75 + statusReportId: Number(id), 76 + }) 77 + .returning() 78 + .get(); 79 + 80 + if (workspacePlan.title !== "Hobby") { 81 + const allPages = await db 82 + .select() 83 + .from(pagesToStatusReports) 84 + .where(eq(pagesToStatusReports.statusReportId, Number(id))) 85 + .all(); 86 + for (const currentPage of allPages) { 87 + const subscribers = await db 88 + .select() 89 + .from(pageSubscriber) 90 + .where( 91 + and( 92 + eq(pageSubscriber.pageId, currentPage.pageId), 93 + isNotNull(pageSubscriber.acceptedAt) 94 + ) 95 + ) 96 + .all(); 97 + const pageInfo = await db 98 + .select() 99 + .from(page) 100 + .where(eq(page.id, currentPage.pageId)) 101 + .get(); 102 + if (!pageInfo) continue; 103 + const subscribersEmails = subscribers.map( 104 + (subscriber) => subscriber.email 105 + ); 106 + await sendEmailHtml({ 107 + to: subscribersEmails, 108 + subject: `New status update for ${pageInfo.title}`, 109 + html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 110 + `, 111 + from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 112 + }); 113 + } 114 + } 115 + 116 + const data = StatusReportUpdateSchema.parse(_statusReportUpdate); 117 + 118 + return c.json(data); 119 + }); 120 + }
+1 -29
apps/server/src/v1/utils.ts
··· 1 1 import { z } from "@hono/zod-openapi"; 2 2 3 - import { db, eq } from "@openstatus/db"; 4 - import { selectWorkspaceSchema, workspace } from "@openstatus/db/src/schema"; 5 - import { allPlans } from "@openstatus/plans"; 6 - 7 - /** 8 - * TODO: move the plan limit into the Unkey `{ meta }` to avoid an additional db call. 9 - * When an API Key is created, we need to include the `{ meta: { plan: "free" } }` to the key. 10 - * Then, we can just read the plan from the key and use it in the middleware. 11 - * Don't forget to update the key whenever a user changes their plan. (via `stripeRoute` webhook) 12 - * 13 - * That remindes me we need to downgrade the frequency/periodicity of monitors to 10m if the user downgrades their plan. 14 - */ 15 - 16 3 export const isoDate = z.preprocess((val) => { 17 4 if (val) { 18 5 return new Date(String(val)).toISOString(); ··· 20 7 return new Date().toISOString(); 21 8 }, z.string()); 22 9 23 - export async function getWorkspace(id: number) { 24 - const _workspace = await db 25 - .select() 26 - .from(workspace) 27 - .where(eq(workspace.id, id)) 28 - .get(); 29 - 30 - return selectWorkspaceSchema.parse(_workspace); 31 - } 32 - 33 - export async function getLimitByWorkspaceId(id: number) { 34 - const { plan } = await getWorkspace(id); 35 - return allPlans[plan]; 36 - } 37 - 38 10 export function isNumberArray<T>( 39 - monitors: number[] | T[], 11 + monitors: number[] | T[] 40 12 ): monitors is number[] { 41 13 return ( 42 14 Array.isArray(monitors) &&
+1
apps/web/package.json
··· 21 21 "@openstatus/assertions": "workspace:*", 22 22 "@openstatus/db": "workspace:*", 23 23 "@openstatus/emails": "workspace:*", 24 + "@openstatus/error": "workspace:*", 24 25 "@openstatus/header-analysis": "workspace:*", 25 26 "@openstatus/next-monitoring": "0.0.4", 26 27 "@openstatus/notification-discord": "workspace:*",
+4 -4
apps/web/src/app/status-page/[domain]/_components/actions.ts
··· 37 37 .from(page) 38 38 .where( 39 39 // REMINDER: customDomain for pro users 40 - sql`lower(${page.slug}) = ${slug} OR lower(${page.customDomain}) = ${slug}` 40 + sql`lower(${page.slug}) = ${slug} OR lower(${page.customDomain}) = ${slug}`, 41 41 ) 42 42 .get(); 43 43 ··· 53 53 .where( 54 54 and( 55 55 eq(pageSubscriber.email, validatedFields.data.email), 56 - eq(pageSubscriber.pageId, pageData.id) 57 - ) 56 + eq(pageSubscriber.pageId, pageData.id), 57 + ), 58 58 ) 59 59 .get(); 60 60 ··· 118 118 .from(page) 119 119 .where( 120 120 // REMINDER: customDomain for pro users 121 - sql`lower(${page.slug}) = ${slug} OR lower(${page.customDomain}) = ${slug}` 121 + sql`lower(${page.slug}) = ${slug} OR lower(${page.customDomain}) = ${slug}`, 122 122 ) 123 123 .get(); 124 124
+34 -21
apps/web/src/components/forms/monitor/form.tsx
··· 91 91 }); 92 92 const router = useRouter(); 93 93 const pathname = usePathname(); 94 - const [isPending, startTransition] = React.useTransition(); 94 + const [isPending, setPending] = React.useState(false); 95 95 const [pingFailed, setPingFailed] = React.useState(false); 96 96 97 97 const handleDataUpdateOrInsertion = async (props: InsertMonitor) => { 98 + if (defaultValues) { 99 + await api.monitor.update.mutate(props); 100 + } else { 101 + await api.monitor.create.mutate(props); 102 + } 103 + if (nextUrl) { 104 + router.push(nextUrl); 105 + } 106 + // to reset the `isDirty` state of them form while keeping the values for optimistic UI 107 + form.reset(undefined, { keepValues: true }); 108 + router.refresh(); 109 + }; 110 + 111 + const handleForceDataUpdateOrInsertion = async (props: InsertMonitor) => { 98 112 try { 99 - if (defaultValues) { 100 - await api.monitor.update.mutate(props); 101 - } else { 102 - await api.monitor.create.mutate(props); 103 - } 104 - if (nextUrl) { 105 - router.push(nextUrl); 106 - } 107 - // to reset the `isDirty` state of them form while keeping the values for optimistic UI 108 - form.reset(undefined, { keepValues: true }); 109 - router.refresh(); 113 + handleDataUpdateOrInsertion(props); 110 114 toastAction("saved"); 111 115 } catch (_error) { 112 116 toastAction("error"); ··· 114 118 }; 115 119 116 120 const onSubmit = ({ ...props }: InsertMonitor) => { 117 - startTransition(async () => { 118 - try { 121 + toast.promise( 122 + async () => { 123 + setPending(true); 119 124 const { error } = await pingEndpoint(); 120 125 if (error) { 121 126 setPingFailed(true); 122 - toast.error(error); 123 - return; 127 + throw new Error(error); 124 128 } 125 129 await handleDataUpdateOrInsertion(props); 126 - } catch { 127 - toastAction("error"); 128 - } 129 - }); 130 + }, 131 + { 132 + loading: "Checking the endpoint before saving...", 133 + success: () => "Endpoint is working fine. Saved!", 134 + error: (error: Error) => { 135 + if (error instanceof Error) return error.message; 136 + return "Endpoint is not working."; 137 + }, 138 + finally: () => { 139 + setPending(false); 140 + }, 141 + }, 142 + ); 130 143 }; 131 144 132 145 const validateJSON = (value?: string) => { ··· 307 320 <FailedPingAlertConfirmation 308 321 monitor={form.getValues()} 309 322 {...{ pingFailed, setPingFailed }} 310 - onConfirm={handleDataUpdateOrInsertion} 323 + onConfirm={handleForceDataUpdateOrInsertion} 311 324 /> 312 325 </> 313 326 );
+11 -5
apps/web/src/components/forms/notification/config.ts
··· 4 4 } from "@openstatus/db/src/schema"; 5 5 import { sendTestDiscordMessage } from "@openstatus/notification-discord"; 6 6 import { sendTestSlackMessage } from "@openstatus/notification-slack"; 7 + import { allPlans, plans } from "@openstatus/plans"; 7 8 8 9 export function getDefaultProviderData(defaultValues?: InsertNotification) { 9 10 if (!defaultValues?.provider) return ""; // FIXME: input can empty - needs to be undefined ··· 18 19 switch (provider) { 19 20 case "email": 20 21 return { 22 + label: "Email", 21 23 dataType: "email", 22 24 placeholder: "dev@documenso.com", 23 25 setupDocLink: null, 24 26 sendTest: null, 25 - plans: ["free", "starter", "pro", "team"], 27 + plans: plans, 26 28 }; 27 29 28 30 case "slack": 29 31 return { 32 + label: "Slack", 30 33 dataType: "url", 31 34 placeholder: "https://hooks.slack.com/services/xxx...", 32 35 setupDocLink: 33 36 "https://api.slack.com/messaging/webhooks#getting_started", 34 37 sendTest: sendTestSlackMessage, 35 - plans: ["free", "starter", "pro", "team"], 38 + plans: plans, 36 39 }; 37 40 38 41 case "discord": 39 42 return { 43 + label: "Discord", 40 44 dataType: "url", 41 45 placeholder: "https://discord.com/api/webhooks/{channelId}/xxx...", 42 46 setupDocLink: "https://support.discord.com/hc/en-us/articles/228383668", 43 47 sendTest: sendTestDiscordMessage, 44 - plans: ["free", "starter", "pro", "team"], 48 + plans: plans, 45 49 }; 46 50 case "sms": 47 51 return { 52 + label: "SMS", 48 53 dataType: "tel", 49 54 placeholder: "+123456789", 50 55 setupDocLink: null, 51 56 sendTest: null, 52 - plans: ["pro", "team"], 57 + plans: plans.filter((plan) => allPlans[plan].limits.sms), 53 58 }; 54 59 55 60 default: 56 61 return { 62 + label: "Webhook", 57 63 dataType: "url", 58 64 placeholder: "xxxx", 59 65 setupDocLink: `https://docs.openstatus.dev/integrations/${provider}`, 60 66 send: null, 61 - plans: ["free", "starter", "pro", "team"], 67 + plans: plans, 62 68 }; 63 69 } 64 70 }
+7 -3
apps/web/src/components/forms/notification/form.tsx
··· 13 13 import { Button, Form } from "@openstatus/ui"; 14 14 15 15 import { LoadingAnimation } from "@/components/loading-animation"; 16 - import { toastAction } from "@/lib/toast"; 16 + import { toast, toastAction } from "@/lib/toast"; 17 17 import { api } from "@/trpc/client"; 18 18 import { SaveButton } from "../shared/save-button"; 19 19 import { ··· 22 22 setProviderData, 23 23 } from "./config"; 24 24 import { General } from "./general"; 25 + import { TRPCClientError } from "@trpc/client"; 26 + import { ZodError, type ZodIssue } from "zod"; 27 + import { SchemaError } from "@openstatus/error"; 25 28 26 29 interface Props { 27 30 defaultValues?: InsertNotification; ··· 79 82 } 80 83 router.refresh(); 81 84 toastAction("saved"); 82 - } catch { 83 - toastAction("error"); 85 + } catch (e) { 86 + if (e instanceof TRPCClientError) toast.error(e.message); 87 + else toastAction("error"); 84 88 } finally { 85 89 onExternalSubmit?.(); 86 90 }
+8 -11
apps/web/src/components/forms/notification/general.tsx
··· 26 26 SelectValue, 27 27 } from "@openstatus/ui"; 28 28 29 - import { toCapitalize } from "@/lib/utils"; 30 29 import { SectionHeader } from "../shared/section-header"; 31 30 import { getProviderMetaData } from "./config"; 32 31 ··· 68 67 </FormControl> 69 68 <SelectContent> 70 69 {notificationProvider.map((provider) => { 71 - const isIncluded = 72 - getProviderMetaData(provider).plans?.includes(plan); 70 + const providerData = getProviderMetaData(provider); 71 + const enabled = providerData.plans?.includes(plan); 72 + 73 73 return ( 74 74 <SelectItem 75 75 key={provider} 76 76 value={provider} 77 77 className="capitalize" 78 - disabled={!isIncluded} 78 + disabled={!enabled} 79 79 > 80 - {provider} 80 + {providerData.label} 81 81 </SelectItem> 82 82 ); 83 83 })} ··· 110 110 name="data" 111 111 render={({ field }) => ( 112 112 <FormItem className="sm:col-span-full"> 113 - {/* make the first letter capital */} 114 - <div className="flex items-center justify-between"> 115 - <FormLabel>{toCapitalize(watchProvider)}</FormLabel> 116 - </div> 113 + <FormLabel>{providerMetaData.label}</FormLabel> 117 114 <FormControl> 118 115 <Input 119 116 type={providerMetaData.dataType} ··· 123 120 /> 124 121 </FormControl> 125 122 <FormDescription className="flex items-center justify-between"> 126 - The data required. 123 + The data is required. 127 124 {providerMetaData.setupDocLink && ( 128 125 <a 129 126 href={providerMetaData.setupDocLink} ··· 131 128 className="underline hover:no-underline" 132 129 rel="noreferrer" 133 130 > 134 - How to setup your {toCapitalize(watchProvider)} webhook 131 + How to setup your {providerMetaData.label} webhook 135 132 </a> 136 133 )} 137 134 </FormDescription>
+1
packages/api/package.json
··· 11 11 "@openstatus/assertions": "workspace:*", 12 12 "@openstatus/db": "workspace:*", 13 13 "@openstatus/emails": "workspace:*", 14 + "@openstatus/error": "workspace:*", 14 15 "@openstatus/plans": "workspace:*", 15 16 "@openstatus/tinybird": "workspace:*", 16 17 "@t3-oss/env-core": "0.7.0",
+25 -4
packages/api/src/router/notification.ts
··· 3 3 4 4 import { and, eq } from "@openstatus/db"; 5 5 import { 6 + NotificationDataSchema, 6 7 insertNotificationSchema, 7 8 notification, 8 9 selectNotificationSchema, ··· 11 12 12 13 import { trackNewNotification } from "../analytics"; 13 14 import { createTRPCRouter, protectedProcedure } from "../trpc"; 15 + import { SchemaError } from "@openstatus/error"; 14 16 15 17 export const notificationRouter = createTRPCRouter({ 16 18 create: protectedProcedure 17 19 .input(insertNotificationSchema) 18 20 .mutation(async (opts) => { 19 - const { ...data } = opts.input; 21 + const { ...props } = opts.input; 20 22 21 23 const notificationLimit = getLimit( 22 24 opts.ctx.workspace.plan, ··· 37 39 }); 38 40 } 39 41 42 + const _data = NotificationDataSchema.safeParse(JSON.parse(props.data)); 43 + 44 + if (!_data.success) { 45 + throw new TRPCError({ 46 + code: "BAD_REQUEST", 47 + message: SchemaError.fromZod(_data.error, props).message, 48 + }); 49 + } 50 + 40 51 const _notification = await opts.ctx.db 41 52 .insert(notification) 42 - .values({ ...data, workspaceId: opts.ctx.workspace.id }) 53 + .values({ ...props, workspaceId: opts.ctx.workspace.id }) 43 54 .returning() 44 55 .get(); 45 56 ··· 55 66 .mutation(async (opts) => { 56 67 if (!opts.input.id) return; 57 68 58 - const { ...data } = opts.input; 69 + const { ...props } = opts.input; 70 + 71 + const _data = NotificationDataSchema.safeParse(JSON.parse(props.data)); 72 + 73 + if (!_data.success) { 74 + throw new TRPCError({ 75 + code: "BAD_REQUEST", 76 + message: SchemaError.fromZod(_data.error, props).message, 77 + }); 78 + } 79 + 59 80 return await opts.ctx.db 60 81 .update(notification) 61 - .set({ ...data, updatedAt: new Date() }) 82 + .set({ ...props, updatedAt: new Date() }) 62 83 .where( 63 84 and( 64 85 eq(notification.id, opts.input.id),
+20 -20
packages/api/src/router/page.ts
··· 65 65 where: and( 66 66 inArray(monitor.id, monitorIds), 67 67 eq(monitor.workspaceId, opts.ctx.workspace.id), 68 - isNull(monitor.deletedAt) 68 + isNull(monitor.deletedAt), 69 69 ), 70 70 }); 71 71 ··· 95 95 const firstPage = await opts.ctx.db.query.page.findFirst({ 96 96 where: and( 97 97 eq(page.id, opts.input.id), 98 - eq(page.workspaceId, opts.ctx.workspace.id) 98 + eq(page.workspaceId, opts.ctx.workspace.id), 99 99 ), 100 100 with: { 101 101 monitorsToPages: { ··· 132 132 .where( 133 133 and( 134 134 eq(page.id, pageInput.id), 135 - eq(page.workspaceId, opts.ctx.workspace.id) 136 - ) 135 + eq(page.workspaceId, opts.ctx.workspace.id), 136 + ), 137 137 ) 138 138 .returning() 139 139 .get(); ··· 144 144 where: and( 145 145 inArray(monitor.id, monitorIds), 146 146 eq(monitor.workspaceId, opts.ctx.workspace.id), 147 - isNull(monitor.deletedAt) 147 + isNull(monitor.deletedAt), 148 148 ), 149 149 }); 150 150 ··· 173 173 .where( 174 174 and( 175 175 inArray(monitorsToPages.monitorId, removedMonitors), 176 - eq(monitorsToPages.pageId, currentPage.id) 177 - ) 176 + eq(monitorsToPages.pageId, currentPage.id), 177 + ), 178 178 ); 179 179 } 180 180 ··· 202 202 .where( 203 203 and( 204 204 eq(page.id, opts.input.id), 205 - eq(page.workspaceId, opts.ctx.workspace.id) 206 - ) 205 + eq(page.workspaceId, opts.ctx.workspace.id), 206 + ), 207 207 ) 208 208 .run(); 209 209 }), ··· 245 245 .leftJoin(monitor, eq(monitorsToPages.monitorId, monitor.id)) 246 246 .where( 247 247 // make sur only active monitors are returned! 248 - and(eq(monitorsToPages.pageId, result.id), eq(monitor.active, true)) 248 + and(eq(monitorsToPages.pageId, result.id), eq(monitor.active, true)), 249 249 ) 250 250 .all(); 251 251 252 252 const monitorsId = monitorsToPagesResult.map( 253 - ({ monitors_to_pages }) => monitors_to_pages.monitorId 253 + ({ monitors_to_pages }) => monitors_to_pages.monitorId, 254 254 ); 255 255 256 256 const monitorsToStatusReportResult = ··· 269 269 .all(); 270 270 271 271 const monitorStatusReportIds = monitorsToStatusReportResult.map( 272 - ({ statusReportId }) => statusReportId 272 + ({ statusReportId }) => statusReportId, 273 273 ); 274 274 275 275 const pageStatusReportIds = statusReportsToPagesResult.map( 276 - ({ statusReportId }) => statusReportId 276 + ({ statusReportId }) => statusReportId, 277 277 ); 278 278 279 279 const statusReportIds = Array.from( 280 - new Set([...monitorStatusReportIds, ...pageStatusReportIds]) 280 + new Set([...monitorStatusReportIds, ...pageStatusReportIds]), 281 281 ); 282 282 283 283 const statusReports = ··· 304 304 and( 305 305 inArray(monitor.id, monitorsId), 306 306 eq(monitor.active, true), 307 - isNull(monitor.deletedAt) 308 - ) // REMINDER: this is hardcoded 307 + isNull(monitor.deletedAt), 308 + ), // REMINDER: this is hardcoded 309 309 ) 310 310 .all() 311 311 : []; ··· 318 318 .where( 319 319 inArray( 320 320 incidentTable.monitorId, 321 - monitors.map((m) => m.id) 322 - ) 321 + monitors.map((m) => m.id), 322 + ), 323 323 ) 324 324 .all() 325 325 : []; ··· 348 348 // had filter on some words we want to keep for us 349 349 if ( 350 350 ["api", "app", "www", "docs", "checker", "time", "help"].includes( 351 - opts.input.slug 351 + opts.input.slug, 352 352 ) 353 353 ) { 354 354 return false; ··· 361 361 362 362 addCustomDomain: protectedProcedure 363 363 .input( 364 - z.object({ customDomain: z.string().toLowerCase(), pageId: z.number() }) 364 + z.object({ customDomain: z.string().toLowerCase(), pageId: z.number() }), 365 365 ) 366 366 .mutation(async (opts) => { 367 367 // TODO Add some check ?
+1 -1
packages/db/package.json
··· 33 33 "typescript": "5.4.5", 34 34 "utf-8-validate": "6.0.3" 35 35 }, 36 - "author": "" 36 + "author": "OpenStatus" 37 37 }
+12 -12
packages/db/src/schema/notifications/validation.ts
··· 27 27 export type Notification = z.infer<typeof selectNotificationSchema>; 28 28 export type NotificationProvider = z.infer<typeof notificationProviderSchema>; 29 29 30 + const phoneRegex = new RegExp( 31 + /^([+]?[\s0-9]+)?(\d{3}|[(]?[0-9]+[)])?([-]?[\s]?[0-9])+$/, 32 + ); 33 + 34 + export const phoneSchema = z.string().regex(phoneRegex, "Invalid Number!"); 35 + export const emailSchema = z.string().email(); 36 + export const urlSchema = z.string().url(); 37 + 30 38 export const NotificationDataSchema = z.union([ 31 - z.object({ 32 - sms: z.string(), 33 - }), 34 - z.object({ 35 - email: z.string().email(), 36 - }), 37 - z.object({ 38 - slack: z.string(), 39 - }), 40 - z.object({ 41 - discord: z.string(), 42 - }), 39 + z.object({ sms: phoneSchema }), 40 + z.object({ email: emailSchema }), 41 + z.object({ slack: urlSchema }), 42 + z.object({ discord: urlSchema }), 43 43 ]);
+26 -2
packages/db/src/seed.mts
··· 9 9 incidentTable, 10 10 monitor, 11 11 monitorsToPages, 12 + monitorsToStatusReport, 12 13 notification, 13 14 notificationsToMonitors, 14 15 page, 16 + pagesToStatusReports, 15 17 statusReport, 16 18 statusReportUpdate, 17 19 user, ··· 155 157 id: 1, 156 158 statusReportId: 1, 157 159 status: "investigating", 158 - message: "", 160 + message: "Message", 159 161 date: new Date(), 160 162 }) 161 163 .run(); ··· 177 179 id: 2, 178 180 statusReportId: 2, 179 181 status: "investigating", 180 - message: "", 182 + message: "Message", 181 183 date: new Date(), 182 184 }) 183 185 .run(); 186 + 187 + await db.insert(monitorsToStatusReport).values([ 188 + { 189 + monitorId: 1, 190 + statusReportId: 2, 191 + }, 192 + { 193 + monitorId: 2, 194 + statusReportId: 2, 195 + }, 196 + ]); 197 + 198 + await db.insert(pagesToStatusReports).values([ 199 + { 200 + pageId: 1, 201 + statusReportId: 2, 202 + }, 203 + { 204 + pageId: 1, 205 + statusReportId: 1, 206 + }, 207 + ]); 184 208 185 209 await db 186 210 .insert(incidentTable)
+2 -1
packages/emails/emails/send.ts
··· 1 + import type React from "react"; 1 2 import { Resend } from "resend"; 2 3 3 4 import { env } from "../env"; ··· 5 6 export const resend = new Resend(env.RESEND_API_KEY); 6 7 7 8 export interface Emails { 8 - react: JSX.Element; 9 + react: React.JSX.Element; 9 10 subject: string; 10 11 to: string[]; 11 12 from: string;
+5
packages/error/index.ts
··· 1 + export * from "./src/base-error"; 2 + export * from "./src/error-code"; 3 + export * from "./src/http-error"; 4 + export * from "./src/schema-error"; 5 + export * from "./src/utils";
+17
packages/error/package.json
··· 1 + { 2 + "name": "@openstatus/error", 3 + "version": "0.0.0", 4 + "description": "", 5 + "main": "index.ts", 6 + "scripts": {}, 7 + "dependencies": { 8 + "zod": "3.22.4" 9 + }, 10 + "devDependencies": { 11 + "@openstatus/tsconfig": "workspace:*", 12 + "typescript": "5.4.5" 13 + }, 14 + "keywords": [], 15 + "author": "", 16 + "license": "ISC" 17 + }
+46
packages/error/src/base-error.ts
··· 1 + import type { ErrorCode } from "./error-code"; 2 + 3 + type ErrorContext = Record<string, unknown>; 4 + 5 + export abstract class BaseError< 6 + TContext extends ErrorContext = ErrorContext 7 + > extends Error { 8 + public abstract readonly name: string; 9 + /** 10 + * A distinct code for the error type used to differentiate between different types of errors. 11 + * Used to build the URL for the error documentation. 12 + * @example 'UNAUTHENTICATED' | 'INTERNAL_SERVER_ERROR' 13 + */ 14 + public abstract readonly code?: ErrorCode; 15 + public readonly cause?: BaseError; 16 + /** 17 + * Additional context to help understand the error. 18 + * @example { url: 'https://example.com/api', method: 'GET', statusCode: 401 } 19 + */ 20 + public readonly context?: TContext; 21 + 22 + constructor(opts: { 23 + message: string; 24 + cause?: BaseError; 25 + context?: TContext; 26 + }) { 27 + super(opts.message); 28 + this.cause = opts.cause; 29 + this.context = opts.context; 30 + 31 + // TODO: add logger here! 32 + } 33 + 34 + public toString(): string { 35 + return `${this.name}(${this.code}): ${ 36 + this.message 37 + } - caused by ${this.cause?.toString()} - with context ${JSON.stringify( 38 + this.context 39 + )}`; 40 + } 41 + 42 + // get docs(): string { 43 + // if (!this.code) return "https://example.com/docs/errors" 44 + // return `https://example.com/docs/errors/${this.code}`; 45 + // } 46 + }
+17
packages/error/src/error-code.ts
··· 1 + import { z } from "zod"; 2 + 3 + export const ErrorCodeEnum = z.enum([ 4 + "BAD_REQUEST", 5 + "FORBIDDEN", 6 + "INTERNAL_SERVER_ERROR", 7 + "USAGE_EXCEEDED", 8 + "DISABLED", 9 + "CONFLICT", 10 + "NOT_FOUND", 11 + "NOT_UNIQUE", 12 + "UNAUTHORIZED", 13 + "METHOD_NOT_ALLOWED", 14 + "UNPROCESSABLE_ENTITY", 15 + ]); 16 + 17 + export type ErrorCode = z.infer<typeof ErrorCodeEnum>;
+36
packages/error/src/http-error.ts
··· 1 + import { BaseError } from "./base-error"; 2 + import type { ErrorCode } from "./error-code"; 3 + import { statusToCode } from "./utils"; 4 + 5 + type Context = { 6 + url?: string; 7 + method?: string; 8 + statusCode?: number; 9 + }; 10 + 11 + export class HttpError extends BaseError<Context> { 12 + public readonly name = HttpError.name; 13 + public readonly code: ErrorCode; 14 + 15 + constructor(opts: { 16 + code: ErrorCode; 17 + message: string; 18 + cause?: BaseError; 19 + context?: Context; 20 + }) { 21 + super(opts); 22 + this.code = opts.code; 23 + } 24 + 25 + public static fromRequest(request: Request, response: Response) { 26 + return new HttpError({ 27 + code: statusToCode(response.status), 28 + message: response.statusText, // can be overriden with { ...res, statusText: 'Custom message' } 29 + context: { 30 + url: request.url, 31 + method: request.method, 32 + statusCode: response.status, 33 + }, 34 + }); 35 + } 36 + }
+30
packages/error/src/schema-error.ts
··· 1 + import type { ZodError } from "zod"; 2 + 3 + import { BaseError } from "./base-error"; 4 + import type { ErrorCode } from "./error-code"; 5 + import { parseZodErrorIssues } from "./utils"; 6 + 7 + type Context = { raw: unknown }; 8 + 9 + export class SchemaError extends BaseError<Context> { 10 + public readonly name = SchemaError.name; 11 + public readonly code: ErrorCode; 12 + 13 + constructor(opts: { 14 + code: ErrorCode; 15 + message: string; 16 + cause?: BaseError; 17 + context?: Context; 18 + }) { 19 + super(opts); 20 + this.code = opts.code; 21 + } 22 + 23 + static fromZod<T>(e: ZodError<T>, raw: unknown): SchemaError { 24 + return new SchemaError({ 25 + code: "UNPROCESSABLE_ENTITY", 26 + message: parseZodErrorIssues(e.issues), 27 + context: { raw: JSON.stringify(raw) }, 28 + }); 29 + } 30 + }
+67
packages/error/src/utils.ts
··· 1 + import type { ZodIssue } from "zod"; 2 + 3 + import type { ErrorCode } from "./error-code"; 4 + 5 + export function statusToCode(status: number): ErrorCode { 6 + switch (status) { 7 + case 400: 8 + return "BAD_REQUEST"; 9 + case 401: 10 + return "UNAUTHORIZED"; 11 + case 403: 12 + return "FORBIDDEN"; 13 + case 404: 14 + return "NOT_FOUND"; 15 + case 405: 16 + return "METHOD_NOT_ALLOWED"; 17 + case 409: 18 + return "METHOD_NOT_ALLOWED"; 19 + case 422: 20 + return "UNPROCESSABLE_ENTITY"; 21 + case 500: 22 + return "INTERNAL_SERVER_ERROR"; 23 + default: 24 + return "INTERNAL_SERVER_ERROR"; 25 + } 26 + } 27 + 28 + export function codeToStatus(code: ErrorCode): number { 29 + switch (code) { 30 + case "BAD_REQUEST": 31 + return 400; 32 + case "UNAUTHORIZED": 33 + return 401; 34 + case "FORBIDDEN": 35 + return 403; 36 + case "NOT_FOUND": 37 + return 404; 38 + case "METHOD_NOT_ALLOWED": 39 + return 405; 40 + case "CONFLICT": 41 + return 409; 42 + case "UNPROCESSABLE_ENTITY": 43 + return 422; 44 + case "INTERNAL_SERVER_ERROR": 45 + return 500; 46 + default: 47 + return 500; 48 + } 49 + } 50 + 51 + // Props to cal.com: https://github.com/calcom/cal.com/blob/5d325495a9c30c5a9d89fc2adfa620b8fde9346e/packages/lib/server/getServerErrorFromUnknown.ts#L17 52 + export function parseZodErrorIssues(issues: ZodIssue[]): string { 53 + return issues 54 + .map((i) => 55 + i.code === "invalid_union" 56 + ? i.unionErrors.map((ue) => parseZodErrorIssues(ue.issues)).join("; ") 57 + : i.code === "unrecognized_keys" 58 + ? i.message 59 + : `${i.path.length ? `${i.code} in '${i.path}': ` : ""}${i.message}` 60 + ) 61 + .join("; "); 62 + } 63 + 64 + export function redactError<TError extends Error | unknown>(err: TError) { 65 + if (!(err instanceof Error)) return err; 66 + console.error(`Type of Error: ${err.constructor}`); 67 + }
+4
packages/error/tsconfig.json
··· 1 + { 2 + "extends": "@openstatus/tsconfig/base.json", 3 + "include": ["src", "*.ts"] 4 + }
+1 -1
packages/plans/src/config.ts
··· 6 6 export const allPlans: Record< 7 7 WorkspacePlan, 8 8 { 9 - title: string; 9 + title: "Hobby" | "Starter" | "Growth" | "Pro"; 10 10 description: string; 11 11 price: number; 12 12 limits: Limits;
+7 -3
packages/plans/src/utils.ts
··· 6 6 // TODO: use getLimit utils function 7 7 export function getLimit<T extends keyof Limits>( 8 8 plan: WorkspacePlan, 9 - limit: T, 9 + limit: T 10 10 ) { 11 11 return allPlans[plan].limits[limit]; 12 12 } 13 13 14 - export function getLimits(plan: WorkspacePlan) { 15 - return allPlans[plan].limits; 14 + export function getLimits(plan: WorkspacePlan | null) { 15 + return allPlans[plan || "free"].limits; 16 + } 17 + 18 + export function getPlanConfig(plan: WorkspacePlan | null) { 19 + return allPlans[plan || "free"]; 16 20 }
+3817 -372
pnpm-lock.yaml
··· 39 39 version: 5.3.0 40 40 drizzle-orm: 41 41 specifier: 0.30.10 42 - version: 0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0) 42 + version: 0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1) 43 43 hono: 44 44 specifier: 4.3.9 45 45 version: 4.3.9 ··· 58 58 version: 5.4.5 59 59 wrangler: 60 60 specifier: 3.57.0 61 - version: 3.57.0(@cloudflare/workers-types@4.20240512.0)(bufferutil@4.0.7)(utf-8-validate@6.0.3) 61 + version: 3.57.0(@cloudflare/workers-types@4.20240512.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4) 62 62 63 63 apps/screenshot-service: 64 64 dependencies: ··· 70 70 version: 0.2.1(hono@4.2.2)(zod@3.22.4) 71 71 '@libsql/client': 72 72 specifier: 0.6.0 73 - version: 0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 73 + version: 0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 74 74 '@openstatus/db': 75 75 specifier: workspace:* 76 76 version: link:../../packages/db ··· 85 85 version: 2.1.8 86 86 drizzle-orm: 87 87 specifier: 0.30.7 88 - version: 0.30.7(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0) 88 + version: 0.30.7(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1) 89 89 hono: 90 90 specifier: 4.2.2 91 91 version: 4.2.2 ··· 110 110 version: 0.2.1(hono@4.2.2)(zod@3.22.4) 111 111 '@libsql/client': 112 112 specifier: 0.6.0 113 - version: 0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 113 + version: 0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 114 114 '@openstatus/db': 115 115 specifier: workspace:* 116 116 version: link:../../packages/db 117 117 drizzle-orm: 118 118 specifier: 0.30.7 119 - version: 0.30.7(@cloudflare/workers-types@4.20240403.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0) 119 + version: 0.30.7(@cloudflare/workers-types@4.20240403.0)(@libsql/client@0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1) 120 120 hono: 121 121 specifier: 4.2.2 122 122 version: 4.2.2 ··· 138 138 version: 5.4.4 139 139 wrangler: 140 140 specifier: 3.47.0 141 - version: 3.47.0(@cloudflare/workers-types@4.20240403.0)(bufferutil@4.0.7)(utf-8-validate@6.0.3) 141 + version: 3.47.0(@cloudflare/workers-types@4.20240403.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4) 142 142 143 143 apps/server: 144 144 dependencies: ··· 160 160 '@openstatus/emails': 161 161 specifier: workspace:* 162 162 version: link:../../packages/emails 163 + '@openstatus/error': 164 + specifier: workspace:* 165 + version: link:../../packages/error 163 166 '@openstatus/notification-discord': 164 167 specifier: workspace:* 165 168 version: link:../../packages/notifications/discord ··· 241 244 version: 3.3.1(react-hook-form@7.47.0(react@18.2.0)) 242 245 '@libsql/client': 243 246 specifier: 0.6.0 244 - version: 0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 247 + version: 0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 245 248 '@openstatus/analytics': 246 249 specifier: workspace:* 247 250 version: link:../../packages/analytics ··· 257 260 '@openstatus/emails': 258 261 specifier: workspace:* 259 262 version: link:../../packages/emails 263 + '@openstatus/error': 264 + specifier: workspace:* 265 + version: link:../../packages/error 260 266 '@openstatus/header-analysis': 261 267 specifier: workspace:* 262 268 version: link:../../packages/header-analysis ··· 310 316 version: 0.7.0(typescript@5.4.5)(zod@3.22.4) 311 317 '@tailwindcss/container-queries': 312 318 specifier: 0.1.1 313 - version: 0.1.1(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))) 319 + version: 0.1.1(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))) 314 320 '@tailwindcss/typography': 315 321 specifier: 0.5.10 316 - version: 0.5.10(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))) 322 + version: 0.5.10(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))) 317 323 '@tanstack/react-table': 318 324 specifier: 8.10.3 319 325 version: 8.10.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) ··· 322 328 version: 4.2.3 323 329 '@tremor/react': 324 330 specifier: 3.13.3 325 - version: 3.13.3(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))) 331 + version: 3.13.3(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))) 326 332 '@trpc/client': 327 333 specifier: 10.45.1 328 334 version: 10.45.1(@trpc/server@10.45.1) 329 335 '@trpc/next': 330 336 specifier: 10.45.1 331 - version: 10.45.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/react-query@10.45.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.45.1)(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 337 + version: 10.45.1(@tanstack/react-query@5.37.1(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/react-query@10.45.1(@tanstack/react-query@5.37.1(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.45.1)(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 332 338 '@trpc/react-query': 333 339 specifier: 10.45.1 334 - version: 10.45.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 340 + version: 10.45.1(@tanstack/react-query@5.37.1(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 335 341 '@trpc/server': 336 342 specifier: 10.45.1 337 343 version: 10.45.1 ··· 346 352 version: 1.22.1(encoding@0.1.13) 347 353 '@vercel/blob': 348 354 specifier: 0.13.0 349 - version: 0.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 355 + version: 0.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 350 356 class-variance-authority: 351 357 specifier: 0.7.0 352 358 version: 0.7.0 ··· 361 367 version: 0.6.3 362 368 contentlayer: 363 369 specifier: 0.3.4 364 - version: 0.3.4(esbuild@0.19.12) 370 + version: 0.3.4(esbuild@0.21.3) 365 371 date-fns: 366 372 specifier: 2.30.0 367 373 version: 2.30.0 ··· 382 388 version: 5.0.0-beta.17(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) 383 389 next-contentlayer: 384 390 specifier: 0.3.4 385 - version: 0.3.4(contentlayer@0.3.4(esbuild@0.19.12))(esbuild@0.19.12)(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 391 + version: 0.3.4(contentlayer@0.3.4(esbuild@0.21.3))(esbuild@0.21.3)(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 386 392 next-plausible: 387 393 specifier: 3.12.0 388 394 version: 3.12.0(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) ··· 451 457 version: 1.14.0 452 458 tailwindcss-animate: 453 459 specifier: 1.0.7 454 - version: 1.0.7(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))) 460 + version: 1.0.7(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))) 455 461 zod: 456 462 specifier: 3.22.4 457 463 version: 3.22.4 458 464 devDependencies: 459 465 '@headlessui/tailwindcss': 460 466 specifier: 0.2.0 461 - version: 0.2.0(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))) 467 + version: 0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))) 462 468 '@openstatus/tsconfig': 463 469 specifier: workspace:* 464 470 version: link:../../packages/tsconfig ··· 491 497 version: 3.0.1 492 498 tailwindcss: 493 499 specifier: 3.4.3 494 - version: 3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 500 + version: 3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 495 501 typescript: 496 502 specifier: 5.4.5 497 503 version: 5.4.5 ··· 535 541 '@openstatus/emails': 536 542 specifier: workspace:* 537 543 version: link:../emails 544 + '@openstatus/error': 545 + specifier: workspace:* 546 + version: link:../error 538 547 '@openstatus/plans': 539 548 specifier: workspace:* 540 549 version: link:../plans ··· 558 567 version: 5.0.0-beta.1 559 568 next: 560 569 specifier: 14.2.3 561 - version: 14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 570 + version: 14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 562 571 random-word-slugs: 563 572 specifier: 0.1.7 564 573 version: 0.1.7 ··· 613 622 version: 16.3.1 614 623 drizzle-orm: 615 624 specifier: 0.30.10 616 - version: 0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0) 625 + version: 0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1) 617 626 drizzle-zod: 618 627 specifier: 0.5.1 619 - version: 0.5.1(drizzle-orm@0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0))(zod@3.22.4) 628 + version: 0.5.1(drizzle-orm@0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1))(zod@3.22.4) 620 629 zod: 621 630 specifier: 3.22.4 622 631 version: 3.22.4 ··· 644 653 version: 0.1.13 645 654 next-auth: 646 655 specifier: 5.0.0-beta.17 647 - version: 5.0.0-beta.17(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) 656 + version: 5.0.0-beta.17(next@14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) 648 657 typescript: 649 658 specifier: 5.4.5 650 659 version: 5.4.5 ··· 659 668 version: 0.0.10 660 669 '@react-email/components': 661 670 specifier: 0.0.7 662 - version: 0.0.7(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 671 + version: 0.0.7(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 663 672 '@react-email/head': 664 673 specifier: 0.0.5 665 674 version: 0.0.5 ··· 668 677 version: 0.0.4 669 678 '@react-email/tailwind': 670 679 specifier: 0.0.9 671 - version: 0.0.9(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 680 + version: 0.0.9(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 672 681 '@t3-oss/env-core': 673 682 specifier: 0.7.0 674 683 version: 0.7.0(typescript@5.4.5)(zod@3.22.4) ··· 698 707 specifier: 5.4.5 699 708 version: 5.4.5 700 709 710 + packages/emails/.react-email: 711 + dependencies: 712 + '@radix-ui/colors': 713 + specifier: 0.1.8 714 + version: 0.1.8 715 + '@radix-ui/react-collapsible': 716 + specifier: 1.0.1 717 + version: 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 718 + '@radix-ui/react-popover': 719 + specifier: 1.0.2 720 + version: 1.0.2(@types/react@18.0.25)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 721 + '@radix-ui/react-slot': 722 + specifier: 1.0.1 723 + version: 1.0.1(react@18.2.0) 724 + '@radix-ui/react-toggle-group': 725 + specifier: 1.0.1 726 + version: 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 727 + '@radix-ui/react-tooltip': 728 + specifier: 1.0.2 729 + version: 1.0.2(@types/react@18.0.25)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 730 + '@react-email/button': 731 + specifier: 0.0.10 732 + version: 0.0.10 733 + '@react-email/components': 734 + specifier: 0.0.7 735 + version: 0.0.7(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 736 + '@react-email/head': 737 + specifier: 0.0.5 738 + version: 0.0.5 739 + '@react-email/html': 740 + specifier: 0.0.4 741 + version: 0.0.4 742 + '@react-email/render': 743 + specifier: 0.0.7 744 + version: 0.0.7 745 + '@react-email/tailwind': 746 + specifier: 0.0.9 747 + version: 0.0.9(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 748 + '@t3-oss/env-core': 749 + specifier: 0.7.0 750 + version: 0.7.0(typescript@4.9.3)(zod@3.22.4) 751 + classnames: 752 + specifier: 2.3.2 753 + version: 2.3.2 754 + framer-motion: 755 + specifier: 8.4.6 756 + version: 8.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 757 + next: 758 + specifier: 13.2.4 759 + version: 13.2.4(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 760 + prism-react-renderer: 761 + specifier: 1.3.5 762 + version: 1.3.5(react@18.2.0) 763 + react: 764 + specifier: 18.2.0 765 + version: 18.2.0 766 + react-dom: 767 + specifier: 18.2.0 768 + version: 18.2.0(react@18.2.0) 769 + react-email: 770 + specifier: 1.10.0 771 + version: 1.10.0(encoding@0.1.13) 772 + resend: 773 + specifier: 2.0.0 774 + version: 2.0.0 775 + zod: 776 + specifier: 3.22.4 777 + version: 3.22.4 778 + devDependencies: 779 + '@types/classnames': 780 + specifier: 2.3.1 781 + version: 2.3.1 782 + '@types/node': 783 + specifier: 18.11.9 784 + version: 18.11.9 785 + '@types/react': 786 + specifier: 18.0.25 787 + version: 18.0.25 788 + '@types/react-dom': 789 + specifier: 18.0.9 790 + version: 18.0.9 791 + autoprefixer: 792 + specifier: 10.4.13 793 + version: 10.4.13(postcss@8.4.19) 794 + eslint: 795 + specifier: 8.36.0 796 + version: 8.36.0 797 + eslint-config-next: 798 + specifier: 13.2.4 799 + version: 13.2.4(eslint@8.36.0)(typescript@4.9.3) 800 + eslint-config-prettier: 801 + specifier: 8.7.0 802 + version: 8.7.0(eslint@8.36.0) 803 + eslint-plugin-simple-import-sort: 804 + specifier: 10.0.0 805 + version: 10.0.0(eslint@8.36.0) 806 + eslint-plugin-unused-imports: 807 + specifier: 2.0.0 808 + version: 2.0.0(eslint@8.36.0) 809 + postcss: 810 + specifier: 8.4.19 811 + version: 8.4.19 812 + prettier: 813 + specifier: 2.8.4 814 + version: 2.8.4 815 + tailwindcss: 816 + specifier: 3.2.4 817 + version: 3.2.4(postcss@8.4.19)(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 818 + typescript: 819 + specifier: 4.9.3 820 + version: 4.9.3 821 + 822 + packages/error: 823 + dependencies: 824 + zod: 825 + specifier: 3.22.4 826 + version: 3.22.4 827 + devDependencies: 828 + '@openstatus/tsconfig': 829 + specifier: workspace:* 830 + version: link:../tsconfig 831 + typescript: 832 + specifier: 5.4.5 833 + version: 5.4.5 834 + 701 835 packages/header-analysis: 702 836 devDependencies: 703 837 '@openstatus/tsconfig': ··· 727 861 version: 18.2.21 728 862 next: 729 863 specifier: 14.2.3 730 - version: 14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 864 + version: 14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 731 865 typescript: 732 866 specifier: 5.4.5 733 867 version: 5.4.5 ··· 745 879 version: link:../../tinybird 746 880 '@react-email/components': 747 881 specifier: 0.0.7 748 - version: 0.0.7(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 882 + version: 0.0.7 749 883 '@react-email/render': 750 884 specifier: 0.0.7 751 885 version: 0.0.7 ··· 773 907 version: 18.2.21 774 908 next: 775 909 specifier: 14.2.3 776 - version: 14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 910 + version: 14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 777 911 typescript: 778 912 specifier: 5.4.5 779 913 version: 5.4.5 ··· 798 932 version: 18.2.21 799 933 next: 800 934 specifier: 14.2.3 801 - version: 14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 935 + version: 14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 802 936 typescript: 803 937 specifier: 5.4.5 804 938 version: 5.4.5 ··· 835 969 version: 18.2.21 836 970 next: 837 971 specifier: 14.2.3 838 - version: 14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 972 + version: 14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 839 973 typescript: 840 974 specifier: 5.4.5 841 975 version: 5.4.5 ··· 873 1007 version: 18.2.64 874 1008 tailwindcss: 875 1009 specifier: 3.4.3 876 - version: 3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 1010 + version: 3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 877 1011 tsup: 878 1012 specifier: 7.2.0 879 - version: 7.2.0(postcss@8.4.38)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))(typescript@5.4.5) 1013 + version: 7.2.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))(typescript@5.4.5) 880 1014 typescript: 881 1015 specifier: 5.4.5 882 1016 version: 5.4.5 ··· 941 1075 dependencies: 942 1076 '@dnd-kit/core': 943 1077 specifier: 6.1.0 944 - version: 6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1078 + version: 6.1.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 945 1079 '@dnd-kit/modifiers': 946 1080 specifier: 7.0.0 947 - version: 7.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) 1081 + version: 7.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0))(react@18.2.0) 948 1082 '@dnd-kit/sortable': 949 1083 specifier: 8.0.0 950 - version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) 1084 + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0))(react@18.2.0) 951 1085 '@dnd-kit/utilities': 952 1086 specifier: 3.2.2 953 1087 version: 3.2.2(react@18.2.0) ··· 956 1090 version: 3.3.1(react-hook-form@7.47.0(react@18.2.0)) 957 1091 '@radix-ui/react-accordion': 958 1092 specifier: 1.1.2 959 - version: 1.1.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1093 + version: 1.1.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 960 1094 '@radix-ui/react-alert-dialog': 961 1095 specifier: 1.0.5 962 - version: 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1096 + version: 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 963 1097 '@radix-ui/react-avatar': 964 1098 specifier: 1.0.4 965 - version: 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1099 + version: 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 966 1100 '@radix-ui/react-checkbox': 967 1101 specifier: 1.0.4 968 - version: 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1102 + version: 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 969 1103 '@radix-ui/react-collapsible': 970 1104 specifier: 1.0.3 971 - version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1105 + version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 972 1106 '@radix-ui/react-context-menu': 973 1107 specifier: 2.1.5 974 - version: 2.1.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1108 + version: 2.1.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 975 1109 '@radix-ui/react-dialog': 976 1110 specifier: 1.0.4 977 - version: 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1111 + version: 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 978 1112 '@radix-ui/react-dropdown-menu': 979 1113 specifier: 2.0.6 980 - version: 2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1114 + version: 2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 981 1115 '@radix-ui/react-hover-card': 982 1116 specifier: 1.0.7 983 - version: 1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1117 + version: 1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 984 1118 '@radix-ui/react-label': 985 1119 specifier: 2.0.2 986 - version: 2.0.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1120 + version: 2.0.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 987 1121 '@radix-ui/react-popover': 988 1122 specifier: 1.0.7 989 - version: 1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1123 + version: 1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 990 1124 '@radix-ui/react-progress': 991 1125 specifier: 1.0.3 992 - version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1126 + version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 993 1127 '@radix-ui/react-radio-group': 994 1128 specifier: 1.1.3 995 - version: 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1129 + version: 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 996 1130 '@radix-ui/react-select': 997 1131 specifier: 2.0.0 998 - version: 2.0.0(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1132 + version: 2.0.0(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 999 1133 '@radix-ui/react-separator': 1000 1134 specifier: 1.0.3 1001 - version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1135 + version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 1002 1136 '@radix-ui/react-slot': 1003 1137 specifier: 1.0.2 1004 1138 version: 1.0.2(@types/react@18.2.64)(react@18.2.0) 1005 1139 '@radix-ui/react-switch': 1006 1140 specifier: 1.0.3 1007 - version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1141 + version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 1008 1142 '@radix-ui/react-tabs': 1009 1143 specifier: 1.0.4 1010 - version: 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1144 + version: 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 1011 1145 '@radix-ui/react-toggle': 1012 1146 specifier: 1.0.3 1013 - version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1147 + version: 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 1014 1148 '@radix-ui/react-tooltip': 1015 1149 specifier: 1.0.7 1016 - version: 1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1150 + version: 1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 1017 1151 class-variance-authority: 1018 1152 specifier: 0.7.0 1019 1153 version: 0.7.0 ··· 1022 1156 version: 2.0.0 1023 1157 cmdk: 1024 1158 specifier: 0.2.0 1025 - version: 0.2.0(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1159 + version: 0.2.0(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 1026 1160 date-fns: 1027 1161 specifier: 2.30.0 1028 1162 version: 2.30.0 ··· 1034 1168 version: 3.3.0 1035 1169 next-themes: 1036 1170 specifier: 0.2.1 1037 - version: 0.2.1(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1171 + version: 0.2.1(next@14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0))(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 1038 1172 react: 1039 1173 specifier: 18.2.0 1040 1174 version: 18.2.0 ··· 1046 1180 version: 7.47.0(react@18.2.0) 1047 1181 sonner: 1048 1182 specifier: 1.3.1 1049 - version: 1.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 1183 + version: 1.3.1(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 1050 1184 tailwind-merge: 1051 1185 specifier: 1.14.0 1052 1186 version: 1.14.0 1053 1187 tailwindcss-animate: 1054 1188 specifier: 1.0.7 1055 - version: 1.0.7(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))) 1189 + version: 1.0.7(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))) 1056 1190 zod: 1057 1191 specifier: 3.22.4 1058 1192 version: 3.22.4 ··· 1102 1236 version: 20.8.0 1103 1237 tsup: 1104 1238 specifier: 7.2.0 1105 - version: 7.2.0(postcss@8.4.38)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))(typescript@5.4.5) 1239 + version: 7.2.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))(typescript@5.4.5) 1106 1240 typescript: 1107 1241 specifier: 5.4.5 1108 1242 version: 5.4.5 ··· 1591 1725 '@effect-ts/system@0.57.5': 1592 1726 resolution: {integrity: sha512-/crHGujo0xnuHIYNc1VgP0HGJGFSoSqq88JFXe6FmFyXPpWt8Xu39LyLg7rchsxfXFeEdA9CrIZvLV5eswXV5g==} 1593 1727 1728 + '@emotion/is-prop-valid@0.8.8': 1729 + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} 1730 + 1731 + '@emotion/memoize@0.7.4': 1732 + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} 1733 + 1594 1734 '@ericcornelissen/bash-parser@0.5.2': 1595 1735 resolution: {integrity: sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ==} 1596 1736 engines: {node: '>=4'} ··· 1622 1762 cpu: [ppc64] 1623 1763 os: [aix] 1624 1764 1765 + '@esbuild/aix-ppc64@0.21.3': 1766 + resolution: {integrity: sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==} 1767 + engines: {node: '>=12'} 1768 + cpu: [ppc64] 1769 + os: [aix] 1770 + 1625 1771 '@esbuild/android-arm64@0.16.4': 1626 1772 resolution: {integrity: sha512-VPuTzXFm/m2fcGfN6CiwZTlLzxrKsWbPkG7ArRFpuxyaHUm/XFHQPD4xNwZT6uUmpIHhnSjcaCmcla8COzmZ5Q==} 1627 1773 engines: {node: '>=12'} ··· 1646 1792 cpu: [arm64] 1647 1793 os: [android] 1648 1794 1795 + '@esbuild/android-arm64@0.21.3': 1796 + resolution: {integrity: sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==} 1797 + engines: {node: '>=12'} 1798 + cpu: [arm64] 1799 + os: [android] 1800 + 1649 1801 '@esbuild/android-arm@0.16.4': 1650 1802 resolution: {integrity: sha512-rZzb7r22m20S1S7ufIc6DC6W659yxoOrl7sKP1nCYhuvUlnCFHVSbATG4keGUtV8rDz11sRRDbWkvQZpzPaHiw==} 1651 1803 engines: {node: '>=12'} ··· 1670 1822 cpu: [arm] 1671 1823 os: [android] 1672 1824 1825 + '@esbuild/android-arm@0.21.3': 1826 + resolution: {integrity: sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==} 1827 + engines: {node: '>=12'} 1828 + cpu: [arm] 1829 + os: [android] 1830 + 1673 1831 '@esbuild/android-x64@0.16.4': 1674 1832 resolution: {integrity: sha512-MW+B2O++BkcOfMWmuHXB15/l1i7wXhJFqbJhp82IBOais8RBEQv2vQz/jHrDEHaY2X0QY7Wfw86SBL2PbVOr0g==} 1675 1833 engines: {node: '>=12'} ··· 1694 1852 cpu: [x64] 1695 1853 os: [android] 1696 1854 1855 + '@esbuild/android-x64@0.21.3': 1856 + resolution: {integrity: sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==} 1857 + engines: {node: '>=12'} 1858 + cpu: [x64] 1859 + os: [android] 1860 + 1697 1861 '@esbuild/darwin-arm64@0.16.4': 1698 1862 resolution: {integrity: sha512-a28X1O//aOfxwJVZVs7ZfM8Tyih2Za4nKJrBwW5Wm4yKsnwBy9aiS/xwpxiiTRttw3EaTg4Srerhcm6z0bu9Wg==} 1699 1863 engines: {node: '>=12'} ··· 1718 1882 cpu: [arm64] 1719 1883 os: [darwin] 1720 1884 1885 + '@esbuild/darwin-arm64@0.21.3': 1886 + resolution: {integrity: sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==} 1887 + engines: {node: '>=12'} 1888 + cpu: [arm64] 1889 + os: [darwin] 1890 + 1721 1891 '@esbuild/darwin-x64@0.16.4': 1722 1892 resolution: {integrity: sha512-e3doCr6Ecfwd7VzlaQqEPrnbvvPjE9uoTpxG5pyLzr2rI2NMjDHmvY1E5EO81O/e9TUOLLkXA5m6T8lfjK9yAA==} 1723 1893 engines: {node: '>=12'} ··· 1738 1908 1739 1909 '@esbuild/darwin-x64@0.19.12': 1740 1910 resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 1911 + engines: {node: '>=12'} 1912 + cpu: [x64] 1913 + os: [darwin] 1914 + 1915 + '@esbuild/darwin-x64@0.21.3': 1916 + resolution: {integrity: sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==} 1741 1917 engines: {node: '>=12'} 1742 1918 cpu: [x64] 1743 1919 os: [darwin] ··· 1766 1942 cpu: [arm64] 1767 1943 os: [freebsd] 1768 1944 1945 + '@esbuild/freebsd-arm64@0.21.3': 1946 + resolution: {integrity: sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==} 1947 + engines: {node: '>=12'} 1948 + cpu: [arm64] 1949 + os: [freebsd] 1950 + 1769 1951 '@esbuild/freebsd-x64@0.16.4': 1770 1952 resolution: {integrity: sha512-vAP+eYOxlN/Bpo/TZmzEQapNS8W1njECrqkTpNgvXskkkJC2AwOXwZWai/Kc2vEFZUXQttx6UJbj9grqjD/+9Q==} 1771 1953 engines: {node: '>=12'} ··· 1790 1972 cpu: [x64] 1791 1973 os: [freebsd] 1792 1974 1975 + '@esbuild/freebsd-x64@0.21.3': 1976 + resolution: {integrity: sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==} 1977 + engines: {node: '>=12'} 1978 + cpu: [x64] 1979 + os: [freebsd] 1980 + 1793 1981 '@esbuild/linux-arm64@0.16.4': 1794 1982 resolution: {integrity: sha512-2zXoBhv4r5pZiyjBKrOdFP4CXOChxXiYD50LRUU+65DkdS5niPFHbboKZd/c81l0ezpw7AQnHeoCy5hFrzzs4g==} 1795 1983 engines: {node: '>=12'} ··· 1810 1998 1811 1999 '@esbuild/linux-arm64@0.19.12': 1812 2000 resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 2001 + engines: {node: '>=12'} 2002 + cpu: [arm64] 2003 + os: [linux] 2004 + 2005 + '@esbuild/linux-arm64@0.21.3': 2006 + resolution: {integrity: sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==} 1813 2007 engines: {node: '>=12'} 1814 2008 cpu: [arm64] 1815 2009 os: [linux] ··· 1838 2032 cpu: [arm] 1839 2033 os: [linux] 1840 2034 2035 + '@esbuild/linux-arm@0.21.3': 2036 + resolution: {integrity: sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==} 2037 + engines: {node: '>=12'} 2038 + cpu: [arm] 2039 + os: [linux] 2040 + 1841 2041 '@esbuild/linux-ia32@0.16.4': 1842 2042 resolution: {integrity: sha512-uxdSrpe9wFhz4yBwt2kl2TxS/NWEINYBUFIxQtaEVtglm1eECvsj1vEKI0KX2k2wCe17zDdQ3v+jVxfwVfvvjw==} 1843 2043 engines: {node: '>=12'} ··· 1862 2062 cpu: [ia32] 1863 2063 os: [linux] 1864 2064 2065 + '@esbuild/linux-ia32@0.21.3': 2066 + resolution: {integrity: sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==} 2067 + engines: {node: '>=12'} 2068 + cpu: [ia32] 2069 + os: [linux] 2070 + 1865 2071 '@esbuild/linux-loong64@0.16.4': 1866 2072 resolution: {integrity: sha512-peDrrUuxbZ9Jw+DwLCh/9xmZAk0p0K1iY5d2IcwmnN+B87xw7kujOkig6ZRcZqgrXgeRGurRHn0ENMAjjD5DEg==} 1867 2073 engines: {node: '>=12'} ··· 1886 2092 cpu: [loong64] 1887 2093 os: [linux] 1888 2094 2095 + '@esbuild/linux-loong64@0.21.3': 2096 + resolution: {integrity: sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==} 2097 + engines: {node: '>=12'} 2098 + cpu: [loong64] 2099 + os: [linux] 2100 + 1889 2101 '@esbuild/linux-mips64el@0.16.4': 1890 2102 resolution: {integrity: sha512-sD9EEUoGtVhFjjsauWjflZklTNr57KdQ6xfloO4yH1u7vNQlOfAlhEzbyBKfgbJlW7rwXYBdl5/NcZ+Mg2XhQA==} 1891 2103 engines: {node: '>=12'} ··· 1910 2122 cpu: [mips64el] 1911 2123 os: [linux] 1912 2124 2125 + '@esbuild/linux-mips64el@0.21.3': 2126 + resolution: {integrity: sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==} 2127 + engines: {node: '>=12'} 2128 + cpu: [mips64el] 2129 + os: [linux] 2130 + 1913 2131 '@esbuild/linux-ppc64@0.16.4': 1914 2132 resolution: {integrity: sha512-X1HSqHUX9D+d0l6/nIh4ZZJ94eQky8d8z6yxAptpZE3FxCWYWvTDd9X9ST84MGZEJx04VYUD/AGgciddwO0b8g==} 1915 2133 engines: {node: '>=12'} ··· 1934 2152 cpu: [ppc64] 1935 2153 os: [linux] 1936 2154 2155 + '@esbuild/linux-ppc64@0.21.3': 2156 + resolution: {integrity: sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==} 2157 + engines: {node: '>=12'} 2158 + cpu: [ppc64] 2159 + os: [linux] 2160 + 1937 2161 '@esbuild/linux-riscv64@0.16.4': 1938 2162 resolution: {integrity: sha512-97ANpzyNp0GTXCt6SRdIx1ngwncpkV/z453ZuxbnBROCJ5p/55UjhbaG23UdHj88fGWLKPFtMoU4CBacz4j9FA==} 1939 2163 engines: {node: '>=12'} ··· 1958 2182 cpu: [riscv64] 1959 2183 os: [linux] 1960 2184 2185 + '@esbuild/linux-riscv64@0.21.3': 2186 + resolution: {integrity: sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==} 2187 + engines: {node: '>=12'} 2188 + cpu: [riscv64] 2189 + os: [linux] 2190 + 1961 2191 '@esbuild/linux-s390x@0.16.4': 1962 2192 resolution: {integrity: sha512-pUvPQLPmbEeJRPjP0DYTC1vjHyhrnCklQmCGYbipkep+oyfTn7GTBJXoPodR7ZS5upmEyc8lzAkn2o29wD786A==} 1963 2193 engines: {node: '>=12'} ··· 1982 2212 cpu: [s390x] 1983 2213 os: [linux] 1984 2214 2215 + '@esbuild/linux-s390x@0.21.3': 2216 + resolution: {integrity: sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==} 2217 + engines: {node: '>=12'} 2218 + cpu: [s390x] 2219 + os: [linux] 2220 + 1985 2221 '@esbuild/linux-x64@0.16.4': 1986 2222 resolution: {integrity: sha512-N55Q0mJs3Sl8+utPRPBrL6NLYZKBCLLx0bme/+RbjvMforTGGzFvsRl4xLTZMUBFC1poDzBEPTEu5nxizQ9Nlw==} 1987 2223 engines: {node: '>=12'} ··· 2002 2238 2003 2239 '@esbuild/linux-x64@0.19.12': 2004 2240 resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 2241 + engines: {node: '>=12'} 2242 + cpu: [x64] 2243 + os: [linux] 2244 + 2245 + '@esbuild/linux-x64@0.21.3': 2246 + resolution: {integrity: sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==} 2005 2247 engines: {node: '>=12'} 2006 2248 cpu: [x64] 2007 2249 os: [linux] ··· 2030 2272 cpu: [x64] 2031 2273 os: [netbsd] 2032 2274 2275 + '@esbuild/netbsd-x64@0.21.3': 2276 + resolution: {integrity: sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==} 2277 + engines: {node: '>=12'} 2278 + cpu: [x64] 2279 + os: [netbsd] 2280 + 2033 2281 '@esbuild/openbsd-x64@0.16.4': 2034 2282 resolution: {integrity: sha512-nLgdc6tWEhcCFg/WVFaUxHcPK3AP/bh+KEwKtl69Ay5IBqUwKDaq/6Xk0E+fh/FGjnLwqFSsarsbPHeKM8t8Sw==} 2035 2283 engines: {node: '>=12'} ··· 2054 2302 cpu: [x64] 2055 2303 os: [openbsd] 2056 2304 2305 + '@esbuild/openbsd-x64@0.21.3': 2306 + resolution: {integrity: sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==} 2307 + engines: {node: '>=12'} 2308 + cpu: [x64] 2309 + os: [openbsd] 2310 + 2057 2311 '@esbuild/sunos-x64@0.16.4': 2058 2312 resolution: {integrity: sha512-08SluG24GjPO3tXKk95/85n9kpyZtXCVwURR2i4myhrOfi3jspClV0xQQ0W0PYWHioJj+LejFMt41q+PG3mlAQ==} 2059 2313 engines: {node: '>=12'} ··· 2078 2332 cpu: [x64] 2079 2333 os: [sunos] 2080 2334 2335 + '@esbuild/sunos-x64@0.21.3': 2336 + resolution: {integrity: sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==} 2337 + engines: {node: '>=12'} 2338 + cpu: [x64] 2339 + os: [sunos] 2340 + 2081 2341 '@esbuild/win32-arm64@0.16.4': 2082 2342 resolution: {integrity: sha512-yYiRDQcqLYQSvNQcBKN7XogbrSvBE45FEQdH8fuXPl7cngzkCvpsG2H9Uey39IjQ6gqqc+Q4VXYHsQcKW0OMjQ==} 2083 2343 engines: {node: '>=12'} ··· 2098 2358 2099 2359 '@esbuild/win32-arm64@0.19.12': 2100 2360 resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 2361 + engines: {node: '>=12'} 2362 + cpu: [arm64] 2363 + os: [win32] 2364 + 2365 + '@esbuild/win32-arm64@0.21.3': 2366 + resolution: {integrity: sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==} 2101 2367 engines: {node: '>=12'} 2102 2368 cpu: [arm64] 2103 2369 os: [win32] ··· 2126 2392 cpu: [ia32] 2127 2393 os: [win32] 2128 2394 2395 + '@esbuild/win32-ia32@0.21.3': 2396 + resolution: {integrity: sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==} 2397 + engines: {node: '>=12'} 2398 + cpu: [ia32] 2399 + os: [win32] 2400 + 2129 2401 '@esbuild/win32-x64@0.16.4': 2130 2402 resolution: {integrity: sha512-sN/I8FMPtmtT2Yw+Dly8Ur5vQ5a/RmC8hW7jO9PtPSQUPkowxWpcUZnqOggU7VwyT3Xkj6vcXWd3V/qTXwultQ==} 2131 2403 engines: {node: '>=12'} ··· 2150 2422 cpu: [x64] 2151 2423 os: [win32] 2152 2424 2425 + '@esbuild/win32-x64@0.21.3': 2426 + resolution: {integrity: sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==} 2427 + engines: {node: '>=12'} 2428 + cpu: [x64] 2429 + os: [win32] 2430 + 2431 + '@eslint-community/eslint-utils@4.4.0': 2432 + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 2433 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 2434 + peerDependencies: 2435 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 2436 + 2437 + '@eslint-community/regexpp@4.10.0': 2438 + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 2439 + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 2440 + 2441 + '@eslint/eslintrc@2.1.4': 2442 + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 2443 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 2444 + 2445 + '@eslint/js@8.36.0': 2446 + resolution: {integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==} 2447 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 2448 + 2153 2449 '@fal-works/esbuild-plugin-global-externals@2.1.2': 2154 2450 resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} 2155 2451 ··· 2157 2453 resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} 2158 2454 engines: {node: '>=14'} 2159 2455 2456 + '@floating-ui/core@0.7.3': 2457 + resolution: {integrity: sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==} 2458 + 2160 2459 '@floating-ui/core@1.5.0': 2161 2460 resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} 2162 2461 2462 + '@floating-ui/dom@0.5.4': 2463 + resolution: {integrity: sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==} 2464 + 2163 2465 '@floating-ui/dom@1.5.3': 2164 2466 resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} 2467 + 2468 + '@floating-ui/react-dom@0.7.2': 2469 + resolution: {integrity: sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==} 2470 + peerDependencies: 2471 + react: '>=16.8.0' 2472 + react-dom: '>=16.8.0' 2165 2473 2166 2474 '@floating-ui/react-dom@1.3.0': 2167 2475 resolution: {integrity: sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==} ··· 2245 2553 peerDependencies: 2246 2554 react-hook-form: ^7.0.0 2247 2555 2556 + '@humanwhocodes/config-array@0.11.14': 2557 + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 2558 + engines: {node: '>=10.10.0'} 2559 + 2560 + '@humanwhocodes/module-importer@1.0.1': 2561 + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 2562 + engines: {node: '>=12.22'} 2563 + 2564 + '@humanwhocodes/object-schema@2.0.3': 2565 + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 2566 + 2248 2567 '@isaacs/cliui@8.0.2': 2249 2568 resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 2250 2569 engines: {node: '>=12'} ··· 2363 2682 '@mdx-js/mdx@2.3.0': 2364 2683 resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} 2365 2684 2685 + '@motionone/animation@10.17.0': 2686 + resolution: {integrity: sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==} 2687 + 2688 + '@motionone/dom@10.17.0': 2689 + resolution: {integrity: sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==} 2690 + 2691 + '@motionone/easing@10.17.0': 2692 + resolution: {integrity: sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==} 2693 + 2694 + '@motionone/generators@10.17.0': 2695 + resolution: {integrity: sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==} 2696 + 2697 + '@motionone/types@10.17.0': 2698 + resolution: {integrity: sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==} 2699 + 2700 + '@motionone/utils@10.17.0': 2701 + resolution: {integrity: sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==} 2702 + 2366 2703 '@neon-rs/load@0.0.4': 2367 2704 resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} 2368 2705 2706 + '@next/env@13.2.4': 2707 + resolution: {integrity: sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==} 2708 + 2369 2709 '@next/env@14.2.3': 2370 2710 resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} 2371 2711 2712 + '@next/eslint-plugin-next@13.2.4': 2713 + resolution: {integrity: sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==} 2714 + 2715 + '@next/swc-android-arm-eabi@13.2.4': 2716 + resolution: {integrity: sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==} 2717 + engines: {node: '>= 10'} 2718 + cpu: [arm] 2719 + os: [android] 2720 + 2721 + '@next/swc-android-arm64@13.2.4': 2722 + resolution: {integrity: sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==} 2723 + engines: {node: '>= 10'} 2724 + cpu: [arm64] 2725 + os: [android] 2726 + 2727 + '@next/swc-darwin-arm64@13.2.4': 2728 + resolution: {integrity: sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==} 2729 + engines: {node: '>= 10'} 2730 + cpu: [arm64] 2731 + os: [darwin] 2732 + 2372 2733 '@next/swc-darwin-arm64@14.2.3': 2373 2734 resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} 2374 2735 engines: {node: '>= 10'} 2375 2736 cpu: [arm64] 2376 2737 os: [darwin] 2377 2738 2739 + '@next/swc-darwin-x64@13.2.4': 2740 + resolution: {integrity: sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==} 2741 + engines: {node: '>= 10'} 2742 + cpu: [x64] 2743 + os: [darwin] 2744 + 2378 2745 '@next/swc-darwin-x64@14.2.3': 2379 2746 resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} 2380 2747 engines: {node: '>= 10'} 2381 2748 cpu: [x64] 2382 2749 os: [darwin] 2383 2750 2751 + '@next/swc-freebsd-x64@13.2.4': 2752 + resolution: {integrity: sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==} 2753 + engines: {node: '>= 10'} 2754 + cpu: [x64] 2755 + os: [freebsd] 2756 + 2757 + '@next/swc-linux-arm-gnueabihf@13.2.4': 2758 + resolution: {integrity: sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==} 2759 + engines: {node: '>= 10'} 2760 + cpu: [arm] 2761 + os: [linux] 2762 + 2763 + '@next/swc-linux-arm64-gnu@13.2.4': 2764 + resolution: {integrity: sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==} 2765 + engines: {node: '>= 10'} 2766 + cpu: [arm64] 2767 + os: [linux] 2768 + 2384 2769 '@next/swc-linux-arm64-gnu@14.2.3': 2385 2770 resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} 2386 2771 engines: {node: '>= 10'} 2387 2772 cpu: [arm64] 2388 2773 os: [linux] 2389 2774 2775 + '@next/swc-linux-arm64-musl@13.2.4': 2776 + resolution: {integrity: sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==} 2777 + engines: {node: '>= 10'} 2778 + cpu: [arm64] 2779 + os: [linux] 2780 + 2390 2781 '@next/swc-linux-arm64-musl@14.2.3': 2391 2782 resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} 2392 2783 engines: {node: '>= 10'} 2393 2784 cpu: [arm64] 2394 2785 os: [linux] 2395 2786 2787 + '@next/swc-linux-x64-gnu@13.2.4': 2788 + resolution: {integrity: sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==} 2789 + engines: {node: '>= 10'} 2790 + cpu: [x64] 2791 + os: [linux] 2792 + 2396 2793 '@next/swc-linux-x64-gnu@14.2.3': 2397 2794 resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} 2398 2795 engines: {node: '>= 10'} 2399 2796 cpu: [x64] 2400 2797 os: [linux] 2401 2798 2799 + '@next/swc-linux-x64-musl@13.2.4': 2800 + resolution: {integrity: sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==} 2801 + engines: {node: '>= 10'} 2802 + cpu: [x64] 2803 + os: [linux] 2804 + 2402 2805 '@next/swc-linux-x64-musl@14.2.3': 2403 2806 resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} 2404 2807 engines: {node: '>= 10'} 2405 2808 cpu: [x64] 2406 2809 os: [linux] 2407 2810 2811 + '@next/swc-win32-arm64-msvc@13.2.4': 2812 + resolution: {integrity: sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==} 2813 + engines: {node: '>= 10'} 2814 + cpu: [arm64] 2815 + os: [win32] 2816 + 2408 2817 '@next/swc-win32-arm64-msvc@14.2.3': 2409 2818 resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} 2410 2819 engines: {node: '>= 10'} 2411 2820 cpu: [arm64] 2412 2821 os: [win32] 2413 2822 2823 + '@next/swc-win32-ia32-msvc@13.2.4': 2824 + resolution: {integrity: sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==} 2825 + engines: {node: '>= 10'} 2826 + cpu: [ia32] 2827 + os: [win32] 2828 + 2414 2829 '@next/swc-win32-ia32-msvc@14.2.3': 2415 2830 resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} 2416 2831 engines: {node: '>= 10'} 2417 2832 cpu: [ia32] 2833 + os: [win32] 2834 + 2835 + '@next/swc-win32-x64-msvc@13.2.4': 2836 + resolution: {integrity: sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==} 2837 + engines: {node: '>= 10'} 2838 + cpu: [x64] 2418 2839 os: [win32] 2419 2840 2420 2841 '@next/swc-win32-x64-msvc@14.2.3': ··· 2521 2942 resolution: {integrity: sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==} 2522 2943 engines: {node: '>=8.0.0'} 2523 2944 2945 + '@opentelemetry/api@1.8.0': 2946 + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} 2947 + engines: {node: '>=8.0.0'} 2948 + 2524 2949 '@opentelemetry/context-async-hooks@1.13.0': 2525 2950 resolution: {integrity: sha512-pS5fU4lrRjOIPZQqA2V1SUM9QUFXbO+8flubAiy6ntLjnAjJJUdRFOUOxK6v86ZHI2p2S8A0vD0BTu95FZYvjA==} 2526 2951 engines: {node: '>=14'} ··· 2641 3066 '@protobufjs/utf8@1.1.0': 2642 3067 resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} 2643 3068 3069 + '@radix-ui/colors@0.1.8': 3070 + resolution: {integrity: sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw==} 3071 + 2644 3072 '@radix-ui/number@1.0.1': 2645 3073 resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} 2646 3074 ··· 2676 3104 '@types/react-dom': 2677 3105 optional: true 2678 3106 3107 + '@radix-ui/react-arrow@1.0.1': 3108 + resolution: {integrity: sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==} 3109 + peerDependencies: 3110 + react: ^16.8 || ^17.0 || ^18.0 3111 + react-dom: ^16.8 || ^17.0 || ^18.0 3112 + 2679 3113 '@radix-ui/react-arrow@1.0.3': 2680 3114 resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} 2681 3115 peerDependencies: ··· 2715 3149 '@types/react-dom': 2716 3150 optional: true 2717 3151 3152 + '@radix-ui/react-collapsible@1.0.1': 3153 + resolution: {integrity: sha512-0maX4q91iYa4gjt3PsNf7dq/yqSR+HGAE8I5p54dQ6gnveS+ETWlMoijxrhmgV1k8svxpm34mQAtqIrJt4XZmA==} 3154 + peerDependencies: 3155 + react: ^16.8 || ^17.0 || ^18.0 3156 + react-dom: ^16.8 || ^17.0 || ^18.0 3157 + 2718 3158 '@radix-ui/react-collapsible@1.0.3': 2719 3159 resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} 2720 3160 peerDependencies: ··· 2727 3167 optional: true 2728 3168 '@types/react-dom': 2729 3169 optional: true 3170 + 3171 + '@radix-ui/react-collection@1.0.1': 3172 + resolution: {integrity: sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==} 3173 + peerDependencies: 3174 + react: ^16.8 || ^17.0 || ^18.0 3175 + react-dom: ^16.8 || ^17.0 || ^18.0 2730 3176 2731 3177 '@radix-ui/react-collection@1.0.3': 2732 3178 resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} ··· 2814 3260 '@types/react-dom': 2815 3261 optional: true 2816 3262 3263 + '@radix-ui/react-direction@1.0.0': 3264 + resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==} 3265 + peerDependencies: 3266 + react: ^16.8 || ^17.0 || ^18.0 3267 + 2817 3268 '@radix-ui/react-direction@1.0.1': 2818 3269 resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} 2819 3270 peerDependencies: ··· 2829 3280 react: ^16.8 || ^17.0 || ^18.0 2830 3281 react-dom: ^16.8 || ^17.0 || ^18.0 2831 3282 3283 + '@radix-ui/react-dismissable-layer@1.0.2': 3284 + resolution: {integrity: sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==} 3285 + peerDependencies: 3286 + react: ^16.8 || ^17.0 || ^18.0 3287 + react-dom: ^16.8 || ^17.0 || ^18.0 3288 + 2832 3289 '@radix-ui/react-dismissable-layer@1.0.4': 2833 3290 resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} 2834 3291 peerDependencies: ··· 2884 3341 2885 3342 '@radix-ui/react-focus-scope@1.0.0': 2886 3343 resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} 3344 + peerDependencies: 3345 + react: ^16.8 || ^17.0 || ^18.0 3346 + react-dom: ^16.8 || ^17.0 || ^18.0 3347 + 3348 + '@radix-ui/react-focus-scope@1.0.1': 3349 + resolution: {integrity: sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==} 2887 3350 peerDependencies: 2888 3351 react: ^16.8 || ^17.0 || ^18.0 2889 3352 react-dom: ^16.8 || ^17.0 || ^18.0 ··· 2967 3430 '@types/react-dom': 2968 3431 optional: true 2969 3432 3433 + '@radix-ui/react-popover@1.0.2': 3434 + resolution: {integrity: sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==} 3435 + peerDependencies: 3436 + react: ^16.8 || ^17.0 || ^18.0 3437 + react-dom: ^16.8 || ^17.0 || ^18.0 3438 + 2970 3439 '@radix-ui/react-popover@1.0.7': 2971 3440 resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} 2972 3441 peerDependencies: ··· 2980 3449 '@types/react-dom': 2981 3450 optional: true 2982 3451 3452 + '@radix-ui/react-popper@1.0.1': 3453 + resolution: {integrity: sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==} 3454 + peerDependencies: 3455 + react: ^16.8 || ^17.0 || ^18.0 3456 + react-dom: ^16.8 || ^17.0 || ^18.0 3457 + 2983 3458 '@radix-ui/react-popper@1.1.3': 2984 3459 resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} 2985 3460 peerDependencies: ··· 2995 3470 2996 3471 '@radix-ui/react-portal@1.0.0': 2997 3472 resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} 3473 + peerDependencies: 3474 + react: ^16.8 || ^17.0 || ^18.0 3475 + react-dom: ^16.8 || ^17.0 || ^18.0 3476 + 3477 + '@radix-ui/react-portal@1.0.1': 3478 + resolution: {integrity: sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==} 2998 3479 peerDependencies: 2999 3480 react: ^16.8 || ^17.0 || ^18.0 3000 3481 react-dom: ^16.8 || ^17.0 || ^18.0 ··· 3050 3531 react: ^16.8 || ^17.0 || ^18.0 3051 3532 react-dom: ^16.8 || ^17.0 || ^18.0 3052 3533 3534 + '@radix-ui/react-primitive@1.0.1': 3535 + resolution: {integrity: sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==} 3536 + peerDependencies: 3537 + react: ^16.8 || ^17.0 || ^18.0 3538 + react-dom: ^16.8 || ^17.0 || ^18.0 3539 + 3053 3540 '@radix-ui/react-primitive@1.0.3': 3054 3541 resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} 3055 3542 peerDependencies: ··· 3089 3576 '@types/react-dom': 3090 3577 optional: true 3091 3578 3579 + '@radix-ui/react-roving-focus@1.0.1': 3580 + resolution: {integrity: sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==} 3581 + peerDependencies: 3582 + react: ^16.8 || ^17.0 || ^18.0 3583 + react-dom: ^16.8 || ^17.0 || ^18.0 3584 + 3092 3585 '@radix-ui/react-roving-focus@1.0.4': 3093 3586 resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} 3094 3587 peerDependencies: ··· 3133 3626 peerDependencies: 3134 3627 react: ^16.8 || ^17.0 || ^18.0 3135 3628 3629 + '@radix-ui/react-slot@1.0.1': 3630 + resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==} 3631 + peerDependencies: 3632 + react: ^16.8 || ^17.0 || ^18.0 3633 + 3136 3634 '@radix-ui/react-slot@1.0.2': 3137 3635 resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} 3138 3636 peerDependencies: ··· 3168 3666 '@types/react-dom': 3169 3667 optional: true 3170 3668 3669 + '@radix-ui/react-toggle-group@1.0.1': 3670 + resolution: {integrity: sha512-eye/gYvzy82xtoSSeu5Pwlzrh6N2rOcDIwAI7xMatu622Qjlg64LtwB0PSh3iWdmn6Wqy1Fjo5twNPQsp0guiw==} 3671 + peerDependencies: 3672 + react: ^16.8 || ^17.0 || ^18.0 3673 + react-dom: ^16.8 || ^17.0 || ^18.0 3674 + 3675 + '@radix-ui/react-toggle@1.0.1': 3676 + resolution: {integrity: sha512-hZIp9ZKnw4NwVqeB4evWBLa91ryaSJhAO0Ed82wkzRPgg/I29ypcY6SuBb3AMZW+GsuBZpIVujpCq+33TdEcyg==} 3677 + peerDependencies: 3678 + react: ^16.8 || ^17.0 || ^18.0 3679 + react-dom: ^16.8 || ^17.0 || ^18.0 3680 + 3171 3681 '@radix-ui/react-toggle@1.0.3': 3172 3682 resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} 3173 3683 peerDependencies: ··· 3180 3690 optional: true 3181 3691 '@types/react-dom': 3182 3692 optional: true 3693 + 3694 + '@radix-ui/react-tooltip@1.0.2': 3695 + resolution: {integrity: sha512-11gUlok2rv5mu+KBtxniOKKNKjqC/uTbgFHWoQdbF46vMV+zjDaBvCtVDK9+MTddlpmlisGPGvvojX7Qm0yr+g==} 3696 + peerDependencies: 3697 + react: ^16.8 || ^17.0 || ^18.0 3698 + react-dom: ^16.8 || ^17.0 || ^18.0 3183 3699 3184 3700 '@radix-ui/react-tooltip@1.0.7': 3185 3701 resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} ··· 3224 3740 3225 3741 '@radix-ui/react-use-escape-keydown@1.0.0': 3226 3742 resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} 3743 + peerDependencies: 3744 + react: ^16.8 || ^17.0 || ^18.0 3745 + 3746 + '@radix-ui/react-use-escape-keydown@1.0.2': 3747 + resolution: {integrity: sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==} 3227 3748 peerDependencies: 3228 3749 react: ^16.8 || ^17.0 || ^18.0 3229 3750 ··· 3259 3780 '@types/react': 3260 3781 optional: true 3261 3782 3783 + '@radix-ui/react-use-rect@1.0.0': 3784 + resolution: {integrity: sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==} 3785 + peerDependencies: 3786 + react: ^16.8 || ^17.0 || ^18.0 3787 + 3262 3788 '@radix-ui/react-use-rect@1.0.1': 3263 3789 resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} 3264 3790 peerDependencies: ··· 3268 3794 '@types/react': 3269 3795 optional: true 3270 3796 3797 + '@radix-ui/react-use-size@1.0.0': 3798 + resolution: {integrity: sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==} 3799 + peerDependencies: 3800 + react: ^16.8 || ^17.0 || ^18.0 3801 + 3271 3802 '@radix-ui/react-use-size@1.0.1': 3272 3803 resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} 3273 3804 peerDependencies: ··· 3276 3807 peerDependenciesMeta: 3277 3808 '@types/react': 3278 3809 optional: true 3810 + 3811 + '@radix-ui/react-visually-hidden@1.0.1': 3812 + resolution: {integrity: sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==} 3813 + peerDependencies: 3814 + react: ^16.8 || ^17.0 || ^18.0 3815 + react-dom: ^16.8 || ^17.0 || ^18.0 3279 3816 3280 3817 '@radix-ui/react-visually-hidden@1.0.3': 3281 3818 resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} ··· 3290 3827 '@types/react-dom': 3291 3828 optional: true 3292 3829 3830 + '@radix-ui/rect@1.0.0': 3831 + resolution: {integrity: sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==} 3832 + 3293 3833 '@radix-ui/rect@1.0.1': 3294 3834 resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} 3295 3835 ··· 3396 3936 peerDependenciesMeta: 3397 3937 rollup: 3398 3938 optional: true 3939 + 3940 + '@rushstack/eslint-patch@1.10.3': 3941 + resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} 3399 3942 3400 3943 '@selderee/plugin-htmlparser2@0.10.0': 3401 3944 resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} ··· 3700 4243 '@swc/counter@0.1.3': 3701 4244 resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 3702 4245 4246 + '@swc/helpers@0.4.14': 4247 + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} 4248 + 3703 4249 '@swc/helpers@0.5.3': 3704 4250 resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} 3705 4251 ··· 3743 4289 peerDependencies: 3744 4290 tailwindcss: '>=3.0.0 || insiders' 3745 4291 3746 - '@tanstack/query-core@4.36.1': 3747 - resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} 4292 + '@tanstack/query-core@5.36.1': 4293 + resolution: {integrity: sha512-BteWYEPUcucEu3NBcDAgKuI4U25R9aPrHSP6YSf2NvaD2pSlIQTdqOfLRsxH9WdRYg7k0Uom35Uacb6nvbIMJg==} 3748 4294 3749 - '@tanstack/react-query@4.36.1': 3750 - resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} 4295 + '@tanstack/react-query@5.37.1': 4296 + resolution: {integrity: sha512-EhtBNA8GL3XFeSx6VYUjXQ96n44xe3JGKZCzBINrCYlxbZP6UwBafv7ti4eSRWc2Fy+fybQre0w17gR6lMzULA==} 3751 4297 peerDependencies: 3752 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 3753 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 3754 - react-native: '*' 3755 - peerDependenciesMeta: 3756 - react-dom: 3757 - optional: true 3758 - react-native: 3759 - optional: true 4298 + react: ^18.0.0 3760 4299 3761 4300 '@tanstack/react-table@8.10.3': 3762 4301 resolution: {integrity: sha512-Qya1cJ+91arAlW7IRDWksRDnYw28O446jJ/ljkRSc663EaftJoBCAU10M+VV1K6MpCBLrXq1BD5IQc1zj/ZEjA==} ··· 3822 4361 '@trpc/server@10.45.1': 3823 4362 resolution: {integrity: sha512-KOzBEVaHW9IxEedUP9E50y0tYxAuvlzyjn80Bpemw4rcNbT4WtJnhkFPUY+qDJl7Crt3B/oY2qMgSxVWi9toLg==} 3824 4363 3825 - '@tsconfig/node10@1.0.9': 3826 - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 4364 + '@tsconfig/node10@1.0.11': 4365 + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} 3827 4366 3828 4367 '@tsconfig/node12@1.0.11': 3829 4368 resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} ··· 3848 4387 '@types/caseless@0.12.4': 3849 4388 resolution: {integrity: sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g==} 3850 4389 4390 + '@types/classnames@2.3.1': 4391 + resolution: {integrity: sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==} 4392 + deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed. 4393 + 3851 4394 '@types/cookie@0.6.0': 3852 4395 resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 3853 4396 ··· 3914 4457 '@types/jsdom@20.0.1': 3915 4458 resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} 3916 4459 4460 + '@types/json5@0.0.29': 4461 + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 4462 + 3917 4463 '@types/long@4.0.2': 3918 4464 resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} 3919 4465 ··· 3938 4484 '@types/node-forge@1.3.11': 3939 4485 resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} 3940 4486 4487 + '@types/node@18.11.9': 4488 + resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} 4489 + 4490 + '@types/node@20.12.12': 4491 + resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} 4492 + 3941 4493 '@types/node@20.8.0': 3942 4494 resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} 3943 4495 ··· 3946 4498 3947 4499 '@types/parse5@6.0.3': 3948 4500 resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} 4501 + 4502 + '@types/prop-types@15.7.12': 4503 + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 3949 4504 3950 4505 '@types/prop-types@15.7.9': 3951 4506 resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} 3952 4507 4508 + '@types/react-dom@18.0.9': 4509 + resolution: {integrity: sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==} 4510 + 3953 4511 '@types/react-dom@18.2.21': 3954 4512 resolution: {integrity: sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==} 3955 4513 4514 + '@types/react@18.0.25': 4515 + resolution: {integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==} 4516 + 3956 4517 '@types/react@18.2.64': 3957 4518 resolution: {integrity: sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==} 4519 + 4520 + '@types/react@18.3.2': 4521 + resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} 3958 4522 3959 4523 '@types/request@2.48.11': 3960 4524 resolution: {integrity: sha512-HuihY1+Vss5RS9ZHzRyTGIzwPTdrJBkCm/mAeLRYrOQu/MGqyezKXWOK1VhCnR+SDbp9G2mRUP+OVEqCrzpcfA==} ··· 3989 4553 '@types/validator@13.11.6': 3990 4554 resolution: {integrity: sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==} 3991 4555 4556 + '@types/ws@8.5.10': 4557 + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} 4558 + 3992 4559 '@types/ws@8.5.8': 3993 4560 resolution: {integrity: sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==} 3994 4561 ··· 3998 4565 '@types/yargs@17.0.29': 3999 4566 resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==} 4000 4567 4568 + '@typescript-eslint/parser@5.62.0': 4569 + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} 4570 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 4571 + peerDependencies: 4572 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 4573 + typescript: '*' 4574 + peerDependenciesMeta: 4575 + typescript: 4576 + optional: true 4577 + 4578 + '@typescript-eslint/scope-manager@5.62.0': 4579 + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} 4580 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 4581 + 4582 + '@typescript-eslint/types@5.62.0': 4583 + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} 4584 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 4585 + 4586 + '@typescript-eslint/typescript-estree@5.62.0': 4587 + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} 4588 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 4589 + peerDependencies: 4590 + typescript: '*' 4591 + peerDependenciesMeta: 4592 + typescript: 4593 + optional: true 4594 + 4595 + '@typescript-eslint/visitor-keys@5.62.0': 4596 + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} 4597 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 4598 + 4001 4599 '@ungap/structured-clone@1.2.0': 4002 4600 resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 4003 4601 ··· 4054 4652 resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 4055 4653 engines: {node: '>=0.4.0'} 4056 4654 4655 + acorn-walk@8.3.2: 4656 + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} 4657 + engines: {node: '>=0.4.0'} 4658 + 4057 4659 acorn@7.4.1: 4058 4660 resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 4059 4661 engines: {node: '>=0.4.0'} ··· 4061 4663 4062 4664 acorn@8.10.0: 4063 4665 resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 4666 + engines: {node: '>=0.4.0'} 4667 + hasBin: true 4668 + 4669 + acorn@8.11.3: 4670 + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 4064 4671 engines: {node: '>=0.4.0'} 4065 4672 hasBin: true 4066 4673 ··· 4084 4691 ajv: 4085 4692 optional: true 4086 4693 4694 + ajv@6.12.6: 4695 + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 4696 + 4087 4697 ajv@8.14.0: 4088 4698 resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} 4089 4699 ··· 4141 4751 resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 4142 4752 engines: {node: '>= 8'} 4143 4753 4144 - arg@4.1.0: 4145 - resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} 4754 + arg@4.1.3: 4755 + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 4146 4756 4147 4757 arg@5.0.2: 4148 4758 resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} ··· 4156 4766 aria-hidden@1.2.3: 4157 4767 resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} 4158 4768 engines: {node: '>=10'} 4769 + 4770 + aria-query@5.3.0: 4771 + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 4159 4772 4160 4773 arity-n@1.0.4: 4161 4774 resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} 4162 4775 4776 + array-buffer-byte-length@1.0.1: 4777 + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} 4778 + engines: {node: '>= 0.4'} 4779 + 4780 + array-includes@3.1.8: 4781 + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} 4782 + engines: {node: '>= 0.4'} 4783 + 4163 4784 array-last@1.3.0: 4164 4785 resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} 4165 4786 engines: {node: '>=0.10.0'} ··· 4171 4792 resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 4172 4793 engines: {node: '>=8'} 4173 4794 4795 + array.prototype.findlast@1.2.5: 4796 + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} 4797 + engines: {node: '>= 0.4'} 4798 + 4799 + array.prototype.findlastindex@1.2.5: 4800 + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} 4801 + engines: {node: '>= 0.4'} 4802 + 4803 + array.prototype.flat@1.3.2: 4804 + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} 4805 + engines: {node: '>= 0.4'} 4806 + 4807 + array.prototype.flatmap@1.3.2: 4808 + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} 4809 + engines: {node: '>= 0.4'} 4810 + 4811 + array.prototype.toreversed@1.1.2: 4812 + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} 4813 + 4814 + array.prototype.tosorted@1.1.3: 4815 + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} 4816 + 4817 + arraybuffer.prototype.slice@1.0.3: 4818 + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} 4819 + engines: {node: '>= 0.4'} 4820 + 4174 4821 arrify@1.0.1: 4175 4822 resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} 4176 4823 engines: {node: '>=0.10.0'} ··· 4178 4825 as-table@1.0.55: 4179 4826 resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} 4180 4827 4828 + ast-types-flow@0.0.8: 4829 + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} 4830 + 4181 4831 ast-types@0.13.4: 4182 4832 resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} 4183 4833 engines: {node: '>=4'} ··· 4189 4839 asynckit@0.4.0: 4190 4840 resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 4191 4841 4842 + autoprefixer@10.4.13: 4843 + resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} 4844 + engines: {node: ^10 || ^12 || >=14} 4845 + hasBin: true 4846 + peerDependencies: 4847 + postcss: ^8.1.0 4848 + 4192 4849 autoprefixer@10.4.19: 4193 4850 resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} 4194 4851 engines: {node: ^10 || ^12 || >=14} ··· 4200 4857 resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 4201 4858 engines: {node: '>= 0.4'} 4202 4859 4860 + available-typed-arrays@1.0.7: 4861 + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 4862 + engines: {node: '>= 0.4'} 4863 + 4864 + axe-core@4.7.0: 4865 + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} 4866 + engines: {node: '>=4'} 4867 + 4203 4868 axios@1.7.2: 4204 4869 resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} 4870 + 4871 + axobject-query@3.2.1: 4872 + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} 4205 4873 4206 4874 babylon@6.18.0: 4207 4875 resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} ··· 4229 4897 bignumber.js@9.1.2: 4230 4898 resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} 4231 4899 4232 - binary-extensions@2.2.0: 4233 - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 4900 + binary-extensions@2.3.0: 4901 + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 4234 4902 engines: {node: '>=8'} 4235 4903 4236 4904 bindings@1.5.0: ··· 4258 4926 resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 4259 4927 engines: {node: '>=8'} 4260 4928 4929 + braces@3.0.3: 4930 + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 4931 + engines: {node: '>=8'} 4932 + 4261 4933 browserslist@4.23.0: 4262 4934 resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} 4263 4935 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} ··· 4276 4948 resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} 4277 4949 engines: {node: '>=6.14.2'} 4278 4950 4951 + bufferutil@4.0.8: 4952 + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} 4953 + engines: {node: '>=6.14.2'} 4954 + 4279 4955 builtins@5.0.1: 4280 4956 resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} 4281 4957 ··· 4284 4960 4285 4961 bun-types@1.0.8: 4286 4962 resolution: {integrity: sha512-2dNB+dBwAcFW7RSd4y5vKycRjouKVklSwPk4EjBKWvcMYUBOqZGGNzV7+b2tfKBG3BeRXnozbnegVKR1azuATg==} 4963 + 4964 + bun-types@1.1.8: 4965 + resolution: {integrity: sha512-dwhfuUKSGK8hm5Llcvb5+ejRh+4mIt8ibObJVKhZBsi0ScpXmt+AlaS1eDW6uRXCHj084Qt0kIqAJ08/7ZGC9Q==} 4287 4966 4288 4967 bundle-require@4.0.2: 4289 4968 resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} ··· 4302 4981 call-bind@1.0.5: 4303 4982 resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} 4304 4983 4984 + call-bind@1.0.7: 4985 + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 4986 + engines: {node: '>= 0.4'} 4987 + 4988 + callsites@3.1.0: 4989 + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 4990 + engines: {node: '>=6'} 4991 + 4305 4992 camel-case@3.0.0: 4306 4993 resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} 4307 4994 ··· 4367 5054 resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 4368 5055 engines: {node: '>= 8.10.0'} 4369 5056 5057 + chokidar@3.6.0: 5058 + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 5059 + engines: {node: '>= 8.10.0'} 5060 + 4370 5061 chownr@1.1.4: 4371 5062 resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 4372 5063 ··· 4376 5067 4377 5068 class-variance-authority@0.7.0: 4378 5069 resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} 5070 + 5071 + classnames@2.3.2: 5072 + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} 4379 5073 4380 5074 clean-stack@2.2.0: 4381 5075 resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} ··· 4547 5241 csstype@3.1.2: 4548 5242 resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 4549 5243 5244 + csstype@3.1.3: 5245 + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 5246 + 4550 5247 d3-array@3.2.4: 4551 5248 resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} 4552 5249 engines: {node: '>=12'} ··· 4594 5291 d@1.0.1: 4595 5292 resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} 4596 5293 5294 + damerau-levenshtein@1.0.8: 5295 + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} 5296 + 4597 5297 data-uri-to-buffer@2.0.2: 4598 5298 resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} 4599 5299 ··· 4609 5309 resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} 4610 5310 engines: {node: '>=12'} 4611 5311 5312 + data-view-buffer@1.0.1: 5313 + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} 5314 + engines: {node: '>= 0.4'} 5315 + 5316 + data-view-byte-length@1.0.1: 5317 + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} 5318 + engines: {node: '>= 0.4'} 5319 + 5320 + data-view-byte-offset@1.0.0: 5321 + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} 5322 + engines: {node: '>= 0.4'} 5323 + 4612 5324 date-fns-tz@2.0.0: 4613 5325 resolution: {integrity: sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ==} 4614 5326 peerDependencies: ··· 4618 5330 resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} 4619 5331 engines: {node: '>=0.11'} 4620 5332 5333 + debug@3.2.7: 5334 + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 5335 + peerDependencies: 5336 + supports-color: '*' 5337 + peerDependenciesMeta: 5338 + supports-color: 5339 + optional: true 5340 + 4621 5341 debug@4.3.4: 4622 5342 resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 4623 5343 engines: {node: '>=6.0'} ··· 4655 5375 deep-freeze@0.0.1: 4656 5376 resolution: {integrity: sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==} 4657 5377 5378 + deep-is@0.1.4: 5379 + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 5380 + 4658 5381 deepmerge@4.3.1: 4659 5382 resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 4660 5383 engines: {node: '>=0.10.0'} ··· 4664 5387 4665 5388 define-data-property@1.1.1: 4666 5389 resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} 5390 + engines: {node: '>= 0.4'} 5391 + 5392 + define-data-property@1.1.4: 5393 + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 5394 + engines: {node: '>= 0.4'} 5395 + 5396 + define-properties@1.2.1: 5397 + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 4667 5398 engines: {node: '>= 0.4'} 4668 5399 4669 5400 defined@1.0.1: ··· 4733 5464 4734 5465 dlv@1.1.3: 4735 5466 resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 5467 + 5468 + doctrine@2.1.0: 5469 + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 5470 + engines: {node: '>=0.10.0'} 5471 + 5472 + doctrine@3.0.0: 5473 + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 5474 + engines: {node: '>=6.0.0'} 4736 5475 4737 5476 dom-helpers@3.4.0: 4738 5477 resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} ··· 4970 5709 end-of-stream@1.4.4: 4971 5710 resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 4972 5711 5712 + enhanced-resolve@5.16.1: 5713 + resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} 5714 + engines: {node: '>=10.13.0'} 5715 + 4973 5716 entities@4.5.0: 4974 5717 resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 4975 5718 engines: {node: '>=0.12'} ··· 4981 5724 error-ex@1.3.2: 4982 5725 resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 4983 5726 5727 + es-abstract@1.23.3: 5728 + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} 5729 + engines: {node: '>= 0.4'} 5730 + 5731 + es-define-property@1.0.0: 5732 + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 5733 + engines: {node: '>= 0.4'} 5734 + 5735 + es-errors@1.3.0: 5736 + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 5737 + engines: {node: '>= 0.4'} 5738 + 5739 + es-iterator-helpers@1.0.19: 5740 + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} 5741 + engines: {node: '>= 0.4'} 5742 + 5743 + es-object-atoms@1.0.0: 5744 + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} 5745 + engines: {node: '>= 0.4'} 5746 + 5747 + es-set-tostringtag@2.0.3: 5748 + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} 5749 + engines: {node: '>= 0.4'} 5750 + 5751 + es-shim-unscopables@1.0.2: 5752 + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 5753 + 5754 + es-to-primitive@1.2.1: 5755 + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 5756 + engines: {node: '>= 0.4'} 5757 + 4984 5758 es5-ext@0.10.62: 4985 5759 resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} 4986 5760 engines: {node: '>=0.10'} ··· 5019 5793 engines: {node: '>=12'} 5020 5794 hasBin: true 5021 5795 5796 + esbuild@0.21.3: 5797 + resolution: {integrity: sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==} 5798 + engines: {node: '>=12'} 5799 + hasBin: true 5800 + 5022 5801 escalade@3.1.1: 5023 5802 resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 5024 5803 engines: {node: '>=6'} ··· 5044 5823 engines: {node: '>=6.0'} 5045 5824 hasBin: true 5046 5825 5826 + eslint-config-next@13.2.4: 5827 + resolution: {integrity: sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==} 5828 + peerDependencies: 5829 + eslint: ^7.23.0 || ^8.0.0 5830 + typescript: '>=3.3.1' 5831 + peerDependenciesMeta: 5832 + typescript: 5833 + optional: true 5834 + 5835 + eslint-config-prettier@8.7.0: 5836 + resolution: {integrity: sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==} 5837 + hasBin: true 5838 + peerDependencies: 5839 + eslint: '>=7.0.0' 5840 + 5841 + eslint-import-resolver-node@0.3.9: 5842 + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 5843 + 5844 + eslint-import-resolver-typescript@3.6.1: 5845 + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} 5846 + engines: {node: ^14.18.0 || >=16.0.0} 5847 + peerDependencies: 5848 + eslint: '*' 5849 + eslint-plugin-import: '*' 5850 + 5851 + eslint-module-utils@2.8.1: 5852 + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} 5853 + engines: {node: '>=4'} 5854 + peerDependencies: 5855 + '@typescript-eslint/parser': '*' 5856 + eslint: '*' 5857 + eslint-import-resolver-node: '*' 5858 + eslint-import-resolver-typescript: '*' 5859 + eslint-import-resolver-webpack: '*' 5860 + peerDependenciesMeta: 5861 + '@typescript-eslint/parser': 5862 + optional: true 5863 + eslint: 5864 + optional: true 5865 + eslint-import-resolver-node: 5866 + optional: true 5867 + eslint-import-resolver-typescript: 5868 + optional: true 5869 + eslint-import-resolver-webpack: 5870 + optional: true 5871 + 5872 + eslint-plugin-import@2.29.1: 5873 + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} 5874 + engines: {node: '>=4'} 5875 + peerDependencies: 5876 + '@typescript-eslint/parser': '*' 5877 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 5878 + peerDependenciesMeta: 5879 + '@typescript-eslint/parser': 5880 + optional: true 5881 + 5882 + eslint-plugin-jsx-a11y@6.8.0: 5883 + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} 5884 + engines: {node: '>=4.0'} 5885 + peerDependencies: 5886 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 5887 + 5888 + eslint-plugin-react-hooks@4.6.2: 5889 + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} 5890 + engines: {node: '>=10'} 5891 + peerDependencies: 5892 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 5893 + 5894 + eslint-plugin-react@7.34.1: 5895 + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} 5896 + engines: {node: '>=4'} 5897 + peerDependencies: 5898 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 5899 + 5900 + eslint-plugin-simple-import-sort@10.0.0: 5901 + resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} 5902 + peerDependencies: 5903 + eslint: '>=5.0.0' 5904 + 5905 + eslint-plugin-unused-imports@2.0.0: 5906 + resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} 5907 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 5908 + peerDependencies: 5909 + '@typescript-eslint/eslint-plugin': ^5.0.0 5910 + eslint: ^8.0.0 5911 + peerDependenciesMeta: 5912 + '@typescript-eslint/eslint-plugin': 5913 + optional: true 5914 + 5915 + eslint-rule-composer@0.3.0: 5916 + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} 5917 + engines: {node: '>=4.0.0'} 5918 + 5919 + eslint-scope@7.2.2: 5920 + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 5921 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 5922 + 5923 + eslint-visitor-keys@3.4.3: 5924 + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 5925 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 5926 + 5927 + eslint@8.36.0: 5928 + resolution: {integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==} 5929 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 5930 + hasBin: true 5931 + 5932 + espree@9.6.1: 5933 + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 5934 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 5935 + 5047 5936 esprima@4.0.1: 5048 5937 resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 5049 5938 engines: {node: '>=4'} 5050 5939 hasBin: true 5051 5940 5941 + esquery@1.5.0: 5942 + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 5943 + engines: {node: '>=0.10'} 5944 + 5945 + esrecurse@4.3.0: 5946 + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 5947 + engines: {node: '>=4.0'} 5948 + 5052 5949 estraverse@5.3.0: 5053 5950 resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 5054 5951 engines: {node: '>=4.0'} ··· 5143 6040 resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 5144 6041 engines: {node: '>=8.6.0'} 5145 6042 6043 + fast-json-stable-stringify@2.1.0: 6044 + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 6045 + 6046 + fast-levenshtein@2.0.6: 6047 + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 6048 + 5146 6049 fast-xml-parser@4.2.5: 5147 6050 resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} 5148 6051 hasBin: true ··· 5164 6067 resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} 5165 6068 engines: {node: '>=8'} 5166 6069 6070 + file-entry-cache@6.0.1: 6071 + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 6072 + engines: {node: ^10.12.0 || >=12.0.0} 6073 + 5167 6074 file-entry-cache@8.0.0: 5168 6075 resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 5169 6076 engines: {node: '>=16.0.0'} ··· 5173 6080 5174 6081 fill-range@7.0.1: 5175 6082 resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 6083 + engines: {node: '>=8'} 6084 + 6085 + fill-range@7.1.1: 6086 + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 5176 6087 engines: {node: '>=8'} 5177 6088 5178 6089 filter-iterator@0.0.1: ··· 5186 6097 resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 5187 6098 engines: {node: '>=8'} 5188 6099 6100 + find-up@5.0.0: 6101 + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 6102 + engines: {node: '>=10'} 6103 + 6104 + flat-cache@3.2.0: 6105 + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 6106 + engines: {node: ^10.12.0 || >=12.0.0} 6107 + 5189 6108 flat-cache@4.0.1: 5190 6109 resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 5191 6110 engines: {node: '>=16'} 5192 6111 5193 - flatted@3.2.9: 5194 - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 6112 + flatted@3.3.1: 6113 + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 5195 6114 5196 6115 follow-redirects@1.15.6: 5197 6116 resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} ··· 5228 6147 fraction.js@4.3.7: 5229 6148 resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 5230 6149 6150 + framer-motion@8.4.6: 6151 + resolution: {integrity: sha512-0GkpTQnhDysG5SiD2VbANtAs8yCXVQLasynVABDTZYI+Qcx1krWg+rfyveM8W78q7AX+8RTsiMz/LJ7YIRZvFw==} 6152 + peerDependencies: 6153 + react: ^18.0.0 6154 + react-dom: ^18.0.0 6155 + 5231 6156 fs-constants@1.0.0: 5232 6157 resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 5233 6158 ··· 5261 6186 5262 6187 function-bind@1.1.2: 5263 6188 resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 6189 + 6190 + function.prototype.name@1.1.6: 6191 + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} 6192 + engines: {node: '>= 0.4'} 6193 + 6194 + functions-have-names@1.2.3: 6195 + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 5264 6196 5265 6197 gaxios@6.1.1: 5266 6198 resolution: {integrity: sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==} ··· 5277 6209 get-intrinsic@1.2.1: 5278 6210 resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 5279 6211 6212 + get-intrinsic@1.2.4: 6213 + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 6214 + engines: {node: '>= 0.4'} 6215 + 5280 6216 get-nonce@1.0.1: 5281 6217 resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} 5282 6218 engines: {node: '>=6'} ··· 5287 6223 get-stream@6.0.1: 5288 6224 resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 5289 6225 engines: {node: '>=10'} 6226 + 6227 + get-symbol-description@1.0.2: 6228 + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} 6229 + engines: {node: '>= 0.4'} 5290 6230 5291 6231 get-tsconfig@4.7.2: 5292 6232 resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} ··· 5320 6260 glob@7.1.6: 5321 6261 resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} 5322 6262 6263 + glob@7.1.7: 6264 + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} 6265 + 5323 6266 glob@7.2.3: 5324 6267 resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 5325 6268 ··· 5327 6270 resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 5328 6271 engines: {node: '>=12'} 5329 6272 6273 + globals@13.24.0: 6274 + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 6275 + engines: {node: '>=8'} 6276 + 6277 + globalthis@1.0.4: 6278 + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 6279 + engines: {node: '>= 0.4'} 6280 + 5330 6281 globby@10.0.2: 5331 6282 resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} 5332 6283 engines: {node: '>=8'} ··· 5353 6304 resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} 5354 6305 engines: {node: '>=10'} 5355 6306 6307 + grapheme-splitter@1.0.4: 6308 + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 6309 + 5356 6310 graphql@16.8.1: 5357 6311 resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} 5358 6312 engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} ··· 5381 6335 resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} 5382 6336 engines: {node: '>=0.10.0'} 5383 6337 6338 + has-bigints@1.0.2: 6339 + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 6340 + 5384 6341 has-flag@3.0.0: 5385 6342 resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 5386 6343 engines: {node: '>=4'} ··· 5399 6356 has-property-descriptors@1.0.0: 5400 6357 resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 5401 6358 6359 + has-property-descriptors@1.0.2: 6360 + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 6361 + 5402 6362 has-proto@1.0.1: 5403 6363 resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 5404 6364 engines: {node: '>= 0.4'} 5405 6365 6366 + has-proto@1.0.3: 6367 + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 6368 + engines: {node: '>= 0.4'} 6369 + 5406 6370 has-symbols@1.0.3: 5407 6371 resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 5408 6372 engines: {node: '>= 0.4'} ··· 5411 6375 resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 5412 6376 engines: {node: '>= 0.4'} 5413 6377 6378 + has-tostringtag@1.0.2: 6379 + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 6380 + engines: {node: '>= 0.4'} 6381 + 5414 6382 has@1.0.4: 5415 6383 resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} 5416 6384 engines: {node: '>= 0.4.0'} ··· 5421 6389 5422 6390 hash-wasm@4.10.0: 5423 6391 resolution: {integrity: sha512-a0NjBNWjavvMalm/pPSEJ00MPDjRG8rv9D5BK7dBQTLGwAOVWqnTEUggaYs5szATB5UK5ULeIQr7QJXbczAZYA==} 6392 + 6393 + hasown@2.0.2: 6394 + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 6395 + engines: {node: '>= 0.4'} 5424 6396 5425 6397 hast-to-hyperscript@10.0.3: 5426 6398 resolution: {integrity: sha512-NuBoUStp4fRwmvlfbidlEiRSTk0gSHm+97q4Xn9CJ10HO+Py7nlTuDi6RhM1qLOureukGrCXLG7AAxaGqqyslQ==} ··· 5470 6442 heap@0.2.7: 5471 6443 resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} 5472 6444 6445 + hey-listen@1.0.8: 6446 + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} 6447 + 5473 6448 hoist-non-react-statics@3.3.2: 5474 6449 resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} 5475 6450 ··· 5573 6548 immediate@3.0.6: 5574 6549 resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} 5575 6550 6551 + import-fresh@3.3.0: 6552 + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 6553 + engines: {node: '>=6'} 6554 + 6555 + imurmurhash@0.1.4: 6556 + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 6557 + engines: {node: '>=0.8.19'} 6558 + 5576 6559 indent-string@4.0.0: 5577 6560 resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 5578 6561 engines: {node: '>=8'} ··· 5601 6584 resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} 5602 6585 engines: {node: '>=12.0.0'} 5603 6586 6587 + internal-slot@1.0.7: 6588 + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} 6589 + engines: {node: '>= 0.4'} 6590 + 5604 6591 internmap@2.0.3: 5605 6592 resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} 5606 6593 engines: {node: '>=12'} ··· 5628 6615 resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} 5629 6616 engines: {node: '>= 0.4'} 5630 6617 6618 + is-array-buffer@3.0.4: 6619 + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} 6620 + engines: {node: '>= 0.4'} 6621 + 5631 6622 is-arrayish@0.2.1: 5632 6623 resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 5633 6624 6625 + is-async-function@2.0.0: 6626 + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} 6627 + engines: {node: '>= 0.4'} 6628 + 6629 + is-bigint@1.0.4: 6630 + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 6631 + 5634 6632 is-binary-path@2.1.0: 5635 6633 resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 5636 6634 engines: {node: '>=8'} 6635 + 6636 + is-boolean-object@1.1.2: 6637 + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 6638 + engines: {node: '>= 0.4'} 5637 6639 5638 6640 is-buffer@1.1.6: 5639 6641 resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} ··· 5649 6651 is-core-module@2.13.0: 5650 6652 resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} 5651 6653 6654 + is-core-module@2.13.1: 6655 + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 6656 + 6657 + is-data-view@1.0.1: 6658 + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} 6659 + engines: {node: '>= 0.4'} 6660 + 6661 + is-date-object@1.0.5: 6662 + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 6663 + engines: {node: '>= 0.4'} 6664 + 5652 6665 is-decimal@2.0.1: 5653 6666 resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} 5654 6667 ··· 5659 6672 is-extglob@2.1.1: 5660 6673 resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 5661 6674 engines: {node: '>=0.10.0'} 6675 + 6676 + is-finalizationregistry@1.0.2: 6677 + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} 5662 6678 5663 6679 is-fullwidth-code-point@3.0.0: 5664 6680 resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} ··· 5686 6702 is-lower-case@1.1.3: 5687 6703 resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} 5688 6704 6705 + is-map@2.0.3: 6706 + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 6707 + engines: {node: '>= 0.4'} 6708 + 6709 + is-negative-zero@2.0.3: 6710 + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} 6711 + engines: {node: '>= 0.4'} 6712 + 6713 + is-number-object@1.0.7: 6714 + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 6715 + engines: {node: '>= 0.4'} 6716 + 5689 6717 is-number@4.0.0: 5690 6718 resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} 5691 6719 engines: {node: '>=0.10.0'} ··· 5734 6762 is-reference@3.0.2: 5735 6763 resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} 5736 6764 6765 + is-regex@1.1.4: 6766 + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 6767 + engines: {node: '>= 0.4'} 6768 + 6769 + is-set@2.0.3: 6770 + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 6771 + engines: {node: '>= 0.4'} 6772 + 6773 + is-shared-array-buffer@1.0.3: 6774 + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} 6775 + engines: {node: '>= 0.4'} 6776 + 5737 6777 is-stream@2.0.1: 5738 6778 resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 5739 6779 engines: {node: '>=8'} 5740 6780 6781 + is-string@1.0.7: 6782 + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 6783 + engines: {node: '>= 0.4'} 6784 + 6785 + is-symbol@1.0.4: 6786 + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 6787 + engines: {node: '>= 0.4'} 6788 + 5741 6789 is-typed-array@1.1.12: 5742 6790 resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} 5743 6791 engines: {node: '>= 0.4'} 5744 6792 6793 + is-typed-array@1.1.13: 6794 + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} 6795 + engines: {node: '>= 0.4'} 6796 + 5745 6797 is-unicode-supported@0.1.0: 5746 6798 resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 5747 6799 engines: {node: '>=10'} ··· 5749 6801 is-upper-case@1.1.2: 5750 6802 resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} 5751 6803 6804 + is-weakmap@2.0.2: 6805 + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 6806 + engines: {node: '>= 0.4'} 6807 + 6808 + is-weakref@1.0.2: 6809 + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 6810 + 6811 + is-weakset@2.0.3: 6812 + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} 6813 + engines: {node: '>= 0.4'} 6814 + 5752 6815 is-what@4.1.15: 5753 6816 resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==} 5754 6817 engines: {node: '>=12.13'} ··· 5756 6819 is-whitespace@0.3.0: 5757 6820 resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} 5758 6821 engines: {node: '>=0.10.0'} 6822 + 6823 + isarray@2.0.5: 6824 + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 5759 6825 5760 6826 isbinaryfile@4.0.10: 5761 6827 resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} ··· 5770 6836 iterable-lookahead@1.0.0: 5771 6837 resolution: {integrity: sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ==} 5772 6838 engines: {node: '>=4'} 6839 + 6840 + iterator.prototype@1.1.2: 6841 + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} 5773 6842 5774 6843 jackspeak@2.3.6: 5775 6844 resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} ··· 5821 6890 engines: {node: '>=12'} 5822 6891 hasBin: true 5823 6892 6893 + js-sdsl@4.4.2: 6894 + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} 6895 + 5824 6896 js-tokens@4.0.0: 5825 6897 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 5826 6898 ··· 5857 6929 json-parse-even-better-errors@2.3.1: 5858 6930 resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 5859 6931 6932 + json-schema-traverse@0.4.1: 6933 + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 6934 + 5860 6935 json-schema-traverse@1.0.0: 5861 6936 resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 5862 6937 6938 + json-stable-stringify-without-jsonify@1.0.1: 6939 + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 6940 + 6941 + json5@1.0.2: 6942 + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 6943 + hasBin: true 6944 + 5863 6945 jsonc-parser@3.2.0: 5864 6946 resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} 5865 6947 ··· 5872 6954 jsonpath-plus@7.2.0: 5873 6955 resolution: {integrity: sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==} 5874 6956 engines: {node: '>=12.0.0'} 6957 + 6958 + jsx-ast-utils@3.3.5: 6959 + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} 6960 + engines: {node: '>=4.0'} 5875 6961 5876 6962 jwa@2.0.0: 5877 6963 resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} ··· 5902 6988 '@types/node': '>=18' 5903 6989 typescript: '>=5.0.4' 5904 6990 6991 + language-subtag-registry@0.3.23: 6992 + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} 6993 + 6994 + language-tags@1.0.9: 6995 + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} 6996 + engines: {node: '>=0.10'} 6997 + 5905 6998 leac@0.6.0: 5906 6999 resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} 7000 + 7001 + levn@0.4.1: 7002 + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 7003 + engines: {node: '>= 0.8.0'} 5907 7004 5908 7005 libsql@0.3.10: 5909 7006 resolution: {integrity: sha512-/8YMTbwWFPmrDWY+YFK3kYqVPFkMgQre0DGmBaOmjogMdSe+7GHm1/q9AZ61AWkEub/vHmi+bA4tqIzVhKnqzg==} ··· 5929 7026 locate-path@5.0.0: 5930 7027 resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 5931 7028 engines: {node: '>=8'} 7029 + 7030 + locate-path@6.0.0: 7031 + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 7032 + engines: {node: '>=10'} 5932 7033 5933 7034 lodash.camelcase@4.3.0: 5934 7035 resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} ··· 6353 7454 napi-build-utils@1.0.2: 6354 7455 resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} 6355 7456 7457 + natural-compare@1.4.0: 7458 + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 7459 + 6356 7460 neo-async@2.6.2: 6357 7461 resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 6358 7462 ··· 6401 7505 next-tick@1.1.0: 6402 7506 resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} 6403 7507 7508 + next@13.2.4: 7509 + resolution: {integrity: sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==} 7510 + engines: {node: '>=14.6.0'} 7511 + hasBin: true 7512 + peerDependencies: 7513 + '@opentelemetry/api': ^1.4.0 7514 + fibers: '>= 3.1.0' 7515 + node-sass: ^6.0.0 || ^7.0.0 7516 + react: ^18.2.0 7517 + react-dom: ^18.2.0 7518 + sass: ^1.3.0 7519 + peerDependenciesMeta: 7520 + '@opentelemetry/api': 7521 + optional: true 7522 + fibers: 7523 + optional: true 7524 + node-sass: 7525 + optional: true 7526 + sass: 7527 + optional: true 7528 + 6404 7529 next@14.2.3: 6405 7530 resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} 6406 7531 engines: {node: '>=18.17.0'} ··· 6454 7579 resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} 6455 7580 hasBin: true 6456 7581 7582 + node-gyp-build@4.8.1: 7583 + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} 7584 + hasBin: true 7585 + 6457 7586 node-plop@0.26.3: 6458 7587 resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} 6459 7588 engines: {node: '>=8.9.4'} ··· 6498 7627 object-inspect@1.13.1: 6499 7628 resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 6500 7629 7630 + object-keys@1.1.1: 7631 + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 7632 + engines: {node: '>= 0.4'} 7633 + 6501 7634 object-pairs@0.1.0: 6502 7635 resolution: {integrity: sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA==} 6503 7636 ··· 6505 7638 resolution: {integrity: sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ==} 6506 7639 engines: {node: '>=0.10.0'} 6507 7640 7641 + object.assign@4.1.5: 7642 + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 7643 + engines: {node: '>= 0.4'} 7644 + 7645 + object.entries@1.1.8: 7646 + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} 7647 + engines: {node: '>= 0.4'} 7648 + 7649 + object.fromentries@2.0.8: 7650 + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} 7651 + engines: {node: '>= 0.4'} 7652 + 7653 + object.groupby@1.0.3: 7654 + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} 7655 + engines: {node: '>= 0.4'} 7656 + 7657 + object.hasown@1.1.4: 7658 + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} 7659 + engines: {node: '>= 0.4'} 7660 + 7661 + object.values@1.2.0: 7662 + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} 7663 + engines: {node: '>= 0.4'} 7664 + 6508 7665 once@1.4.0: 6509 7666 resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 6510 7667 ··· 6518 7675 6519 7676 openapi3-ts@4.1.2: 6520 7677 resolution: {integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==} 7678 + 7679 + optionator@0.9.4: 7680 + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 7681 + engines: {node: '>= 0.8.0'} 6521 7682 6522 7683 ora@4.1.1: 6523 7684 resolution: {integrity: sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==} ··· 6535 7696 resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 6536 7697 engines: {node: '>=6'} 6537 7698 7699 + p-limit@3.1.0: 7700 + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 7701 + engines: {node: '>=10'} 7702 + 6538 7703 p-locate@4.1.0: 6539 7704 resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 6540 7705 engines: {node: '>=8'} 7706 + 7707 + p-locate@5.0.0: 7708 + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 7709 + engines: {node: '>=10'} 6541 7710 6542 7711 p-map@3.0.0: 6543 7712 resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} ··· 6562 7731 param-case@2.1.1: 6563 7732 resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} 6564 7733 7734 + parent-module@1.0.1: 7735 + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 7736 + engines: {node: '>=6'} 7737 + 6565 7738 parse-entities@4.0.1: 6566 7739 resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} 6567 7740 ··· 6619 7792 path-to-regexp@6.2.1: 6620 7793 resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} 6621 7794 7795 + path-to-regexp@6.2.2: 7796 + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} 7797 + 6622 7798 path-type@4.0.0: 6623 7799 resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 6624 7800 engines: {node: '>=8'} ··· 6668 7844 engines: {node: '>=16'} 6669 7845 hasBin: true 6670 7846 7847 + possible-typed-array-names@1.0.0: 7848 + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 7849 + engines: {node: '>= 0.4'} 7850 + 6671 7851 postcss-css-variables@0.18.0: 6672 7852 resolution: {integrity: sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q==} 6673 7853 peerDependencies: ··· 6738 7918 postcss-value-parser@4.2.0: 6739 7919 resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 6740 7920 7921 + postcss@8.4.14: 7922 + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} 7923 + engines: {node: ^10 || ^12 || >=14} 7924 + 7925 + postcss@8.4.19: 7926 + resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} 7927 + engines: {node: ^10 || ^12 || >=14} 7928 + 6741 7929 postcss@8.4.21: 6742 7930 resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} 6743 7931 engines: {node: ^10 || ^12 || >=14} ··· 6773 7961 engines: {node: '>=10'} 6774 7962 hasBin: true 6775 7963 7964 + prelude-ls@1.2.1: 7965 + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 7966 + engines: {node: '>= 0.8.0'} 7967 + 7968 + prettier@2.8.4: 7969 + resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} 7970 + engines: {node: '>=10.13.0'} 7971 + hasBin: true 7972 + 6776 7973 pretty-format@29.7.0: 6777 7974 resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 6778 7975 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} ··· 6790 7987 6791 7988 printable-characters@1.0.42: 6792 7989 resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} 7990 + 7991 + prism-react-renderer@1.3.5: 7992 + resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} 7993 + peerDependencies: 7994 + react: '>=0.14.9' 6793 7995 6794 7996 progress@2.0.3: 6795 7997 resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} ··· 6879 8081 peerDependencies: 6880 8082 react: ^18.2.0 6881 8083 8084 + react-dom@18.3.1: 8085 + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 8086 + peerDependencies: 8087 + react: ^18.3.1 8088 + 6882 8089 react-email@1.10.0: 6883 8090 resolution: {integrity: sha512-IrLs28p3Iqyx9JASSrdEoTC+TQeb3jDcJ++2xzVS71yR6U8GYAqff7NKPGZJIA6z5oGtwRFv6GCViR4JiGdmXg==} 6884 8091 engines: {node: '>=18.0.0'} ··· 6971 8178 resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 6972 8179 engines: {node: '>=0.10.0'} 6973 8180 8181 + react@18.3.1: 8182 + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 8183 + engines: {node: '>=0.10.0'} 8184 + 6974 8185 read-cache@1.0.0: 6975 8186 resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 6976 8187 ··· 7016 8227 resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 7017 8228 engines: {node: '>=8'} 7018 8229 8230 + reflect.getprototypeof@1.0.6: 8231 + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} 8232 + engines: {node: '>= 0.4'} 8233 + 7019 8234 regenerator-runtime@0.14.0: 7020 8235 resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} 7021 8236 8237 + regexp.prototype.flags@1.5.2: 8238 + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} 8239 + engines: {node: '>= 0.4'} 8240 + 7022 8241 registry-auth-token@3.3.2: 7023 8242 resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} 7024 8243 ··· 7088 8307 resolution: {integrity: sha512-jAh0DN84ZjjmzGM2vMjJ1hphPBg1mG98dzopF7kJzmin62v8ESg4og2iCKWdkAboGOT2SeO5exbr/8Xh8gLddw==} 7089 8308 engines: {node: '>=18'} 7090 8309 8310 + resolve-from@4.0.0: 8311 + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 8312 + engines: {node: '>=4'} 8313 + 7091 8314 resolve-from@5.0.0: 7092 8315 resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 7093 8316 engines: {node: '>=8'} ··· 7101 8324 7102 8325 resolve@1.22.8: 7103 8326 resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 8327 + hasBin: true 8328 + 8329 + resolve@2.0.0-next.5: 8330 + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} 7104 8331 hasBin: true 7105 8332 7106 8333 restore-cursor@3.1.0: ··· 7166 8393 resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 7167 8394 engines: {node: '>=6'} 7168 8395 8396 + safe-array-concat@1.1.2: 8397 + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} 8398 + engines: {node: '>=0.4'} 8399 + 7169 8400 safe-buffer@5.2.1: 7170 8401 resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 8402 + 8403 + safe-regex-test@1.0.3: 8404 + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} 8405 + engines: {node: '>= 0.4'} 7171 8406 7172 8407 safer-buffer@2.1.2: 7173 8408 resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} ··· 7176 8411 resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} 7177 8412 engines: {node: '>=v12.22.7'} 7178 8413 7179 - scheduler@0.23.0: 7180 - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 8414 + scheduler@0.23.2: 8415 + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 7181 8416 7182 8417 section-matter@1.0.0: 7183 8418 resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} ··· 7195 8430 7196 8431 semver@5.7.2: 7197 8432 resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 8433 + hasBin: true 8434 + 8435 + semver@6.3.1: 8436 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 7198 8437 hasBin: true 7199 8438 7200 8439 semver@7.5.4: ··· 7207 8446 7208 8447 set-function-length@1.1.1: 7209 8448 resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} 8449 + engines: {node: '>= 0.4'} 8450 + 8451 + set-function-length@1.2.2: 8452 + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 8453 + engines: {node: '>= 0.4'} 8454 + 8455 + set-function-name@2.0.2: 8456 + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 7210 8457 engines: {node: '>= 0.4'} 7211 8458 7212 8459 shebang-command@2.0.0: ··· 7231 8478 side-channel@1.0.4: 7232 8479 resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 7233 8480 8481 + side-channel@1.0.6: 8482 + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} 8483 + engines: {node: '>= 0.4'} 8484 + 7234 8485 signal-exit@3.0.7: 7235 8486 resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 7236 8487 ··· 7279 8530 sort-keys@5.0.0: 7280 8531 resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} 7281 8532 engines: {node: '>=12'} 8533 + 8534 + source-map-js@1.0.2: 8535 + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 8536 + engines: {node: '>=0.10.0'} 7282 8537 7283 8538 source-map-js@1.2.0: 7284 8539 resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} ··· 7360 8615 string.fromcodepoint@0.2.1: 7361 8616 resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} 7362 8617 8618 + string.prototype.matchall@4.0.11: 8619 + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} 8620 + engines: {node: '>= 0.4'} 8621 + 8622 + string.prototype.trim@1.2.9: 8623 + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} 8624 + engines: {node: '>= 0.4'} 8625 + 8626 + string.prototype.trimend@1.0.8: 8627 + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} 8628 + 8629 + string.prototype.trimstart@1.0.8: 8630 + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 8631 + engines: {node: '>= 0.4'} 8632 + 7363 8633 string_decoder@1.3.0: 7364 8634 resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 7365 8635 ··· 7397 8667 strip-json-comments@2.0.1: 7398 8668 resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 7399 8669 engines: {node: '>=0.10.0'} 8670 + 8671 + strip-json-comments@3.1.1: 8672 + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 8673 + engines: {node: '>=8'} 7400 8674 7401 8675 strip-json-comments@5.0.1: 7402 8676 resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} ··· 7484 8758 peerDependencies: 7485 8759 tailwindcss: '>=3.0.0 || insiders' 7486 8760 8761 + tailwindcss@3.2.4: 8762 + resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==} 8763 + engines: {node: '>=12.13.0'} 8764 + hasBin: true 8765 + peerDependencies: 8766 + postcss: ^8.0.9 8767 + 7487 8768 tailwindcss@3.2.7: 7488 8769 resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==} 7489 8770 engines: {node: '>=12.13.0'} ··· 7496 8777 engines: {node: '>=14.0.0'} 7497 8778 hasBin: true 7498 8779 8780 + tapable@2.2.1: 8781 + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 8782 + engines: {node: '>=6'} 8783 + 7499 8784 tar-fs@2.1.1: 7500 8785 resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} 7501 8786 ··· 7506 8791 teeny-request@9.0.0: 7507 8792 resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} 7508 8793 engines: {node: '>=14'} 8794 + 8795 + text-table@0.2.0: 8796 + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 7509 8797 7510 8798 thenify-all@1.6.0: 7511 8799 resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} ··· 7591 8879 ts-interface-checker@0.1.13: 7592 8880 resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 7593 8881 7594 - ts-node@10.9.1: 7595 - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} 8882 + ts-node@10.9.2: 8883 + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 7596 8884 hasBin: true 7597 8885 peerDependencies: 7598 8886 '@swc/core': '>=1.2.50' ··· 7607 8895 7608 8896 ts-pattern@4.3.0: 7609 8897 resolution: {integrity: sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==} 8898 + 8899 + tsconfig-paths@3.15.0: 8900 + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 7610 8901 7611 8902 tslib@1.14.1: 7612 8903 resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} ··· 7630 8921 typescript: 7631 8922 optional: true 7632 8923 8924 + tsutils@3.21.0: 8925 + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 8926 + engines: {node: '>= 6'} 8927 + peerDependencies: 8928 + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 8929 + 7633 8930 tunnel-agent@0.6.0: 7634 8931 resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 7635 8932 ··· 7674 8971 typanion@3.14.0: 7675 8972 resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} 7676 8973 8974 + type-check@0.4.0: 8975 + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 8976 + engines: {node: '>= 0.8.0'} 8977 + 7677 8978 type-detect@4.0.8: 7678 8979 resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 7679 8980 engines: {node: '>=4'} 7680 8981 7681 8982 type-fest@0.13.1: 7682 8983 resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} 8984 + engines: {node: '>=10'} 8985 + 8986 + type-fest@0.20.2: 8987 + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 7683 8988 engines: {node: '>=10'} 7684 8989 7685 8990 type-fest@0.21.3: ··· 7716 9021 type@2.7.2: 7717 9022 resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} 7718 9023 9024 + typed-array-buffer@1.0.2: 9025 + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} 9026 + engines: {node: '>= 0.4'} 9027 + 9028 + typed-array-byte-length@1.0.1: 9029 + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} 9030 + engines: {node: '>= 0.4'} 9031 + 9032 + typed-array-byte-offset@1.0.2: 9033 + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} 9034 + engines: {node: '>= 0.4'} 9035 + 9036 + typed-array-length@1.0.6: 9037 + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} 9038 + engines: {node: '>= 0.4'} 9039 + 9040 + typescript@4.9.3: 9041 + resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} 9042 + engines: {node: '>=4.2.0'} 9043 + hasBin: true 9044 + 7719 9045 typescript@5.4.4: 7720 9046 resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==} 7721 9047 engines: {node: '>=14.17'} ··· 7730 9056 resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} 7731 9057 engines: {node: '>=0.8.0'} 7732 9058 hasBin: true 9059 + 9060 + unbox-primitive@1.0.2: 9061 + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 9062 + 9063 + undici-types@5.26.5: 9064 + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 7733 9065 7734 9066 undici@5.25.1: 7735 9067 resolution: {integrity: sha512-nTw6b2G2OqP6btYPyghCgV4hSwjJlL/78FMJatVLCa3otj6PCOQSt6dVtYt82OtNqFz8XsnJ+vsXLADPXjPhqw==} ··· 7837 9169 engines: {node: '>=10'} 7838 9170 peerDependencies: 7839 9171 '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 9172 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 9173 + peerDependenciesMeta: 9174 + '@types/react': 9175 + optional: true 9176 + 9177 + use-isomorphic-layout-effect@1.1.2: 9178 + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} 9179 + peerDependencies: 9180 + '@types/react': '*' 7840 9181 react: ^16.8.0 || ^17.0.0 || ^18.0.0 7841 9182 peerDependenciesMeta: 7842 9183 '@types/react': ··· 7861 9202 resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} 7862 9203 engines: {node: '>=6.14.2'} 7863 9204 9205 + utf-8-validate@6.0.4: 9206 + resolution: {integrity: sha512-xu9GQDeFp+eZ6LnCywXN/zBancWvOpUMzgjLPSjy4BRHSmTelvn2E0DG0o1sTiw5hkCKBHo8rwSKncfRfv2EEQ==} 9207 + engines: {node: '>=6.14.2'} 9208 + 7864 9209 util-deprecate@1.0.2: 7865 9210 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 7866 9211 ··· 7970 9315 whatwg-url@7.1.0: 7971 9316 resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 7972 9317 9318 + which-boxed-primitive@1.0.2: 9319 + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 9320 + 9321 + which-builtin-type@1.1.3: 9322 + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} 9323 + engines: {node: '>= 0.4'} 9324 + 9325 + which-collection@1.0.2: 9326 + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 9327 + engines: {node: '>= 0.4'} 9328 + 7973 9329 which-typed-array@1.1.13: 7974 9330 resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} 7975 9331 engines: {node: '>= 0.4'} 7976 9332 9333 + which-typed-array@1.1.15: 9334 + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} 9335 + engines: {node: '>= 0.4'} 9336 + 7977 9337 which@2.0.2: 7978 9338 resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 7979 9339 engines: {node: '>= 8'} 7980 9340 hasBin: true 7981 9341 9342 + word-wrap@1.2.5: 9343 + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 9344 + engines: {node: '>=0.10.0'} 9345 + 7982 9346 wordwrap@1.0.0: 7983 9347 resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} 7984 9348 ··· 8039 9403 utf-8-validate: 8040 9404 optional: true 8041 9405 9406 + ws@8.17.0: 9407 + resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} 9408 + engines: {node: '>=10.0.0'} 9409 + peerDependencies: 9410 + bufferutil: ^4.0.1 9411 + utf-8-validate: '>=5.0.2' 9412 + peerDependenciesMeta: 9413 + bufferutil: 9414 + optional: true 9415 + utf-8-validate: 9416 + optional: true 9417 + 8042 9418 xml-name-validator@4.0.0: 8043 9419 resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} 8044 9420 engines: {node: '>=12'} ··· 8086 9462 yn@3.1.1: 8087 9463 resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 8088 9464 engines: {node: '>=6'} 9465 + 9466 + yocto-queue@0.1.0: 9467 + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 9468 + engines: {node: '>=10'} 8089 9469 8090 9470 youch@3.3.3: 8091 9471 resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} ··· 8792 10172 dependencies: 8793 10173 commander: 9.4.1 8794 10174 8795 - '@contentlayer/cli@0.3.4(esbuild@0.19.12)': 10175 + '@contentlayer/cli@0.3.4(esbuild@0.21.3)': 8796 10176 dependencies: 8797 - '@contentlayer/core': 0.3.4(esbuild@0.19.12) 10177 + '@contentlayer/core': 0.3.4(esbuild@0.21.3) 8798 10178 '@contentlayer/utils': 0.3.4 8799 10179 clipanion: 3.2.1(typanion@3.14.0) 8800 10180 typanion: 3.14.0 ··· 8804 10184 - markdown-wasm 8805 10185 - supports-color 8806 10186 8807 - '@contentlayer/client@0.3.4(esbuild@0.19.12)': 10187 + '@contentlayer/client@0.3.4(esbuild@0.21.3)': 8808 10188 dependencies: 8809 - '@contentlayer/core': 0.3.4(esbuild@0.19.12) 10189 + '@contentlayer/core': 0.3.4(esbuild@0.21.3) 8810 10190 transitivePeerDependencies: 8811 10191 - '@effect-ts/otel-node' 8812 10192 - esbuild 8813 10193 - markdown-wasm 8814 10194 - supports-color 8815 10195 8816 - '@contentlayer/core@0.3.4(esbuild@0.19.12)': 10196 + '@contentlayer/core@0.3.4(esbuild@0.21.3)': 8817 10197 dependencies: 8818 10198 '@contentlayer/utils': 0.3.4 8819 10199 camel-case: 4.1.2 8820 10200 comment-json: 4.2.3 8821 10201 gray-matter: 4.0.3 8822 - mdx-bundler: 9.2.1(esbuild@0.19.12) 10202 + mdx-bundler: 9.2.1(esbuild@0.21.3) 8823 10203 rehype-stringify: 9.0.4 8824 10204 remark-frontmatter: 4.0.1 8825 10205 remark-parse: 10.0.2 ··· 8828 10208 type-fest: 3.13.1 8829 10209 unified: 10.1.2 8830 10210 optionalDependencies: 8831 - esbuild: 0.19.12 10211 + esbuild: 0.21.3 8832 10212 transitivePeerDependencies: 8833 10213 - '@effect-ts/otel-node' 8834 10214 - supports-color 8835 10215 8836 - '@contentlayer/source-files@0.3.4(esbuild@0.19.12)': 10216 + '@contentlayer/source-files@0.3.4(esbuild@0.21.3)': 8837 10217 dependencies: 8838 - '@contentlayer/core': 0.3.4(esbuild@0.19.12) 10218 + '@contentlayer/core': 0.3.4(esbuild@0.21.3) 8839 10219 '@contentlayer/utils': 0.3.4 8840 - chokidar: 3.5.3 8841 - fast-glob: 3.3.1 10220 + chokidar: 3.6.0 10221 + fast-glob: 3.3.2 8842 10222 gray-matter: 4.0.3 8843 10223 imagescript: 1.2.16 8844 10224 micromatch: 4.0.5 ··· 8852 10232 - markdown-wasm 8853 10233 - supports-color 8854 10234 8855 - '@contentlayer/source-remote-files@0.3.4(esbuild@0.19.12)': 10235 + '@contentlayer/source-remote-files@0.3.4(esbuild@0.21.3)': 8856 10236 dependencies: 8857 - '@contentlayer/core': 0.3.4(esbuild@0.19.12) 8858 - '@contentlayer/source-files': 0.3.4(esbuild@0.19.12) 10237 + '@contentlayer/core': 0.3.4(esbuild@0.21.3) 10238 + '@contentlayer/source-files': 0.3.4(esbuild@0.21.3) 8859 10239 '@contentlayer/utils': 0.3.4 8860 10240 transitivePeerDependencies: 8861 10241 - '@effect-ts/otel-node' ··· 8877 10257 '@opentelemetry/sdk-trace-base': 1.13.0(@opentelemetry/api@1.4.1) 8878 10258 '@opentelemetry/sdk-trace-node': 1.13.0(@opentelemetry/api@1.4.1) 8879 10259 '@opentelemetry/semantic-conventions': 1.13.0 8880 - chokidar: 3.5.3 10260 + chokidar: 3.6.0 8881 10261 hash-wasm: 4.10.0 8882 10262 inflection: 2.0.1 8883 10263 memfs: 3.5.3 ··· 8894 10274 react: 18.2.0 8895 10275 tslib: 2.6.2 8896 10276 8897 - '@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 10277 + '@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 8898 10278 dependencies: 8899 10279 '@dnd-kit/accessibility': 3.1.0(react@18.2.0) 8900 10280 '@dnd-kit/utilities': 3.2.2(react@18.2.0) 8901 10281 react: 18.2.0 8902 - react-dom: 18.2.0(react@18.2.0) 10282 + react-dom: 18.3.1(react@18.2.0) 8903 10283 tslib: 2.6.2 8904 10284 8905 - '@dnd-kit/modifiers@7.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': 10285 + '@dnd-kit/modifiers@7.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0))(react@18.2.0)': 8906 10286 dependencies: 8907 - '@dnd-kit/core': 6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10287 + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 8908 10288 '@dnd-kit/utilities': 3.2.2(react@18.2.0) 8909 10289 react: 18.2.0 8910 10290 tslib: 2.6.2 8911 10291 8912 - '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': 10292 + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0))(react@18.2.0)': 8913 10293 dependencies: 8914 - '@dnd-kit/core': 6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10294 + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 8915 10295 '@dnd-kit/utilities': 3.2.2(react@18.2.0) 8916 10296 react: 18.2.0 8917 10297 tslib: 2.6.2 ··· 8952 10332 8953 10333 '@effect-ts/system@0.57.5': {} 8954 10334 10335 + '@emotion/is-prop-valid@0.8.8': 10336 + dependencies: 10337 + '@emotion/memoize': 0.7.4 10338 + optional: true 10339 + 10340 + '@emotion/memoize@0.7.4': 10341 + optional: true 10342 + 8955 10343 '@ericcornelissen/bash-parser@0.5.2': 8956 10344 dependencies: 8957 10345 array-last: 1.3.0 ··· 8994 10382 escape-string-regexp: 4.0.0 8995 10383 rollup-plugin-node-polyfills: 0.2.1 8996 10384 8997 - '@esbuild-plugins/node-resolve@0.1.4(esbuild@0.19.12)': 10385 + '@esbuild-plugins/node-resolve@0.1.4(esbuild@0.21.3)': 8998 10386 dependencies: 8999 10387 '@types/resolve': 1.20.4 9000 10388 debug: 4.3.4 9001 - esbuild: 0.19.12 10389 + esbuild: 0.21.3 9002 10390 escape-string-regexp: 4.0.0 9003 10391 resolve: 1.22.8 9004 10392 transitivePeerDependencies: ··· 9007 10395 '@esbuild/aix-ppc64@0.19.12': 9008 10396 optional: true 9009 10397 10398 + '@esbuild/aix-ppc64@0.21.3': 10399 + optional: true 10400 + 9010 10401 '@esbuild/android-arm64@0.16.4': 9011 10402 optional: true 9012 10403 ··· 9019 10410 '@esbuild/android-arm64@0.19.12': 9020 10411 optional: true 9021 10412 10413 + '@esbuild/android-arm64@0.21.3': 10414 + optional: true 10415 + 9022 10416 '@esbuild/android-arm@0.16.4': 9023 10417 optional: true 9024 10418 ··· 9031 10425 '@esbuild/android-arm@0.19.12': 9032 10426 optional: true 9033 10427 10428 + '@esbuild/android-arm@0.21.3': 10429 + optional: true 10430 + 9034 10431 '@esbuild/android-x64@0.16.4': 9035 10432 optional: true 9036 10433 ··· 9043 10440 '@esbuild/android-x64@0.19.12': 9044 10441 optional: true 9045 10442 10443 + '@esbuild/android-x64@0.21.3': 10444 + optional: true 10445 + 9046 10446 '@esbuild/darwin-arm64@0.16.4': 9047 10447 optional: true 9048 10448 ··· 9055 10455 '@esbuild/darwin-arm64@0.19.12': 9056 10456 optional: true 9057 10457 10458 + '@esbuild/darwin-arm64@0.21.3': 10459 + optional: true 10460 + 9058 10461 '@esbuild/darwin-x64@0.16.4': 9059 10462 optional: true 9060 10463 ··· 9065 10468 optional: true 9066 10469 9067 10470 '@esbuild/darwin-x64@0.19.12': 10471 + optional: true 10472 + 10473 + '@esbuild/darwin-x64@0.21.3': 9068 10474 optional: true 9069 10475 9070 10476 '@esbuild/freebsd-arm64@0.16.4': ··· 9079 10485 '@esbuild/freebsd-arm64@0.19.12': 9080 10486 optional: true 9081 10487 10488 + '@esbuild/freebsd-arm64@0.21.3': 10489 + optional: true 10490 + 9082 10491 '@esbuild/freebsd-x64@0.16.4': 9083 10492 optional: true 9084 10493 ··· 9091 10500 '@esbuild/freebsd-x64@0.19.12': 9092 10501 optional: true 9093 10502 10503 + '@esbuild/freebsd-x64@0.21.3': 10504 + optional: true 10505 + 9094 10506 '@esbuild/linux-arm64@0.16.4': 9095 10507 optional: true 9096 10508 ··· 9103 10515 '@esbuild/linux-arm64@0.19.12': 9104 10516 optional: true 9105 10517 10518 + '@esbuild/linux-arm64@0.21.3': 10519 + optional: true 10520 + 9106 10521 '@esbuild/linux-arm@0.16.4': 9107 10522 optional: true 9108 10523 ··· 9113 10528 optional: true 9114 10529 9115 10530 '@esbuild/linux-arm@0.19.12': 10531 + optional: true 10532 + 10533 + '@esbuild/linux-arm@0.21.3': 9116 10534 optional: true 9117 10535 9118 10536 '@esbuild/linux-ia32@0.16.4': ··· 9127 10545 '@esbuild/linux-ia32@0.19.12': 9128 10546 optional: true 9129 10547 10548 + '@esbuild/linux-ia32@0.21.3': 10549 + optional: true 10550 + 9130 10551 '@esbuild/linux-loong64@0.16.4': 9131 10552 optional: true 9132 10553 ··· 9139 10560 '@esbuild/linux-loong64@0.19.12': 9140 10561 optional: true 9141 10562 10563 + '@esbuild/linux-loong64@0.21.3': 10564 + optional: true 10565 + 9142 10566 '@esbuild/linux-mips64el@0.16.4': 9143 10567 optional: true 9144 10568 ··· 9151 10575 '@esbuild/linux-mips64el@0.19.12': 9152 10576 optional: true 9153 10577 10578 + '@esbuild/linux-mips64el@0.21.3': 10579 + optional: true 10580 + 9154 10581 '@esbuild/linux-ppc64@0.16.4': 9155 10582 optional: true 9156 10583 ··· 9163 10590 '@esbuild/linux-ppc64@0.19.12': 9164 10591 optional: true 9165 10592 10593 + '@esbuild/linux-ppc64@0.21.3': 10594 + optional: true 10595 + 9166 10596 '@esbuild/linux-riscv64@0.16.4': 9167 10597 optional: true 9168 10598 ··· 9175 10605 '@esbuild/linux-riscv64@0.19.12': 9176 10606 optional: true 9177 10607 10608 + '@esbuild/linux-riscv64@0.21.3': 10609 + optional: true 10610 + 9178 10611 '@esbuild/linux-s390x@0.16.4': 9179 10612 optional: true 9180 10613 ··· 9187 10620 '@esbuild/linux-s390x@0.19.12': 9188 10621 optional: true 9189 10622 10623 + '@esbuild/linux-s390x@0.21.3': 10624 + optional: true 10625 + 9190 10626 '@esbuild/linux-x64@0.16.4': 9191 10627 optional: true 9192 10628 ··· 9197 10633 optional: true 9198 10634 9199 10635 '@esbuild/linux-x64@0.19.12': 10636 + optional: true 10637 + 10638 + '@esbuild/linux-x64@0.21.3': 9200 10639 optional: true 9201 10640 9202 10641 '@esbuild/netbsd-x64@0.16.4': ··· 9211 10650 '@esbuild/netbsd-x64@0.19.12': 9212 10651 optional: true 9213 10652 10653 + '@esbuild/netbsd-x64@0.21.3': 10654 + optional: true 10655 + 9214 10656 '@esbuild/openbsd-x64@0.16.4': 9215 10657 optional: true 9216 10658 ··· 9223 10665 '@esbuild/openbsd-x64@0.19.12': 9224 10666 optional: true 9225 10667 10668 + '@esbuild/openbsd-x64@0.21.3': 10669 + optional: true 10670 + 9226 10671 '@esbuild/sunos-x64@0.16.4': 9227 10672 optional: true 9228 10673 ··· 9235 10680 '@esbuild/sunos-x64@0.19.12': 9236 10681 optional: true 9237 10682 10683 + '@esbuild/sunos-x64@0.21.3': 10684 + optional: true 10685 + 9238 10686 '@esbuild/win32-arm64@0.16.4': 9239 10687 optional: true 9240 10688 ··· 9245 10693 optional: true 9246 10694 9247 10695 '@esbuild/win32-arm64@0.19.12': 10696 + optional: true 10697 + 10698 + '@esbuild/win32-arm64@0.21.3': 9248 10699 optional: true 9249 10700 9250 10701 '@esbuild/win32-ia32@0.16.4': ··· 9259 10710 '@esbuild/win32-ia32@0.19.12': 9260 10711 optional: true 9261 10712 10713 + '@esbuild/win32-ia32@0.21.3': 10714 + optional: true 10715 + 9262 10716 '@esbuild/win32-x64@0.16.4': 9263 10717 optional: true 9264 10718 ··· 9271 10725 '@esbuild/win32-x64@0.19.12': 9272 10726 optional: true 9273 10727 10728 + '@esbuild/win32-x64@0.21.3': 10729 + optional: true 10730 + 10731 + '@eslint-community/eslint-utils@4.4.0(eslint@8.36.0)': 10732 + dependencies: 10733 + eslint: 8.36.0 10734 + eslint-visitor-keys: 3.4.3 10735 + 10736 + '@eslint-community/regexpp@4.10.0': {} 10737 + 10738 + '@eslint/eslintrc@2.1.4': 10739 + dependencies: 10740 + ajv: 6.12.6 10741 + debug: 4.3.4 10742 + espree: 9.6.1 10743 + globals: 13.24.0 10744 + ignore: 5.2.4 10745 + import-fresh: 3.3.0 10746 + js-yaml: 4.1.0 10747 + minimatch: 3.1.2 10748 + strip-json-comments: 3.1.1 10749 + transitivePeerDependencies: 10750 + - supports-color 10751 + 10752 + '@eslint/js@8.36.0': {} 10753 + 9274 10754 '@fal-works/esbuild-plugin-global-externals@2.1.2': {} 9275 10755 9276 10756 '@fastify/busboy@2.1.1': {} 9277 10757 10758 + '@floating-ui/core@0.7.3': {} 10759 + 9278 10760 '@floating-ui/core@1.5.0': 9279 10761 dependencies: 9280 10762 '@floating-ui/utils': 0.1.6 9281 10763 10764 + '@floating-ui/dom@0.5.4': 10765 + dependencies: 10766 + '@floating-ui/core': 0.7.3 10767 + 9282 10768 '@floating-ui/dom@1.5.3': 9283 10769 dependencies: 9284 10770 '@floating-ui/core': 1.5.0 9285 10771 '@floating-ui/utils': 0.1.6 9286 10772 10773 + '@floating-ui/react-dom@0.7.2(@types/react@18.0.25)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 10774 + dependencies: 10775 + '@floating-ui/dom': 0.5.4 10776 + react: 18.2.0 10777 + react-dom: 18.2.0(react@18.2.0) 10778 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.25)(react@18.2.0) 10779 + transitivePeerDependencies: 10780 + - '@types/react' 10781 + 9287 10782 '@floating-ui/react-dom@1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 9288 10783 dependencies: 9289 10784 '@floating-ui/dom': 1.5.3 9290 10785 react: 18.2.0 9291 10786 react-dom: 18.2.0(react@18.2.0) 9292 10787 9293 - '@floating-ui/react-dom@2.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 10788 + '@floating-ui/react-dom@2.0.2(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 9294 10789 dependencies: 9295 10790 '@floating-ui/dom': 1.5.3 9296 10791 react: 18.2.0 9297 - react-dom: 18.2.0(react@18.2.0) 10792 + react-dom: 18.3.1(react@18.2.0) 9298 10793 9299 10794 '@floating-ui/react@0.19.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 9300 10795 dependencies: ··· 9342 10837 react: 18.2.0 9343 10838 react-dom: 18.2.0(react@18.2.0) 9344 10839 9345 - '@headlessui/tailwindcss@0.2.0(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)))': 10840 + '@headlessui/tailwindcss@0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)))': 9346 10841 dependencies: 9347 - tailwindcss: 3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 10842 + tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 9348 10843 9349 10844 '@hono/sentry@1.1.0(hono@4.0.0)': 9350 10845 dependencies: ··· 9372 10867 dependencies: 9373 10868 react-hook-form: 7.47.0(react@18.2.0) 9374 10869 10870 + '@humanwhocodes/config-array@0.11.14': 10871 + dependencies: 10872 + '@humanwhocodes/object-schema': 2.0.3 10873 + debug: 4.3.4 10874 + minimatch: 3.1.2 10875 + transitivePeerDependencies: 10876 + - supports-color 10877 + 10878 + '@humanwhocodes/module-importer@1.0.1': {} 10879 + 10880 + '@humanwhocodes/object-schema@2.0.3': {} 10881 + 9375 10882 '@isaacs/cliui@8.0.2': 9376 10883 dependencies: 9377 10884 string-width: 5.1.2 ··· 9453 10960 - bufferutil 9454 10961 - utf-8-validate 9455 10962 10963 + '@libsql/client@0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)': 10964 + dependencies: 10965 + '@libsql/core': 0.6.0 10966 + '@libsql/hrana-client': 0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 10967 + js-base64: 3.7.5 10968 + libsql: 0.3.10 10969 + transitivePeerDependencies: 10970 + - bufferutil 10971 + - utf-8-validate 10972 + 9456 10973 '@libsql/core@0.6.0': 9457 10974 dependencies: 9458 10975 js-base64: 3.7.5 ··· 9473 10990 - bufferutil 9474 10991 - utf-8-validate 9475 10992 10993 + '@libsql/hrana-client@0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)': 10994 + dependencies: 10995 + '@libsql/isomorphic-fetch': 0.2.1 10996 + '@libsql/isomorphic-ws': 0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) 10997 + js-base64: 3.7.5 10998 + node-fetch: 3.3.2 10999 + transitivePeerDependencies: 11000 + - bufferutil 11001 + - utf-8-validate 11002 + 9476 11003 '@libsql/isomorphic-fetch@0.2.1': {} 9477 11004 9478 11005 '@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)': ··· 9483 11010 - bufferutil 9484 11011 - utf-8-validate 9485 11012 11013 + '@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.4)': 11014 + dependencies: 11015 + '@types/ws': 8.5.8 11016 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) 11017 + transitivePeerDependencies: 11018 + - bufferutil 11019 + - utf-8-validate 11020 + 9486 11021 '@libsql/linux-arm64-gnu@0.3.10': 9487 11022 optional: true 9488 11023 ··· 9515 11050 dependencies: 9516 11051 unist-util-visit: 1.4.1 9517 11052 9518 - '@mdx-js/esbuild@2.3.0(esbuild@0.19.12)': 11053 + '@mdx-js/esbuild@2.3.0(esbuild@0.21.3)': 9519 11054 dependencies: 9520 11055 '@mdx-js/mdx': 2.3.0 9521 - esbuild: 0.19.12 11056 + esbuild: 0.21.3 9522 11057 node-fetch: 3.3.2 9523 11058 vfile: 5.3.7 9524 11059 transitivePeerDependencies: ··· 9546 11081 transitivePeerDependencies: 9547 11082 - supports-color 9548 11083 11084 + '@motionone/animation@10.17.0': 11085 + dependencies: 11086 + '@motionone/easing': 10.17.0 11087 + '@motionone/types': 10.17.0 11088 + '@motionone/utils': 10.17.0 11089 + tslib: 2.6.2 11090 + 11091 + '@motionone/dom@10.17.0': 11092 + dependencies: 11093 + '@motionone/animation': 10.17.0 11094 + '@motionone/generators': 10.17.0 11095 + '@motionone/types': 10.17.0 11096 + '@motionone/utils': 10.17.0 11097 + hey-listen: 1.0.8 11098 + tslib: 2.6.2 11099 + 11100 + '@motionone/easing@10.17.0': 11101 + dependencies: 11102 + '@motionone/utils': 10.17.0 11103 + tslib: 2.6.2 11104 + 11105 + '@motionone/generators@10.17.0': 11106 + dependencies: 11107 + '@motionone/types': 10.17.0 11108 + '@motionone/utils': 10.17.0 11109 + tslib: 2.6.2 11110 + 11111 + '@motionone/types@10.17.0': {} 11112 + 11113 + '@motionone/utils@10.17.0': 11114 + dependencies: 11115 + '@motionone/types': 10.17.0 11116 + hey-listen: 1.0.8 11117 + tslib: 2.6.2 11118 + 9549 11119 '@neon-rs/load@0.0.4': {} 9550 11120 11121 + '@next/env@13.2.4': {} 11122 + 9551 11123 '@next/env@14.2.3': {} 9552 11124 11125 + '@next/eslint-plugin-next@13.2.4': 11126 + dependencies: 11127 + glob: 7.1.7 11128 + 11129 + '@next/swc-android-arm-eabi@13.2.4': 11130 + optional: true 11131 + 11132 + '@next/swc-android-arm64@13.2.4': 11133 + optional: true 11134 + 11135 + '@next/swc-darwin-arm64@13.2.4': 11136 + optional: true 11137 + 9553 11138 '@next/swc-darwin-arm64@14.2.3': 9554 11139 optional: true 9555 11140 11141 + '@next/swc-darwin-x64@13.2.4': 11142 + optional: true 11143 + 9556 11144 '@next/swc-darwin-x64@14.2.3': 9557 11145 optional: true 9558 11146 11147 + '@next/swc-freebsd-x64@13.2.4': 11148 + optional: true 11149 + 11150 + '@next/swc-linux-arm-gnueabihf@13.2.4': 11151 + optional: true 11152 + 11153 + '@next/swc-linux-arm64-gnu@13.2.4': 11154 + optional: true 11155 + 9559 11156 '@next/swc-linux-arm64-gnu@14.2.3': 9560 11157 optional: true 9561 11158 11159 + '@next/swc-linux-arm64-musl@13.2.4': 11160 + optional: true 11161 + 9562 11162 '@next/swc-linux-arm64-musl@14.2.3': 9563 11163 optional: true 9564 11164 11165 + '@next/swc-linux-x64-gnu@13.2.4': 11166 + optional: true 11167 + 9565 11168 '@next/swc-linux-x64-gnu@14.2.3': 11169 + optional: true 11170 + 11171 + '@next/swc-linux-x64-musl@13.2.4': 9566 11172 optional: true 9567 11173 9568 11174 '@next/swc-linux-x64-musl@14.2.3': 9569 11175 optional: true 9570 11176 11177 + '@next/swc-win32-arm64-msvc@13.2.4': 11178 + optional: true 11179 + 9571 11180 '@next/swc-win32-arm64-msvc@14.2.3': 9572 11181 optional: true 9573 11182 11183 + '@next/swc-win32-ia32-msvc@13.2.4': 11184 + optional: true 11185 + 9574 11186 '@next/swc-win32-ia32-msvc@14.2.3': 11187 + optional: true 11188 + 11189 + '@next/swc-win32-x64-msvc@13.2.4': 9575 11190 optional: true 9576 11191 9577 11192 '@next/swc-win32-x64-msvc@14.2.3': ··· 9691 11306 9692 11307 '@opentelemetry/api-logs@0.39.1': 9693 11308 dependencies: 9694 - '@opentelemetry/api': 1.4.1 11309 + '@opentelemetry/api': 1.8.0 9695 11310 9696 11311 '@opentelemetry/api@1.4.1': {} 11312 + 11313 + '@opentelemetry/api@1.8.0': {} 9697 11314 9698 11315 '@opentelemetry/context-async-hooks@1.13.0(@opentelemetry/api@1.4.1)': 9699 11316 dependencies: ··· 9814 11431 9815 11432 '@protobufjs/utf8@1.1.0': {} 9816 11433 11434 + '@radix-ui/colors@0.1.8': {} 11435 + 9817 11436 '@radix-ui/number@1.0.1': 9818 11437 dependencies: 9819 11438 '@babel/runtime': 7.23.2 ··· 9826 11445 dependencies: 9827 11446 '@babel/runtime': 7.23.2 9828 11447 9829 - '@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11448 + '@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 9830 11449 dependencies: 9831 11450 '@babel/runtime': 7.23.2 9832 11451 '@radix-ui/primitive': 1.0.1 9833 - '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 9834 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11452 + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11453 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 9835 11454 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9836 11455 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9837 11456 '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9838 11457 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9839 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11458 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 9840 11459 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9841 11460 react: 18.2.0 9842 - react-dom: 18.2.0(react@18.2.0) 11461 + react-dom: 18.3.1(react@18.2.0) 9843 11462 optionalDependencies: 9844 11463 '@types/react': 18.2.64 9845 11464 '@types/react-dom': 18.2.21 9846 11465 9847 - '@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11466 + '@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 9848 11467 dependencies: 9849 11468 '@babel/runtime': 7.23.2 9850 11469 '@radix-ui/primitive': 1.0.1 9851 11470 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9852 11471 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9853 - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 9854 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11472 + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11473 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 9855 11474 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 9856 11475 react: 18.2.0 9857 - react-dom: 18.2.0(react@18.2.0) 11476 + react-dom: 18.3.1(react@18.2.0) 9858 11477 optionalDependencies: 9859 11478 '@types/react': 18.2.64 9860 11479 '@types/react-dom': 18.2.21 9861 11480 9862 - '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11481 + '@radix-ui/react-arrow@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 9863 11482 dependencies: 9864 11483 '@babel/runtime': 7.23.2 9865 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11484 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 9866 11485 react: 18.2.0 9867 11486 react-dom: 18.2.0(react@18.2.0) 11487 + 11488 + '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 11489 + dependencies: 11490 + '@babel/runtime': 7.23.2 11491 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11492 + react: 18.2.0 11493 + react-dom: 18.3.1(react@18.2.0) 9868 11494 optionalDependencies: 9869 11495 '@types/react': 18.2.64 9870 11496 '@types/react-dom': 18.2.21 9871 11497 9872 - '@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11498 + '@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 9873 11499 dependencies: 9874 11500 '@babel/runtime': 7.23.2 9875 11501 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9876 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11502 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 9877 11503 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9878 11504 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9879 11505 react: 18.2.0 9880 - react-dom: 18.2.0(react@18.2.0) 11506 + react-dom: 18.3.1(react@18.2.0) 9881 11507 optionalDependencies: 9882 11508 '@types/react': 18.2.64 9883 11509 '@types/react-dom': 18.2.21 9884 11510 9885 - '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11511 + '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 9886 11512 dependencies: 9887 11513 '@babel/runtime': 7.23.2 9888 11514 '@radix-ui/primitive': 1.0.1 9889 11515 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9890 11516 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9891 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 9892 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11517 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11518 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 9893 11519 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9894 11520 '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9895 11521 '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9896 11522 react: 18.2.0 9897 - react-dom: 18.2.0(react@18.2.0) 11523 + react-dom: 18.3.1(react@18.2.0) 9898 11524 optionalDependencies: 9899 11525 '@types/react': 18.2.64 9900 11526 '@types/react-dom': 18.2.21 9901 11527 9902 - '@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11528 + '@radix-ui/react-collapsible@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11529 + dependencies: 11530 + '@babel/runtime': 7.23.2 11531 + '@radix-ui/primitive': 1.0.0 11532 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 11533 + '@radix-ui/react-context': 1.0.0(react@18.2.0) 11534 + '@radix-ui/react-id': 1.0.0(react@18.2.0) 11535 + '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11536 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11537 + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) 11538 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) 11539 + react: 18.2.0 11540 + react-dom: 18.2.0(react@18.2.0) 11541 + 11542 + '@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 9903 11543 dependencies: 9904 11544 '@babel/runtime': 7.23.2 9905 11545 '@radix-ui/primitive': 1.0.1 9906 11546 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9907 11547 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9908 11548 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9909 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 9910 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11549 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11550 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 9911 11551 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9912 11552 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9913 11553 react: 18.2.0 9914 - react-dom: 18.2.0(react@18.2.0) 11554 + react-dom: 18.3.1(react@18.2.0) 9915 11555 optionalDependencies: 9916 11556 '@types/react': 18.2.64 9917 11557 '@types/react-dom': 18.2.21 9918 11558 9919 - '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11559 + '@radix-ui/react-collection@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11560 + dependencies: 11561 + '@babel/runtime': 7.23.2 11562 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 11563 + '@radix-ui/react-context': 1.0.0(react@18.2.0) 11564 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11565 + '@radix-ui/react-slot': 1.0.1(react@18.2.0) 11566 + react: 18.2.0 11567 + react-dom: 18.2.0(react@18.2.0) 11568 + 11569 + '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 9920 11570 dependencies: 9921 11571 '@babel/runtime': 7.23.2 9922 11572 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9923 11573 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9924 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11574 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 9925 11575 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 9926 11576 react: 18.2.0 9927 - react-dom: 18.2.0(react@18.2.0) 11577 + react-dom: 18.3.1(react@18.2.0) 9928 11578 optionalDependencies: 9929 11579 '@types/react': 18.2.64 9930 11580 '@types/react-dom': 18.2.21 ··· 9941 11591 optionalDependencies: 9942 11592 '@types/react': 18.2.64 9943 11593 9944 - '@radix-ui/react-context-menu@2.1.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11594 + '@radix-ui/react-context-menu@2.1.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 9945 11595 dependencies: 9946 11596 '@babel/runtime': 7.23.2 9947 11597 '@radix-ui/primitive': 1.0.1 9948 11598 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9949 - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 9950 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11599 + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11600 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 9951 11601 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9952 11602 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9953 11603 react: 18.2.0 9954 - react-dom: 18.2.0(react@18.2.0) 11604 + react-dom: 18.3.1(react@18.2.0) 9955 11605 optionalDependencies: 9956 11606 '@types/react': 18.2.64 9957 11607 '@types/react-dom': 18.2.21 ··· 9990 11640 transitivePeerDependencies: 9991 11641 - '@types/react' 9992 11642 9993 - '@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11643 + '@radix-ui/react-dialog@1.0.0(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 11644 + dependencies: 11645 + '@babel/runtime': 7.23.2 11646 + '@radix-ui/primitive': 1.0.0 11647 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 11648 + '@radix-ui/react-context': 1.0.0(react@18.2.0) 11649 + '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11650 + '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0) 11651 + '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11652 + '@radix-ui/react-id': 1.0.0(react@18.2.0) 11653 + '@radix-ui/react-portal': 1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11654 + '@radix-ui/react-presence': 1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11655 + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11656 + '@radix-ui/react-slot': 1.0.0(react@18.2.0) 11657 + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) 11658 + aria-hidden: 1.2.3 11659 + react: 18.2.0 11660 + react-dom: 18.3.1(react@18.2.0) 11661 + react-remove-scroll: 2.5.4(@types/react@18.2.64)(react@18.2.0) 11662 + transitivePeerDependencies: 11663 + - '@types/react' 11664 + 11665 + '@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 9994 11666 dependencies: 9995 11667 '@babel/runtime': 7.23.2 9996 11668 '@radix-ui/primitive': 1.0.1 9997 11669 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9998 11670 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 9999 - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11671 + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10000 11672 '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10001 - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11673 + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10002 11674 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10003 - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10004 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10005 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11675 + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11676 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11677 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10006 11678 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 10007 11679 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10008 11680 aria-hidden: 1.2.3 10009 11681 react: 18.2.0 10010 - react-dom: 18.2.0(react@18.2.0) 11682 + react-dom: 18.3.1(react@18.2.0) 10011 11683 react-remove-scroll: 2.5.5(@types/react@18.2.64)(react@18.2.0) 10012 11684 optionalDependencies: 10013 11685 '@types/react': 18.2.64 10014 11686 '@types/react-dom': 18.2.21 10015 11687 10016 - '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11688 + '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10017 11689 dependencies: 10018 11690 '@babel/runtime': 7.23.2 10019 11691 '@radix-ui/primitive': 1.0.1 10020 11692 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10021 11693 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10022 - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11694 + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10023 11695 '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10024 - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11696 + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10025 11697 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10026 - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10027 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10028 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11698 + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11699 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11700 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10029 11701 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 10030 11702 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10031 11703 aria-hidden: 1.2.3 10032 11704 react: 18.2.0 10033 - react-dom: 18.2.0(react@18.2.0) 11705 + react-dom: 18.3.1(react@18.2.0) 10034 11706 react-remove-scroll: 2.5.5(@types/react@18.2.64)(react@18.2.0) 10035 11707 optionalDependencies: 10036 11708 '@types/react': 18.2.64 10037 11709 '@types/react-dom': 18.2.21 11710 + 11711 + '@radix-ui/react-direction@1.0.0(react@18.2.0)': 11712 + dependencies: 11713 + '@babel/runtime': 7.23.2 11714 + react: 18.2.0 10038 11715 10039 11716 '@radix-ui/react-direction@1.0.1(@types/react@18.2.64)(react@18.2.0)': 10040 11717 dependencies: ··· 10054 11731 react: 18.2.0 10055 11732 react-dom: 18.2.0(react@18.2.0) 10056 11733 10057 - '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11734 + '@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 11735 + dependencies: 11736 + '@babel/runtime': 7.23.2 11737 + '@radix-ui/primitive': 1.0.0 11738 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 11739 + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11740 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) 11741 + '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.2.0) 11742 + react: 18.2.0 11743 + react-dom: 18.3.1(react@18.2.0) 11744 + 11745 + '@radix-ui/react-dismissable-layer@1.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11746 + dependencies: 11747 + '@babel/runtime': 7.23.2 11748 + '@radix-ui/primitive': 1.0.0 11749 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 11750 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11751 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) 11752 + '@radix-ui/react-use-escape-keydown': 1.0.2(react@18.2.0) 11753 + react: 18.2.0 11754 + react-dom: 18.2.0(react@18.2.0) 11755 + 11756 + '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10058 11757 dependencies: 10059 11758 '@babel/runtime': 7.23.2 10060 11759 '@radix-ui/primitive': 1.0.1 10061 11760 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10062 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11761 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10063 11762 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10064 11763 '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.64)(react@18.2.0) 10065 11764 react: 18.2.0 10066 - react-dom: 18.2.0(react@18.2.0) 11765 + react-dom: 18.3.1(react@18.2.0) 10067 11766 optionalDependencies: 10068 11767 '@types/react': 18.2.64 10069 11768 '@types/react-dom': 18.2.21 10070 11769 10071 - '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11770 + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10072 11771 dependencies: 10073 11772 '@babel/runtime': 7.23.2 10074 11773 '@radix-ui/primitive': 1.0.1 10075 11774 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10076 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11775 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10077 11776 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10078 11777 '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.64)(react@18.2.0) 10079 11778 react: 18.2.0 10080 - react-dom: 18.2.0(react@18.2.0) 11779 + react-dom: 18.3.1(react@18.2.0) 10081 11780 optionalDependencies: 10082 11781 '@types/react': 18.2.64 10083 11782 '@types/react-dom': 18.2.21 10084 11783 10085 - '@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11784 + '@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10086 11785 dependencies: 10087 11786 '@babel/runtime': 7.23.2 10088 11787 '@radix-ui/primitive': 1.0.1 10089 11788 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10090 11789 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10091 11790 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10092 - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10093 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11791 + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11792 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10094 11793 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10095 11794 react: 18.2.0 10096 - react-dom: 18.2.0(react@18.2.0) 11795 + react-dom: 18.3.1(react@18.2.0) 10097 11796 optionalDependencies: 10098 11797 '@types/react': 18.2.64 10099 11798 '@types/react-dom': 18.2.21 ··· 10119 11818 react: 18.2.0 10120 11819 react-dom: 18.2.0(react@18.2.0) 10121 11820 10122 - '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11821 + '@radix-ui/react-focus-scope@1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 11822 + dependencies: 11823 + '@babel/runtime': 7.23.2 11824 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 11825 + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11826 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) 11827 + react: 18.2.0 11828 + react-dom: 18.3.1(react@18.2.0) 11829 + 11830 + '@radix-ui/react-focus-scope@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11831 + dependencies: 11832 + '@babel/runtime': 7.23.2 11833 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 11834 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11835 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) 11836 + react: 18.2.0 11837 + react-dom: 18.2.0(react@18.2.0) 11838 + 11839 + '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10123 11840 dependencies: 10124 11841 '@babel/runtime': 7.23.2 10125 11842 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10126 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11843 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10127 11844 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10128 11845 react: 18.2.0 10129 - react-dom: 18.2.0(react@18.2.0) 11846 + react-dom: 18.3.1(react@18.2.0) 10130 11847 optionalDependencies: 10131 11848 '@types/react': 18.2.64 10132 11849 '@types/react-dom': 18.2.21 10133 11850 10134 - '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11851 + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10135 11852 dependencies: 10136 11853 '@babel/runtime': 7.23.2 10137 11854 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10138 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11855 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10139 11856 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10140 11857 react: 18.2.0 10141 - react-dom: 18.2.0(react@18.2.0) 11858 + react-dom: 18.3.1(react@18.2.0) 10142 11859 optionalDependencies: 10143 11860 '@types/react': 18.2.64 10144 11861 '@types/react-dom': 18.2.21 10145 11862 10146 - '@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11863 + '@radix-ui/react-hover-card@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10147 11864 dependencies: 10148 11865 '@babel/runtime': 7.23.2 10149 11866 '@radix-ui/primitive': 1.0.1 10150 11867 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10151 11868 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10152 - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10153 - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10154 - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10155 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10156 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11869 + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11870 + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11871 + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11872 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11873 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10157 11874 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10158 11875 react: 18.2.0 10159 - react-dom: 18.2.0(react@18.2.0) 11876 + react-dom: 18.3.1(react@18.2.0) 10160 11877 optionalDependencies: 10161 11878 '@types/react': 18.2.64 10162 11879 '@types/react-dom': 18.2.21 ··· 10175 11892 optionalDependencies: 10176 11893 '@types/react': 18.2.64 10177 11894 10178 - '@radix-ui/react-label@2.0.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11895 + '@radix-ui/react-label@2.0.2(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10179 11896 dependencies: 10180 11897 '@babel/runtime': 7.23.2 10181 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11898 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10182 11899 react: 18.2.0 10183 - react-dom: 18.2.0(react@18.2.0) 11900 + react-dom: 18.3.1(react@18.2.0) 10184 11901 optionalDependencies: 10185 11902 '@types/react': 18.2.64 10186 11903 '@types/react-dom': 18.2.21 10187 11904 10188 - '@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11905 + '@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10189 11906 dependencies: 10190 11907 '@babel/runtime': 7.23.2 10191 11908 '@radix-ui/primitive': 1.0.1 10192 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11909 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10193 11910 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10194 11911 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10195 11912 '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10196 - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11913 + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10197 11914 '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10198 - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11915 + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10199 11916 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10200 - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10201 - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10202 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10203 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10204 - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11917 + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11918 + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11919 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11920 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11921 + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10205 11922 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 10206 11923 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10207 11924 aria-hidden: 1.2.3 10208 11925 react: 18.2.0 10209 - react-dom: 18.2.0(react@18.2.0) 11926 + react-dom: 18.3.1(react@18.2.0) 10210 11927 react-remove-scroll: 2.5.5(@types/react@18.2.64)(react@18.2.0) 10211 11928 optionalDependencies: 10212 11929 '@types/react': 18.2.64 10213 11930 '@types/react-dom': 18.2.21 10214 11931 10215 - '@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11932 + '@radix-ui/react-popover@1.0.2(@types/react@18.0.25)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11933 + dependencies: 11934 + '@babel/runtime': 7.23.2 11935 + '@radix-ui/primitive': 1.0.0 11936 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 11937 + '@radix-ui/react-context': 1.0.0(react@18.2.0) 11938 + '@radix-ui/react-dismissable-layer': 1.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11939 + '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0) 11940 + '@radix-ui/react-focus-scope': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11941 + '@radix-ui/react-id': 1.0.0(react@18.2.0) 11942 + '@radix-ui/react-popper': 1.0.1(@types/react@18.0.25)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11943 + '@radix-ui/react-portal': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11944 + '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11945 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11946 + '@radix-ui/react-slot': 1.0.1(react@18.2.0) 11947 + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) 11948 + aria-hidden: 1.2.3 11949 + react: 18.2.0 11950 + react-dom: 18.2.0(react@18.2.0) 11951 + react-remove-scroll: 2.5.5(@types/react@18.0.25)(react@18.2.0) 11952 + transitivePeerDependencies: 11953 + - '@types/react' 11954 + 11955 + '@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10216 11956 dependencies: 10217 11957 '@babel/runtime': 7.23.2 10218 11958 '@radix-ui/primitive': 1.0.1 10219 11959 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10220 11960 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10221 - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11961 + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10222 11962 '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10223 - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11963 + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10224 11964 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10225 - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10226 - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10227 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10228 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11965 + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11966 + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11967 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 11968 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10229 11969 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 10230 11970 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10231 11971 aria-hidden: 1.2.3 10232 11972 react: 18.2.0 10233 - react-dom: 18.2.0(react@18.2.0) 11973 + react-dom: 18.3.1(react@18.2.0) 10234 11974 react-remove-scroll: 2.5.5(@types/react@18.2.64)(react@18.2.0) 10235 11975 optionalDependencies: 10236 11976 '@types/react': 18.2.64 10237 11977 '@types/react-dom': 18.2.21 10238 11978 10239 - '@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11979 + '@radix-ui/react-popper@1.0.1(@types/react@18.0.25)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11980 + dependencies: 11981 + '@babel/runtime': 7.23.2 11982 + '@floating-ui/react-dom': 0.7.2(@types/react@18.0.25)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11983 + '@radix-ui/react-arrow': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11984 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 11985 + '@radix-ui/react-context': 1.0.0(react@18.2.0) 11986 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11987 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) 11988 + '@radix-ui/react-use-rect': 1.0.0(react@18.2.0) 11989 + '@radix-ui/react-use-size': 1.0.0(react@18.2.0) 11990 + '@radix-ui/rect': 1.0.0 11991 + react: 18.2.0 11992 + react-dom: 18.2.0(react@18.2.0) 11993 + transitivePeerDependencies: 11994 + - '@types/react' 11995 + 11996 + '@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10240 11997 dependencies: 10241 11998 '@babel/runtime': 7.23.2 10242 - '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10243 - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11999 + '@floating-ui/react-dom': 2.0.2(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12000 + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10244 12001 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10245 12002 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10246 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12003 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10247 12004 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10248 12005 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10249 12006 '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10250 12007 '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10251 12008 '@radix-ui/rect': 1.0.1 10252 12009 react: 18.2.0 10253 - react-dom: 18.2.0(react@18.2.0) 12010 + react-dom: 18.3.1(react@18.2.0) 10254 12011 optionalDependencies: 10255 12012 '@types/react': 18.2.64 10256 12013 '@types/react-dom': 18.2.21 ··· 10262 12019 react: 18.2.0 10263 12020 react-dom: 18.2.0(react@18.2.0) 10264 12021 10265 - '@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12022 + '@radix-ui/react-portal@1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 12023 + dependencies: 12024 + '@babel/runtime': 7.23.2 12025 + '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12026 + react: 18.2.0 12027 + react-dom: 18.3.1(react@18.2.0) 12028 + 12029 + '@radix-ui/react-portal@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 10266 12030 dependencies: 10267 12031 '@babel/runtime': 7.23.2 10268 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12032 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10269 12033 react: 18.2.0 10270 12034 react-dom: 18.2.0(react@18.2.0) 12035 + 12036 + '@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 12037 + dependencies: 12038 + '@babel/runtime': 7.23.2 12039 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12040 + react: 18.2.0 12041 + react-dom: 18.3.1(react@18.2.0) 10271 12042 optionalDependencies: 10272 12043 '@types/react': 18.2.64 10273 12044 '@types/react-dom': 18.2.21 10274 12045 10275 - '@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12046 + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10276 12047 dependencies: 10277 12048 '@babel/runtime': 7.23.2 10278 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12049 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10279 12050 react: 18.2.0 10280 - react-dom: 18.2.0(react@18.2.0) 12051 + react-dom: 18.3.1(react@18.2.0) 10281 12052 optionalDependencies: 10282 12053 '@types/react': 18.2.64 10283 12054 '@types/react-dom': 18.2.21 ··· 10290 12061 react: 18.2.0 10291 12062 react-dom: 18.2.0(react@18.2.0) 10292 12063 10293 - '@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12064 + '@radix-ui/react-presence@1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 12065 + dependencies: 12066 + '@babel/runtime': 7.23.2 12067 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 12068 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) 12069 + react: 18.2.0 12070 + react-dom: 18.3.1(react@18.2.0) 12071 + 12072 + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10294 12073 dependencies: 10295 12074 '@babel/runtime': 7.23.2 10296 12075 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10297 12076 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10298 12077 react: 18.2.0 10299 - react-dom: 18.2.0(react@18.2.0) 12078 + react-dom: 18.3.1(react@18.2.0) 10300 12079 optionalDependencies: 10301 12080 '@types/react': 18.2.64 10302 12081 '@types/react-dom': 18.2.21 ··· 10308 12087 react: 18.2.0 10309 12088 react-dom: 18.2.0(react@18.2.0) 10310 12089 10311 - '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12090 + '@radix-ui/react-primitive@1.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10312 12091 dependencies: 10313 12092 '@babel/runtime': 7.23.2 10314 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 12093 + '@radix-ui/react-slot': 1.0.0(react@18.2.0) 12094 + react: 18.2.0 12095 + react-dom: 18.3.1(react@18.2.0) 12096 + 12097 + '@radix-ui/react-primitive@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12098 + dependencies: 12099 + '@babel/runtime': 7.23.2 12100 + '@radix-ui/react-slot': 1.0.1(react@18.2.0) 10315 12101 react: 18.2.0 10316 12102 react-dom: 18.2.0(react@18.2.0) 12103 + 12104 + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 12105 + dependencies: 12106 + '@babel/runtime': 7.23.2 12107 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 12108 + react: 18.2.0 12109 + react-dom: 18.3.1(react@18.2.0) 10317 12110 optionalDependencies: 10318 12111 '@types/react': 18.2.64 10319 12112 '@types/react-dom': 18.2.21 10320 12113 10321 - '@radix-ui/react-progress@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12114 + '@radix-ui/react-progress@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10322 12115 dependencies: 10323 12116 '@babel/runtime': 7.23.2 10324 12117 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10325 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12118 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10326 12119 react: 18.2.0 10327 - react-dom: 18.2.0(react@18.2.0) 12120 + react-dom: 18.3.1(react@18.2.0) 10328 12121 optionalDependencies: 10329 12122 '@types/react': 18.2.64 10330 12123 '@types/react-dom': 18.2.21 10331 12124 10332 - '@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12125 + '@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10333 12126 dependencies: 10334 12127 '@babel/runtime': 7.23.2 10335 12128 '@radix-ui/primitive': 1.0.1 10336 12129 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10337 12130 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10338 12131 '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10339 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10340 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10341 - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12132 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12133 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12134 + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10342 12135 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10343 12136 '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10344 12137 '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10345 12138 react: 18.2.0 10346 - react-dom: 18.2.0(react@18.2.0) 12139 + react-dom: 18.3.1(react@18.2.0) 10347 12140 optionalDependencies: 10348 12141 '@types/react': 18.2.64 10349 12142 '@types/react-dom': 18.2.21 10350 12143 10351 - '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12144 + '@radix-ui/react-roving-focus@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12145 + dependencies: 12146 + '@babel/runtime': 7.23.2 12147 + '@radix-ui/primitive': 1.0.0 12148 + '@radix-ui/react-collection': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12149 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 12150 + '@radix-ui/react-context': 1.0.0(react@18.2.0) 12151 + '@radix-ui/react-direction': 1.0.0(react@18.2.0) 12152 + '@radix-ui/react-id': 1.0.0(react@18.2.0) 12153 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12154 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) 12155 + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) 12156 + react: 18.2.0 12157 + react-dom: 18.2.0(react@18.2.0) 12158 + 12159 + '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10352 12160 dependencies: 10353 12161 '@babel/runtime': 7.23.2 10354 12162 '@radix-ui/primitive': 1.0.1 10355 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12163 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10356 12164 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10357 12165 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10358 12166 '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10359 12167 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10360 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12168 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10361 12169 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10362 12170 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10363 12171 react: 18.2.0 10364 - react-dom: 18.2.0(react@18.2.0) 12172 + react-dom: 18.3.1(react@18.2.0) 10365 12173 optionalDependencies: 10366 12174 '@types/react': 18.2.64 10367 12175 '@types/react-dom': 18.2.21 10368 12176 10369 - '@radix-ui/react-select@2.0.0(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12177 + '@radix-ui/react-select@2.0.0(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10370 12178 dependencies: 10371 12179 '@babel/runtime': 7.23.2 10372 12180 '@radix-ui/number': 1.0.1 10373 12181 '@radix-ui/primitive': 1.0.1 10374 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12182 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10375 12183 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10376 12184 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10377 12185 '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10378 - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12186 + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10379 12187 '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10380 - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12188 + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10381 12189 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10382 - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10383 - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10384 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12190 + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12191 + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12192 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10385 12193 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 10386 12194 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10387 12195 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10388 12196 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10389 12197 '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10390 - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12198 + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10391 12199 aria-hidden: 1.2.3 10392 12200 react: 18.2.0 10393 - react-dom: 18.2.0(react@18.2.0) 12201 + react-dom: 18.3.1(react@18.2.0) 10394 12202 react-remove-scroll: 2.5.5(@types/react@18.2.64)(react@18.2.0) 10395 12203 optionalDependencies: 10396 12204 '@types/react': 18.2.64 10397 12205 '@types/react-dom': 18.2.21 10398 12206 10399 - '@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12207 + '@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10400 12208 dependencies: 10401 12209 '@babel/runtime': 7.23.2 10402 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12210 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10403 12211 react: 18.2.0 10404 - react-dom: 18.2.0(react@18.2.0) 12212 + react-dom: 18.3.1(react@18.2.0) 10405 12213 optionalDependencies: 10406 12214 '@types/react': 18.2.64 10407 12215 '@types/react-dom': 18.2.21 ··· 10412 12220 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 10413 12221 react: 18.2.0 10414 12222 12223 + '@radix-ui/react-slot@1.0.1(react@18.2.0)': 12224 + dependencies: 12225 + '@babel/runtime': 7.23.2 12226 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 12227 + react: 18.2.0 12228 + 10415 12229 '@radix-ui/react-slot@1.0.2(@types/react@18.2.64)(react@18.2.0)': 10416 12230 dependencies: 10417 12231 '@babel/runtime': 7.23.2 ··· 10420 12234 optionalDependencies: 10421 12235 '@types/react': 18.2.64 10422 12236 10423 - '@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12237 + '@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10424 12238 dependencies: 10425 12239 '@babel/runtime': 7.23.2 10426 12240 '@radix-ui/primitive': 1.0.1 10427 12241 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10428 12242 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10429 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12243 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10430 12244 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10431 12245 '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10432 12246 '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10433 12247 react: 18.2.0 10434 - react-dom: 18.2.0(react@18.2.0) 12248 + react-dom: 18.3.1(react@18.2.0) 10435 12249 optionalDependencies: 10436 12250 '@types/react': 18.2.64 10437 12251 '@types/react-dom': 18.2.21 10438 12252 10439 - '@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12253 + '@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10440 12254 dependencies: 10441 12255 '@babel/runtime': 7.23.2 10442 12256 '@radix-ui/primitive': 1.0.1 10443 12257 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10444 12258 '@radix-ui/react-direction': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10445 12259 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10446 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10447 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10448 - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12260 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12261 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12262 + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10449 12263 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10450 12264 react: 18.2.0 10451 - react-dom: 18.2.0(react@18.2.0) 12265 + react-dom: 18.3.1(react@18.2.0) 10452 12266 optionalDependencies: 10453 12267 '@types/react': 18.2.64 10454 12268 '@types/react-dom': 18.2.21 10455 12269 10456 - '@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12270 + '@radix-ui/react-toggle-group@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12271 + dependencies: 12272 + '@babel/runtime': 7.23.2 12273 + '@radix-ui/primitive': 1.0.0 12274 + '@radix-ui/react-context': 1.0.0(react@18.2.0) 12275 + '@radix-ui/react-direction': 1.0.0(react@18.2.0) 12276 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12277 + '@radix-ui/react-roving-focus': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12278 + '@radix-ui/react-toggle': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12279 + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) 12280 + react: 18.2.0 12281 + react-dom: 18.2.0(react@18.2.0) 12282 + 12283 + '@radix-ui/react-toggle@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12284 + dependencies: 12285 + '@babel/runtime': 7.23.2 12286 + '@radix-ui/primitive': 1.0.0 12287 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12288 + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) 12289 + react: 18.2.0 12290 + react-dom: 18.2.0(react@18.2.0) 12291 + 12292 + '@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10457 12293 dependencies: 10458 12294 '@babel/runtime': 7.23.2 10459 12295 '@radix-ui/primitive': 1.0.1 10460 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12296 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10461 12297 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10462 12298 react: 18.2.0 10463 - react-dom: 18.2.0(react@18.2.0) 12299 + react-dom: 18.3.1(react@18.2.0) 10464 12300 optionalDependencies: 10465 12301 '@types/react': 18.2.64 10466 12302 '@types/react-dom': 18.2.21 10467 12303 10468 - '@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12304 + '@radix-ui/react-tooltip@1.0.2(@types/react@18.0.25)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12305 + dependencies: 12306 + '@babel/runtime': 7.23.2 12307 + '@radix-ui/primitive': 1.0.0 12308 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) 12309 + '@radix-ui/react-context': 1.0.0(react@18.2.0) 12310 + '@radix-ui/react-dismissable-layer': 1.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12311 + '@radix-ui/react-id': 1.0.0(react@18.2.0) 12312 + '@radix-ui/react-popper': 1.0.1(@types/react@18.0.25)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12313 + '@radix-ui/react-portal': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12314 + '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12315 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12316 + '@radix-ui/react-slot': 1.0.1(react@18.2.0) 12317 + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) 12318 + '@radix-ui/react-visually-hidden': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12319 + react: 18.2.0 12320 + react-dom: 18.2.0(react@18.2.0) 12321 + transitivePeerDependencies: 12322 + - '@types/react' 12323 + 12324 + '@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 10469 12325 dependencies: 10470 12326 '@babel/runtime': 7.23.2 10471 12327 '@radix-ui/primitive': 1.0.1 10472 12328 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10473 12329 '@radix-ui/react-context': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10474 - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12330 + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10475 12331 '@radix-ui/react-id': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10476 - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10477 - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10478 - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10479 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12332 + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12333 + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12334 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12335 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10480 12336 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.64)(react@18.2.0) 10481 12337 '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.64)(react@18.2.0) 10482 - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12338 + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 10483 12339 react: 18.2.0 10484 - react-dom: 18.2.0(react@18.2.0) 12340 + react-dom: 18.3.1(react@18.2.0) 10485 12341 optionalDependencies: 10486 12342 '@types/react': 18.2.64 10487 12343 '@types/react-dom': 18.2.21 ··· 10518 12374 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) 10519 12375 react: 18.2.0 10520 12376 12377 + '@radix-ui/react-use-escape-keydown@1.0.2(react@18.2.0)': 12378 + dependencies: 12379 + '@babel/runtime': 7.23.2 12380 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) 12381 + react: 18.2.0 12382 + 10521 12383 '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.64)(react@18.2.0)': 10522 12384 dependencies: 10523 12385 '@babel/runtime': 7.23.2 ··· 10544 12406 react: 18.2.0 10545 12407 optionalDependencies: 10546 12408 '@types/react': 18.2.64 12409 + 12410 + '@radix-ui/react-use-rect@1.0.0(react@18.2.0)': 12411 + dependencies: 12412 + '@babel/runtime': 7.23.2 12413 + '@radix-ui/rect': 1.0.0 12414 + react: 18.2.0 10547 12415 10548 12416 '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.64)(react@18.2.0)': 10549 12417 dependencies: ··· 10553 12421 optionalDependencies: 10554 12422 '@types/react': 18.2.64 10555 12423 12424 + '@radix-ui/react-use-size@1.0.0(react@18.2.0)': 12425 + dependencies: 12426 + '@babel/runtime': 7.23.2 12427 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) 12428 + react: 18.2.0 12429 + 10556 12430 '@radix-ui/react-use-size@1.0.1(@types/react@18.2.64)(react@18.2.0)': 10557 12431 dependencies: 10558 12432 '@babel/runtime': 7.23.2 ··· 10561 12435 optionalDependencies: 10562 12436 '@types/react': 18.2.64 10563 12437 10564 - '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 12438 + '@radix-ui/react-visually-hidden@1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 10565 12439 dependencies: 10566 12440 '@babel/runtime': 7.23.2 10567 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 12441 + '@radix-ui/react-primitive': 1.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 10568 12442 react: 18.2.0 10569 12443 react-dom: 18.2.0(react@18.2.0) 12444 + 12445 + '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 12446 + dependencies: 12447 + '@babel/runtime': 7.23.2 12448 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.21)(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 12449 + react: 18.2.0 12450 + react-dom: 18.3.1(react@18.2.0) 10570 12451 optionalDependencies: 10571 12452 '@types/react': 18.2.64 10572 12453 '@types/react-dom': 18.2.21 12454 + 12455 + '@radix-ui/rect@1.0.0': 12456 + dependencies: 12457 + '@babel/runtime': 7.23.2 10573 12458 10574 12459 '@radix-ui/rect@1.0.1': 10575 12460 dependencies: ··· 10591 12476 dependencies: 10592 12477 react: 18.2.0 10593 12478 10594 - '@react-email/components@0.0.7(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))': 12479 + '@react-email/components@0.0.7': 12480 + dependencies: 12481 + '@react-email/body': 0.0.2 12482 + '@react-email/button': 0.0.9 12483 + '@react-email/column': 0.0.7 12484 + '@react-email/container': 0.0.8 12485 + '@react-email/font': 0.0.2 12486 + '@react-email/head': 0.0.5 12487 + '@react-email/heading': 0.0.8 12488 + '@react-email/hr': 0.0.5 12489 + '@react-email/html': 0.0.4 12490 + '@react-email/img': 0.0.5 12491 + '@react-email/link': 0.0.5 12492 + '@react-email/preview': 0.0.6 12493 + '@react-email/render': 0.0.7 12494 + '@react-email/row': 0.0.5 12495 + '@react-email/section': 0.0.9 12496 + '@react-email/tailwind': 0.0.8 12497 + '@react-email/text': 0.0.5 12498 + react: 18.2.0 12499 + transitivePeerDependencies: 12500 + - ts-node 12501 + 12502 + '@react-email/components@0.0.7(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3))': 10595 12503 dependencies: 10596 12504 '@react-email/body': 0.0.2 10597 12505 '@react-email/button': 0.0.9 ··· 10608 12516 '@react-email/render': 0.0.7 10609 12517 '@react-email/row': 0.0.5 10610 12518 '@react-email/section': 0.0.9 10611 - '@react-email/tailwind': 0.0.8(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 12519 + '@react-email/tailwind': 0.0.8(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 12520 + '@react-email/text': 0.0.5 12521 + react: 18.2.0 12522 + transitivePeerDependencies: 12523 + - ts-node 12524 + 12525 + '@react-email/components@0.0.7(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))': 12526 + dependencies: 12527 + '@react-email/body': 0.0.2 12528 + '@react-email/button': 0.0.9 12529 + '@react-email/column': 0.0.7 12530 + '@react-email/container': 0.0.8 12531 + '@react-email/font': 0.0.2 12532 + '@react-email/head': 0.0.5 12533 + '@react-email/heading': 0.0.8 12534 + '@react-email/hr': 0.0.5 12535 + '@react-email/html': 0.0.4 12536 + '@react-email/img': 0.0.5 12537 + '@react-email/link': 0.0.5 12538 + '@react-email/preview': 0.0.6 12539 + '@react-email/render': 0.0.7 12540 + '@react-email/row': 0.0.5 12541 + '@react-email/section': 0.0.9 12542 + '@react-email/tailwind': 0.0.8(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 10612 12543 '@react-email/text': 0.0.5 10613 12544 react: 18.2.0 10614 12545 transitivePeerDependencies: ··· 10676 12607 dependencies: 10677 12608 react: 18.2.0 10678 12609 10679 - '@react-email/tailwind@0.0.8(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))': 12610 + '@react-email/tailwind@0.0.8': 12611 + dependencies: 12612 + html-react-parser: 3.0.9(react@18.2.0) 12613 + react: 18.2.0 12614 + react-dom: 18.2.0(react@18.2.0) 12615 + tw-to-css: 0.0.11 12616 + transitivePeerDependencies: 12617 + - ts-node 12618 + 12619 + '@react-email/tailwind@0.0.8(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3))': 10680 12620 dependencies: 10681 12621 html-react-parser: 3.0.9(react@18.2.0) 10682 12622 react: 18.2.0 10683 12623 react-dom: 18.2.0(react@18.2.0) 10684 - tw-to-css: 0.0.11(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 12624 + tw-to-css: 0.0.11(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 10685 12625 transitivePeerDependencies: 10686 12626 - ts-node 10687 12627 10688 - '@react-email/tailwind@0.0.9(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))': 12628 + '@react-email/tailwind@0.0.8(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))': 12629 + dependencies: 12630 + html-react-parser: 3.0.9(react@18.2.0) 12631 + react: 18.2.0 12632 + react-dom: 18.2.0(react@18.2.0) 12633 + tw-to-css: 0.0.11(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 12634 + transitivePeerDependencies: 12635 + - ts-node 12636 + 12637 + '@react-email/tailwind@0.0.9(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3))': 10689 12638 dependencies: 10690 12639 html-react-parser: 4.0.0(react@18.2.0) 10691 12640 react: 18.2.0 10692 12641 react-dom: 18.2.0(react@18.2.0) 10693 - tw-to-css: 0.0.11(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 12642 + tw-to-css: 0.0.11(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 12643 + transitivePeerDependencies: 12644 + - ts-node 12645 + 12646 + '@react-email/tailwind@0.0.9(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))': 12647 + dependencies: 12648 + html-react-parser: 4.0.0(react@18.2.0) 12649 + react: 18.2.0 12650 + react-dom: 18.2.0(react@18.2.0) 12651 + tw-to-css: 0.0.11(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 10694 12652 transitivePeerDependencies: 10695 12653 - ts-node 10696 12654 ··· 10717 12675 optionalDependencies: 10718 12676 rollup: 2.78.0 10719 12677 12678 + '@rushstack/eslint-patch@1.10.3': {} 12679 + 10720 12680 '@selderee/plugin-htmlparser2@0.10.0': 10721 12681 dependencies: 10722 12682 domhandler: 5.0.3 ··· 11200 13160 11201 13161 '@swc/counter@0.1.3': {} 11202 13162 13163 + '@swc/helpers@0.4.14': 13164 + dependencies: 13165 + tslib: 2.6.2 13166 + 11203 13167 '@swc/helpers@0.5.3': 11204 13168 dependencies: 11205 13169 tslib: 2.6.2 ··· 11209 13173 '@swc/counter': 0.1.3 11210 13174 tslib: 2.6.2 11211 13175 13176 + '@t3-oss/env-core@0.7.0(typescript@4.9.3)(zod@3.22.4)': 13177 + dependencies: 13178 + zod: 3.22.4 13179 + optionalDependencies: 13180 + typescript: 4.9.3 13181 + 11212 13182 '@t3-oss/env-core@0.7.0(typescript@5.4.5)(zod@3.22.4)': 11213 13183 dependencies: 11214 13184 zod: 3.22.4 ··· 11234 13204 optionalDependencies: 11235 13205 typescript: 5.4.5 11236 13206 11237 - '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)))': 13207 + '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)))': 11238 13208 dependencies: 11239 - tailwindcss: 3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 13209 + tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 11240 13210 11241 - '@tailwindcss/typography@0.5.10(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)))': 13211 + '@tailwindcss/typography@0.5.10(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)))': 11242 13212 dependencies: 11243 13213 lodash.castarray: 4.4.0 11244 13214 lodash.isplainobject: 4.0.6 11245 13215 lodash.merge: 4.6.2 11246 13216 postcss-selector-parser: 6.0.10 11247 - tailwindcss: 3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 13217 + tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 11248 13218 11249 - '@tanstack/query-core@4.36.1': {} 13219 + '@tanstack/query-core@5.36.1': {} 11250 13220 11251 - '@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 13221 + '@tanstack/react-query@5.37.1(react@18.2.0)': 11252 13222 dependencies: 11253 - '@tanstack/query-core': 4.36.1 13223 + '@tanstack/query-core': 5.36.1 11254 13224 react: 18.2.0 11255 - use-sync-external-store: 1.2.0(react@18.2.0) 11256 - optionalDependencies: 11257 - react-dom: 18.2.0(react@18.2.0) 11258 13225 11259 13226 '@tanstack/react-table@8.10.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11260 13227 dependencies: ··· 11284 13251 11285 13252 '@tootallnate/quickjs-emscripten@0.23.0': {} 11286 13253 11287 - '@tremor/react@3.13.3(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)))': 13254 + '@tremor/react@3.13.3(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)))': 11288 13255 dependencies: 11289 13256 '@floating-ui/react': 0.19.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11290 13257 '@headlessui/react': 1.7.18(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11291 - '@headlessui/tailwindcss': 0.2.0(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))) 13258 + '@headlessui/tailwindcss': 0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))) 11292 13259 date-fns: 2.30.0 11293 13260 react: 18.2.0 11294 13261 react-day-picker: 8.10.0(date-fns@2.30.0)(react@18.2.0) ··· 11304 13271 dependencies: 11305 13272 '@trpc/server': 10.45.1 11306 13273 11307 - '@trpc/next@10.45.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/react-query@10.45.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.45.1)(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 13274 + '@trpc/next@10.45.1(@tanstack/react-query@5.37.1(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/react-query@10.45.1(@tanstack/react-query@5.37.1(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.45.1)(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11308 13275 dependencies: 11309 - '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 13276 + '@tanstack/react-query': 5.37.1(react@18.2.0) 11310 13277 '@trpc/client': 10.45.1(@trpc/server@10.45.1) 11311 - '@trpc/react-query': 10.45.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 13278 + '@trpc/react-query': 10.45.1(@tanstack/react-query@5.37.1(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11312 13279 '@trpc/server': 10.45.1 11313 13280 next: 14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 11314 13281 react: 18.2.0 11315 13282 react-dom: 18.2.0(react@18.2.0) 11316 13283 11317 - '@trpc/react-query@10.45.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 13284 + '@trpc/react-query@10.45.1(@tanstack/react-query@5.37.1(react@18.2.0))(@trpc/client@10.45.1(@trpc/server@10.45.1))(@trpc/server@10.45.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': 11318 13285 dependencies: 11319 - '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 13286 + '@tanstack/react-query': 5.37.1(react@18.2.0) 11320 13287 '@trpc/client': 10.45.1(@trpc/server@10.45.1) 11321 13288 '@trpc/server': 10.45.1 11322 13289 react: 18.2.0 ··· 11324 13291 11325 13292 '@trpc/server@10.45.1': {} 11326 13293 11327 - '@tsconfig/node10@1.0.9': {} 13294 + '@tsconfig/node10@1.0.11': {} 11328 13295 11329 13296 '@tsconfig/node12@1.0.11': {} 11330 13297 ··· 11342 13309 minimatch: 9.0.1 11343 13310 node-plop: 0.26.3 11344 13311 proxy-agent: 6.3.1 11345 - ts-node: 10.9.1(@types/node@20.8.0)(typescript@5.4.5) 13312 + ts-node: 10.9.2(@types/node@20.8.0)(typescript@5.4.5) 11346 13313 update-check: 1.5.4 11347 13314 validate-npm-package-name: 5.0.0 11348 13315 transitivePeerDependencies: ··· 11357 13324 chalk: 2.4.2 11358 13325 commander: 10.0.1 11359 13326 execa: 5.1.1 11360 - fast-glob: 3.3.1 13327 + fast-glob: 3.3.2 11361 13328 fs-extra: 10.1.0 11362 13329 gradient-string: 2.0.2 11363 13330 inquirer: 8.2.6 ··· 11373 13340 11374 13341 '@types/caseless@0.12.4': {} 11375 13342 13343 + '@types/classnames@2.3.1': 13344 + dependencies: 13345 + classnames: 2.3.2 13346 + 11376 13347 '@types/cookie@0.6.0': {} 11377 13348 11378 13349 '@types/d3-array@3.0.9': {} ··· 11445 13416 '@types/tough-cookie': 4.0.4 11446 13417 parse5: 7.1.2 11447 13418 13419 + '@types/json5@0.0.29': {} 13420 + 11448 13421 '@types/long@4.0.2': {} 11449 13422 11450 13423 '@types/luxon@3.3.1': {} ··· 11465 13438 dependencies: 11466 13439 '@types/node': 20.8.0 11467 13440 13441 + '@types/node@18.11.9': {} 13442 + 13443 + '@types/node@20.12.12': 13444 + dependencies: 13445 + undici-types: 5.26.5 13446 + optional: true 13447 + 11468 13448 '@types/node@20.8.0': {} 11469 13449 11470 13450 '@types/normalize-package-data@2.4.3': {} 11471 13451 11472 13452 '@types/parse5@6.0.3': {} 13453 + 13454 + '@types/prop-types@15.7.12': {} 11473 13455 11474 13456 '@types/prop-types@15.7.9': {} 11475 13457 13458 + '@types/react-dom@18.0.9': 13459 + dependencies: 13460 + '@types/react': 18.2.64 13461 + 11476 13462 '@types/react-dom@18.2.21': 11477 13463 dependencies: 11478 13464 '@types/react': 18.2.64 13465 + 13466 + '@types/react@18.0.25': 13467 + dependencies: 13468 + '@types/prop-types': 15.7.12 13469 + '@types/scheduler': 0.16.5 13470 + csstype: 3.1.3 11479 13471 11480 13472 '@types/react@18.2.64': 11481 13473 dependencies: 11482 13474 '@types/prop-types': 15.7.9 11483 13475 '@types/scheduler': 0.16.5 11484 13476 csstype: 3.1.2 13477 + 13478 + '@types/react@18.3.2': 13479 + dependencies: 13480 + '@types/prop-types': 15.7.12 13481 + csstype: 3.1.3 13482 + optional: true 11485 13483 11486 13484 '@types/request@2.48.11': 11487 13485 dependencies: ··· 11512 13510 11513 13511 '@types/validator@13.11.6': {} 11514 13512 13513 + '@types/ws@8.5.10': 13514 + dependencies: 13515 + '@types/node': 20.8.0 13516 + optional: true 13517 + 11515 13518 '@types/ws@8.5.8': 11516 13519 dependencies: 11517 13520 '@types/node': 20.8.0 ··· 11522 13525 dependencies: 11523 13526 '@types/yargs-parser': 21.0.2 11524 13527 13528 + '@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3)': 13529 + dependencies: 13530 + '@typescript-eslint/scope-manager': 5.62.0 13531 + '@typescript-eslint/types': 5.62.0 13532 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.3) 13533 + debug: 4.3.4 13534 + eslint: 8.36.0 13535 + optionalDependencies: 13536 + typescript: 4.9.3 13537 + transitivePeerDependencies: 13538 + - supports-color 13539 + 13540 + '@typescript-eslint/scope-manager@5.62.0': 13541 + dependencies: 13542 + '@typescript-eslint/types': 5.62.0 13543 + '@typescript-eslint/visitor-keys': 5.62.0 13544 + 13545 + '@typescript-eslint/types@5.62.0': {} 13546 + 13547 + '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.3)': 13548 + dependencies: 13549 + '@typescript-eslint/types': 5.62.0 13550 + '@typescript-eslint/visitor-keys': 5.62.0 13551 + debug: 4.3.4 13552 + globby: 11.1.0 13553 + is-glob: 4.0.3 13554 + semver: 7.5.4 13555 + tsutils: 3.21.0(typescript@4.9.3) 13556 + optionalDependencies: 13557 + typescript: 4.9.3 13558 + transitivePeerDependencies: 13559 + - supports-color 13560 + 13561 + '@typescript-eslint/visitor-keys@5.62.0': 13562 + dependencies: 13563 + '@typescript-eslint/types': 5.62.0 13564 + eslint-visitor-keys: 3.4.3 13565 + 11525 13566 '@ungap/structured-clone@1.2.0': {} 11526 13567 11527 13568 '@unkey/api@0.16.0': {} ··· 11555 13596 transitivePeerDependencies: 11556 13597 - encoding 11557 13598 11558 - '@vercel/blob@0.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)': 13599 + '@vercel/blob@0.13.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)': 11559 13600 dependencies: 11560 - jest-environment-jsdom: 29.7.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 13601 + jest-environment-jsdom: 29.7.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 11561 13602 undici: 5.25.1 11562 13603 transitivePeerDependencies: 11563 13604 - bufferutil ··· 11575 13616 11576 13617 acorn-globals@7.0.1: 11577 13618 dependencies: 11578 - acorn: 8.10.0 11579 - acorn-walk: 8.2.0 13619 + acorn: 8.11.3 13620 + acorn-walk: 8.3.2 11580 13621 11581 - acorn-jsx@5.3.2(acorn@8.10.0): 13622 + acorn-jsx@5.3.2(acorn@8.11.3): 11582 13623 dependencies: 11583 - acorn: 8.10.0 13624 + acorn: 8.11.3 11584 13625 11585 13626 acorn-node@1.8.2: 11586 13627 dependencies: ··· 11592 13633 11593 13634 acorn-walk@8.2.0: {} 11594 13635 13636 + acorn-walk@8.3.2: {} 13637 + 11595 13638 acorn@7.4.1: {} 11596 13639 11597 13640 acorn@8.10.0: {} 13641 + 13642 + acorn@8.11.3: {} 11598 13643 11599 13644 agent-base@6.0.2: 11600 13645 dependencies: ··· 11616 13661 ajv-formats@2.1.1(ajv@8.14.0): 11617 13662 optionalDependencies: 11618 13663 ajv: 8.14.0 13664 + 13665 + ajv@6.12.6: 13666 + dependencies: 13667 + fast-deep-equal: 3.1.3 13668 + fast-json-stable-stringify: 2.1.0 13669 + json-schema-traverse: 0.4.1 13670 + uri-js: 4.4.1 11619 13671 11620 13672 ajv@8.14.0: 11621 13673 dependencies: ··· 11670 13722 normalize-path: 3.0.0 11671 13723 picomatch: 2.3.1 11672 13724 11673 - arg@4.1.0: {} 13725 + arg@4.1.3: {} 11674 13726 11675 13727 arg@5.0.2: {} 11676 13728 ··· 11684 13736 dependencies: 11685 13737 tslib: 2.6.2 11686 13738 13739 + aria-query@5.3.0: 13740 + dependencies: 13741 + dequal: 2.0.3 13742 + 11687 13743 arity-n@1.0.4: {} 11688 13744 13745 + array-buffer-byte-length@1.0.1: 13746 + dependencies: 13747 + call-bind: 1.0.7 13748 + is-array-buffer: 3.0.4 13749 + 13750 + array-includes@3.1.8: 13751 + dependencies: 13752 + call-bind: 1.0.7 13753 + define-properties: 1.2.1 13754 + es-abstract: 1.23.3 13755 + es-object-atoms: 1.0.0 13756 + get-intrinsic: 1.2.4 13757 + is-string: 1.0.7 13758 + 11689 13759 array-last@1.3.0: 11690 13760 dependencies: 11691 13761 is-number: 4.0.0 ··· 11694 13764 11695 13765 array-union@2.1.0: {} 11696 13766 13767 + array.prototype.findlast@1.2.5: 13768 + dependencies: 13769 + call-bind: 1.0.7 13770 + define-properties: 1.2.1 13771 + es-abstract: 1.23.3 13772 + es-errors: 1.3.0 13773 + es-object-atoms: 1.0.0 13774 + es-shim-unscopables: 1.0.2 13775 + 13776 + array.prototype.findlastindex@1.2.5: 13777 + dependencies: 13778 + call-bind: 1.0.7 13779 + define-properties: 1.2.1 13780 + es-abstract: 1.23.3 13781 + es-errors: 1.3.0 13782 + es-object-atoms: 1.0.0 13783 + es-shim-unscopables: 1.0.2 13784 + 13785 + array.prototype.flat@1.3.2: 13786 + dependencies: 13787 + call-bind: 1.0.5 13788 + define-properties: 1.2.1 13789 + es-abstract: 1.23.3 13790 + es-shim-unscopables: 1.0.2 13791 + 13792 + array.prototype.flatmap@1.3.2: 13793 + dependencies: 13794 + call-bind: 1.0.5 13795 + define-properties: 1.2.1 13796 + es-abstract: 1.23.3 13797 + es-shim-unscopables: 1.0.2 13798 + 13799 + array.prototype.toreversed@1.1.2: 13800 + dependencies: 13801 + call-bind: 1.0.5 13802 + define-properties: 1.2.1 13803 + es-abstract: 1.23.3 13804 + es-shim-unscopables: 1.0.2 13805 + 13806 + array.prototype.tosorted@1.1.3: 13807 + dependencies: 13808 + call-bind: 1.0.5 13809 + define-properties: 1.2.1 13810 + es-abstract: 1.23.3 13811 + es-errors: 1.3.0 13812 + es-shim-unscopables: 1.0.2 13813 + 13814 + arraybuffer.prototype.slice@1.0.3: 13815 + dependencies: 13816 + array-buffer-byte-length: 1.0.1 13817 + call-bind: 1.0.7 13818 + define-properties: 1.2.1 13819 + es-abstract: 1.23.3 13820 + es-errors: 1.3.0 13821 + get-intrinsic: 1.2.4 13822 + is-array-buffer: 3.0.4 13823 + is-shared-array-buffer: 1.0.3 13824 + 11697 13825 arrify@1.0.1: {} 11698 13826 11699 13827 as-table@1.0.55: 11700 13828 dependencies: 11701 13829 printable-characters: 1.0.42 13830 + 13831 + ast-types-flow@0.0.8: {} 11702 13832 11703 13833 ast-types@0.13.4: 11704 13834 dependencies: ··· 11708 13838 11709 13839 asynckit@0.4.0: {} 11710 13840 13841 + autoprefixer@10.4.13(postcss@8.4.19): 13842 + dependencies: 13843 + browserslist: 4.23.0 13844 + caniuse-lite: 1.0.30001612 13845 + fraction.js: 4.3.7 13846 + normalize-range: 0.1.2 13847 + picocolors: 1.0.0 13848 + postcss: 8.4.19 13849 + postcss-value-parser: 4.2.0 13850 + 11711 13851 autoprefixer@10.4.19(postcss@8.4.38): 11712 13852 dependencies: 11713 13853 browserslist: 4.23.0 ··· 11720 13860 11721 13861 available-typed-arrays@1.0.5: {} 11722 13862 13863 + available-typed-arrays@1.0.7: 13864 + dependencies: 13865 + possible-typed-array-names: 1.0.0 13866 + 13867 + axe-core@4.7.0: {} 13868 + 11723 13869 axios@1.7.2: 11724 13870 dependencies: 11725 13871 follow-redirects: 1.15.6 ··· 11727 13873 proxy-from-env: 1.1.0 11728 13874 transitivePeerDependencies: 11729 13875 - debug 13876 + 13877 + axobject-query@3.2.1: 13878 + dependencies: 13879 + dequal: 2.0.3 11730 13880 11731 13881 babylon@6.18.0: {} 11732 13882 ··· 11747 13897 11748 13898 bignumber.js@9.1.2: {} 11749 13899 11750 - binary-extensions@2.2.0: {} 13900 + binary-extensions@2.3.0: {} 11751 13901 11752 13902 bindings@1.5.0: 11753 13903 dependencies: ··· 11778 13928 dependencies: 11779 13929 fill-range: 7.0.1 11780 13930 13931 + braces@3.0.3: 13932 + dependencies: 13933 + fill-range: 7.1.1 13934 + 11781 13935 browserslist@4.23.0: 11782 13936 dependencies: 11783 13937 caniuse-lite: 1.0.30001612 ··· 11798 13952 dependencies: 11799 13953 node-gyp-build: 4.6.1 11800 13954 13955 + bufferutil@4.0.8: 13956 + dependencies: 13957 + node-gyp-build: 4.8.1 13958 + optional: true 13959 + 11801 13960 builtins@5.0.1: 11802 13961 dependencies: 11803 13962 semver: 7.5.4 ··· 11806 13965 11807 13966 bun-types@1.0.8: {} 11808 13967 13968 + bun-types@1.1.8: 13969 + dependencies: 13970 + '@types/node': 20.12.12 13971 + '@types/ws': 8.5.10 13972 + optional: true 13973 + 11809 13974 bundle-require@4.0.2(esbuild@0.18.20): 11810 13975 dependencies: 11811 13976 esbuild: 0.18.20 ··· 11822 13987 function-bind: 1.1.2 11823 13988 get-intrinsic: 1.2.1 11824 13989 set-function-length: 1.1.1 13990 + 13991 + call-bind@1.0.7: 13992 + dependencies: 13993 + es-define-property: 1.0.0 13994 + es-errors: 1.3.0 13995 + function-bind: 1.1.2 13996 + get-intrinsic: 1.2.4 13997 + set-function-length: 1.2.2 13998 + 13999 + callsites@3.1.0: {} 11825 14000 11826 14001 camel-case@3.0.0: 11827 14002 dependencies: ··· 11921 14096 optionalDependencies: 11922 14097 fsevents: 2.3.3 11923 14098 14099 + chokidar@3.6.0: 14100 + dependencies: 14101 + anymatch: 3.1.3 14102 + braces: 3.0.3 14103 + glob-parent: 5.1.2 14104 + is-binary-path: 2.1.0 14105 + is-glob: 4.0.3 14106 + normalize-path: 3.0.0 14107 + readdirp: 3.6.0 14108 + optionalDependencies: 14109 + fsevents: 2.3.3 14110 + 11924 14111 chownr@1.1.4: {} 11925 14112 11926 14113 ci-info@3.9.0: {} ··· 11928 14115 class-variance-authority@0.7.0: 11929 14116 dependencies: 11930 14117 clsx: 2.0.0 14118 + 14119 + classnames@2.3.2: {} 11931 14120 11932 14121 clean-stack@2.2.0: {} 11933 14122 ··· 11976 14165 transitivePeerDependencies: 11977 14166 - '@types/react' 11978 14167 14168 + cmdk@0.2.0(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0): 14169 + dependencies: 14170 + '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.64)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 14171 + command-score: 0.1.2 14172 + react: 18.2.0 14173 + react-dom: 18.3.1(react@18.2.0) 14174 + transitivePeerDependencies: 14175 + - '@types/react' 14176 + 11979 14177 cobe@0.6.3: 11980 14178 dependencies: 11981 14179 phenomenon: 1.6.0 ··· 12040 14238 snake-case: 2.1.0 12041 14239 upper-case: 1.1.3 12042 14240 12043 - contentlayer@0.3.4(esbuild@0.19.12): 14241 + contentlayer@0.3.4(esbuild@0.21.3): 12044 14242 dependencies: 12045 - '@contentlayer/cli': 0.3.4(esbuild@0.19.12) 12046 - '@contentlayer/client': 0.3.4(esbuild@0.19.12) 12047 - '@contentlayer/core': 0.3.4(esbuild@0.19.12) 12048 - '@contentlayer/source-files': 0.3.4(esbuild@0.19.12) 12049 - '@contentlayer/source-remote-files': 0.3.4(esbuild@0.19.12) 14243 + '@contentlayer/cli': 0.3.4(esbuild@0.21.3) 14244 + '@contentlayer/client': 0.3.4(esbuild@0.21.3) 14245 + '@contentlayer/core': 0.3.4(esbuild@0.21.3) 14246 + '@contentlayer/source-files': 0.3.4(esbuild@0.21.3) 14247 + '@contentlayer/source-remote-files': 0.3.4(esbuild@0.21.3) 12050 14248 '@contentlayer/utils': 0.3.4 12051 14249 transitivePeerDependencies: 12052 14250 - '@effect-ts/otel-node' ··· 12088 14286 12089 14287 csstype@3.1.2: {} 12090 14288 14289 + csstype@3.1.3: {} 14290 + 12091 14291 d3-array@3.2.4: 12092 14292 dependencies: 12093 14293 internmap: 2.0.3 ··· 12130 14330 dependencies: 12131 14331 es5-ext: 0.10.62 12132 14332 type: 1.2.0 14333 + 14334 + damerau-levenshtein@1.0.8: {} 12133 14335 12134 14336 data-uri-to-buffer@2.0.2: {} 12135 14337 ··· 12143 14345 whatwg-mimetype: 3.0.0 12144 14346 whatwg-url: 11.0.0 12145 14347 14348 + data-view-buffer@1.0.1: 14349 + dependencies: 14350 + call-bind: 1.0.7 14351 + es-errors: 1.3.0 14352 + is-data-view: 1.0.1 14353 + 14354 + data-view-byte-length@1.0.1: 14355 + dependencies: 14356 + call-bind: 1.0.7 14357 + es-errors: 1.3.0 14358 + is-data-view: 1.0.1 14359 + 14360 + data-view-byte-offset@1.0.0: 14361 + dependencies: 14362 + call-bind: 1.0.7 14363 + es-errors: 1.3.0 14364 + is-data-view: 1.0.1 14365 + 12146 14366 date-fns-tz@2.0.0(date-fns@2.30.0): 12147 14367 dependencies: 12148 14368 date-fns: 2.30.0 ··· 12150 14370 date-fns@2.30.0: 12151 14371 dependencies: 12152 14372 '@babel/runtime': 7.23.2 14373 + 14374 + debug@3.2.7: 14375 + dependencies: 14376 + ms: 2.1.2 12153 14377 12154 14378 debug@4.3.4: 12155 14379 dependencies: ··· 12178 14402 12179 14403 deep-freeze@0.0.1: {} 12180 14404 14405 + deep-is@0.1.4: {} 14406 + 12181 14407 deepmerge@4.3.1: {} 12182 14408 12183 14409 defaults@1.0.4: ··· 12190 14416 gopd: 1.0.1 12191 14417 has-property-descriptors: 1.0.0 12192 14418 14419 + define-data-property@1.1.4: 14420 + dependencies: 14421 + es-define-property: 1.0.0 14422 + es-errors: 1.3.0 14423 + gopd: 1.0.1 14424 + 14425 + define-properties@1.2.1: 14426 + dependencies: 14427 + define-data-property: 1.1.1 14428 + has-property-descriptors: 1.0.0 14429 + object-keys: 1.1.1 14430 + 12193 14431 defined@1.0.1: {} 12194 14432 12195 14433 degenerator@5.0.1: ··· 12253 14491 12254 14492 dlv@1.1.3: {} 12255 14493 14494 + doctrine@2.1.0: 14495 + dependencies: 14496 + esutils: 2.0.3 14497 + 14498 + doctrine@3.0.0: 14499 + dependencies: 14500 + esutils: 2.0.3 14501 + 12256 14502 dom-helpers@3.4.0: 12257 14503 dependencies: 12258 14504 '@babel/runtime': 7.23.2 ··· 12303 14549 transitivePeerDependencies: 12304 14550 - supports-color 12305 14551 12306 - drizzle-orm@0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0): 14552 + drizzle-orm@0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1): 12307 14553 optionalDependencies: 12308 14554 '@cloudflare/workers-types': 4.20240512.0 12309 14555 '@libsql/client': 0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 12310 - '@opentelemetry/api': 1.4.1 12311 - '@types/react': 18.2.64 14556 + '@opentelemetry/api': 1.8.0 14557 + '@types/react': 18.3.2 14558 + better-sqlite3: 10.0.0 14559 + bun-types: 1.1.8 14560 + react: 18.3.1 14561 + 14562 + drizzle-orm@0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1): 14563 + optionalDependencies: 14564 + '@cloudflare/workers-types': 4.20240512.0 14565 + '@libsql/client': 0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 14566 + '@opentelemetry/api': 1.8.0 14567 + '@types/react': 18.3.2 12312 14568 better-sqlite3: 10.0.0 12313 - bun-types: 1.0.11 12314 - react: 18.2.0 14569 + bun-types: 1.1.8 14570 + react: 18.3.1 12315 14571 12316 - drizzle-orm@0.30.7(@cloudflare/workers-types@4.20240403.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0): 14572 + drizzle-orm@0.30.7(@cloudflare/workers-types@4.20240403.0)(@libsql/client@0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1): 12317 14573 optionalDependencies: 12318 14574 '@cloudflare/workers-types': 4.20240403.0 12319 - '@libsql/client': 0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 12320 - '@opentelemetry/api': 1.4.1 12321 - '@types/react': 18.2.64 14575 + '@libsql/client': 0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 14576 + '@opentelemetry/api': 1.8.0 14577 + '@types/react': 18.3.2 12322 14578 better-sqlite3: 10.0.0 12323 - bun-types: 1.0.11 12324 - react: 18.2.0 14579 + bun-types: 1.1.8 14580 + react: 18.3.1 12325 14581 12326 - drizzle-orm@0.30.7(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0): 14582 + drizzle-orm@0.30.7(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1): 12327 14583 optionalDependencies: 12328 14584 '@cloudflare/workers-types': 4.20240512.0 12329 - '@libsql/client': 0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 12330 - '@opentelemetry/api': 1.4.1 12331 - '@types/react': 18.2.64 14585 + '@libsql/client': 0.6.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 14586 + '@opentelemetry/api': 1.8.0 14587 + '@types/react': 18.3.2 12332 14588 better-sqlite3: 10.0.0 12333 - bun-types: 1.0.11 12334 - react: 18.2.0 14589 + bun-types: 1.1.8 14590 + react: 18.3.1 12335 14591 12336 - drizzle-zod@0.5.1(drizzle-orm@0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0))(zod@3.22.4): 14592 + drizzle-zod@0.5.1(drizzle-orm@0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1))(zod@3.22.4): 12337 14593 dependencies: 12338 - drizzle-orm: 0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.4.1)(@types/react@18.2.64)(better-sqlite3@10.0.0)(bun-types@1.0.11)(react@18.2.0) 14594 + drizzle-orm: 0.30.10(@cloudflare/workers-types@4.20240512.0)(@libsql/client@0.6.0(bufferutil@4.0.7)(utf-8-validate@6.0.3))(@opentelemetry/api@1.8.0)(@types/react@18.3.2)(better-sqlite3@10.0.0)(bun-types@1.1.8)(react@18.3.1) 12339 14595 zod: 3.22.4 12340 14596 12341 14597 duplexify@4.1.2: ··· 12380 14636 dependencies: 12381 14637 once: 1.4.0 12382 14638 14639 + enhanced-resolve@5.16.1: 14640 + dependencies: 14641 + graceful-fs: 4.2.11 14642 + tapable: 2.2.1 14643 + 12383 14644 entities@4.5.0: {} 12384 14645 12385 14646 env-paths@3.0.0: {} ··· 12388 14649 dependencies: 12389 14650 is-arrayish: 0.2.1 12390 14651 14652 + es-abstract@1.23.3: 14653 + dependencies: 14654 + array-buffer-byte-length: 1.0.1 14655 + arraybuffer.prototype.slice: 1.0.3 14656 + available-typed-arrays: 1.0.7 14657 + call-bind: 1.0.7 14658 + data-view-buffer: 1.0.1 14659 + data-view-byte-length: 1.0.1 14660 + data-view-byte-offset: 1.0.0 14661 + es-define-property: 1.0.0 14662 + es-errors: 1.3.0 14663 + es-object-atoms: 1.0.0 14664 + es-set-tostringtag: 2.0.3 14665 + es-to-primitive: 1.2.1 14666 + function.prototype.name: 1.1.6 14667 + get-intrinsic: 1.2.4 14668 + get-symbol-description: 1.0.2 14669 + globalthis: 1.0.4 14670 + gopd: 1.0.1 14671 + has-property-descriptors: 1.0.2 14672 + has-proto: 1.0.3 14673 + has-symbols: 1.0.3 14674 + hasown: 2.0.2 14675 + internal-slot: 1.0.7 14676 + is-array-buffer: 3.0.4 14677 + is-callable: 1.2.7 14678 + is-data-view: 1.0.1 14679 + is-negative-zero: 2.0.3 14680 + is-regex: 1.1.4 14681 + is-shared-array-buffer: 1.0.3 14682 + is-string: 1.0.7 14683 + is-typed-array: 1.1.13 14684 + is-weakref: 1.0.2 14685 + object-inspect: 1.13.1 14686 + object-keys: 1.1.1 14687 + object.assign: 4.1.5 14688 + regexp.prototype.flags: 1.5.2 14689 + safe-array-concat: 1.1.2 14690 + safe-regex-test: 1.0.3 14691 + string.prototype.trim: 1.2.9 14692 + string.prototype.trimend: 1.0.8 14693 + string.prototype.trimstart: 1.0.8 14694 + typed-array-buffer: 1.0.2 14695 + typed-array-byte-length: 1.0.1 14696 + typed-array-byte-offset: 1.0.2 14697 + typed-array-length: 1.0.6 14698 + unbox-primitive: 1.0.2 14699 + which-typed-array: 1.1.15 14700 + 14701 + es-define-property@1.0.0: 14702 + dependencies: 14703 + get-intrinsic: 1.2.4 14704 + 14705 + es-errors@1.3.0: {} 14706 + 14707 + es-iterator-helpers@1.0.19: 14708 + dependencies: 14709 + call-bind: 1.0.7 14710 + define-properties: 1.2.1 14711 + es-abstract: 1.23.3 14712 + es-errors: 1.3.0 14713 + es-set-tostringtag: 2.0.3 14714 + function-bind: 1.1.2 14715 + get-intrinsic: 1.2.4 14716 + globalthis: 1.0.4 14717 + has-property-descriptors: 1.0.2 14718 + has-proto: 1.0.3 14719 + has-symbols: 1.0.3 14720 + internal-slot: 1.0.7 14721 + iterator.prototype: 1.1.2 14722 + safe-array-concat: 1.1.2 14723 + 14724 + es-object-atoms@1.0.0: 14725 + dependencies: 14726 + es-errors: 1.3.0 14727 + 14728 + es-set-tostringtag@2.0.3: 14729 + dependencies: 14730 + get-intrinsic: 1.2.4 14731 + has-tostringtag: 1.0.2 14732 + hasown: 2.0.2 14733 + 14734 + es-shim-unscopables@1.0.2: 14735 + dependencies: 14736 + hasown: 2.0.2 14737 + 14738 + es-to-primitive@1.2.1: 14739 + dependencies: 14740 + is-callable: 1.2.7 14741 + is-date-object: 1.0.5 14742 + is-symbol: 1.0.4 14743 + 12391 14744 es5-ext@0.10.62: 12392 14745 dependencies: 12393 14746 es6-iterator: 2.0.3 ··· 12520 14873 '@esbuild/win32-ia32': 0.19.12 12521 14874 '@esbuild/win32-x64': 0.19.12 12522 14875 14876 + esbuild@0.21.3: 14877 + optionalDependencies: 14878 + '@esbuild/aix-ppc64': 0.21.3 14879 + '@esbuild/android-arm': 0.21.3 14880 + '@esbuild/android-arm64': 0.21.3 14881 + '@esbuild/android-x64': 0.21.3 14882 + '@esbuild/darwin-arm64': 0.21.3 14883 + '@esbuild/darwin-x64': 0.21.3 14884 + '@esbuild/freebsd-arm64': 0.21.3 14885 + '@esbuild/freebsd-x64': 0.21.3 14886 + '@esbuild/linux-arm': 0.21.3 14887 + '@esbuild/linux-arm64': 0.21.3 14888 + '@esbuild/linux-ia32': 0.21.3 14889 + '@esbuild/linux-loong64': 0.21.3 14890 + '@esbuild/linux-mips64el': 0.21.3 14891 + '@esbuild/linux-ppc64': 0.21.3 14892 + '@esbuild/linux-riscv64': 0.21.3 14893 + '@esbuild/linux-s390x': 0.21.3 14894 + '@esbuild/linux-x64': 0.21.3 14895 + '@esbuild/netbsd-x64': 0.21.3 14896 + '@esbuild/openbsd-x64': 0.21.3 14897 + '@esbuild/sunos-x64': 0.21.3 14898 + '@esbuild/win32-arm64': 0.21.3 14899 + '@esbuild/win32-ia32': 0.21.3 14900 + '@esbuild/win32-x64': 0.21.3 14901 + 12523 14902 escalade@3.1.1: {} 12524 14903 12525 14904 escape-string-regexp@1.0.5: {} ··· 12538 14917 optionalDependencies: 12539 14918 source-map: 0.6.1 12540 14919 14920 + eslint-config-next@13.2.4(eslint@8.36.0)(typescript@4.9.3): 14921 + dependencies: 14922 + '@next/eslint-plugin-next': 13.2.4 14923 + '@rushstack/eslint-patch': 1.10.3 14924 + '@typescript-eslint/parser': 5.62.0(eslint@8.36.0)(typescript@4.9.3) 14925 + eslint: 8.36.0 14926 + eslint-import-resolver-node: 0.3.9 14927 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.36.0))(eslint@8.36.0) 14928 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.36.0) 14929 + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.36.0) 14930 + eslint-plugin-react: 7.34.1(eslint@8.36.0) 14931 + eslint-plugin-react-hooks: 4.6.2(eslint@8.36.0) 14932 + optionalDependencies: 14933 + typescript: 4.9.3 14934 + transitivePeerDependencies: 14935 + - eslint-import-resolver-webpack 14936 + - supports-color 14937 + 14938 + eslint-config-prettier@8.7.0(eslint@8.36.0): 14939 + dependencies: 14940 + eslint: 8.36.0 14941 + 14942 + eslint-import-resolver-node@0.3.9: 14943 + dependencies: 14944 + debug: 3.2.7 14945 + is-core-module: 2.13.0 14946 + resolve: 1.22.8 14947 + transitivePeerDependencies: 14948 + - supports-color 14949 + 14950 + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.36.0))(eslint@8.36.0): 14951 + dependencies: 14952 + debug: 4.3.4 14953 + enhanced-resolve: 5.16.1 14954 + eslint: 8.36.0 14955 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.36.0))(eslint@8.36.0))(eslint@8.36.0) 14956 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.36.0) 14957 + fast-glob: 3.3.2 14958 + get-tsconfig: 4.7.2 14959 + is-core-module: 2.13.0 14960 + is-glob: 4.0.3 14961 + transitivePeerDependencies: 14962 + - '@typescript-eslint/parser' 14963 + - eslint-import-resolver-node 14964 + - eslint-import-resolver-webpack 14965 + - supports-color 14966 + 14967 + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.36.0))(eslint@8.36.0))(eslint@8.36.0): 14968 + dependencies: 14969 + debug: 3.2.7 14970 + optionalDependencies: 14971 + '@typescript-eslint/parser': 5.62.0(eslint@8.36.0)(typescript@4.9.3) 14972 + eslint: 8.36.0 14973 + eslint-import-resolver-node: 0.3.9 14974 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.36.0))(eslint@8.36.0) 14975 + transitivePeerDependencies: 14976 + - supports-color 14977 + 14978 + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.36.0): 14979 + dependencies: 14980 + array-includes: 3.1.8 14981 + array.prototype.findlastindex: 1.2.5 14982 + array.prototype.flat: 1.3.2 14983 + array.prototype.flatmap: 1.3.2 14984 + debug: 3.2.7 14985 + doctrine: 2.1.0 14986 + eslint: 8.36.0 14987 + eslint-import-resolver-node: 0.3.9 14988 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.36.0)(typescript@4.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.36.0))(eslint@8.36.0))(eslint@8.36.0) 14989 + hasown: 2.0.2 14990 + is-core-module: 2.13.1 14991 + is-glob: 4.0.3 14992 + minimatch: 3.1.2 14993 + object.fromentries: 2.0.8 14994 + object.groupby: 1.0.3 14995 + object.values: 1.2.0 14996 + semver: 6.3.1 14997 + tsconfig-paths: 3.15.0 14998 + optionalDependencies: 14999 + '@typescript-eslint/parser': 5.62.0(eslint@8.36.0)(typescript@4.9.3) 15000 + transitivePeerDependencies: 15001 + - eslint-import-resolver-typescript 15002 + - eslint-import-resolver-webpack 15003 + - supports-color 15004 + 15005 + eslint-plugin-jsx-a11y@6.8.0(eslint@8.36.0): 15006 + dependencies: 15007 + '@babel/runtime': 7.23.2 15008 + aria-query: 5.3.0 15009 + array-includes: 3.1.8 15010 + array.prototype.flatmap: 1.3.2 15011 + ast-types-flow: 0.0.8 15012 + axe-core: 4.7.0 15013 + axobject-query: 3.2.1 15014 + damerau-levenshtein: 1.0.8 15015 + emoji-regex: 9.2.2 15016 + es-iterator-helpers: 1.0.19 15017 + eslint: 8.36.0 15018 + hasown: 2.0.2 15019 + jsx-ast-utils: 3.3.5 15020 + language-tags: 1.0.9 15021 + minimatch: 3.1.2 15022 + object.entries: 1.1.8 15023 + object.fromentries: 2.0.8 15024 + 15025 + eslint-plugin-react-hooks@4.6.2(eslint@8.36.0): 15026 + dependencies: 15027 + eslint: 8.36.0 15028 + 15029 + eslint-plugin-react@7.34.1(eslint@8.36.0): 15030 + dependencies: 15031 + array-includes: 3.1.8 15032 + array.prototype.findlast: 1.2.5 15033 + array.prototype.flatmap: 1.3.2 15034 + array.prototype.toreversed: 1.1.2 15035 + array.prototype.tosorted: 1.1.3 15036 + doctrine: 2.1.0 15037 + es-iterator-helpers: 1.0.19 15038 + eslint: 8.36.0 15039 + estraverse: 5.3.0 15040 + jsx-ast-utils: 3.3.5 15041 + minimatch: 3.1.2 15042 + object.entries: 1.1.8 15043 + object.fromentries: 2.0.8 15044 + object.hasown: 1.1.4 15045 + object.values: 1.2.0 15046 + prop-types: 15.8.1 15047 + resolve: 2.0.0-next.5 15048 + semver: 6.3.1 15049 + string.prototype.matchall: 4.0.11 15050 + 15051 + eslint-plugin-simple-import-sort@10.0.0(eslint@8.36.0): 15052 + dependencies: 15053 + eslint: 8.36.0 15054 + 15055 + eslint-plugin-unused-imports@2.0.0(eslint@8.36.0): 15056 + dependencies: 15057 + eslint: 8.36.0 15058 + eslint-rule-composer: 0.3.0 15059 + 15060 + eslint-rule-composer@0.3.0: {} 15061 + 15062 + eslint-scope@7.2.2: 15063 + dependencies: 15064 + esrecurse: 4.3.0 15065 + estraverse: 5.3.0 15066 + 15067 + eslint-visitor-keys@3.4.3: {} 15068 + 15069 + eslint@8.36.0: 15070 + dependencies: 15071 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.36.0) 15072 + '@eslint-community/regexpp': 4.10.0 15073 + '@eslint/eslintrc': 2.1.4 15074 + '@eslint/js': 8.36.0 15075 + '@humanwhocodes/config-array': 0.11.14 15076 + '@humanwhocodes/module-importer': 1.0.1 15077 + '@nodelib/fs.walk': 1.2.8 15078 + ajv: 6.12.6 15079 + chalk: 4.1.2 15080 + cross-spawn: 7.0.3 15081 + debug: 4.3.4 15082 + doctrine: 3.0.0 15083 + escape-string-regexp: 4.0.0 15084 + eslint-scope: 7.2.2 15085 + eslint-visitor-keys: 3.4.3 15086 + espree: 9.6.1 15087 + esquery: 1.5.0 15088 + esutils: 2.0.3 15089 + fast-deep-equal: 3.1.3 15090 + file-entry-cache: 6.0.1 15091 + find-up: 5.0.0 15092 + glob-parent: 6.0.2 15093 + globals: 13.24.0 15094 + grapheme-splitter: 1.0.4 15095 + ignore: 5.2.4 15096 + import-fresh: 3.3.0 15097 + imurmurhash: 0.1.4 15098 + is-glob: 4.0.3 15099 + is-path-inside: 3.0.3 15100 + js-sdsl: 4.4.2 15101 + js-yaml: 4.1.0 15102 + json-stable-stringify-without-jsonify: 1.0.1 15103 + levn: 0.4.1 15104 + lodash.merge: 4.6.2 15105 + minimatch: 3.1.2 15106 + natural-compare: 1.4.0 15107 + optionator: 0.9.4 15108 + strip-ansi: 6.0.1 15109 + strip-json-comments: 3.1.1 15110 + text-table: 0.2.0 15111 + transitivePeerDependencies: 15112 + - supports-color 15113 + 15114 + espree@9.6.1: 15115 + dependencies: 15116 + acorn: 8.11.3 15117 + acorn-jsx: 5.3.2(acorn@8.11.3) 15118 + eslint-visitor-keys: 3.4.3 15119 + 12541 15120 esprima@4.0.1: {} 15121 + 15122 + esquery@1.5.0: 15123 + dependencies: 15124 + estraverse: 5.3.0 15125 + 15126 + esrecurse@4.3.0: 15127 + dependencies: 15128 + estraverse: 5.3.0 12542 15129 12543 15130 estraverse@5.3.0: {} 12544 15131 ··· 12644 15231 merge2: 1.4.1 12645 15232 micromatch: 4.0.5 12646 15233 15234 + fast-json-stable-stringify@2.1.0: {} 15235 + 15236 + fast-levenshtein@2.0.6: {} 15237 + 12647 15238 fast-xml-parser@4.2.5: 12648 15239 dependencies: 12649 15240 strnum: 1.0.5 ··· 12667 15258 dependencies: 12668 15259 escape-string-regexp: 1.0.5 12669 15260 15261 + file-entry-cache@6.0.1: 15262 + dependencies: 15263 + flat-cache: 3.2.0 15264 + 12670 15265 file-entry-cache@8.0.0: 12671 15266 dependencies: 12672 15267 flat-cache: 4.0.1 ··· 12677 15272 dependencies: 12678 15273 to-regex-range: 5.0.1 12679 15274 15275 + fill-range@7.1.1: 15276 + dependencies: 15277 + to-regex-range: 5.0.1 15278 + 12680 15279 filter-iterator@0.0.1: {} 12681 15280 12682 15281 filter-obj@1.1.0: {} ··· 12686 15285 locate-path: 5.0.0 12687 15286 path-exists: 4.0.0 12688 15287 15288 + find-up@5.0.0: 15289 + dependencies: 15290 + locate-path: 6.0.0 15291 + path-exists: 4.0.0 15292 + 15293 + flat-cache@3.2.0: 15294 + dependencies: 15295 + flatted: 3.3.1 15296 + keyv: 4.5.4 15297 + rimraf: 3.0.2 15298 + 12689 15299 flat-cache@4.0.1: 12690 15300 dependencies: 12691 - flatted: 3.2.9 15301 + flatted: 3.3.1 12692 15302 keyv: 4.5.4 12693 15303 12694 - flatted@3.2.9: {} 15304 + flatted@3.3.1: {} 12695 15305 12696 15306 follow-redirects@1.15.6: {} 12697 15307 ··· 12724 15334 12725 15335 fraction.js@4.3.7: {} 12726 15336 15337 + framer-motion@8.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0): 15338 + dependencies: 15339 + '@motionone/dom': 10.17.0 15340 + hey-listen: 1.0.8 15341 + react: 18.2.0 15342 + react-dom: 18.2.0(react@18.2.0) 15343 + tslib: 2.6.2 15344 + optionalDependencies: 15345 + '@emotion/is-prop-valid': 0.8.8 15346 + 12727 15347 fs-constants@1.0.0: {} 12728 15348 12729 15349 fs-extra@10.1.0: ··· 12756 15376 12757 15377 function-bind@1.1.2: {} 12758 15378 15379 + function.prototype.name@1.1.6: 15380 + dependencies: 15381 + call-bind: 1.0.7 15382 + define-properties: 1.2.1 15383 + es-abstract: 1.23.3 15384 + functions-have-names: 1.2.3 15385 + 15386 + functions-have-names@1.2.3: {} 15387 + 12759 15388 gaxios@6.1.1(encoding@0.1.13): 12760 15389 dependencies: 12761 15390 extend: 3.0.2 ··· 12783 15412 has-proto: 1.0.1 12784 15413 has-symbols: 1.0.3 12785 15414 15415 + get-intrinsic@1.2.4: 15416 + dependencies: 15417 + es-errors: 1.3.0 15418 + function-bind: 1.1.2 15419 + has-proto: 1.0.1 15420 + has-symbols: 1.0.3 15421 + hasown: 2.0.2 15422 + 12786 15423 get-nonce@1.0.1: {} 12787 15424 12788 15425 get-source@2.0.12: ··· 12791 15428 source-map: 0.6.1 12792 15429 12793 15430 get-stream@6.0.1: {} 15431 + 15432 + get-symbol-description@1.0.2: 15433 + dependencies: 15434 + call-bind: 1.0.7 15435 + es-errors: 1.3.0 15436 + get-intrinsic: 1.2.4 12794 15437 12795 15438 get-tsconfig@4.7.2: 12796 15439 dependencies: ··· 12836 15479 once: 1.4.0 12837 15480 path-is-absolute: 1.0.1 12838 15481 15482 + glob@7.1.7: 15483 + dependencies: 15484 + fs.realpath: 1.0.0 15485 + inflight: 1.0.6 15486 + inherits: 2.0.4 15487 + minimatch: 3.1.2 15488 + once: 1.4.0 15489 + path-is-absolute: 1.0.1 15490 + 12839 15491 glob@7.2.3: 12840 15492 dependencies: 12841 15493 fs.realpath: 1.0.0 ··· 12853 15505 minimatch: 5.1.6 12854 15506 once: 1.4.0 12855 15507 15508 + globals@13.24.0: 15509 + dependencies: 15510 + type-fest: 0.20.2 15511 + 15512 + globalthis@1.0.4: 15513 + dependencies: 15514 + define-properties: 1.2.1 15515 + gopd: 1.0.1 15516 + 12856 15517 globby@10.0.2: 12857 15518 dependencies: 12858 15519 '@types/glob': 7.2.0 12859 15520 array-union: 2.1.0 12860 15521 dir-glob: 3.0.1 12861 - fast-glob: 3.3.1 15522 + fast-glob: 3.3.2 12862 15523 glob: 7.2.3 12863 15524 ignore: 5.2.4 12864 15525 merge2: 1.4.1 ··· 12914 15575 chalk: 4.1.2 12915 15576 tinygradient: 1.1.5 12916 15577 15578 + grapheme-splitter@1.0.4: {} 15579 + 12917 15580 graphql@16.8.1: {} 12918 15581 12919 15582 gray-matter@4.0.3: ··· 12951 15614 dependencies: 12952 15615 ansi-regex: 2.1.1 12953 15616 15617 + has-bigints@1.0.2: {} 15618 + 12954 15619 has-flag@3.0.0: {} 12955 15620 12956 15621 has-flag@4.0.0: {} ··· 12963 15628 dependencies: 12964 15629 get-intrinsic: 1.2.1 12965 15630 15631 + has-property-descriptors@1.0.2: 15632 + dependencies: 15633 + es-define-property: 1.0.0 15634 + 12966 15635 has-proto@1.0.1: {} 15636 + 15637 + has-proto@1.0.3: {} 12967 15638 12968 15639 has-symbols@1.0.3: {} 12969 15640 ··· 12971 15642 dependencies: 12972 15643 has-symbols: 1.0.3 12973 15644 15645 + has-tostringtag@1.0.2: 15646 + dependencies: 15647 + has-symbols: 1.0.3 15648 + 12974 15649 has@1.0.4: {} 12975 15650 12976 15651 hash-obj@4.0.0: ··· 12980 15655 type-fest: 1.4.0 12981 15656 12982 15657 hash-wasm@4.10.0: {} 15658 + 15659 + hasown@2.0.2: 15660 + dependencies: 15661 + function-bind: 1.1.2 12983 15662 12984 15663 hast-to-hyperscript@10.0.3: 12985 15664 dependencies: ··· 13095 15774 upper-case: 1.1.3 13096 15775 13097 15776 heap@0.2.7: {} 15777 + 15778 + hey-listen@1.0.8: {} 13098 15779 13099 15780 hoist-non-react-statics@3.3.2: 13100 15781 dependencies: ··· 13226 15907 13227 15908 immediate@3.0.6: {} 13228 15909 15910 + import-fresh@3.3.0: 15911 + dependencies: 15912 + parent-module: 1.0.1 15913 + resolve-from: 4.0.0 15914 + 15915 + imurmurhash@0.1.4: {} 15916 + 13229 15917 indent-string@4.0.0: {} 13230 15918 13231 15919 inflection@2.0.1: {} ··· 13275 15963 through: 2.3.8 13276 15964 wrap-ansi: 6.2.0 13277 15965 15966 + internal-slot@1.0.7: 15967 + dependencies: 15968 + es-errors: 1.3.0 15969 + hasown: 2.0.2 15970 + side-channel: 1.0.4 15971 + 13278 15972 internmap@2.0.3: {} 13279 15973 13280 15974 interpret@1.4.0: {} ··· 13299 15993 call-bind: 1.0.5 13300 15994 has-tostringtag: 1.0.0 13301 15995 15996 + is-array-buffer@3.0.4: 15997 + dependencies: 15998 + call-bind: 1.0.7 15999 + get-intrinsic: 1.2.4 16000 + 13302 16001 is-arrayish@0.2.1: {} 13303 16002 16003 + is-async-function@2.0.0: 16004 + dependencies: 16005 + has-tostringtag: 1.0.0 16006 + 16007 + is-bigint@1.0.4: 16008 + dependencies: 16009 + has-bigints: 1.0.2 16010 + 13304 16011 is-binary-path@2.1.0: 13305 16012 dependencies: 13306 - binary-extensions: 2.2.0 16013 + binary-extensions: 2.3.0 16014 + 16015 + is-boolean-object@1.1.2: 16016 + dependencies: 16017 + call-bind: 1.0.7 16018 + has-tostringtag: 1.0.0 13307 16019 13308 16020 is-buffer@1.1.6: {} 13309 16021 ··· 13315 16027 dependencies: 13316 16028 has: 1.0.4 13317 16029 16030 + is-core-module@2.13.1: 16031 + dependencies: 16032 + hasown: 2.0.2 16033 + 16034 + is-data-view@1.0.1: 16035 + dependencies: 16036 + is-typed-array: 1.1.13 16037 + 16038 + is-date-object@1.0.5: 16039 + dependencies: 16040 + has-tostringtag: 1.0.0 16041 + 13318 16042 is-decimal@2.0.1: {} 13319 16043 13320 16044 is-extendable@0.1.1: {} 13321 16045 13322 16046 is-extglob@2.1.1: {} 16047 + 16048 + is-finalizationregistry@1.0.2: 16049 + dependencies: 16050 + call-bind: 1.0.7 13323 16051 13324 16052 is-fullwidth-code-point@3.0.0: {} 13325 16053 ··· 13341 16069 dependencies: 13342 16070 lower-case: 1.1.4 13343 16071 16072 + is-map@2.0.3: {} 16073 + 16074 + is-negative-zero@2.0.3: {} 16075 + 16076 + is-number-object@1.0.7: 16077 + dependencies: 16078 + has-tostringtag: 1.0.0 16079 + 13344 16080 is-number@4.0.0: {} 13345 16081 13346 16082 is-number@7.0.0: {} ··· 13371 16107 dependencies: 13372 16108 '@types/estree': 1.0.3 13373 16109 16110 + is-regex@1.1.4: 16111 + dependencies: 16112 + call-bind: 1.0.7 16113 + has-tostringtag: 1.0.0 16114 + 16115 + is-set@2.0.3: {} 16116 + 16117 + is-shared-array-buffer@1.0.3: 16118 + dependencies: 16119 + call-bind: 1.0.7 16120 + 13374 16121 is-stream@2.0.1: {} 13375 16122 16123 + is-string@1.0.7: 16124 + dependencies: 16125 + has-tostringtag: 1.0.0 16126 + 16127 + is-symbol@1.0.4: 16128 + dependencies: 16129 + has-symbols: 1.0.3 16130 + 13376 16131 is-typed-array@1.1.12: 13377 16132 dependencies: 13378 16133 which-typed-array: 1.1.13 13379 16134 16135 + is-typed-array@1.1.13: 16136 + dependencies: 16137 + which-typed-array: 1.1.15 16138 + 13380 16139 is-unicode-supported@0.1.0: {} 13381 16140 13382 16141 is-upper-case@1.1.2: 13383 16142 dependencies: 13384 16143 upper-case: 1.1.3 13385 16144 16145 + is-weakmap@2.0.2: {} 16146 + 16147 + is-weakref@1.0.2: 16148 + dependencies: 16149 + call-bind: 1.0.7 16150 + 16151 + is-weakset@2.0.3: 16152 + dependencies: 16153 + call-bind: 1.0.7 16154 + get-intrinsic: 1.2.4 16155 + 13386 16156 is-what@4.1.15: {} 13387 16157 13388 16158 is-whitespace@0.3.0: {} 16159 + 16160 + isarray@2.0.5: {} 13389 16161 13390 16162 isbinaryfile@4.0.10: {} 13391 16163 ··· 13400 16172 13401 16173 iterable-lookahead@1.0.0: {} 13402 16174 16175 + iterator.prototype@1.1.2: 16176 + dependencies: 16177 + define-properties: 1.2.1 16178 + get-intrinsic: 1.2.4 16179 + has-symbols: 1.0.3 16180 + reflect.getprototypeof: 1.0.6 16181 + set-function-name: 2.0.2 16182 + 13403 16183 jackspeak@2.3.6: 13404 16184 dependencies: 13405 16185 '@isaacs/cliui': 8.0.2 13406 16186 optionalDependencies: 13407 16187 '@pkgjs/parseargs': 0.11.0 13408 16188 13409 - jest-environment-jsdom@29.7.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): 16189 + jest-environment-jsdom@29.7.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): 13410 16190 dependencies: 13411 16191 '@jest/environment': 29.7.0 13412 16192 '@jest/fake-timers': 29.7.0 ··· 13415 16195 '@types/node': 20.8.0 13416 16196 jest-mock: 29.7.0 13417 16197 jest-util: 29.7.0 13418 - jsdom: 20.0.3(bufferutil@4.0.7)(utf-8-validate@6.0.3) 16198 + jsdom: 20.0.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) 13419 16199 transitivePeerDependencies: 13420 16200 - bufferutil 13421 16201 - supports-color ··· 13467 16247 glob: 8.1.0 13468 16248 nopt: 6.0.0 13469 16249 16250 + js-sdsl@4.4.2: {} 16251 + 13470 16252 js-tokens@4.0.0: {} 13471 16253 13472 16254 js-yaml@3.14.1: ··· 13480 16262 13481 16263 jsbi@4.3.0: {} 13482 16264 13483 - jsdom@20.0.3(bufferutil@4.0.7)(utf-8-validate@6.0.3): 16265 + jsdom@20.0.3(bufferutil@4.0.8)(utf-8-validate@6.0.4): 13484 16266 dependencies: 13485 16267 abab: 2.0.6 13486 - acorn: 8.10.0 16268 + acorn: 8.11.3 13487 16269 acorn-globals: 7.0.1 13488 16270 cssom: 0.5.0 13489 16271 cssstyle: 2.3.0 ··· 13506 16288 whatwg-encoding: 2.0.0 13507 16289 whatwg-mimetype: 3.0.0 13508 16290 whatwg-url: 11.0.0 13509 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) 16291 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) 13510 16292 xml-name-validator: 4.0.0 13511 16293 transitivePeerDependencies: 13512 16294 - bufferutil ··· 13527 16309 13528 16310 json-parse-even-better-errors@2.3.1: {} 13529 16311 16312 + json-schema-traverse@0.4.1: {} 16313 + 13530 16314 json-schema-traverse@1.0.0: {} 16315 + 16316 + json-stable-stringify-without-jsonify@1.0.1: {} 16317 + 16318 + json5@1.0.2: 16319 + dependencies: 16320 + minimist: 1.2.8 13531 16321 13532 16322 jsonc-parser@3.2.0: {} 13533 16323 ··· 13542 16332 graceful-fs: 4.2.11 13543 16333 13544 16334 jsonpath-plus@7.2.0: {} 16335 + 16336 + jsx-ast-utils@3.3.5: 16337 + dependencies: 16338 + array-includes: 3.1.8 16339 + array.prototype.flat: 1.3.2 16340 + object.assign: 4.1.5 16341 + object.values: 1.2.0 13545 16342 13546 16343 jwa@2.0.0: 13547 16344 dependencies: ··· 13589 16386 zod: 3.22.4 13590 16387 zod-validation-error: 3.3.0(zod@3.22.4) 13591 16388 16389 + language-subtag-registry@0.3.23: {} 16390 + 16391 + language-tags@1.0.9: 16392 + dependencies: 16393 + language-subtag-registry: 0.3.23 16394 + 13592 16395 leac@0.6.0: {} 16396 + 16397 + levn@0.4.1: 16398 + dependencies: 16399 + prelude-ls: 1.2.1 16400 + type-check: 0.4.0 13593 16401 13594 16402 libsql@0.3.10: 13595 16403 dependencies: ··· 13621 16429 locate-path@5.0.0: 13622 16430 dependencies: 13623 16431 p-locate: 4.1.0 16432 + 16433 + locate-path@6.0.0: 16434 + dependencies: 16435 + p-locate: 5.0.0 13624 16436 13625 16437 lodash.camelcase@4.3.0: {} 13626 16438 ··· 13869 16681 dependencies: 13870 16682 '@types/mdast': 3.0.14 13871 16683 13872 - mdx-bundler@9.2.1(esbuild@0.19.12): 16684 + mdx-bundler@9.2.1(esbuild@0.21.3): 13873 16685 dependencies: 13874 16686 '@babel/runtime': 7.23.2 13875 - '@esbuild-plugins/node-resolve': 0.1.4(esbuild@0.19.12) 16687 + '@esbuild-plugins/node-resolve': 0.1.4(esbuild@0.21.3) 13876 16688 '@fal-works/esbuild-plugin-global-externals': 2.1.2 13877 - '@mdx-js/esbuild': 2.3.0(esbuild@0.19.12) 13878 - esbuild: 0.19.12 16689 + '@mdx-js/esbuild': 2.3.0(esbuild@0.21.3) 16690 + esbuild: 0.21.3 13879 16691 gray-matter: 4.0.3 13880 16692 remark-frontmatter: 4.0.1 13881 16693 remark-mdx-frontmatter: 1.1.1 ··· 14043 16855 14044 16856 micromark-extension-mdxjs@1.0.1: 14045 16857 dependencies: 14046 - acorn: 8.10.0 14047 - acorn-jsx: 5.3.2(acorn@8.10.0) 16858 + acorn: 8.11.3 16859 + acorn-jsx: 5.3.2(acorn@8.11.3) 14048 16860 micromark-extension-mdx-expression: 1.0.8 14049 16861 micromark-extension-mdx-jsx: 1.0.5 14050 16862 micromark-extension-mdx-md: 1.0.1 ··· 14213 17025 14214 17026 min-indent@1.0.1: {} 14215 17027 14216 - miniflare@3.20240403.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): 17028 + miniflare@3.20240403.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): 14217 17029 dependencies: 14218 17030 '@cspotcode/source-map-support': 0.8.1 14219 17031 acorn: 8.10.0 ··· 14224 17036 stoppable: 1.1.0 14225 17037 undici: 5.28.4 14226 17038 workerd: 1.20240403.0 14227 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) 17039 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) 14228 17040 youch: 3.3.3 14229 17041 zod: 3.22.4 14230 17042 transitivePeerDependencies: ··· 14232 17044 - supports-color 14233 17045 - utf-8-validate 14234 17046 14235 - miniflare@3.20240512.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): 17047 + miniflare@3.20240512.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): 14236 17048 dependencies: 14237 17049 '@cspotcode/source-map-support': 0.8.1 14238 - acorn: 8.10.0 14239 - acorn-walk: 8.2.0 17050 + acorn: 8.11.3 17051 + acorn-walk: 8.3.2 14240 17052 capnp-ts: 0.7.0 14241 17053 exit-hook: 2.2.1 14242 17054 glob-to-regexp: 0.4.1 14243 17055 stoppable: 1.1.0 14244 17056 undici: 5.28.4 14245 17057 workerd: 1.20240512.0 14246 - ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) 17058 + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 14247 17059 youch: 3.3.3 14248 17060 zod: 3.22.4 14249 17061 transitivePeerDependencies: ··· 14307 17119 14308 17120 napi-build-utils@1.0.2: {} 14309 17121 17122 + natural-compare@1.4.0: {} 17123 + 14310 17124 neo-async@2.6.2: {} 14311 17125 14312 17126 netmask@2.0.2: {} ··· 14317 17131 next: 14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 14318 17132 react: 18.2.0 14319 17133 14320 - next-contentlayer@0.3.4(contentlayer@0.3.4(esbuild@0.19.12))(esbuild@0.19.12)(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): 17134 + next-auth@5.0.0-beta.17(next@14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): 17135 + dependencies: 17136 + '@auth/core': 0.30.0 17137 + next: 14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 17138 + react: 18.3.1 17139 + 17140 + next-contentlayer@0.3.4(contentlayer@0.3.4(esbuild@0.21.3))(esbuild@0.21.3)(next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): 14321 17141 dependencies: 14322 - '@contentlayer/core': 0.3.4(esbuild@0.19.12) 17142 + '@contentlayer/core': 0.3.4(esbuild@0.21.3) 14323 17143 '@contentlayer/utils': 0.3.4 14324 - contentlayer: 0.3.4(esbuild@0.19.12) 17144 + contentlayer: 0.3.4(esbuild@0.21.3) 14325 17145 next: 14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 14326 17146 react: 18.2.0 14327 17147 react-dom: 18.2.0(react@18.2.0) ··· 14343 17163 react: 18.2.0 14344 17164 react-dom: 18.2.0(react@18.2.0) 14345 17165 17166 + next-themes@0.2.1(next@14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0))(react-dom@18.3.1(react@18.2.0))(react@18.2.0): 17167 + dependencies: 17168 + next: 14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 17169 + react: 18.2.0 17170 + react-dom: 18.3.1(react@18.2.0) 17171 + 14346 17172 next-tick@1.1.0: {} 14347 17173 17174 + next@13.2.4(@opentelemetry/api@1.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): 17175 + dependencies: 17176 + '@next/env': 13.2.4 17177 + '@swc/helpers': 0.4.14 17178 + caniuse-lite: 1.0.30001612 17179 + postcss: 8.4.14 17180 + react: 18.2.0 17181 + react-dom: 18.2.0(react@18.2.0) 17182 + styled-jsx: 5.1.1(react@18.2.0) 17183 + optionalDependencies: 17184 + '@next/swc-android-arm-eabi': 13.2.4 17185 + '@next/swc-android-arm64': 13.2.4 17186 + '@next/swc-darwin-arm64': 13.2.4 17187 + '@next/swc-darwin-x64': 13.2.4 17188 + '@next/swc-freebsd-x64': 13.2.4 17189 + '@next/swc-linux-arm-gnueabihf': 13.2.4 17190 + '@next/swc-linux-arm64-gnu': 13.2.4 17191 + '@next/swc-linux-arm64-musl': 13.2.4 17192 + '@next/swc-linux-x64-gnu': 13.2.4 17193 + '@next/swc-linux-x64-musl': 13.2.4 17194 + '@next/swc-win32-arm64-msvc': 13.2.4 17195 + '@next/swc-win32-ia32-msvc': 13.2.4 17196 + '@next/swc-win32-x64-msvc': 13.2.4 17197 + '@opentelemetry/api': 1.8.0 17198 + transitivePeerDependencies: 17199 + - '@babel/core' 17200 + - babel-plugin-macros 17201 + 14348 17202 next@14.2.3(@opentelemetry/api@1.4.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): 14349 17203 dependencies: 14350 17204 '@next/env': 14.2.3 ··· 14371 17225 - '@babel/core' 14372 17226 - babel-plugin-macros 14373 17227 17228 + next@14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0): 17229 + dependencies: 17230 + '@next/env': 14.2.3 17231 + '@swc/helpers': 0.5.5 17232 + busboy: 1.6.0 17233 + caniuse-lite: 1.0.30001612 17234 + graceful-fs: 4.2.11 17235 + postcss: 8.4.31 17236 + react: 18.2.0 17237 + react-dom: 18.3.1(react@18.2.0) 17238 + styled-jsx: 5.1.1(react@18.2.0) 17239 + optionalDependencies: 17240 + '@next/swc-darwin-arm64': 14.2.3 17241 + '@next/swc-darwin-x64': 14.2.3 17242 + '@next/swc-linux-arm64-gnu': 14.2.3 17243 + '@next/swc-linux-arm64-musl': 14.2.3 17244 + '@next/swc-linux-x64-gnu': 14.2.3 17245 + '@next/swc-linux-x64-musl': 14.2.3 17246 + '@next/swc-win32-arm64-msvc': 14.2.3 17247 + '@next/swc-win32-ia32-msvc': 14.2.3 17248 + '@next/swc-win32-x64-msvc': 14.2.3 17249 + '@opentelemetry/api': 1.8.0 17250 + transitivePeerDependencies: 17251 + - '@babel/core' 17252 + - babel-plugin-macros 17253 + 17254 + next@14.2.3(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 17255 + dependencies: 17256 + '@next/env': 14.2.3 17257 + '@swc/helpers': 0.5.5 17258 + busboy: 1.6.0 17259 + caniuse-lite: 1.0.30001612 17260 + graceful-fs: 4.2.11 17261 + postcss: 8.4.31 17262 + react: 18.3.1 17263 + react-dom: 18.3.1(react@18.3.1) 17264 + styled-jsx: 5.1.1(react@18.3.1) 17265 + optionalDependencies: 17266 + '@next/swc-darwin-arm64': 14.2.3 17267 + '@next/swc-darwin-x64': 14.2.3 17268 + '@next/swc-linux-arm64-gnu': 14.2.3 17269 + '@next/swc-linux-arm64-musl': 14.2.3 17270 + '@next/swc-linux-x64-gnu': 14.2.3 17271 + '@next/swc-linux-x64-musl': 14.2.3 17272 + '@next/swc-win32-arm64-msvc': 14.2.3 17273 + '@next/swc-win32-ia32-msvc': 14.2.3 17274 + '@next/swc-win32-x64-msvc': 14.2.3 17275 + '@opentelemetry/api': 1.8.0 17276 + transitivePeerDependencies: 17277 + - '@babel/core' 17278 + - babel-plugin-macros 17279 + 14374 17280 no-case@2.3.2: 14375 17281 dependencies: 14376 17282 lower-case: 1.1.4 ··· 14401 17307 node-forge@1.3.1: {} 14402 17308 14403 17309 node-gyp-build@4.6.1: {} 17310 + 17311 + node-gyp-build@4.8.1: 17312 + optional: true 14404 17313 14405 17314 node-plop@0.26.3: 14406 17315 dependencies: ··· 14447 17356 14448 17357 object-inspect@1.13.1: {} 14449 17358 17359 + object-keys@1.1.1: {} 17360 + 14450 17361 object-pairs@0.1.0: {} 14451 17362 14452 17363 object-values@1.0.0: {} 14453 17364 17365 + object.assign@4.1.5: 17366 + dependencies: 17367 + call-bind: 1.0.5 17368 + define-properties: 1.2.1 17369 + has-symbols: 1.0.3 17370 + object-keys: 1.1.1 17371 + 17372 + object.entries@1.1.8: 17373 + dependencies: 17374 + call-bind: 1.0.7 17375 + define-properties: 1.2.1 17376 + es-object-atoms: 1.0.0 17377 + 17378 + object.fromentries@2.0.8: 17379 + dependencies: 17380 + call-bind: 1.0.7 17381 + define-properties: 1.2.1 17382 + es-abstract: 1.23.3 17383 + es-object-atoms: 1.0.0 17384 + 17385 + object.groupby@1.0.3: 17386 + dependencies: 17387 + call-bind: 1.0.7 17388 + define-properties: 1.2.1 17389 + es-abstract: 1.23.3 17390 + 17391 + object.hasown@1.1.4: 17392 + dependencies: 17393 + define-properties: 1.2.1 17394 + es-abstract: 1.23.3 17395 + es-object-atoms: 1.0.0 17396 + 17397 + object.values@1.2.0: 17398 + dependencies: 17399 + call-bind: 1.0.7 17400 + define-properties: 1.2.1 17401 + es-object-atoms: 1.0.0 17402 + 14454 17403 once@1.4.0: 14455 17404 dependencies: 14456 17405 wrappy: 1.0.2 ··· 14465 17414 dependencies: 14466 17415 yaml: 2.3.3 14467 17416 17417 + optionator@0.9.4: 17418 + dependencies: 17419 + deep-is: 0.1.4 17420 + fast-levenshtein: 2.0.6 17421 + levn: 0.4.1 17422 + prelude-ls: 1.2.1 17423 + type-check: 0.4.0 17424 + word-wrap: 1.2.5 17425 + 14468 17426 ora@4.1.1: 14469 17427 dependencies: 14470 17428 chalk: 3.0.0 ··· 14494 17452 dependencies: 14495 17453 p-try: 2.2.0 14496 17454 17455 + p-limit@3.1.0: 17456 + dependencies: 17457 + yocto-queue: 0.1.0 17458 + 14497 17459 p-locate@4.1.0: 14498 17460 dependencies: 14499 17461 p-limit: 2.3.0 17462 + 17463 + p-locate@5.0.0: 17464 + dependencies: 17465 + p-limit: 3.1.0 14500 17466 14501 17467 p-map@3.0.0: 14502 17468 dependencies: ··· 14531 17497 dependencies: 14532 17498 no-case: 2.3.2 14533 17499 17500 + parent-module@1.0.1: 17501 + dependencies: 17502 + callsites: 3.1.0 17503 + 14534 17504 parse-entities@4.0.1: 14535 17505 dependencies: 14536 17506 '@types/unist': 2.0.9 ··· 14598 17568 14599 17569 path-to-regexp@6.2.1: {} 14600 17570 17571 + path-to-regexp@6.2.2: {} 17572 + 14601 17573 path-type@4.0.0: {} 14602 17574 14603 17575 peberminta@0.8.0: {} ··· 14631 17603 playwright-core: 1.43.0 14632 17604 optionalDependencies: 14633 17605 fsevents: 2.3.2 17606 + 17607 + possible-typed-array-names@1.0.0: {} 14634 17608 14635 17609 postcss-css-variables@0.18.0(postcss@8.4.21): 14636 17610 dependencies: ··· 14639 17613 extend: 3.0.2 14640 17614 postcss: 8.4.21 14641 17615 17616 + postcss-import@14.1.0(postcss@8.4.19): 17617 + dependencies: 17618 + postcss: 8.4.19 17619 + postcss-value-parser: 4.2.0 17620 + read-cache: 1.0.0 17621 + resolve: 1.22.8 17622 + 14642 17623 postcss-import@14.1.0(postcss@8.4.21): 14643 17624 dependencies: 14644 17625 postcss: 8.4.21 ··· 14653 17634 read-cache: 1.0.0 14654 17635 resolve: 1.22.8 14655 17636 17637 + postcss-js@4.0.1(postcss@8.4.19): 17638 + dependencies: 17639 + camelcase-css: 2.0.1 17640 + postcss: 8.4.19 17641 + 14656 17642 postcss-js@4.0.1(postcss@8.4.21): 14657 17643 dependencies: 14658 17644 camelcase-css: 2.0.1 ··· 14663 17649 camelcase-css: 2.0.1 14664 17650 postcss: 8.4.38 14665 17651 14666 - postcss-load-config@3.1.4(postcss@8.4.21)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)): 17652 + postcss-load-config@3.1.4(postcss@8.4.19)(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)): 17653 + dependencies: 17654 + lilconfig: 2.1.0 17655 + yaml: 1.10.2 17656 + optionalDependencies: 17657 + postcss: 8.4.19 17658 + ts-node: 10.9.2(@types/node@18.11.9)(typescript@4.9.3) 17659 + 17660 + postcss-load-config@3.1.4(postcss@8.4.21)(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)): 17661 + dependencies: 17662 + lilconfig: 2.1.0 17663 + yaml: 1.10.2 17664 + optionalDependencies: 17665 + postcss: 8.4.21 17666 + ts-node: 10.9.2(@types/node@18.11.9)(typescript@4.9.3) 17667 + 17668 + postcss-load-config@3.1.4(postcss@8.4.21)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)): 14667 17669 dependencies: 14668 17670 lilconfig: 2.1.0 14669 17671 yaml: 1.10.2 14670 17672 optionalDependencies: 14671 17673 postcss: 8.4.21 14672 - ts-node: 10.9.1(@types/node@20.8.0)(typescript@5.4.5) 17674 + ts-node: 10.9.2(@types/node@20.8.0)(typescript@5.4.5) 14673 17675 14674 - postcss-load-config@4.0.1(postcss@8.4.38)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)): 17676 + postcss-load-config@4.0.1(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)): 14675 17677 dependencies: 14676 17678 lilconfig: 2.1.0 14677 17679 yaml: 2.3.3 14678 17680 optionalDependencies: 14679 17681 postcss: 8.4.38 14680 - ts-node: 10.9.1(@types/node@20.8.0)(typescript@5.4.5) 17682 + ts-node: 10.9.2(@types/node@20.8.0)(typescript@5.4.5) 17683 + 17684 + postcss-nested@6.0.0(postcss@8.4.19): 17685 + dependencies: 17686 + postcss: 8.4.19 17687 + postcss-selector-parser: 6.0.13 14681 17688 14682 17689 postcss-nested@6.0.0(postcss@8.4.21): 14683 17690 dependencies: ··· 14701 17708 14702 17709 postcss-value-parser@4.2.0: {} 14703 17710 14704 - postcss@8.4.21: 17711 + postcss@8.4.14: 14705 17712 dependencies: 14706 17713 nanoid: 3.3.7 14707 17714 picocolors: 1.0.0 14708 17715 source-map-js: 1.2.0 14709 17716 14710 - postcss@8.4.31: 17717 + postcss@8.4.19: 14711 17718 dependencies: 14712 17719 nanoid: 3.3.7 14713 17720 picocolors: 1.0.0 14714 17721 source-map-js: 1.2.0 17722 + 17723 + postcss@8.4.21: 17724 + dependencies: 17725 + nanoid: 3.3.7 17726 + picocolors: 1.0.0 17727 + source-map-js: 1.2.0 17728 + 17729 + postcss@8.4.31: 17730 + dependencies: 17731 + nanoid: 3.3.6 17732 + picocolors: 1.0.0 17733 + source-map-js: 1.0.2 14715 17734 14716 17735 postcss@8.4.38: 14717 17736 dependencies: ··· 14755 17774 tar-fs: 2.1.1 14756 17775 tunnel-agent: 0.6.0 14757 17776 17777 + prelude-ls@1.2.1: {} 17778 + 17779 + prettier@2.8.4: {} 17780 + 14758 17781 pretty-format@29.7.0: 14759 17782 dependencies: 14760 17783 '@jest/schemas': 29.6.3 ··· 14774 17797 js-beautify: 1.14.9 14775 17798 14776 17799 printable-characters@1.0.42: {} 17800 + 17801 + prism-react-renderer@1.3.5(react@18.2.0): 17802 + dependencies: 17803 + react: 18.2.0 14777 17804 14778 17805 progress@2.0.3: {} 14779 17806 ··· 14869 17896 dependencies: 14870 17897 loose-envify: 1.4.0 14871 17898 react: 18.2.0 14872 - scheduler: 0.23.0 17899 + scheduler: 0.23.2 17900 + 17901 + react-dom@18.3.1(react@18.2.0): 17902 + dependencies: 17903 + loose-envify: 1.4.0 17904 + react: 18.2.0 17905 + scheduler: 0.23.2 17906 + 17907 + react-dom@18.3.1(react@18.3.1): 17908 + dependencies: 17909 + loose-envify: 1.4.0 17910 + react: 18.3.1 17911 + scheduler: 0.23.2 14873 17912 14874 17913 react-email@1.10.0(encoding@0.1.13): 14875 17914 dependencies: ··· 14904 17943 14905 17944 react-property@2.0.0: {} 14906 17945 17946 + react-remove-scroll-bar@2.3.4(@types/react@18.0.25)(react@18.2.0): 17947 + dependencies: 17948 + react: 18.2.0 17949 + react-style-singleton: 2.2.1(@types/react@18.0.25)(react@18.2.0) 17950 + tslib: 2.6.2 17951 + optionalDependencies: 17952 + '@types/react': 18.0.25 17953 + 14907 17954 react-remove-scroll-bar@2.3.4(@types/react@18.2.64)(react@18.2.0): 14908 17955 dependencies: 14909 17956 react: 18.2.0 ··· 14923 17970 optionalDependencies: 14924 17971 '@types/react': 18.2.64 14925 17972 17973 + react-remove-scroll@2.5.5(@types/react@18.0.25)(react@18.2.0): 17974 + dependencies: 17975 + react: 18.2.0 17976 + react-remove-scroll-bar: 2.3.4(@types/react@18.0.25)(react@18.2.0) 17977 + react-style-singleton: 2.2.1(@types/react@18.0.25)(react@18.2.0) 17978 + tslib: 2.6.2 17979 + use-callback-ref: 1.3.0(@types/react@18.0.25)(react@18.2.0) 17980 + use-sidecar: 1.1.2(@types/react@18.0.25)(react@18.2.0) 17981 + optionalDependencies: 17982 + '@types/react': 18.0.25 17983 + 14926 17984 react-remove-scroll@2.5.5(@types/react@18.2.64)(react@18.2.0): 14927 17985 dependencies: 14928 17986 react: 18.2.0 ··· 14941 17999 react: 18.2.0 14942 18000 react-dom: 18.2.0(react@18.2.0) 14943 18001 react-transition-group: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) 18002 + 18003 + react-style-singleton@2.2.1(@types/react@18.0.25)(react@18.2.0): 18004 + dependencies: 18005 + get-nonce: 1.0.1 18006 + invariant: 2.2.4 18007 + react: 18.2.0 18008 + tslib: 2.6.2 18009 + optionalDependencies: 18010 + '@types/react': 18.0.25 14944 18011 14945 18012 react-style-singleton@2.2.1(@types/react@18.2.64)(react@18.2.0): 14946 18013 dependencies: ··· 14978 18045 dependencies: 14979 18046 loose-envify: 1.4.0 14980 18047 18048 + react@18.3.1: 18049 + dependencies: 18050 + loose-envify: 1.4.0 18051 + 14981 18052 read-cache@1.0.0: 14982 18053 dependencies: 14983 18054 pify: 2.3.0 ··· 15041 18112 indent-string: 4.0.0 15042 18113 strip-indent: 3.0.0 15043 18114 18115 + reflect.getprototypeof@1.0.6: 18116 + dependencies: 18117 + call-bind: 1.0.7 18118 + define-properties: 1.2.1 18119 + es-abstract: 1.23.3 18120 + es-errors: 1.3.0 18121 + get-intrinsic: 1.2.4 18122 + globalthis: 1.0.4 18123 + which-builtin-type: 1.1.3 18124 + 15044 18125 regenerator-runtime@0.14.0: {} 15045 18126 18127 + regexp.prototype.flags@1.5.2: 18128 + dependencies: 18129 + call-bind: 1.0.7 18130 + define-properties: 1.2.1 18131 + es-errors: 1.3.0 18132 + set-function-name: 2.0.2 18133 + 15046 18134 registry-auth-token@3.3.2: 15047 18135 dependencies: 15048 18136 rc: 1.2.8 ··· 15155 18243 dependencies: 15156 18244 '@react-email/render': 0.0.9 15157 18245 18246 + resolve-from@4.0.0: {} 18247 + 15158 18248 resolve-from@5.0.0: {} 15159 18249 15160 18250 resolve-pkg-maps@1.0.0: {} ··· 15162 18252 resolve.exports@2.0.2: {} 15163 18253 15164 18254 resolve@1.22.8: 18255 + dependencies: 18256 + is-core-module: 2.13.0 18257 + path-parse: 1.0.7 18258 + supports-preserve-symlinks-flag: 1.0.0 18259 + 18260 + resolve@2.0.0-next.5: 15165 18261 dependencies: 15166 18262 is-core-module: 2.13.0 15167 18263 path-parse: 1.0.7 ··· 15237 18333 dependencies: 15238 18334 mri: 1.2.0 15239 18335 18336 + safe-array-concat@1.1.2: 18337 + dependencies: 18338 + call-bind: 1.0.7 18339 + get-intrinsic: 1.2.4 18340 + has-symbols: 1.0.3 18341 + isarray: 2.0.5 18342 + 15240 18343 safe-buffer@5.2.1: {} 15241 18344 18345 + safe-regex-test@1.0.3: 18346 + dependencies: 18347 + call-bind: 1.0.7 18348 + es-errors: 1.3.0 18349 + is-regex: 1.1.4 18350 + 15242 18351 safer-buffer@2.1.2: {} 15243 18352 15244 18353 saxes@6.0.0: 15245 18354 dependencies: 15246 18355 xmlchars: 2.2.0 15247 18356 15248 - scheduler@0.23.0: 18357 + scheduler@0.23.2: 15249 18358 dependencies: 15250 18359 loose-envify: 1.4.0 15251 18360 ··· 15269 18378 15270 18379 semver@5.7.2: {} 15271 18380 18381 + semver@6.3.1: {} 18382 + 15272 18383 semver@7.5.4: 15273 18384 dependencies: 15274 18385 lru-cache: 6.0.0 ··· 15285 18396 gopd: 1.0.1 15286 18397 has-property-descriptors: 1.0.0 15287 18398 18399 + set-function-length@1.2.2: 18400 + dependencies: 18401 + define-data-property: 1.1.4 18402 + es-errors: 1.3.0 18403 + function-bind: 1.1.2 18404 + get-intrinsic: 1.2.4 18405 + gopd: 1.0.1 18406 + has-property-descriptors: 1.0.2 18407 + 18408 + set-function-name@2.0.2: 18409 + dependencies: 18410 + define-data-property: 1.1.4 18411 + es-errors: 1.3.0 18412 + functions-have-names: 1.2.3 18413 + has-property-descriptors: 1.0.2 18414 + 15288 18415 shebang-command@2.0.0: 15289 18416 dependencies: 15290 18417 shebang-regex: 3.0.0 ··· 15312 18439 get-intrinsic: 1.2.1 15313 18440 object-inspect: 1.13.1 15314 18441 18442 + side-channel@1.0.6: 18443 + dependencies: 18444 + call-bind: 1.0.7 18445 + es-errors: 1.3.0 18446 + get-intrinsic: 1.2.4 18447 + object-inspect: 1.13.1 18448 + 15315 18449 signal-exit@3.0.7: {} 15316 18450 15317 18451 signal-exit@4.1.0: {} ··· 15354 18488 react: 18.2.0 15355 18489 react-dom: 18.2.0(react@18.2.0) 15356 18490 18491 + sonner@1.3.1(react-dom@18.3.1(react@18.2.0))(react@18.2.0): 18492 + dependencies: 18493 + react: 18.2.0 18494 + react-dom: 18.3.1(react@18.2.0) 18495 + 15357 18496 sort-keys@5.0.0: 15358 18497 dependencies: 15359 18498 is-plain-obj: 4.1.0 18499 + 18500 + source-map-js@1.0.2: {} 15360 18501 15361 18502 source-map-js@1.2.0: {} 15362 18503 ··· 15434 18575 15435 18576 string.fromcodepoint@0.2.1: {} 15436 18577 18578 + string.prototype.matchall@4.0.11: 18579 + dependencies: 18580 + call-bind: 1.0.7 18581 + define-properties: 1.2.1 18582 + es-abstract: 1.23.3 18583 + es-errors: 1.3.0 18584 + es-object-atoms: 1.0.0 18585 + get-intrinsic: 1.2.4 18586 + gopd: 1.0.1 18587 + has-symbols: 1.0.3 18588 + internal-slot: 1.0.7 18589 + regexp.prototype.flags: 1.5.2 18590 + set-function-name: 2.0.2 18591 + side-channel: 1.0.6 18592 + 18593 + string.prototype.trim@1.2.9: 18594 + dependencies: 18595 + call-bind: 1.0.7 18596 + define-properties: 1.2.1 18597 + es-abstract: 1.23.3 18598 + es-object-atoms: 1.0.0 18599 + 18600 + string.prototype.trimend@1.0.8: 18601 + dependencies: 18602 + call-bind: 1.0.7 18603 + define-properties: 1.2.1 18604 + es-object-atoms: 1.0.0 18605 + 18606 + string.prototype.trimstart@1.0.8: 18607 + dependencies: 18608 + call-bind: 1.0.7 18609 + define-properties: 1.2.1 18610 + es-object-atoms: 1.0.0 18611 + 15437 18612 string_decoder@1.3.0: 15438 18613 dependencies: 15439 18614 safe-buffer: 5.2.1 ··· 15467 18642 15468 18643 strip-json-comments@2.0.1: {} 15469 18644 18645 + strip-json-comments@3.1.1: {} 18646 + 15470 18647 strip-json-comments@5.0.1: {} 15471 18648 15472 18649 stripe@13.8.0: ··· 15495 18672 client-only: 0.0.1 15496 18673 react: 18.2.0 15497 18674 18675 + styled-jsx@5.1.1(react@18.3.1): 18676 + dependencies: 18677 + client-only: 0.0.1 18678 + react: 18.3.1 18679 + 15498 18680 sucrase@3.34.0: 15499 18681 dependencies: 15500 18682 '@jridgewell/gen-mapping': 0.3.5 ··· 15540 18722 15541 18723 tailwind-merge@1.14.0: {} 15542 18724 15543 - tailwindcss-animate@1.0.7(tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))): 18725 + tailwindcss-animate@1.0.7(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))): 18726 + dependencies: 18727 + tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 18728 + 18729 + tailwindcss@3.2.4(postcss@8.4.19)(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)): 18730 + dependencies: 18731 + arg: 5.0.2 18732 + chokidar: 3.6.0 18733 + color-name: 1.1.4 18734 + detective: 5.2.1 18735 + didyoumean: 1.2.2 18736 + dlv: 1.1.3 18737 + fast-glob: 3.3.2 18738 + glob-parent: 6.0.2 18739 + is-glob: 4.0.3 18740 + lilconfig: 2.1.0 18741 + micromatch: 4.0.5 18742 + normalize-path: 3.0.0 18743 + object-hash: 3.0.0 18744 + picocolors: 1.0.0 18745 + postcss: 8.4.19 18746 + postcss-import: 14.1.0(postcss@8.4.19) 18747 + postcss-js: 4.0.1(postcss@8.4.19) 18748 + postcss-load-config: 3.1.4(postcss@8.4.19)(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 18749 + postcss-nested: 6.0.0(postcss@8.4.19) 18750 + postcss-selector-parser: 6.0.13 18751 + postcss-value-parser: 4.2.0 18752 + quick-lru: 5.1.1 18753 + resolve: 1.22.8 18754 + transitivePeerDependencies: 18755 + - ts-node 18756 + 18757 + tailwindcss@3.2.7(postcss@8.4.21): 18758 + dependencies: 18759 + arg: 5.0.2 18760 + chokidar: 3.6.0 18761 + color-name: 1.1.4 18762 + detective: 5.2.1 18763 + didyoumean: 1.2.2 18764 + dlv: 1.1.3 18765 + fast-glob: 3.3.2 18766 + glob-parent: 6.0.2 18767 + is-glob: 4.0.3 18768 + lilconfig: 2.1.0 18769 + micromatch: 4.0.5 18770 + normalize-path: 3.0.0 18771 + object-hash: 3.0.0 18772 + picocolors: 1.0.0 18773 + postcss: 8.4.21 18774 + postcss-import: 14.1.0(postcss@8.4.21) 18775 + postcss-js: 4.0.1(postcss@8.4.21) 18776 + postcss-load-config: 3.1.4(postcss@8.4.21)(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 18777 + postcss-nested: 6.0.0(postcss@8.4.21) 18778 + postcss-selector-parser: 6.0.13 18779 + postcss-value-parser: 4.2.0 18780 + quick-lru: 5.1.1 18781 + resolve: 1.22.8 18782 + transitivePeerDependencies: 18783 + - ts-node 18784 + 18785 + tailwindcss@3.2.7(postcss@8.4.21)(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)): 15544 18786 dependencies: 15545 - tailwindcss: 3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 18787 + arg: 5.0.2 18788 + chokidar: 3.6.0 18789 + color-name: 1.1.4 18790 + detective: 5.2.1 18791 + didyoumean: 1.2.2 18792 + dlv: 1.1.3 18793 + fast-glob: 3.3.2 18794 + glob-parent: 6.0.2 18795 + is-glob: 4.0.3 18796 + lilconfig: 2.1.0 18797 + micromatch: 4.0.5 18798 + normalize-path: 3.0.0 18799 + object-hash: 3.0.0 18800 + picocolors: 1.0.0 18801 + postcss: 8.4.21 18802 + postcss-import: 14.1.0(postcss@8.4.21) 18803 + postcss-js: 4.0.1(postcss@8.4.21) 18804 + postcss-load-config: 3.1.4(postcss@8.4.21)(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 18805 + postcss-nested: 6.0.0(postcss@8.4.21) 18806 + postcss-selector-parser: 6.0.13 18807 + postcss-value-parser: 4.2.0 18808 + quick-lru: 5.1.1 18809 + resolve: 1.22.8 18810 + transitivePeerDependencies: 18811 + - ts-node 15546 18812 15547 - tailwindcss@3.2.7(postcss@8.4.21)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)): 18813 + tailwindcss@3.2.7(postcss@8.4.21)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)): 15548 18814 dependencies: 15549 18815 arg: 5.0.2 15550 - chokidar: 3.5.3 18816 + chokidar: 3.6.0 15551 18817 color-name: 1.1.4 15552 18818 detective: 5.2.1 15553 18819 didyoumean: 1.2.2 ··· 15563 18829 postcss: 8.4.21 15564 18830 postcss-import: 14.1.0(postcss@8.4.21) 15565 18831 postcss-js: 4.0.1(postcss@8.4.21) 15566 - postcss-load-config: 3.1.4(postcss@8.4.21)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 18832 + postcss-load-config: 3.1.4(postcss@8.4.21)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 15567 18833 postcss-nested: 6.0.0(postcss@8.4.21) 15568 18834 postcss-selector-parser: 6.0.13 15569 18835 postcss-value-parser: 4.2.0 ··· 15572 18838 transitivePeerDependencies: 15573 18839 - ts-node 15574 18840 15575 - tailwindcss@3.4.3(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)): 18841 + tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)): 15576 18842 dependencies: 15577 18843 '@alloc/quick-lru': 5.2.0 15578 18844 arg: 5.0.2 ··· 15591 18857 postcss: 8.4.38 15592 18858 postcss-import: 15.1.0(postcss@8.4.38) 15593 18859 postcss-js: 4.0.1(postcss@8.4.38) 15594 - postcss-load-config: 4.0.1(postcss@8.4.38)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 18860 + postcss-load-config: 4.0.1(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 15595 18861 postcss-nested: 6.0.1(postcss@8.4.38) 15596 18862 postcss-selector-parser: 6.0.13 15597 18863 resolve: 1.22.8 15598 18864 sucrase: 3.34.0 15599 18865 transitivePeerDependencies: 15600 18866 - ts-node 18867 + 18868 + tapable@2.2.1: {} 15601 18869 15602 18870 tar-fs@2.1.1: 15603 18871 dependencies: ··· 15624 18892 transitivePeerDependencies: 15625 18893 - encoding 15626 18894 - supports-color 18895 + 18896 + text-table@0.2.0: {} 15627 18897 15628 18898 thenify-all@1.6.0: 15629 18899 dependencies: ··· 15717 18987 15718 18988 ts-interface-checker@0.1.13: {} 15719 18989 15720 - ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5): 18990 + ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3): 18991 + dependencies: 18992 + '@cspotcode/source-map-support': 0.8.1 18993 + '@tsconfig/node10': 1.0.11 18994 + '@tsconfig/node12': 1.0.11 18995 + '@tsconfig/node14': 1.0.3 18996 + '@tsconfig/node16': 1.0.4 18997 + '@types/node': 18.11.9 18998 + acorn: 8.11.3 18999 + acorn-walk: 8.3.2 19000 + arg: 4.1.3 19001 + create-require: 1.1.1 19002 + diff: 4.0.2 19003 + make-error: 1.3.6 19004 + typescript: 4.9.3 19005 + v8-compile-cache-lib: 3.0.1 19006 + yn: 3.1.1 19007 + optional: true 19008 + 19009 + ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5): 15721 19010 dependencies: 15722 19011 '@cspotcode/source-map-support': 0.8.1 15723 - '@tsconfig/node10': 1.0.9 19012 + '@tsconfig/node10': 1.0.11 15724 19013 '@tsconfig/node12': 1.0.11 15725 19014 '@tsconfig/node14': 1.0.3 15726 19015 '@tsconfig/node16': 1.0.4 15727 19016 '@types/node': 20.8.0 15728 - acorn: 8.10.0 15729 - acorn-walk: 8.2.0 15730 - arg: 4.1.0 19017 + acorn: 8.11.3 19018 + acorn-walk: 8.3.2 19019 + arg: 4.1.3 15731 19020 create-require: 1.1.1 15732 19021 diff: 4.0.2 15733 19022 make-error: 1.3.6 ··· 15737 19026 15738 19027 ts-pattern@4.3.0: {} 15739 19028 19029 + tsconfig-paths@3.15.0: 19030 + dependencies: 19031 + '@types/json5': 0.0.29 19032 + json5: 1.0.2 19033 + minimist: 1.2.8 19034 + strip-bom: 3.0.0 19035 + 15740 19036 tslib@1.14.1: {} 15741 19037 15742 19038 tslib@2.6.2: {} 15743 19039 15744 - tsup@7.2.0(postcss@8.4.38)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5))(typescript@5.4.5): 19040 + tsup@7.2.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5))(typescript@5.4.5): 15745 19041 dependencies: 15746 19042 bundle-require: 4.0.2(esbuild@0.18.20) 15747 19043 cac: 6.7.14 ··· 15751 19047 execa: 5.1.1 15752 19048 globby: 11.1.0 15753 19049 joycon: 3.1.1 15754 - postcss-load-config: 4.0.1(postcss@8.4.38)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 19050 + postcss-load-config: 4.0.1(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 15755 19051 resolve-from: 5.0.0 15756 19052 rollup: 3.29.4 15757 19053 source-map: 0.8.0-beta.0 ··· 15764 19060 - supports-color 15765 19061 - ts-node 15766 19062 19063 + tsutils@3.21.0(typescript@4.9.3): 19064 + dependencies: 19065 + tslib: 1.14.1 19066 + typescript: 4.9.3 19067 + 15767 19068 tunnel-agent@0.6.0: 15768 19069 dependencies: 15769 19070 safe-buffer: 5.2.1 ··· 15795 19096 turbo-windows-64: 1.13.3 15796 19097 turbo-windows-arm64: 1.13.3 15797 19098 15798 - tw-to-css@0.0.11(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)): 19099 + tw-to-css@0.0.11: 15799 19100 dependencies: 15800 19101 postcss: 8.4.21 15801 19102 postcss-css-variables: 0.18.0(postcss@8.4.21) 15802 - tailwindcss: 3.2.7(postcss@8.4.21)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.4.5)) 19103 + tailwindcss: 3.2.7(postcss@8.4.21) 19104 + transitivePeerDependencies: 19105 + - ts-node 19106 + 19107 + tw-to-css@0.0.11(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)): 19108 + dependencies: 19109 + postcss: 8.4.21 19110 + postcss-css-variables: 0.18.0(postcss@8.4.21) 19111 + tailwindcss: 3.2.7(postcss@8.4.21)(ts-node@10.9.2(@types/node@18.11.9)(typescript@4.9.3)) 19112 + transitivePeerDependencies: 19113 + - ts-node 19114 + 19115 + tw-to-css@0.0.11(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)): 19116 + dependencies: 19117 + postcss: 8.4.21 19118 + postcss-css-variables: 0.18.0(postcss@8.4.21) 19119 + tailwindcss: 3.2.7(postcss@8.4.21)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.4.5)) 15803 19120 transitivePeerDependencies: 15804 19121 - ts-node 15805 19122 15806 19123 typanion@3.14.0: {} 15807 19124 19125 + type-check@0.4.0: 19126 + dependencies: 19127 + prelude-ls: 1.2.1 19128 + 15808 19129 type-detect@4.0.8: {} 15809 19130 15810 19131 type-fest@0.13.1: {} 19132 + 19133 + type-fest@0.20.2: {} 15811 19134 15812 19135 type-fest@0.21.3: {} 15813 19136 ··· 15827 19150 15828 19151 type@2.7.2: {} 15829 19152 19153 + typed-array-buffer@1.0.2: 19154 + dependencies: 19155 + call-bind: 1.0.7 19156 + es-errors: 1.3.0 19157 + is-typed-array: 1.1.13 19158 + 19159 + typed-array-byte-length@1.0.1: 19160 + dependencies: 19161 + call-bind: 1.0.7 19162 + for-each: 0.3.3 19163 + gopd: 1.0.1 19164 + has-proto: 1.0.3 19165 + is-typed-array: 1.1.13 19166 + 19167 + typed-array-byte-offset@1.0.2: 19168 + dependencies: 19169 + available-typed-arrays: 1.0.7 19170 + call-bind: 1.0.7 19171 + for-each: 0.3.3 19172 + gopd: 1.0.1 19173 + has-proto: 1.0.3 19174 + is-typed-array: 1.1.13 19175 + 19176 + typed-array-length@1.0.6: 19177 + dependencies: 19178 + call-bind: 1.0.7 19179 + for-each: 0.3.3 19180 + gopd: 1.0.1 19181 + has-proto: 1.0.3 19182 + is-typed-array: 1.1.13 19183 + possible-typed-array-names: 1.0.0 19184 + 19185 + typescript@4.9.3: {} 19186 + 15830 19187 typescript@5.4.4: {} 15831 19188 15832 19189 typescript@5.4.5: {} 15833 19190 15834 19191 uglify-js@3.17.4: 19192 + optional: true 19193 + 19194 + unbox-primitive@1.0.2: 19195 + dependencies: 19196 + call-bind: 1.0.7 19197 + has-bigints: 1.0.2 19198 + has-symbols: 1.0.3 19199 + which-boxed-primitive: 1.0.2 19200 + 19201 + undici-types@5.26.5: 15835 19202 optional: true 15836 19203 15837 19204 undici@5.25.1: ··· 15968 19335 punycode: 1.3.2 15969 19336 querystring: 0.2.0 15970 19337 19338 + use-callback-ref@1.3.0(@types/react@18.0.25)(react@18.2.0): 19339 + dependencies: 19340 + react: 18.2.0 19341 + tslib: 2.6.2 19342 + optionalDependencies: 19343 + '@types/react': 18.0.25 19344 + 15971 19345 use-callback-ref@1.3.0(@types/react@18.2.64)(react@18.2.0): 15972 19346 dependencies: 15973 19347 react: 18.2.0 ··· 15975 19349 optionalDependencies: 15976 19350 '@types/react': 18.2.64 15977 19351 19352 + use-isomorphic-layout-effect@1.1.2(@types/react@18.0.25)(react@18.2.0): 19353 + dependencies: 19354 + react: 18.2.0 19355 + optionalDependencies: 19356 + '@types/react': 18.0.25 19357 + 19358 + use-sidecar@1.1.2(@types/react@18.0.25)(react@18.2.0): 19359 + dependencies: 19360 + detect-node-es: 1.1.0 19361 + react: 18.2.0 19362 + tslib: 2.6.2 19363 + optionalDependencies: 19364 + '@types/react': 18.0.25 19365 + 15978 19366 use-sidecar@1.1.2(@types/react@18.2.64)(react@18.2.0): 15979 19367 dependencies: 15980 19368 detect-node-es: 1.1.0 ··· 15991 19379 dependencies: 15992 19380 node-gyp-build: 4.6.1 15993 19381 19382 + utf-8-validate@6.0.4: 19383 + dependencies: 19384 + node-gyp-build: 4.8.1 19385 + optional: true 19386 + 15994 19387 util-deprecate@1.0.2: {} 15995 19388 15996 19389 util@0.12.5: ··· 16120 19513 tr46: 1.0.1 16121 19514 webidl-conversions: 4.0.2 16122 19515 19516 + which-boxed-primitive@1.0.2: 19517 + dependencies: 19518 + is-bigint: 1.0.4 19519 + is-boolean-object: 1.1.2 19520 + is-number-object: 1.0.7 19521 + is-string: 1.0.7 19522 + is-symbol: 1.0.4 19523 + 19524 + which-builtin-type@1.1.3: 19525 + dependencies: 19526 + function.prototype.name: 1.1.6 19527 + has-tostringtag: 1.0.0 19528 + is-async-function: 2.0.0 19529 + is-date-object: 1.0.5 19530 + is-finalizationregistry: 1.0.2 19531 + is-generator-function: 1.0.10 19532 + is-regex: 1.1.4 19533 + is-weakref: 1.0.2 19534 + isarray: 2.0.5 19535 + which-boxed-primitive: 1.0.2 19536 + which-collection: 1.0.2 19537 + which-typed-array: 1.1.13 19538 + 19539 + which-collection@1.0.2: 19540 + dependencies: 19541 + is-map: 2.0.3 19542 + is-set: 2.0.3 19543 + is-weakmap: 2.0.2 19544 + is-weakset: 2.0.3 19545 + 16123 19546 which-typed-array@1.1.13: 16124 19547 dependencies: 16125 19548 available-typed-arrays: 1.0.5 ··· 16128 19551 gopd: 1.0.1 16129 19552 has-tostringtag: 1.0.0 16130 19553 19554 + which-typed-array@1.1.15: 19555 + dependencies: 19556 + available-typed-arrays: 1.0.7 19557 + call-bind: 1.0.7 19558 + for-each: 0.3.3 19559 + gopd: 1.0.1 19560 + has-tostringtag: 1.0.2 19561 + 16131 19562 which@2.0.2: 16132 19563 dependencies: 16133 19564 isexe: 2.0.0 19565 + 19566 + word-wrap@1.2.5: {} 16134 19567 16135 19568 wordwrap@1.0.0: {} 16136 19569 ··· 16150 19583 '@cloudflare/workerd-linux-arm64': 1.20240512.0 16151 19584 '@cloudflare/workerd-windows-64': 1.20240512.0 16152 19585 16153 - wrangler@3.47.0(@cloudflare/workers-types@4.20240403.0)(bufferutil@4.0.7)(utf-8-validate@6.0.3): 19586 + wrangler@3.47.0(@cloudflare/workers-types@4.20240403.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4): 16154 19587 dependencies: 16155 19588 '@cloudflare/kv-asset-handler': 0.3.1 16156 19589 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) ··· 16158 19591 blake3-wasm: 2.1.5 16159 19592 chokidar: 3.5.3 16160 19593 esbuild: 0.17.19 16161 - miniflare: 3.20240403.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 19594 + miniflare: 3.20240403.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 16162 19595 nanoid: 3.3.6 16163 19596 path-to-regexp: 6.2.1 16164 19597 resolve: 1.22.8 ··· 16174 19607 - supports-color 16175 19608 - utf-8-validate 16176 19609 16177 - wrangler@3.57.0(@cloudflare/workers-types@4.20240512.0)(bufferutil@4.0.7)(utf-8-validate@6.0.3): 19610 + wrangler@3.57.0(@cloudflare/workers-types@4.20240512.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4): 16178 19611 dependencies: 16179 19612 '@cloudflare/kv-asset-handler': 0.3.2 16180 19613 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) 16181 19614 '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) 16182 19615 blake3-wasm: 2.1.5 16183 - chokidar: 3.5.3 19616 + chokidar: 3.6.0 16184 19617 esbuild: 0.17.19 16185 - miniflare: 3.20240512.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) 19618 + miniflare: 3.20240512.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) 16186 19619 nanoid: 3.3.7 16187 - path-to-regexp: 6.2.1 19620 + path-to-regexp: 6.2.2 16188 19621 resolve: 1.22.8 16189 19622 resolve.exports: 2.0.2 16190 19623 selfsigned: 2.4.1 ··· 16223 19656 bufferutil: 4.0.7 16224 19657 utf-8-validate: 6.0.3 16225 19658 19659 + ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.4): 19660 + optionalDependencies: 19661 + bufferutil: 4.0.8 19662 + utf-8-validate: 6.0.4 19663 + 19664 + ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): 19665 + optionalDependencies: 19666 + bufferutil: 4.0.8 19667 + utf-8-validate: 6.0.4 19668 + 16226 19669 xml-name-validator@4.0.0: {} 16227 19670 16228 19671 xml@1.0.1: {} ··· 16259 19702 yargs-parser: 21.1.1 16260 19703 16261 19704 yn@3.1.1: {} 19705 + 19706 + yocto-queue@0.1.0: {} 16262 19707 16263 19708 youch@3.3.3: 16264 19709 dependencies: