From bbe0c91d7eec37f05beea67dea0ac997230226ae Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Wed, 14 Jun 2023 10:41:25 +0200 Subject: [PATCH 01/40] allow to override default database config in new this way we can temporarily allow to execute multiple statements in one query. --- server/utils/database.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/utils/database.ts b/server/utils/database.ts index d956d52..de9c79c 100644 --- a/server/utils/database.ts +++ b/server/utils/database.ts @@ -11,7 +11,9 @@ const connectionOptions: mysql.ConnectionOptions = { }; export const database = - await mysql.createConnection(connectionOptions) as Connection & { new: () => Promise }; -database.new = () => { return mysql.createConnection(connectionOptions); }; + await mysql.createConnection(connectionOptions) as Connection & { + new: (localConnectionOptions: mysql.ConnectionOptions | undefined) => Promise + }; +database.new = (localConnectionOptions: mysql.ConnectionOptions | undefined) => { return mysql.createConnection({ ...localConnectionOptions, ...connectionOptions }); }; export type data = [T[], mysql.FieldPacket[]]; From 75f809051c681f756dcc8c0a3b83d29c3b9b6aee Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Wed, 14 Jun 2023 11:31:31 +0200 Subject: [PATCH 02/40] refactor out password hashing in login.post.ts this will be used to create the first user account in an empty database --- server/api/login.post.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/server/api/login.post.ts b/server/api/login.post.ts index b011aaf..f603761 100644 --- a/server/api/login.post.ts +++ b/server/api/login.post.ts @@ -6,6 +6,12 @@ import { isString } from "../utils/isString"; import { cookieSettings } from "../utils/rootUtils"; import Snowflake from "~/utils/snowflake"; +export function getPasswordHash(password: string) { + return crypto.createHmac("sha512", "42") + .update(password) + .digest(); +} + export default defineEventHandler(async (e) => { if (getCookie(e, "token")) throw createError({ statusCode: 501, message: "Case not implemented: logging in while cookie is set" }); @@ -18,12 +24,10 @@ export default defineEventHandler(async (e) => { if (!isString(login)) throw createError({ statusCode: 400, message: "Login is not string." }); if (!isString(password)) throw createError({ statusCode: 400, message: "Password is not string." }); - const hashedPassword = crypto.createHmac("sha512", "42") - .update(password) - .digest("hex"); + const hashedPassword = getPasswordHash(password); const [account] = await database.query( - "SELECT CONVERT(`id`, CHAR(32)) AS `id` from `users` WHERE `username` = ? AND LOWER(HEX(`password`)) = ? LIMIT 1", + "SELECT CONVERT(`id`, CHAR(32)) AS `id` from `users` WHERE `username` = ? AND `password` = ? LIMIT 1", [login, hashedPassword], )as unknown as data<{id: string}>; From cbfc4e93177f0e240f98b1d28b8109b032dc1887 Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Wed, 14 Jun 2023 12:37:57 +0200 Subject: [PATCH 03/40] fix auth check if database is uninitialised --- server/middleware/auth.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/server/middleware/auth.ts b/server/middleware/auth.ts index cb16180..82760c6 100644 --- a/server/middleware/auth.ts +++ b/server/middleware/auth.ts @@ -8,6 +8,7 @@ const endpointsWithoutAuth: string[] = [ "/hi", "/login", "/logout", + "/firstRun", ]; export default defineEventHandler(async (e) => { @@ -31,10 +32,14 @@ export default defineEventHandler(async (e) => { */ export async function isAuthorised(token: string | undefined): Promise { if (!token) return false; - const [[session]] = await database.query( - "SELECT EXISTS(SELECT `id` FROM `sessions` WHERE `id` = ? AND `expiry_date` >= NOW()) as `logged_in`", - [token], - ) as unknown as data<{logged_in: number}>; + try { + const [[session]] = await database.query( + "SELECT EXISTS(SELECT `id` FROM `sessions` WHERE `id` = ? AND `expiry_date` >= NOW()) as `logged_in`", + [token], + ) as unknown as data<{logged_in: number}>; - return session.logged_in === 1; + return session.logged_in === 1; + } catch { + return false; + } } From 90932a49c8b4af7a8f09cfe6e77f75cb42167d7b Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Wed, 14 Jun 2023 13:00:19 +0200 Subject: [PATCH 04/40] Add database initialization now, when the project is ran without configured database, it will prompt for the first user to configure the database and add the first user --- middleware/firstRun.ts | 8 ++ pages/firstRun.vue | 62 +++++++++++++ pages/login.vue | 1 + schemaModel.sql | 167 ++++++++++++++++++++++++++++++++++++ server/api/firstRun.get.ts | 15 ++++ server/api/firstRun.post.ts | 33 +++++++ 6 files changed, 286 insertions(+) create mode 100644 middleware/firstRun.ts create mode 100644 pages/firstRun.vue create mode 100644 schemaModel.sql create mode 100644 server/api/firstRun.get.ts create mode 100644 server/api/firstRun.post.ts diff --git a/middleware/firstRun.ts b/middleware/firstRun.ts new file mode 100644 index 0000000..9bb58b4 --- /dev/null +++ b/middleware/firstRun.ts @@ -0,0 +1,8 @@ +import { defineNuxtRouteMiddleware, navigateTo, useFetch } from "nuxt/app"; + +export default defineNuxtRouteMiddleware(async (to, from) => { + const firstRun = await useFetch("/api/firstRun"); + + if (firstRun.data.value) + return navigateTo({ path: "/firstRun" }); +}); diff --git a/pages/firstRun.vue b/pages/firstRun.vue new file mode 100644 index 0000000..c6d58d7 --- /dev/null +++ b/pages/firstRun.vue @@ -0,0 +1,62 @@ + + + diff --git a/pages/login.vue b/pages/login.vue index 5761adf..0667932 100644 --- a/pages/login.vue +++ b/pages/login.vue @@ -19,6 +19,7 @@ const redirectTo = ref(route.redirectedFrom); definePageMeta({ layout: false, + middleware: ["first-run"], }); async function submit() { diff --git a/schemaModel.sql b/schemaModel.sql new file mode 100644 index 0000000..b03f0ac --- /dev/null +++ b/schemaModel.sql @@ -0,0 +1,167 @@ +-- Server version 8.0.32 + +-- +-- Table structure for table `users` +-- + +CREATE TABLE `users` ( + `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), + `username` varchar(30) NOT NULL, + `email` varchar(128) NOT NULL, + `password` binary(64) NOT NULL, + `display_name` varchar(30) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `idusers_UNIQUE` (`id`), + UNIQUE KEY `username_UNIQUE` (`username`), + UNIQUE KEY `email_UNIQUE` (`email`) +); + +-- +-- Table structure for table `clients` +-- + +CREATE TABLE `clients` ( + `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), + `name` varchar(128) DEFAULT NULL, + `address` varchar(128) DEFAULT NULL, + `phone` varchar(16) DEFAULT NULL, + `email` varchar(128) DEFAULT NULL, + PRIMARY KEY (`id`) +); + +-- +-- Table structure for table `orders` +-- + +CREATE TABLE `orders` ( + `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), + `client` bigint unsigned NOT NULL, + `user` bigint unsigned NOT NULL, + `is_draft` tinyint NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `user_idx` (`user`), + KEY `client_idx` (`client`), + CONSTRAINT `client` FOREIGN KEY (`client`) REFERENCES `clients` (`id`), + CONSTRAINT `user` FOREIGN KEY (`user`) REFERENCES `users` (`id`) +); + +-- +-- Table structure for table `imported_products` +-- + +CREATE TABLE `imported_products` ( + `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), + `order` bigint unsigned NOT NULL, + `name` varchar(128) DEFAULT NULL, + `link` varchar(1024) NOT NULL, + `price_imported` decimal(10,2) NOT NULL DEFAULT '0.00', + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + PRIMARY KEY (`id`), + KEY `order_idx` (`order`), + CONSTRAINT `order2` FOREIGN KEY (`order`) REFERENCES `orders` (`id`) +); + +-- +-- Table structure for table `offer` +-- + +CREATE TABLE `offer` ( + `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), + `name` varchar(45) NOT NULL, + `description` text, + `recommended_price` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +); + +-- +-- Table structure for table `order_templates` +-- + +CREATE TABLE `order_templates` ( + `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), + `name` varchar(45) NOT NULL, + `description` text, + PRIMARY KEY (`id`) +); + +-- +-- Table structure for table `sessions` +-- + +CREATE TABLE `sessions` ( + `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), + `user` bigint unsigned NOT NULL, + `expiry_date` timestamp NULL DEFAULT ((now() + interval 30 day)), + PRIMARY KEY (`id`), + KEY `user_idx` (`user`), + CONSTRAINT `user_session` FOREIGN KEY (`user`) REFERENCES `users` (`id`) +); + +-- +-- Table structure for table `work` +-- + +CREATE TABLE `work` ( + `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), + `order` bigint unsigned NOT NULL, + `offer` bigint unsigned NOT NULL, + `price` decimal(10,2) NOT NULL, + `notes` text, + `is_fulfilled` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `order_idx` (`order`), + KEY `offer_idx` (`offer`), + CONSTRAINT `offer` FOREIGN KEY (`offer`) REFERENCES `offer` (`id`), + CONSTRAINT `order` FOREIGN KEY (`order`) REFERENCES `orders` (`id`) +); + +-- +-- Table structure for table `work_templates` +-- + +CREATE TABLE `work_templates` ( + `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), + `order_template` bigint unsigned NOT NULL, + `offer` bigint unsigned NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `notes` text, + PRIMARY KEY (`id`), + KEY `order_template_idx` (`order_template`), + KEY `offer_idx` (`offer`), + CONSTRAINT `offer2` FOREIGN KEY (`offer`) REFERENCES `offer` (`id`), + CONSTRAINT `order_template` FOREIGN KEY (`order_template`) REFERENCES `order_templates` (`id`) +); + +-- +-- Final view structure for view `orderSummaries` +-- + +CREATE VIEW `orderSummaries` AS +SELECT + `id`, + `client`, + `user`, + `is_draft`, + (COALESCE(`imported_products`.`price`, 0) + COALESCE(`work`.`price`, 0)) AS `value`, + COALESCE(`imported_products`.`count`, 0) as `imported_products_count`, + COALESCE(`work`.`count`, 0) as `work_count` +FROM +`orders` +LEFT JOIN +( + SELECT + `order`, + SUM(`price`) as `price`, + COUNT(*) AS `count` + FROM `imported_products` + GROUP BY `order` +) as `imported_products` ON `orders`.`id` = `imported_products`.`order` +LEFT JOIN +( + SELECT + `order`, + SUM(`price`) AS `price`, + COUNT(*) AS `count` + FROM `work` + GROUP BY `work`.`order` +) AS `work` ON `work`.`order` = `orders`.`id`; diff --git a/server/api/firstRun.get.ts b/server/api/firstRun.get.ts new file mode 100644 index 0000000..ae1bb23 --- /dev/null +++ b/server/api/firstRun.get.ts @@ -0,0 +1,15 @@ +/* global defineEventHandler */ +import { data, database } from "../utils/database"; + +export async function isFirstRun() { + const [tables] = await database.query({ sql: "SHOW TABLES", rowsAsArray: true }, []) as data<[string]>; + if (tables.length === 0) return true; + if (!tables.find(a => a[0] === "users")) return true; + const [[users]] = await database.query("SELECT COUNT(*) as `count` FROM `users`") as data<{count: number}>; + if (users.count === 0) return true; + return false; +} + +export default defineEventHandler((e) => { + return isFirstRun(); +}); diff --git a/server/api/firstRun.post.ts b/server/api/firstRun.post.ts new file mode 100644 index 0000000..657b8d5 --- /dev/null +++ b/server/api/firstRun.post.ts @@ -0,0 +1,33 @@ +/* global defineEventHandler, setResponseStatus, readBody, createError */ + +import fs from "node:fs/promises"; + +import { database as db } from "../utils/database"; +import { isFirstRun } from "./firstRun.get"; +import { getPasswordHash } from "./login.post"; +import Snowflake from "~/utils/snowflake"; + +export default defineEventHandler(async (e) => { + if (!isFirstRun()) { + setResponseStatus(e, 404); + return ""; + } + + const body = await readBody(e); + if (typeof body !== "object") throw createError({ message: "Invalid body", statusCode: 400 }); + const username = body.username; + if (typeof username !== "string") throw createError({ message: "username is not string", statusCode: 400 }); + const password = body.password; + if (typeof password !== "string") throw createError({ message: "password is not string", statusCode: 400 }); + const email = body.email; + if (typeof email !== "string") throw createError({ message: "email is not string", statusCode: 400 }); + + const sql = await fs.readFile("./schemaModel.sql", "utf-8"); + + const database = await db.new({ multipleStatements: true }); + await database.query(sql); + await database.execute( + "INSERT INTO `users` (`id`, `username`, `password`, `email`) VALUES (?, ?, ?, ?)", + [new Snowflake().toString(), username, getPasswordHash(password), email]); + return ""; +}); From 4720202d8ac63820b6197af0bbf6c7989c30a1d4 Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Wed, 14 Jun 2023 13:47:21 +0200 Subject: [PATCH 05/40] remove playground junk --- components/navigation/navigation.vue | 12 --- components/test.vue | 11 --- pages/clients.backup.vue | 124 --------------------------- pages/forms.vue | 28 ------ pages/index.vue | 26 +----- pages/tableExample.vue | 50 ----------- server/api/dbtest.get.ts | 9 -- server/api/dbtest.post.ts | 26 ------ 8 files changed, 4 insertions(+), 282 deletions(-) delete mode 100644 components/test.vue delete mode 100644 pages/clients.backup.vue delete mode 100644 pages/forms.vue delete mode 100644 pages/tableExample.vue delete mode 100644 server/api/dbtest.get.ts delete mode 100644 server/api/dbtest.post.ts diff --git a/components/navigation/navigation.vue b/components/navigation/navigation.vue index c72c67d..6e5a674 100644 --- a/components/navigation/navigation.vue +++ b/components/navigation/navigation.vue @@ -13,22 +13,10 @@ const navOpen = ref(!mobile.value); Database Project - - - - - - - diff --git a/components/test.vue b/components/test.vue deleted file mode 100644 index 6c5504e..0000000 --- a/components/test.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/pages/clients.backup.vue b/pages/clients.backup.vue deleted file mode 100644 index 5b4121b..0000000 --- a/pages/clients.backup.vue +++ /dev/null @@ -1,124 +0,0 @@ - - - - - diff --git a/pages/forms.vue b/pages/forms.vue deleted file mode 100644 index 9d5a687..0000000 --- a/pages/forms.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - diff --git a/pages/index.vue b/pages/index.vue index 4fba044..1887815 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -1,23 +1,5 @@ - - - - - diff --git a/pages/tableExample.vue b/pages/tableExample.vue deleted file mode 100644 index 751b9bb..0000000 --- a/pages/tableExample.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - - - diff --git a/server/api/dbtest.get.ts b/server/api/dbtest.get.ts deleted file mode 100644 index e801627..0000000 --- a/server/api/dbtest.get.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* global defineEventHandler */ - -import { database } from "../utils/database"; - -export default defineEventHandler(async () => { - const [owo] = await database.execute("SELECT * FROM `sch_baza_smartfony`.`lombardy`"); - - return owo as {id: number, nazwa: string, adres: string, kontakt: string}[]; -}); diff --git a/server/api/dbtest.post.ts b/server/api/dbtest.post.ts deleted file mode 100644 index d13e2ab..0000000 --- a/server/api/dbtest.post.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* global defineEventHandler, readBody */ - -import { RowDataPacket } from "mysql2"; - -import { database } from "../utils/database"; -import { isString } from "../utils/isString"; - -export default defineEventHandler(async (e) => { - const data = await readBody(e); - - const nazwa = data.nazwa; - const adres = data.adres; - const kontakt = data.kontakt; - - if (!isString(nazwa)) throw new Error("nazwa is not string"); - if (!isString(adres)) throw new Error("adres is not string"); - if (!isString(kontakt)) throw new Error("kontakt is not string"); - - const [inserted] = await database.query("INSERT INTO `sch_baza_smartfony`.`lombardy` (`nazwa`, `adres`, `kontakt`) VALUES (?, ?, ?);", [nazwa, adres, kontakt]) as RowDataPacket[]; - return { - id: inserted.insertId as number, - nazwa, - adres, - kontakt, - }; -}); From 267a83d4849a4659496c30fa762aac4b9b45e4fe Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Wed, 14 Jun 2023 13:52:53 +0200 Subject: [PATCH 06/40] fix no template for index.vue --- pages/index.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pages/index.vue b/pages/index.vue index 1887815..d95849d 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -3,3 +3,7 @@ import { navigateTo } from 'nuxt/app'; navigateTo("/clients"); + + From 1d893c4a78376fb937b2dd2241b94b86e137595c Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Mon, 6 Nov 2023 02:57:00 +0100 Subject: [PATCH 07/40] Update dependencies, fix (auto)import problems --- components/orderView.vue | 2 +- package-lock.json | 8033 +++++++++++------ package.json | 6 +- pages/client/[id].vue | 4 +- pages/clients.vue | 13 +- pages/firstRun.vue | 8 +- pages/index.vue | 2 +- pages/login.vue | 3 +- server/api/clients.get.ts | 5 +- server/api/clients.post.ts | 6 +- server/api/clients/[id].delete.ts | 2 +- server/api/clients/[id].get.ts | 2 +- server/api/clients/[id].patch.ts | 2 +- server/api/clients/[id]/orders.get.ts | 2 +- server/api/clients/count.get.ts | 2 +- server/api/dbtest/[id].delete.ts | 2 +- server/api/echo.post.ts | 2 +- server/api/firstRun.get.ts | 4 +- server/api/firstRun.post.ts | 5 +- server/api/hi.ts | 2 +- server/api/login.post.ts | 6 +- server/api/logout.ts | 4 +- server/api/orders.get.ts | 6 +- server/api/orders.post.ts | 4 +- server/api/orders/[id].delete.ts | 6 +- server/api/orders/[id].get.ts | 7 +- server/api/orders/[id].patch.ts | 4 +- .../api/orders/[id]/imported_products.get.ts | 4 +- .../api/orders/[id]/imported_products.post.ts | 4 +- server/api/orders/[id]/work.get.ts | 4 +- server/api/orders/[id]/work.post.ts | 4 +- .../api/orders/[id]/work/[idWork].delete.ts | 6 +- server/api/orders/[id]/work/[idWork].get.ts | 4 +- server/api/users/me.get.ts | 5 +- server/middleware/auth.ts | 5 +- server/utils/baaPagination.ts | 14 +- server/utils/database.ts | 6 +- server/utils/getRequestingUser.ts | 9 +- server/utils/validation.ts | 2 +- utils/cookieSettings.ts | 2 +- 40 files changed, 5166 insertions(+), 3047 deletions(-) diff --git a/components/orderView.vue b/components/orderView.vue index aa540b7..5e25109 100644 --- a/components/orderView.vue +++ b/components/orderView.vue @@ -1,5 +1,5 @@ diff --git a/pages/login.vue b/pages/login.vue index 0667932..b177602 100644 --- a/pages/login.vue +++ b/pages/login.vue @@ -2,9 +2,8 @@ /* global $fetch */ import { ref, watch } from "vue"; import { VForm } from "vuetify/components"; -import { navigateTo, useCookie, useFetch, useRoute } from "nuxt/app"; import { cookieSettings } from "~/utils/cookieSettings"; -import { definePageMeta } from "~/.nuxt/imports"; +import { definePageMeta, navigateTo, useCookie, useFetch, useRoute } from "#imports"; const route = useRoute(); diff --git a/server/api/clients.get.ts b/server/api/clients.get.ts index 42e6cca..8d2d498 100644 --- a/server/api/clients.get.ts +++ b/server/api/clients.get.ts @@ -1,7 +1,8 @@ -/* global defineEventHandler getQuery, createError */ +import { defineEventHandler, getQuery } from "h3"; +import { createError } from "#imports"; import BaaPagination from "~/server/utils/baaPagination"; -import { client } from "~/utils/types/database"; +import { type client } from "~/utils/types/database"; export const baaWrapper = new BaaPagination("clients", "id"); diff --git a/server/api/clients.post.ts b/server/api/clients.post.ts index 84fa7e4..6dbe778 100644 --- a/server/api/clients.post.ts +++ b/server/api/clients.post.ts @@ -1,7 +1,9 @@ -/* global defineEventHandler, createError, readBody */ +import { defineEventHandler, readBody } from "h3"; import { baaWrapper } from "./clients.get"; -import { client } from "~/utils/types/database"; +import { type client } from "~/utils/types/database"; + +import { createError } from "#imports"; const clientKeys: Array = [ "name", diff --git a/server/api/clients/[id].delete.ts b/server/api/clients/[id].delete.ts index a4c2e51..9b6ab20 100644 --- a/server/api/clients/[id].delete.ts +++ b/server/api/clients/[id].delete.ts @@ -1,4 +1,4 @@ -/* global defineEventHandler */ +import { defineEventHandler } from "h3"; import { baaWrapper } from "../clients.get"; diff --git a/server/api/clients/[id].get.ts b/server/api/clients/[id].get.ts index 2647b77..75fcc79 100644 --- a/server/api/clients/[id].get.ts +++ b/server/api/clients/[id].get.ts @@ -1,4 +1,4 @@ -/* global defineEventHandler */ +import { defineEventHandler } from "h3"; import { baaWrapper } from "../clients.get"; diff --git a/server/api/clients/[id].patch.ts b/server/api/clients/[id].patch.ts index 38ff3f8..55163ca 100644 --- a/server/api/clients/[id].patch.ts +++ b/server/api/clients/[id].patch.ts @@ -1,4 +1,4 @@ -/* global defineEventHandler */ +import { defineEventHandler } from "h3"; import { checkIsClient } from "../clients.post"; import { baaWrapper } from "../clients.get"; diff --git a/server/api/clients/[id]/orders.get.ts b/server/api/clients/[id]/orders.get.ts index bd9903b..de76c37 100644 --- a/server/api/clients/[id]/orders.get.ts +++ b/server/api/clients/[id]/orders.get.ts @@ -1,4 +1,4 @@ -/* global defineEventHandler */ +import { defineEventHandler } from "h3"; import { baaWrapper } from "~/server/api/orders.get"; diff --git a/server/api/clients/count.get.ts b/server/api/clients/count.get.ts index 38b82b5..565dcd2 100644 --- a/server/api/clients/count.get.ts +++ b/server/api/clients/count.get.ts @@ -1,4 +1,4 @@ -/* global defineEventHandler */ +import { defineEventHandler } from "h3"; import { baaWrapper } from "../clients.get"; diff --git a/server/api/dbtest/[id].delete.ts b/server/api/dbtest/[id].delete.ts index 81560f6..749540a 100644 --- a/server/api/dbtest/[id].delete.ts +++ b/server/api/dbtest/[id].delete.ts @@ -1,4 +1,4 @@ -/* global defineEventHandler */ +import { defineEventHandler } from "h3"; import { database } from "~/server/utils/database"; diff --git a/server/api/echo.post.ts b/server/api/echo.post.ts index 2e8db98..4c90f68 100644 --- a/server/api/echo.post.ts +++ b/server/api/echo.post.ts @@ -1,4 +1,4 @@ -/* global defineEventHandler */ +import { defineEventHandler } from "h3"; export default defineEventHandler((event) => { const message = event.node.req.read(); diff --git a/server/api/firstRun.get.ts b/server/api/firstRun.get.ts index ae1bb23..21ccb65 100644 --- a/server/api/firstRun.get.ts +++ b/server/api/firstRun.get.ts @@ -1,5 +1,5 @@ -/* global defineEventHandler */ -import { data, database } from "../utils/database"; +import { defineEventHandler } from "h3"; +import { type data, database } from "../utils/database"; export async function isFirstRun() { const [tables] = await database.query({ sql: "SHOW TABLES", rowsAsArray: true }, []) as data<[string]>; diff --git a/server/api/firstRun.post.ts b/server/api/firstRun.post.ts index 657b8d5..16436cf 100644 --- a/server/api/firstRun.post.ts +++ b/server/api/firstRun.post.ts @@ -1,12 +1,13 @@ -/* global defineEventHandler, setResponseStatus, readBody, createError */ - import fs from "node:fs/promises"; +import { defineEventHandler, setResponseStatus, readBody } from "h3"; import { database as db } from "../utils/database"; import { isFirstRun } from "./firstRun.get"; import { getPasswordHash } from "./login.post"; import Snowflake from "~/utils/snowflake"; +import { createError } from "#imports"; + export default defineEventHandler(async (e) => { if (!isFirstRun()) { setResponseStatus(e, 404); diff --git a/server/api/hi.ts b/server/api/hi.ts index 2f94714..c5b6e65 100644 --- a/server/api/hi.ts +++ b/server/api/hi.ts @@ -1,4 +1,4 @@ -/* global defineEventHandler */ +import { defineEventHandler } from "h3"; export default defineEventHandler(() => { return "Hi mom!"; diff --git a/server/api/login.post.ts b/server/api/login.post.ts index f603761..49f8690 100644 --- a/server/api/login.post.ts +++ b/server/api/login.post.ts @@ -1,11 +1,13 @@ -/* global defineEventHandler, getCookie, setCookie, readBody, createError */ import crypto from "crypto"; +import { defineEventHandler, getCookie, setCookie, readBody } from "h3"; -import { database, data } from "../utils/database"; +import { database, type data } from "../utils/database"; import { isString } from "../utils/isString"; import { cookieSettings } from "../utils/rootUtils"; import Snowflake from "~/utils/snowflake"; +import { createError } from "#imports"; + export function getPasswordHash(password: string) { return crypto.createHmac("sha512", "42") .update(password) diff --git a/server/api/logout.ts b/server/api/logout.ts index 6923245..59ce9b6 100644 --- a/server/api/logout.ts +++ b/server/api/logout.ts @@ -1,9 +1,11 @@ -/* global defineEventHandler, createError, getCookie, deleteCookie */ +import { defineEventHandler, getCookie, deleteCookie } from "h3"; import { isAuthorised } from "../middleware/auth"; import { database } from "../utils/database"; import { cookieSettings } from "../utils/rootUtils"; +import { createError } from "#imports"; + export default defineEventHandler(async (e) => { const token = getCookie(e, "token"); if (token === undefined) { diff --git a/server/api/orders.get.ts b/server/api/orders.get.ts index 34f7816..526401b 100644 --- a/server/api/orders.get.ts +++ b/server/api/orders.get.ts @@ -1,8 +1,8 @@ -/* global defineEventHandler */ +import { defineEventHandler } from "h3"; import BaaPagination from "../utils/baaPagination"; -import { data, database } from "../utils/database"; -import { client, orderSummary } from "~/utils/types/database"; +import { type data, database } from "../utils/database"; +import { type client, type orderSummary } from "~/utils/types/database"; export const baaWrapper = new BaaPagination( "orderSummaries", diff --git a/server/api/orders.post.ts b/server/api/orders.post.ts index ed31ada..e67913d 100644 --- a/server/api/orders.post.ts +++ b/server/api/orders.post.ts @@ -1,4 +1,4 @@ -/* global defineEventHandler, createError, readBody, setResponseStatus */ +import { defineEventHandler, readBody, setResponseStatus } from "h3"; import { createValidationError, handleRecursedValidationError } from "../utils/validation"; import { database as db } from "../utils/database"; @@ -6,6 +6,8 @@ import getRequestingUser from "../utils/getRequestingUser"; import { getOrder } from "./orders/[id].get"; import Snowflake from "~/utils/snowflake"; +import { createError } from "#imports"; + type importedProduct = { name: string | null, link: string, diff --git a/server/api/orders/[id].delete.ts b/server/api/orders/[id].delete.ts index 0f660d0..662e7d2 100644 --- a/server/api/orders/[id].delete.ts +++ b/server/api/orders/[id].delete.ts @@ -1,8 +1,10 @@ -/* global defineEventHandler, createError */ -import { ResultSetHeader } from "mysql2"; +import { defineEventHandler } from "h3"; +import { type ResultSetHeader } from "mysql2"; import { database } from "~/server/utils/database"; +import { createError } from "#imports"; + export default defineEventHandler(async (e) => { const id = e.context.params?.id; diff --git a/server/api/orders/[id].get.ts b/server/api/orders/[id].get.ts index 9832f2f..6069201 100644 --- a/server/api/orders/[id].get.ts +++ b/server/api/orders/[id].get.ts @@ -1,7 +1,8 @@ -/* global defineEventHandler, createError */ +import { defineEventHandler } from "h3"; +import { createError } from "#imports"; -import { offer as offerType, order } from "~/utils/types/database"; -import { database, data } from "~/server/utils/database"; +import { type offer as offerType, type order } from "~/utils/types/database"; +import { database, type data } from "~/server/utils/database"; export async function orderExists(id: string) { const [[exists]] = await database.query( diff --git a/server/api/orders/[id].patch.ts b/server/api/orders/[id].patch.ts index 87aa718..687066a 100644 --- a/server/api/orders/[id].patch.ts +++ b/server/api/orders/[id].patch.ts @@ -1,8 +1,10 @@ -/* global defineEventHandler, readBody, createError */ +import { defineEventHandler, readBody } from "h3"; import { checkIsOrder } from "../orders.post"; import { database as db } from "~/server/utils/database"; +import { createError } from "#imports"; + export default defineEventHandler(async (e) => { const body = await readBody(e); const id = e.context.params?.id; diff --git a/server/api/orders/[id]/imported_products.get.ts b/server/api/orders/[id]/imported_products.get.ts index ad7d9e0..1e6a027 100644 --- a/server/api/orders/[id]/imported_products.get.ts +++ b/server/api/orders/[id]/imported_products.get.ts @@ -1,7 +1,9 @@ -/* global defineEventHandler, createError */ +import { defineEventHandler } from "h3"; import { orderExists, getImportedProducts } from "../[id].get"; +import { createError } from "#imports"; + export default defineEventHandler(async (e) => { const id = e.context.params?.id as string; diff --git a/server/api/orders/[id]/imported_products.post.ts b/server/api/orders/[id]/imported_products.post.ts index f441432..debf1a8 100644 --- a/server/api/orders/[id]/imported_products.post.ts +++ b/server/api/orders/[id]/imported_products.post.ts @@ -1,10 +1,12 @@ -/* global defineEventHandler, readBody, createError, setResponseStatus */ +import { defineEventHandler, readBody, setResponseStatus } from "h3"; import { checkIsImportedProduct } from "../../orders.post"; import { getImportedProducts, orderExists } from "../[id].get"; import Snowflake from "~/utils/snowflake"; import { database } from "~/server/utils/database"; +import { createError } from "#imports"; + export default defineEventHandler(async (e) => { const body = await readBody(e); const idOrder = e.context.params?.id as string; diff --git a/server/api/orders/[id]/work.get.ts b/server/api/orders/[id]/work.get.ts index 5399cb8..02bd815 100644 --- a/server/api/orders/[id]/work.get.ts +++ b/server/api/orders/[id]/work.get.ts @@ -1,7 +1,9 @@ -/* global defineEventHandler, createError */ +import { defineEventHandler } from "h3"; import { orderExists, getWork } from "../[id].get"; +import { createError } from "#imports"; + export default defineEventHandler(async (e) => { const id = e.context.params?.id as string; diff --git a/server/api/orders/[id]/work.post.ts b/server/api/orders/[id]/work.post.ts index 98e04bd..f153ae6 100644 --- a/server/api/orders/[id]/work.post.ts +++ b/server/api/orders/[id]/work.post.ts @@ -1,10 +1,12 @@ -/* global defineEventHandler, readBody, createError, setResponseStatus */ +import { defineEventHandler, readBody, setResponseStatus } from "h3"; import { checkIsWork } from "../../orders.post"; import { getWork, orderExists } from "../[id].get"; import Snowflake from "~/utils/snowflake"; import { database } from "~/server/utils/database"; +import { createError } from "#imports"; + export default defineEventHandler(async (e) => { const body = await readBody(e); const idOrder = e.context.params?.id as string; diff --git a/server/api/orders/[id]/work/[idWork].delete.ts b/server/api/orders/[id]/work/[idWork].delete.ts index d95f1c3..9c7ef0e 100644 --- a/server/api/orders/[id]/work/[idWork].delete.ts +++ b/server/api/orders/[id]/work/[idWork].delete.ts @@ -1,9 +1,11 @@ -/* global defineEventHandler, createError */ +import { defineEventHandler } from "h3"; -import { ResultSetHeader } from "mysql2"; +import { type ResultSetHeader } from "mysql2"; import { orderExists } from "../../[id].get"; import { database } from "~/server/utils/database"; +import { createError } from "#imports"; + export default defineEventHandler(async (e) => { const idOrder = e.context.params?.id as string; const idWork = e.context.params?.idWork as string; diff --git a/server/api/orders/[id]/work/[idWork].get.ts b/server/api/orders/[id]/work/[idWork].get.ts index 5a8c06c..9c21067 100644 --- a/server/api/orders/[id]/work/[idWork].get.ts +++ b/server/api/orders/[id]/work/[idWork].get.ts @@ -1,7 +1,9 @@ -/* global defineEventHandler, createError */ +import { defineEventHandler } from "h3"; import { orderExists, getWork } from "../../[id].get"; +import { createError } from "#imports"; + export default defineEventHandler((e) => { const idOrder = e.context.params?.id as string; const idWork = e.context.params?.idWork as string; diff --git a/server/api/users/me.get.ts b/server/api/users/me.get.ts index f7ca2e6..1e2f156 100644 --- a/server/api/users/me.get.ts +++ b/server/api/users/me.get.ts @@ -1,7 +1,8 @@ /* global defineEventHandler, getCookie */ +import { defineEventHandler, getCookie } from "h3"; -import { database, data } from "~/server/utils/database"; -import { user } from "~/utils/types/database"; +import { database, type data } from "~/server/utils/database"; +import { type user } from "~/utils/types/database"; export default defineEventHandler(async (e) => { const token = getCookie(e, "token"); diff --git a/server/middleware/auth.ts b/server/middleware/auth.ts index 82760c6..ad4dc48 100644 --- a/server/middleware/auth.ts +++ b/server/middleware/auth.ts @@ -1,6 +1,7 @@ -/* global defineEventHandler, createError, getCookie */ +import { defineEventHandler, getCookie } from "h3"; +import { createError } from "#imports"; -import { database, data } from "~/server/utils/database"; +import { database, type data } from "~/server/utils/database"; const endpointsWithoutAuth: string[] = [ "/dbtest", diff --git a/server/utils/baaPagination.ts b/server/utils/baaPagination.ts index 96e4853..aa78ec7 100644 --- a/server/utils/baaPagination.ts +++ b/server/utils/baaPagination.ts @@ -1,12 +1,12 @@ -/* global defineEventHandler, getQuery, createError, readBody, setResponseStatus */ -import { QueryObject } from "ufo"; -import { H3Event } from "h3"; -import { ResultSetHeader } from "mysql2/promise"; +import { defineEventHandler, getQuery, readBody, setResponseStatus, H3Event } from "h3"; +import { type ResultSetHeader } from "mysql2/promise"; -import { data, database } from "./database"; +import { type data, database } from "./database"; import { isString } from "./isString"; import Snowflake from "~/utils/snowflake"; -import { client } from "~/utils/types/database"; +import { type client } from "~/utils/types/database"; + +import { createError } from "#imports"; type queryType = { type: "before" | "after" | "around", @@ -33,7 +33,7 @@ export default class BaaPagination Promise + new: (localConnectionOptions?: mysql.ConnectionOptions | undefined) => Promise }; -database.new = (localConnectionOptions: mysql.ConnectionOptions | undefined) => { return mysql.createConnection({ ...localConnectionOptions, ...connectionOptions }); }; +database.new = (localConnectionOptions?: mysql.ConnectionOptions | undefined) => { return mysql.createConnection({ ...localConnectionOptions, ...connectionOptions }); }; export type data = [T[], mysql.FieldPacket[]]; diff --git a/server/utils/getRequestingUser.ts b/server/utils/getRequestingUser.ts index 45a0037..02f5b0b 100644 --- a/server/utils/getRequestingUser.ts +++ b/server/utils/getRequestingUser.ts @@ -1,8 +1,9 @@ -/* global getCookie, createError */ -import { H3Event } from "h3"; +import { getCookie, H3Event } from "h3"; -import { database, data } from "./database"; -import { user } from "~/utils/types/database"; +import { database, type data } from "./database"; +import { type user } from "~/utils/types/database"; + +import { createError } from "#imports"; export default async function getRequestingUser(e: H3Event) { const cookie = getCookie(e, "token"); diff --git a/server/utils/validation.ts b/server/utils/validation.ts index 300a55d..9a94222 100644 --- a/server/utils/validation.ts +++ b/server/utils/validation.ts @@ -1,4 +1,4 @@ -/* global createError */ +import { createError } from "#imports"; export function createValidationError(errors: Map) { let message = "Invalid parameters: "; diff --git a/utils/cookieSettings.ts b/utils/cookieSettings.ts index 857ed94..34f7bb6 100644 --- a/utils/cookieSettings.ts +++ b/utils/cookieSettings.ts @@ -1,4 +1,4 @@ -import { CookieSerializeOptions } from "cookie-es"; +import { type CookieSerializeOptions } from "cookie-es"; export const cookieSettings: CookieSerializeOptions = { sameSite: "lax", From be1e3909b6d57fe9ee2bf0459016f02a2a243c6b Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Mon, 6 Nov 2023 19:48:35 +0100 Subject: [PATCH 08/40] Delete unrelated testing stuff --- server/api/dbtest/[id].delete.ts | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 server/api/dbtest/[id].delete.ts diff --git a/server/api/dbtest/[id].delete.ts b/server/api/dbtest/[id].delete.ts deleted file mode 100644 index 749540a..0000000 --- a/server/api/dbtest/[id].delete.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineEventHandler } from "h3"; - -import { database } from "~/server/utils/database"; - -export default defineEventHandler(async (e) => { - if (!e.context.params?.id) return Error("id is not provided"); - const rowID = e.context.params.id; - await database.execute("DELETE FROM `sch_baza_smartfony`.`lombardy` WHERE `id` = ?", [rowID]); -}); From eebf25198d5bc675e72e323991d6206203c5c024 Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Wed, 8 Nov 2023 05:35:48 +0100 Subject: [PATCH 09/40] Replace mysql2 with prisma also I updated packages, and properly typed api input a lot of time was spent, I don't remeber what really I did x3 but everything was related to replacing mysql2 with prisma --- README.md | 6 +- components/orderView.vue | 8 +- package-lock.json | 576 +++++++----------- package.json | 4 +- pages/client/[id].vue | 34 +- pages/clients.vue | 3 +- schema.prisma | 116 ++++ schemaModel.mysqlWorkbench.mwb | Bin 16539 -> 0 bytes schemaModel.sql | 167 ----- server/api/clients.get.ts | 13 +- server/api/clients.post.ts | 43 +- server/api/clients/[id].delete.ts | 21 +- server/api/clients/[id].get.ts | 17 +- server/api/clients/[id].patch.ts | 23 +- server/api/clients/[id]/orders.get.ts | 17 +- server/api/clients/count.get.ts | 8 +- server/api/firstRun.get.ts | 15 +- server/api/firstRun.post.ts | 24 +- server/api/login.post.ts | 33 +- server/api/logout.ts | 9 +- server/api/orders.get.ts | 84 ++- server/api/orders.post.ts | 139 +++-- server/api/orders/[id].delete.ts | 19 +- server/api/orders/[id].get.ts | 123 +--- server/api/orders/[id].patch.ts | 22 +- .../api/orders/[id]/imported_products.get.ts | 23 +- .../api/orders/[id]/imported_products.post.ts | 30 +- server/api/orders/[id]/work.get.ts | 27 +- server/api/orders/[id]/work.post.ts | 30 +- .../api/orders/[id]/work/[idWork].delete.ts | 20 +- server/api/orders/[id]/work/[idWork].get.ts | 27 +- server/api/users/me.get.ts | 17 +- server/middleware/auth.ts | 16 +- server/utils/baaPageParsing.ts | 108 ++++ server/utils/baaPagination.ts | 261 -------- server/utils/database.ts | 112 +++- server/utils/getRequestingUser.ts | 35 +- server/utils/prismaToWeb.ts | 44 ++ utils/types/database.ts | 99 --- 39 files changed, 1081 insertions(+), 1292 deletions(-) create mode 100644 schema.prisma delete mode 100644 schemaModel.mysqlWorkbench.mwb delete mode 100644 schemaModel.sql create mode 100644 server/utils/baaPageParsing.ts delete mode 100644 server/utils/baaPagination.ts create mode 100644 server/utils/prismaToWeb.ts delete mode 100644 utils/types/database.ts diff --git a/README.md b/README.md index c0fbd05..379b005 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,6 @@ Project uses Oracle MySQL as a database store. It uses environment variables for | Environment variable | Description | |----------------------|-------------------| -| `DB_HOST` | Database host | -| `DB_PORT` | Database port | -| `DB_USER` | Database user | -| `DB_PASSWORD` | Database password | -| `DB_SCHEMA` | Database schema | +| `DB_URL` | Database url, see [this](https://www.prisma.io/docs/concepts/database-connectors/mysql#connection-url) | After setting variables, you can run the project using `npx nuxi dev` or `npx nuxi preview`. diff --git a/components/orderView.vue b/components/orderView.vue index 5e25109..971ed2f 100644 --- a/components/orderView.vue +++ b/components/orderView.vue @@ -1,8 +1,10 @@ @@ -24,7 +26,7 @@ const props = defineProps<{ - {{ i.is_fulfilled }} + {{ i.fulfilled }} {{ i.offer.name }} diff --git a/package-lock.json b/package-lock.json index bb2e2f9..70c125e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,6 +6,7 @@ "": { "hasInstallScript": true, "dependencies": { + "@prisma/client": "5.5.2", "mysql2": "^3.2.3" }, "devDependencies": { @@ -14,7 +15,8 @@ "@typescript-eslint/eslint-plugin": "^6.9.1", "@typescript-eslint/parser": "^6.9.1", "eslint": "^8.39.0", - "nuxt": "3.8.0", + "nuxt": "3.8.1", + "prisma": "5.5.2", "sass": "^1.62.0", "vite-plugin-vuetify": "^1.0.2", "vuetify": "^3.1.15" @@ -1822,19 +1824,19 @@ } }, "node_modules/@nuxt/kit": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.8.0.tgz", - "integrity": "sha512-oIthQxeMIVs4ESVP5FqLYn8tj0S1sLd+eYreh+dNYgnJ2pTi7+THR12ONBNHjk668jqEe7ErUJ8UlGwqBzgezg==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.8.1.tgz", + "integrity": "sha512-DrhG1Z85iH68QOTkgfb0HVfM2g7+CfcMWrFWMDwck9ofyM2RXQUZyfmvMedwBnui1AjjpgpLO9078yZM+RqNUg==", "dev": true, "dependencies": { - "@nuxt/schema": "3.8.0", + "@nuxt/schema": "3.8.1", "c12": "^1.5.1", "consola": "^3.2.3", - "defu": "^6.1.2", + "defu": "^6.1.3", "globby": "^13.2.2", "hash-sum": "^2.0.0", "ignore": "^5.2.4", - "jiti": "^1.20.0", + "jiti": "^1.21.0", "knitwork": "^1.0.0", "mlly": "^1.4.2", "pathe": "^1.1.1", @@ -1882,18 +1884,17 @@ } }, "node_modules/@nuxt/schema": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.8.0.tgz", - "integrity": "sha512-VEDVeCjdVowhoY5vIBSz94+SSwmM204jN6TNe/ShBJ2d/vZiy9EtLbhOwqaPNFHwnN1fl/XFHThwJiexdB9D1w==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.8.1.tgz", + "integrity": "sha512-fSaWRcI/2mUskfTZTGSnH6Ny0x05CRzylbVn6WFV0d6UEKIVy42Qd6n+h7yoFfp4cq4nji6u16PT4SqS1DEhsw==", "dev": true, "dependencies": { "@nuxt/ui-templates": "^1.3.1", "consola": "^3.2.3", - "defu": "^6.1.2", + "defu": "^6.1.3", "hookable": "^5.5.3", "pathe": "^1.1.1", "pkg-types": "^1.0.3", - "postcss-import-resolver": "^2.0.0", "std-env": "^3.4.3", "ufo": "^1.3.1", "unimport": "^3.4.0", @@ -1938,20 +1939,20 @@ "dev": true }, "node_modules/@nuxt/vite-builder": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.8.0.tgz", - "integrity": "sha512-F9BfH+c/Idp6sBGVHR4QJSuoO42evtE4D0OelD45NgkqVvmBmOawlj0Oz5fDKoV64LDPI2+yE+xnBdQtsNv/VA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.8.1.tgz", + "integrity": "sha512-Ot/twGONxj22T9U4bxp771ibKVFlZxIiYDHY/e6mZsE4Blc0efKo6MzPPPo0W4/tXQbtKKEq41uINN3dMI3mag==", "dev": true, "dependencies": { - "@nuxt/kit": "3.8.0", - "@rollup/plugin-replace": "^5.0.4", + "@nuxt/kit": "3.8.1", + "@rollup/plugin-replace": "^5.0.5", "@vitejs/plugin-vue": "^4.4.0", "@vitejs/plugin-vue-jsx": "^3.0.2", "autoprefixer": "^10.4.16", "clear": "^0.1.0", "consola": "^3.2.3", "cssnano": "^6.0.1", - "defu": "^6.1.2", + "defu": "^6.1.3", "esbuild": "^0.19.5", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", @@ -1967,8 +1968,6 @@ "perfect-debounce": "^1.0.0", "pkg-types": "^1.0.3", "postcss": "^8.4.31", - "postcss-import": "^15.1.0", - "postcss-url": "^10.1.3", "rollup-plugin-visualizer": "^5.9.2", "std-env": "^3.4.3", "strip-literal": "^1.3.0", @@ -2363,6 +2362,38 @@ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, + "node_modules/@prisma/client": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.5.2.tgz", + "integrity": "sha512-54XkqR8M+fxbzYqe+bIXimYnkkcGqgOh0dn0yWtIk6CQT4IUCAvNFNcQZwk2KqaLU+/1PHTSWrcHtx4XjluR5w==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "5.5.1-1.aebc046ce8b88ebbcb45efe31cbe7d06fd6abc0a" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.5.2.tgz", + "integrity": "sha512-Be5hoNF8k+lkB3uEMiCHbhbfF6aj1GnrTBnn5iYFT7GEr3TsOEp1soviEcBR0tYCgHbxjcIxJMhdbvxALJhAqg==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "5.5.1-1.aebc046ce8b88ebbcb45efe31cbe7d06fd6abc0a", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.5.1-1.aebc046ce8b88ebbcb45efe31cbe7d06fd6abc0a.tgz", + "integrity": "sha512-O+qHFnZvAyOFk1tUco2/VdiqS0ym42a3+6CYLScllmnpbyiTplgyLt2rK/B9BTjYkSHjrgMhkG47S0oqzdIckA==" + }, "node_modules/@rollup/plugin-alias": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.0.1.tgz", @@ -2694,24 +2725,24 @@ } }, "node_modules/@types/estree": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", - "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.13", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", - "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -2721,18 +2752,18 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", - "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/resolve": { @@ -2742,22 +2773,22 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -2783,15 +2814,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4" }, "engines": { @@ -2811,13 +2842,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2828,13 +2859,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -2855,9 +2886,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2868,13 +2899,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2895,17 +2926,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", "semver": "^7.5.4" }, "engines": { @@ -2920,12 +2951,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.10.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3167,13 +3198,13 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.7.tgz", - "integrity": "sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.8.tgz", + "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==", "dev": true, "dependencies": { "@babel/parser": "^7.23.0", - "@vue/shared": "3.3.7", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } @@ -3185,27 +3216,27 @@ "dev": true }, "node_modules/@vue/compiler-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz", - "integrity": "sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz", + "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz", - "integrity": "sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz", + "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==", "dev": true, "dependencies": { "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-ssr": "3.3.7", - "@vue/reactivity-transform": "3.3.7", - "@vue/shared": "3.3.7", + "@vue/compiler-core": "3.3.8", + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-ssr": "3.3.8", + "@vue/reactivity-transform": "3.3.8", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "magic-string": "^0.30.5", "postcss": "^8.4.31", @@ -3219,13 +3250,13 @@ "dev": true }, "node_modules/@vue/compiler-ssr": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz", - "integrity": "sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz", + "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-dom": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/devtools-api": { @@ -3235,23 +3266,23 @@ "dev": true }, "node_modules/@vue/reactivity": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.7.tgz", - "integrity": "sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.8.tgz", + "integrity": "sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==", "dev": true, "dependencies": { - "@vue/shared": "3.3.7" + "@vue/shared": "3.3.8" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz", - "integrity": "sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz", + "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==", "dev": true, "dependencies": { "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7", + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "magic-string": "^0.30.5" } @@ -3263,43 +3294,43 @@ "dev": true }, "node_modules/@vue/runtime-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.7.tgz", - "integrity": "sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.8.tgz", + "integrity": "sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==", "dev": true, "dependencies": { - "@vue/reactivity": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/reactivity": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/runtime-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz", - "integrity": "sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz", + "integrity": "sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==", "dev": true, "dependencies": { - "@vue/runtime-core": "3.3.7", - "@vue/shared": "3.3.7", + "@vue/runtime-core": "3.3.8", + "@vue/shared": "3.3.8", "csstype": "^3.1.2" } }, "node_modules/@vue/server-renderer": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.7.tgz", - "integrity": "sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.8.tgz", + "integrity": "sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==", "dev": true, "dependencies": { - "@vue/compiler-ssr": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-ssr": "3.3.8", + "@vue/shared": "3.3.8" }, "peerDependencies": { - "vue": "3.3.7" + "vue": "3.3.8" } }, "node_modules/@vue/shared": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.7.tgz", - "integrity": "sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz", + "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==", "dev": true }, "node_modules/@vuetify/loader-shared": { @@ -4688,12 +4719,6 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "dev": true - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5006,9 +5031,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.576", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", - "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", + "version": "1.4.578", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.578.tgz", + "integrity": "sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==", "dev": true }, "node_modules/emoji-regex": { @@ -5076,18 +5101,6 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5869,9 +5882,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -7739,55 +7752,6 @@ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, - "node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/memory-fs/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/memory-fs/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -8685,28 +8649,28 @@ } }, "node_modules/nuxt": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.8.0.tgz", - "integrity": "sha512-ZnisJYx5AcUl7xlw18m6zfINBpNhld+ZF+jdTLRZxkLjKSFZeFMGqKxOR1jNVSmxfIXM/guK0uV9GPm6HK/z7g==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.8.1.tgz", + "integrity": "sha512-RSGO56Gv0x2f6AXWw4o4GoBaVdsD0qkPCjrX7Ud/jzH3cRJoyYMPuq/9AOLvf2o1ecZWl39j5elqJ4QHmggyOA==", "dev": true, "dependencies": { "@nuxt/devalue": "^2.0.2", "@nuxt/devtools": "^1.0.0", - "@nuxt/kit": "3.8.0", - "@nuxt/schema": "3.8.0", + "@nuxt/kit": "3.8.1", + "@nuxt/schema": "3.8.1", "@nuxt/telemetry": "^2.5.2", "@nuxt/ui-templates": "^1.3.1", - "@nuxt/vite-builder": "3.8.0", - "@unhead/dom": "^1.7.4", - "@unhead/ssr": "^1.7.4", - "@unhead/vue": "^1.7.4", - "@vue/shared": "^3.3.4", - "acorn": "8.10.0", + "@nuxt/vite-builder": "3.8.1", + "@unhead/dom": "^1.8.3", + "@unhead/ssr": "^1.8.3", + "@unhead/vue": "^1.8.3", + "@vue/shared": "^3.3.8", + "acorn": "8.11.2", "c12": "^1.5.1", "chokidar": "^3.5.3", "cookie-es": "^1.0.0", - "defu": "^6.1.2", - "destr": "^2.0.1", + "defu": "^6.1.3", + "destr": "^2.0.2", "devalue": "^4.3.2", "esbuild": "^0.19.5", "escape-string-regexp": "^5.0.0", @@ -8715,12 +8679,12 @@ "globby": "^13.2.2", "h3": "^1.8.2", "hookable": "^5.5.3", - "jiti": "^1.20.0", + "jiti": "^1.21.0", "klona": "^2.0.6", "knitwork": "^1.0.0", "magic-string": "^0.30.5", "mlly": "^1.4.2", - "nitropack": "^2.7.0", + "nitropack": "^2.7.2", "nuxi": "^3.9.1", "nypm": "^0.3.3", "ofetch": "^1.3.3", @@ -8741,7 +8705,7 @@ "unplugin": "^1.5.0", "unplugin-vue-router": "^0.7.0", "untyped": "^1.4.0", - "vue": "^3.3.4", + "vue": "^3.3.8", "vue-bundle-renderer": "^2.0.0", "vue-devtools-stub": "^0.1.0", "vue-router": "^4.2.5" @@ -8766,18 +8730,6 @@ } } }, - "node_modules/nuxt/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/nuxt/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -9382,15 +9334,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -9601,55 +9544,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-import-resolver": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz", - "integrity": "sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==", - "dev": true, - "dependencies": { - "enhanced-resolve": "^4.1.1" - } - }, - "node_modules/postcss-import-resolver/node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-import-resolver/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss-merge-longhand": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz", @@ -9972,48 +9866,6 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-url": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", - "dev": true, - "dependencies": { - "make-dir": "~3.1.0", - "mime": "~2.5.2", - "minimatch": "~3.0.4", - "xxhashjs": "~0.2.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-url/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-url/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -10021,9 +9873,9 @@ "dev": true }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -10059,6 +9911,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/prisma": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.5.2.tgz", + "integrity": "sha512-WQtG6fevOL053yoPl6dbHV+IWgKo25IRN4/pwAGqcWmg7CrtoCzvbDbN9fXUc7QS2KK0LimHIqLsaCOX/vHl8w==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.5.2" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, "node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -10112,12 +9980,6 @@ "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -10188,15 +10050,6 @@ "flat": "^5.0.2" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, "node_modules/read-package-json": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", @@ -12975,16 +12828,16 @@ "dev": true }, "node_modules/vue": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.7.tgz", - "integrity": "sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.8.tgz", + "integrity": "sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-sfc": "3.3.7", - "@vue/runtime-dom": "3.3.7", - "@vue/server-renderer": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-sfc": "3.3.8", + "@vue/runtime-dom": "3.3.8", + "@vue/server-renderer": "3.3.8", + "@vue/shared": "3.3.8" }, "peerDependencies": { "typescript": "*" @@ -13244,15 +13097,6 @@ "node": ">=12" } }, - "node_modules/xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", - "dev": true, - "dependencies": { - "cuint": "^0.2.2" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 870979c..78d8280 100644 --- a/package.json +++ b/package.json @@ -16,12 +16,14 @@ "@typescript-eslint/eslint-plugin": "^6.9.1", "@typescript-eslint/parser": "^6.9.1", "eslint": "^8.39.0", - "nuxt": "3.8.0", + "nuxt": "3.8.1", + "prisma": "5.5.2", "sass": "^1.62.0", "vite-plugin-vuetify": "^1.0.2", "vuetify": "^3.1.15" }, "dependencies": { + "@prisma/client": "5.5.2", "mysql2": "^3.2.3" } } diff --git a/pages/client/[id].vue b/pages/client/[id].vue index 23f5e94..b64c240 100644 --- a/pages/client/[id].vue +++ b/pages/client/[id].vue @@ -6,24 +6,28 @@ import { ref, type Ref } from "vue"; import { VBtn, VForm } from "vuetify/components"; import PagedList from "~/components/pagedList.vue"; import Snowflake from "~/utils/snowflake"; -import { client as clientType, order, orderSummary } from "~/utils/types/database"; import OrderView from "~/components/orderView.vue"; import EntryEditor, { type fieldDefinition } from "~/components/entryEditor.vue"; const route = useRoute(); const id = route.params.id; -const clientRequest = await useFetch(`/api/clients/${id}`); +const clientRequest = await useFetch(`/api/clients/${id}` as "/api/clients/:id"); if (clientRequest.error.value) throw createError(clientRequest.error.value?.data ?? ""); -const client = clientRequest.data as Ref; +type Client = NonNullable; +const client = clientRequest.data as Ref; -const clientOrdersRequest = await useFetch(`/api/clients/${id}/orders`); +const clientOrdersRequest = await useFetch(`/api/clients/${id}/orders` as "/api/clients/:id/orders"); if (clientOrdersRequest.error.value) throw createError(clientOrdersRequest.error.value?.data ?? ""); -const clientOrders = clientOrdersRequest.data as Ref>; +type OrderSummary = NonNullable; +const clientOrders = clientOrdersRequest.data as Ref; +type Order = Awaited>>["data"]["value"]; + +// cache const orders = ref>(new Map()); for (const i of clientOrders.value) @@ -36,7 +40,7 @@ async function loadOrder(id: string) { // @ts-expect-error entry.value = await $fetch(`/api/orders/${id}` as "/api/order/:id", { method: "GET", - }); + }) as Order; entry.loading = false; } @@ -184,24 +188,24 @@ function getCreationDate() { > diff --git a/pages/clients.vue b/pages/clients.vue index 87bf07b..83de69b 100644 --- a/pages/clients.vue +++ b/pages/clients.vue @@ -4,7 +4,6 @@ import { type NuxtError } from "nuxt/app"; import { ref, type Ref, reactive } from "vue"; import { VBtn } from "vuetify/components"; -import { type client as clientType } from "~/utils/types/database"; import pagedTable from "~/components/pagedTable.vue"; import Alerts, { type AlertData } from "~/components/alerts.vue"; import { type fieldDefinition } from "~/components/entryEditor.vue"; @@ -33,7 +32,7 @@ async function rowClicked(client: string, edit = false) { async function rowDelete(client: string) { try { - await $fetch(`/api/clients/${client}`, { + await $fetch(`/api/clients/${client}` as "api/clients/:id", { method: "DELETE", }); clients.value = clients.value.filter(e => e.id !== client); diff --git a/schema.prisma b/schema.prisma new file mode 100644 index 0000000..a507bf7 --- /dev/null +++ b/schema.prisma @@ -0,0 +1,116 @@ +datasource db { + provider = "mysql" + url = env("DB_URL") +} + +generator client { + provider = "prisma-client-js" +} + +model User { + id BigInt @id @unique @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + username String @unique @db.VarChar(30) + email String @unique @db.VarChar(128) + password Bytes @db.Binary(64) + display_name String? @db.VarChar(30) + managedOrders Order[] + sessions Session[] + + @@map("users") +} + +model Session { + id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + userId BigInt @map("user") @db.UnsignedBigInt + expiry_date DateTime? @default(dbgenerated("(now() + interval 30 day)")) @db.Timestamp(0) + user User @relation(fields: [userId], references: [id]) + + @@index([userId], map: "user_idx") + @@map("sessions") +} + +model Client { + id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + name String? @db.VarChar(128) + address String? @db.VarChar(128) + phone String? @db.VarChar(16) + email String? @db.VarChar(128) + orders Order[] + + @@map("clients") +} + +model Order { + id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + clientId BigInt @db.UnsignedBigInt @map("client") + userId BigInt @db.UnsignedBigInt @map("user") + draft Boolean @default(true) @map("is_draft") @db.TinyInt + imported_products ImportedProduct[] + client Client @relation(fields: [clientId], references: [id]) + user User @relation(fields: [userId], references: [id]) + work Work[] + + @@index([clientId]) + @@index([userId]) + @@map("orders") +} + +model ImportedProduct { + id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + orderId BigInt @db.UnsignedBigInt @map("order") + name String? @db.VarChar(128) + link String @db.VarChar(1024) + price_imported Decimal @default(0.00) @db.Decimal(10, 2) + price Decimal @default(0.00) @db.Decimal(10, 2) + order Order @relation(fields: [orderId], references: [id]) + + @@index([orderId]) + @@map("imported_products") +} + +model Offer { + id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + name String @db.VarChar(45) + description String? @db.Text + recommended_price Decimal? @db.Decimal(10, 2) + work Work[] + + @@map("offer") +} + +model OrderTemplate { + id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + name String @db.VarChar(45) + description String? @db.Text + work_templates WorkTemplate[] + + @@map("order_templates") +} + +model Work { + id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + orderId BigInt @map("order") @db.UnsignedBigInt + offerId BigInt @map("offer") @db.UnsignedBigInt + price Decimal @db.Decimal(10, 2) + notes String? @db.Text + fulfilled Boolean @default(false) @map("is_fulfilled") @db.TinyInt + order Order @relation(fields: [orderId], references: [id]) + offer Offer @relation(fields: [offerId], references: [id]) + + @@index([offerId], map: "offer_idx") + @@index([orderId], map: "order_idx") + @@map("work") +} + +model WorkTemplate { + id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + orderTemplateId BigInt @map("order_template") @db.UnsignedBigInt + offerId BigInt @map("offer") @db.UnsignedBigInt + price Decimal @default(0.00) @db.Decimal(10, 2) + notes String? @db.Text + orderTemplate OrderTemplate @relation(fields: [orderTemplateId], references: [id]) + + @@index([offerId]) + @@index([orderTemplateId]) + @@map("work_templates") +} diff --git a/schemaModel.mysqlWorkbench.mwb b/schemaModel.mysqlWorkbench.mwb deleted file mode 100644 index bd78215a898c40163d8875a3fcb78da75b9cf379..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16539 zcma*O19WAKEuwr$%T+eyc^ZTrTyjgHl^)v>LPZ6}ldzj^b$nf1+@Id`3NYi-oI zr_QZizuHig0R=+?0s(>o;#O%>Cn|SJ3S|QVYOMnWLIMH;GO;&ywKcVKVX$>KV(_rF zx$w1g#^p}EIC`vAeD5tS%cHjy^VB3abwbQyZPLX=W& zFiBFiW640XGGkL6_ly(;dCG>}$$dNedUavudyQ8p4Zb-(8aamcdDmAU{AkacY$&=L zJO69L*FI_{C^&qBDDmNF@0So~M%g%>_A(u(?<4S;cO>DDudtPOShUqqgt_l0;Nvro zh~Sgw|M_w={yg{CV7pwy z+ny~azsEo1pN?dUB)T%ln>I;+P+C9Rbz_0S3$@{wTvg@Hmxya}lyq*inEH9!da_S= zWf74&?&Y`{|C#?h9vZpj!-K2e#$|BHrpyO#{E&B8c-%nA*f93y)A0HT7-BqFvtRuE z7{_St*yLwz_=33qgeZPg<*(JWcQY^e)%Faz{N=-i)wRu0?U(UKujUtH&-FeP$CqV$ z!p9LI>|GVI&mDl%otdH~2KbIWyAMywsT}Uyt`c=^(jO}&OV`LXkB znDsPSuEWxb8(v_#eNau092qkG@z01pO4HBYdMLqlw)M7#8li7G;n&U3E=+Qn5-tn~kp+=vhJ+B04hUqafIEWAe5i#UP!aRS@?VUv*+kZa-Mlg5 z%Yzqh)tmY|TvDqyg+Bm(`l#j7!JM)t++<^%|Mx3XqQ_w|{^WGoia$sMm;R?tj>4^9 zVAW8LhVAdqfpw31Ekf)q@d<&r;i74cd&A%FHCntTxJA#lZakf*$vzQnw48nAbk3B@FkV=n$&b;^nl#@xFWMs04qb=QH37bzksP!sGLFF^h2PIE_K?)6f%tS8(|2 zG^RUi``zZ%NdPaEAnc4UwnSV1xh7ly*X(FM2G!lyo&V$E;HFVu&&yo{)!KE~;MIvw z`w_U(+_25*G5_#mHsc;b#$I`OkWE~`Gh_V<#$g|fk3dHU;jVUUe9uT&l|b+!hEW~C zcTTV?{g;6LWE^E#@ZCyXR-aw-iC4YLbo0?7O9SD(H7*w78>7rxd54~2RI1Hce+_&U z>{vE<1$lwck3U9j)p$(FPDo&wAp=Il!Q_&cL}aK*MD09eSKw_B+UPp|8`wZ7=|D^% zJK;9UvRk^OJ3g5TQ3{ieb=4&UB0ogn?;?_n>N#4*wLsZWfJXytcg97?MMMS=3W4BMR2e{q@7{n(W9XvW61e{ z4W9zyiLwIfiiAcjK>EQ#nggy`vg8G0De0@@Qkz{g9mu5qM$3HT@;HLM&769cJnT)AbMtB2JLfcNjo6|l zqe<^Pnho_Q{*05a&=7psS(oG-i%XzyANe2Ueeq!bxm^oyAhOw2RL4@d?R%l(I2=#X z)nD0}ZfTZmnkh6d^7}j)7mj@m*4yf*u1}dgh;3>SRT=<>js>YSz&o3v2}p?u-bCFU z3=@s{q*hjbc#W%?KD6-=h_!#)6eDE`Tsz%{F~2#zzrQFU2qY#S1f_I6w;xBEQAWyd zLeUdBi9kDh%QBYVp+2#-Ts>rs15oJXWOTw3toMc1sQ9f-NPLviR|vIC7+uyBFpW*$ zN;#Id_xyfu+Q=Bch|ngrE>&}(W#7N@3c)~(+VpxCW;XovR*a7E0;Bt68gRV&xY^nE zOoFPcyRk|*S8XLHBuSx*mD14OXkUzoo0S+gFw*L5eFfIRCvc~YjVSngV!)N|Yd2Q_ z;OzKYQ@hRQU9kP$b!pkZoYW`A@v>2DoYq*a#CurO*K_E3p=tV{e*0PFSp*)wMHc7i z2Zv$>d8kFBAhl{T1j9;|g`w)~qF3Rn|1?hmxLLH&G&@hZjsTas*hW0rUczjA-@7G4 z34)k^<^iE$wOZFo?HEHNpPzEX1v10{rr`!dafIY@LD90wC^2HpATjL*$j+7{C6l5t zf$aylsDl*cfCVDU(2GX1CZ!u0MLmt6$xJ>EqM@pEa+W@yO_+b(RoTm;8Sblw?*$y* z7fU(+dM4ok>$cF`1L*Do&>^mTXT%wU9O(A))rN@miSd}iNCQ9);-QQ8Q$C7g;$0Fr zc#e`2Re|uriSzk93_?tSPK2mO!mLD4Z8x;nG--a=^jI2KVCPvF7siCkmH1IOb&WBP0M|IrL-qWPXaO#QtcY_FHlGt#0JWOhbNOryYVO*NPNcKx^ zYdU_HbpcZE^{yor#{^$5)=#b)Z+8Li>AaXinQZp@>$78q>F%LkgM}Sn@t3j;J&OK? zCWnlNEyk(wB`ye`3^}u4ki~NkKMjN_3~uw~FuS9(s+P8Q8zwEE*WW4npA8=-*K2xO ztJepbd%E}--a7u!+6I%Htt>5reVH7oV^-_-jKZ!x{I5RkqDy-QZu_9oS%e0O@UM@X zJ`024I_v2iOfx&=vcrS}g)qXCZ)J@(9Q2*NS)FO{-g4EQ4AQu==I+d$av5x)k^9x7 zZk{dKSok+^<@& zxs`V344vDrr0z#Zl)M_-zKY|94{yms933qmV46*Aj{^-)*6n$42-dK_?$_k)zju^- z-mOc*jwJDdW?pnU8Sb=kc2}q1stO=bV+QX$djXRn)5PY#Mi!p_ARQ*1T8@$!A0e4g zR}L6NP83v9>e`kbCO73^DwXT?v6fY-#1q2DV?>{3(@v#o_v>!I^{_-g1b?tg(QpJ2=O~80EP_cf$fEfCEov z21i4#lMF59V6tzLJ-yTg`(r*3m_K}vO@=fA%&wN z2gAZ+yQX3~gLeg~0IS2N%j-|F@_`Q!^DaoD6?He+M}=Wfbl|}9-3kxgIFa&C%xOll zO>J(9b4b5;yb>c!gYn&dZHpP3lskhBDypBQI!3~Vj|K}Dt1QB=4`A*Kg~MR^Z3r&h zE1UaZR5w3ZyTM~}qqeqqYn63$yKKkBu`p4a&i`zi$4B294I_U(^8{VU{H5&I%5?VVKw9>9iWI8$wBmJpKk|GD}MSy}J#me?n<~f@8MQu4zGx zY2cxz0Yea_A_dhZa59SJ6O?q<0*^rqa9F%3Rg7TMJ({E_(QPi1kwMU$?p4LMzT3?j z`_H9ND~1(g1$H$e4_w3CA`l}y2%T^tk9>;Hp00&IeZcNYtdL59b&g$*$ed_#!&7C)yd>zvxG#6r?Pemyq6OW|6q*t*q#I;$Ltq=7r z{%4eJdeQQ_Tt4l+3&wp}j{T)YXJwKij5H#QDh#~|W$PD8$MjglN;*c-OocS5ehKf8 zDZ?Lu&L}$vl%s_>8%DVNpIxT8A6Z9Dwo0L@$ja8=$vU>HWVG!C(b6Qe8ELc`p=`3iJ2UYUB`a&+tsW8b(5Z7;#3 zFuvZL(t35=wN%n7#ngvkdIn=BYI?2=ZJZ{uTYxA6{bNyB%6>nehotKwNSMlChiN&X zjt4P%2~E+Snzhe^#8FxDBv%Bch>p5gb%yA;`@Y3ks*O&nh3w>lhKAnMV$2&eo8iC3YX)x8oU{4I#(UBvDLh_P;%()PiOe6fSFOWv5D#$X}FK>un0HSX0?o<|M zO(dB}H%)5jbaVv8A>^3|?;SGM5Zv($F=!)RtOuiPqLv~g0O}w`#3pY9Kd&{o(L_2o zT?BdrHGKvooe*d_0-lA)&%vM3XqXT`Q(+`sk&VP?h!)i%nqP&f?MYXlAZ`fq4Fm=L zh;eMN!|BOGbaisW{kts_77`3u5Pn@Bgb*={kmHGQRr)QTN1!T=?S>eZi6wJu71MFQ zdx&s)VIK#K;@>{wKP5#0T*Y6GZ_`NdIz6AVmQ3ama93a_13|0^8@vjH zr5C+#5rsx9#{`qSg5F`63flRhGIDnSQas+=Hy}Ks=}nAFk_9k4ax$-3nAG^aPKqsPePb@!ci zU-(tS@e7%DU+PxIgU8K!4h)m=3*PGu0r9hg$G&SJr?*QQKT%#uH4o3Vl+3%m}b~`?kc;y$Z;&~)H142a^r5;)6z=_h!42U-j zazsTTb4N_%mWF=9=O30rS6KC>?zm!Ve0xL%r@!r&oDP5|Zh^r(>XcM^gG4=wP!mDT zP^=3Mq;7@==gs_sWbvONfXv%;&kIPO!@Q*QB~Is;(KlFgC-&{r#x}BszgE>2;x7== zq5%?F$sjV^u@D5HI?{BccMItnXjy|aDIqDsLo13{_4*<~prCfbQ~Mg)&tpp4rd_zd zihQH}IZWkO5ovu7suNgbZvvlJ5#zc4(E0<*7@>0KFcJ8C3y67TPhhEiiAxxZ??ZV5 zLc)`~9Y#-Ju|C19OBuQD6z4E8z)t|nT+#4ZrJ`Y(k#OW4^%uzyCCP)iJVNEF0T}%Q z5K7=MFTPduWzvM|(xC7KxYY3V`)UzB=xDA>z^3vb`%-wXQ>;>vNAkr%V!C{S&}ux~ zxADq2<mgNl{|3K;2KsJTEX+M$TnmEzp3~&rM_=?gm@*CL~)yje-YIr7L zCr(6Xr@yFe6b_rL4qf<@oRDi)j|i|XT?4AfXi>U&$VK|NLiPO+<%_X~g(>q?fp(C> zm}Lu}zk(QApj}XpFL95zh>KM*tpBsBiGev?5JN1{{!AuH?(KaZa8bl-j(O>WriD~mPVCGa|kem0Y%~RP^dH!-{O+Wi6ME6p*_0YYM9wM#Bi1| z-rmeEuOVK1Jh5EM%GC$ptLB!|OOh^l$LMQ)79M*1W^X=Bn-yQIa2>_nx2?hQ0j*Uw z2#mh#^{N3j73i;GCIFM<<5VW0IEdYC?kaS%KCDHuIl9(5jqmmCqeX+(^Op#coD2rT z5-XKbqcQ_l573@!D_uf9L+!i-(gT0;2CJnE8;xN zMUzhsM1x{{0%VNVmk!D>!xa*$77OS?%S457RkD!Jko+lnZffa!kIC!+ktxoDkfW|D zB2yA9W%28Qzp%l=Ep0}pf^7H$BlFwgku;-&k|`tN{Jo+Hi8$j}-S31Rt^s~NYFqr` zP@!wy>P(YOxMpAxi*AcZ1_{KHv=WMh?RBsXnC}bO$q$aEENyH3hNkchx~xMOZs{oh z&?K;m&*R)n5Bp(c-J)D>lJJ*GVRU?!D0YVkHZ8)=n?YPji^^j|z8I3ON!%!LMGS=y zxD_z^9B2)UFaJ=Js~!!km{FYf1cCO-*CxBSjUgy|{m39e$20+;YeWZ* zj!ewD>KsW*lSNN4csN%|6W4Vj2K-ZjiWJ~KWJz-RORi8zT^dWr9ddf4N|iYg(mw=} zQhUjPS9jD-gg~~UQr*oX^`O=3fGj&iYlmzq~Fru-4vsYk07!+^!nfs;F+rtpxFz?^u95Hfb56M4&PY!!q4p2l|~?$8j)>}2-362fXV zxzt@63e(k#!vN?NF}#GxS%n-Y1A;KL4x9gSkwsh(4Qi$RgQ!&|?rdVnsnC$52!5j! zL+6|AzbxKYgQ_i{X(2HzA&hcZafpNsLxhI{pp}8J`Pc)6#yu5w#EwvXHM$yt+Cl2=dZGX zIyTr_$tqGNL7F}#yie8Y#I2$vN!W3Vk*7G-iXo-NU31g|Z7KFASoS=gA`JG-lvqC5 zl9e%67|Vs28#1ggC|3*|JP**%WY*$D zN1~D=BCH=KP+*RMk1B0)_3{`IGiX)-J|f|nV{%0@jXzLC@#q+^lhHq<+G-wLtN%?l z2knaD-VY4Bf0NBY8^ulroTR0BKOkfs&FQiawzV0v5zitpLK*l*4Z(#*rZb zSd0oegT&BLXbsEQD5e;oI_r>>zPH6PgrR=zHi@RK2_hrQ%sd1k>zD^4N*1{tMBNad zZlsZJ)b5x?=9e^h#V`2|kxu4^sI%9)D{YkcEQit~wZ|#-zLin|^34vEc{fs$*~9d@ z6(aMiRi=|?pxpPv+mbqHEgiRiiM7!_)(|E)t{&Yth^i-96b3QQhET^Es-Fu3bJrB< z!Epa^oMvr<-;9D(0yuE}6(9~WgpDLfT3Jv;VtVVslmtm$u#JsxP!3P(DssTxIf-QcIYoeYBxDjj&KUp8;8yJ4OUH}_fcqsq1 z(&Z?u&%DqZAJhRY83t#Ng6#wl<%|9#N`WJSs!quVPC&bJV>v8g1Gb4tUp{I56y<#i z{&<+g{kpwKdwvp(%kAEOzZ2UaJ6FJ}j)GKF&py=)AKz`}B? z_7#qPq#%Ok>jzfEp;LsC5sK*jPn_o==?s6f{ZXu9D9?MYTWE>w07`IH)wPb;g6G4g=~86XU1u@ zHFQ3V6m-{b(94b`=R+FbyH+Zy6Hp6M@%7@X*gD+MZqwqCEvr zx71~}T7U0soHUK1BB?nHqTULE>otE!vtWgawunShxrI`t;|WHFQ;FLYun`EH{w7>z^RM0A#LVy1VMH zM`0#Pj)DI30>JJJ`gqXem!4$lmm?+fnIxRJiuyfWi?2qYV*idBKp8AbBc$ z@B2)@T$tX%+mb(2NZ-mjqA;h5i#L)DlhGJy&JR-x$+!85F((3Q6oCy2@$yq~iQ1Ee zut1;@Q#~(H$=nrh`YDG1IPsmBQJAu>ltUPX8Awbd{~|kowse0O+%$4SrPe!XGC{={ zIzDm}A&CZ{$OHtY0?RYE$SV_2+XwYAzzFVw1>=VbBcQ@jU{!+$|LoC!9z2xPoSQKW zBp#7>9^ym7^A_rAMTUb1R{RMdHqR7E>a7c&XzHh6I;X&rj^F_c<1^g-G}t}pxG4`! zuS?Dt=Iw8rc92SQUPLrUc^v9WWU3ApmDCVZAiuu}jW^(bdDL2X*Z`T#!7Ii?Wt< zKN~z|vAo-7-o#1qfuA5C4Shjf&}A1Nsw8b8cpdT>cFsiJR2K61AL%O|ofs97w?K*} z)PO}~RY4^^+5&vq8zGc6?*ZZSkK`FW)`E{;m+RNza%r5eG=)E4yH6RvBi0YU6+ay} zZ=FI-4@#Pcyc+URxGBl&GOdK9qBY?|Adq62VYQg-$6g;yQk^TPFyd(8KB`gjf8D*e zh-ghND*LdB@I%hHALd3x5@l`{M(Af`*8b=xJwxKxqmz%7?ZH}rtSY>Y%?@#4;cCBJL%TZ6{Ns;VK!f6 z|1~ytO6X&1_0XlisjH*Ac}>;n`LH+J04VL@_qrTdFZy~rU7e5+*@IZC)F@Wf3NdOFBw`4*8Ku~J6%q*_kW(hrPkQK58ta=V*6+v((U=~=j@F1?rHJt^E`U=GV0(K+o?!oH4HM^zn?6+U}>0HrwZtK459v zC)2mUmU%})0_r0~ksqI=q8rlI7g#Pztxen z2WR2eeG=fxIxWOJ%faH5-}w~4BOQ1@1$2--!e(GovbBSa;}QBwP!L_Zg0I_hxc6HI zmlCI>GIYjzEGuusuWK)M8M8anLt9J40vA?&==Z8iy`7sev8`i)i%f*Qm(44{T-Uk$ z?X1^D_hjS&QVy1O-bcNBrp|Ss?RSaaR?>y$sjf7{I`hM2LkUM0A>!X+d=>Dv7)3yf z18++yq4R8PiOm`=+!{0c*O9^6+?aRk z#z=w;J<=3Gc4w>JR}cfASz?gyngzf#Y<9h8V><)+n%mD#s&+5l7w{Xk)eKvJ!}|UG zXAnsUv~8J){V6DfkZW-#L#Py7wD!o;2iDP7^yWE0@yxtUCL?BLD(b0%zt?S<*Lpx} zG`)fp{`%Lx{;?PD;9ANy@z$#V2m4!v-)H9q=$w1$#e)1YHM=F}1r?iS>UNTtdGXK( zJ&*sB*x`_j+{6StN7j;lHB^X*u~9nv?7;712V+EFOX|2hJQF+;TTp9wDAV`691!9% zU0@L^>}CS(Uhb&ibSGFBM~objq3EXZHKGpi5c_7&%QJLeqo>&5iFxGBz<%ZVM~8xV zE;k{?wv{(8l(! zB!&Y@1gsElZZ0GOy4y-ruq&J(N2o1hP+*NH5Sk!haYF)rLG&=?GLCS;MPki*{P2>* zs92%8BWaIVv|c<*B+>;gKja?)lHot$7N|7N3xw*7c6WuZOK&}DbNtS#wvYBe?Yiuz ziF%Utd2~k02J!IzO8f|JM035uyRE^_8vDdHnh$q(PH8YByj2_AI4(2)Z*M*~tC{GjY8&O5}YK2D83=+dmYAGmY`?8{qp z2G;ILa1qv7F~fHZ{AP2z9_egjo6^4a8_JZv?t2!m*kVt32LqNeTPi?= z;8lt+Y;7y#6w6F6GOhP*?k6d27xi|-%wEb`%!C1@sRHFtPos$wV{O&w>c`fYH zYpl)Z?HKSF{L6*y{_-P5EuGrM-rtaNtD!xq5d*%3V~b&pZE=m%Z%X?vS*)Y9@qDkr z*1LxP+*6=?)V#)Xd&1G%gkmd!@u!=046dJmy=|%9!v@K=zfx2wy*(%46ojqY-+qI$ zu68T4EL|@iix{=IkpVvID%}?gzgcyir0GmDQuJ9OqnN@z{j!(8RhkZd`^w;(;M;BZ zoZbGv$-}MY=lbg#Gi|j>$3D4pbv9{eH@UHV+fmiqofAhqnI~&6>6Q1# zw{;@OrprpY9VZj#PHk&?S}zNYC)taoU)p6cxyG1S~hfAd+=ELn1ci6 zMS*B+fnY4*J6ktILZL#p3DjRpflXl=yYQwPN-zxVSw6Y=apTOh&Z}=2Bsr3je{=Pu z^VcuOyp+1OZcL_{#Y6o56Z&VS7i}?;5Ez=iQyqq6)E-{nA854g`fXKZSk#Sy#T24F#P7R~YhBH$fItvDj z*4Cc28rW9Tj{8GSx|<;-49RmfBNrevF~*|$a3U&NezHF0dSOlV9J3coh24(FeY@#m z8#S8>p^-@zXU;3e)N{M-k5&zHbM5BytG2JJl*?MGy4I79JEd(7n@>zs_*|kdwk#8l zj;h1OVUCTquFv2NCa0&OD1r0`Y=B+zj*kTqmjEL5FQ1L7jXJA$n+ z^ERyew}E#qLB`=9H*hc2@*1L#%o*$#(^=w`@G-dHy%eh>`xCncOUJr&ADUR%)08i1 zN*%8sCs(POMbNSL=sb{Av3bS)2tqbox2n9j$A_Fs`xBV_&L0nREXcCgL?lp<$*c&) zN|juejKu{aB4=5CAGS=LQ~7CF9QQ?tdn1(3iyV=*SW|9tBI0ZOQ?LF=S%= zz{7a#LDa`XzC=?Zv7Ey4LD^Tp+{!G)kx4|qaly-#5wN895W|#qU;w=~|KV*99N7nE z8{|`95F>fIxV&%S5_yL3ORyXE@l2-6$2(8Q4>UQA8o_A#oUfoOf}k2{5Meh#i)t0_ zbO}wZ{tU_nu3fOr~=s( zlO0b~VtiecgU%4j3+?o~tDmAyXxP)Bivf%kU}|E_2NmyOS1c+!4#tg0v>_GW2pM0L zkbs8*$w!vp#)VHTAp%^DP#51KmV44vkwjEBA5Z!}-6#pVz#*zkvdkb#YYU!GSv+{S zhMh67+r3;!vS7SoIp83>L%F^I?w{#1gF;Lfkc0HP^u4x3S|n72In7|f0u z3;FO_%YtiZ&#=|1DYx94txN?z_F7&K*e{H*$xrzzD z1I#Y?|NbNXK~e#$mUFDHvky<3vN>e1KzM&kfnkKHW0KU@{ zMg0(5aS5|vvTG=bAXG|%|FPp&JJQ8FI68VMer@z0A`9C;#{Nu8q~OwRzPqiw`hw8v z1k`@%y4*$Vm&Sg2KECkq`m{a2-@6xa!3Dx1g@_MT@M8upu^Kc-q4IV^N?VvV;UAid z0i+iFaALi$tYfACHf+;jBf)9xE&G?FAZt7<6%l;@@q7_1U%CM|;{n z!H)$yZ3A@AHlMGQ!v~VSwj#eMkTvPWfh;S5Qe;7(nIRQDj)N8Z6(0;fT8r`Twxf$; zU+jsk-t6D&-raXC-S@g=@SA0}yfL@5#UE{{A8u-(P^h^^zEjoUh++d1>D15SrO!KP zx3ncU>W5H+tiA2Y2{GQb5=$L=E<046WK0Hu=7^dD z<1FMP2MnvsWB%>?EnB>vdUhQDeJ~>CE5L9a?6e;Yn7A=XeNy=6CG$z#^te@qMj1=G z3Q71uUi5Vc6nWfJfq;@;7#oQ`yK7Ja4{d2#!h57#evCyb@i1L76W-j!G6~S)=y2RA zNyJYC-5y(_NJxalLSBT0pduHDRmTB}%dd(~U1)47p2LQew`_gq+F5A-`a3sym8oUcnuZiGlEW0OcmEQ0dyzY+ zff+axyJ?KEGHXuoSS*>?7c=dg(t;EB74^pE@1hyyB$!SOYi$U1?e2t|C{O2UwN(^1 zd1DxJK0C8&VW6GyTQYm|n!BJKZf5je>#o*$s}#Pd5@D0({w46>v){R>PqF`UV0D;- znb&hOFxh*~zyMAw*rZ%2hm<{~kXJj@$190m{oJ-JF~q@OcNwLyXsXhj*hR}iK#dc3 zt^FWh_EJgpq`q`lf_j)HX6oIT)3fY*kahW{`T!8n=-S=hzZrVPe6yurx)sw)8~rHh zJ!98+byOKzn`F$LgFsjJ&-fE-zAv>EXWL$gUi5t9=DLhh|6Ztbo>ge@gif#Rqo+Ul zmUY{fMTl@Gu4WU5>2hHu$>>+1MfVt%Vya$QKdK!8d_NRhz=He&J7j$nOe1fKJHd&x ze5~7M;QP>KgXPGP>+^@gSCEG=`qrnxX87#Jr4En1%(I@&W$p@*mPSZcaHN0(I}YM& zs;A}WtTLl~%FoNaFMhwMeHqYr5VF|#=g8Zr(kX}mpA&?yr&Fz9xRw|rP4^<7-+DO5K2Nb%Ut z%tY-4a$*<@2gaq5;Fyjht?*r~Uhnljn~e zmiMPdCBd)cS|xB=b7Q^?dJd&hFOL@n-bwQzmi6m9{6o90n01Ua4?h&{wJ{HYj_hgq z?%sxv6T%)0EuydIGm{NmGs3Uk+mkn}-49ZfuXDDnLj{b5U$4g5M>k>^`W>&2!n4%u z9e>x<{Tmn_tIdp=qNaJRtxR!rzr>cLgG;Z52^C1l@rIr_ZLMqsCap8EViW}a5-Ko+ z|77&Xq?XwgIQ@yE4`-%H{9hZOp+HfHLOAIjC9C1ha<#o6wv?tLq#fpA(j}T2y9)I<>;ObF!iOXXMZA| zk5)&v_d$y>1ym{l^%?S$ofbCD!8R1A z`ag-4x9Tm`tM=VzPAqy1Di|*B7Cvrl-f4t245=Kq#IXfK%Y~E&__uSb;;}y1zSBEd z1LNC>6xPv?%d4J#+0$mQPfd6i5n49n!3h{Y5G=?tdZ{Xe>qe=qBSZ{;IEu_(K^KIy zd69D3)?N%};pDH94gWFY%c4)UKTfg_>bY+G zuXx2zm!1$koP=`KK;5;RPX8yKx&3}m`{iNPwte-c51(&Co8F37;%x2c0>#Drs8}Jo zy5rxgU61Xp@v}Jp&w2xq?-C(@#s8EneOD&|B}%uc+vjwsfPc6DonYUmjlHooGb=djW2 z4I{c?Tu*v#fjmHgrrr@~cze9~HLt5%CcnAe)A9PStk>;am)_&*Z|{C&@GD$qU~TRC z;>8CGBIb)ST%l&q-|g^i?RvE|{HV3Z5t}y6-2ZaBN8oMb{Hn2M>eK1=q0#p7=Gx+m z&&#sqW+4XGn(*VV!O>&~K>s+~%8o@br80pzhFTh3(z;gKPHBh&L4(#cvUbs>YpS;F z-6>~VXY%CmeKl*H^XTg0eACO@{EEA+epI?Y&WSEm_9;SyRqe{ixQ4rqPv_R5B^0fx zfGn9D)u_NGy67-xS-zYiTK92=Vx1p3#$zNQ*7O`i!Kt0`lK32g~>iM4al*>y`ji^$$J3_%oV2@aZR zNyzk?W!hO8frj9F-`cRsG+*Q6?7_Zb_s!{J)w161eB48cLAG7Cy)DXQZI7?Hzu!4a zPjl-Ex8_D}&r9PA?Hj;*yQk5=?(Vgti#pytwu{f-K*rmSacfQB zk+=2elNa*KY`W&{dpY%nMC4wpTJFBVSN@+V}zCd*DddLNH+D3<`+JO^N%{;zct3$+lzPFh=p#Q)j-+ zkxPI@+rj$=3F!J5+8nA0e&IZ_zu4T)$wPpn?BIyI`?3f9q{y;q02pL7mMzQA`PY1X zg1%CIQ(!GrJ{34t!Kc1fM+R)3H|x3u-}nXm-twOPy1kwAYIEm5dQLvKUB0fIx4#CS zF6M_fQp;#R^gc^I-+Bbz4K=@zF&L{8BmK`UpC_Ia<`j=pk$t3CG9nmkK*0;}p!LOU z1zv6TcCAVXa7%Wj<%`((emlLGB(HGQ=)p{d#gCa32T&Ih>5GtU%PvY5AFA@`)GQS3 zpVsWT_$4FF;TW%y05?;hdb=HHG5>Lp!-39gXE4_oRcZ}`O%s64re^|=3zRau%2u9| zPDtaIu2Dj7%C=sOujf!+(7R_Ib7*8QW5OX9Stx;sRn_{T+Zlld!jf*S^lM1#2VTr~ zG+>v@h)qek;IS>eTB|>Om2TN4D(yygicq(`2@gxZN&y}H4qHyss6?kQpRQ@zCfQ1W z@R$1OEf-T2R}P{qGxbn596Q6Y-BuAa9>gjMbDgwqvYHWF6USL7TBI~{7qnGr1R+er zY~$<(Uu@fXf=$0Y%&>JI$gZUN4qm;I)0kr)H}hp|n7SI5hxS-YwANTOnMJh9T6XY^ z`cD<{=36|6P=wuHCi}zzZZC2%BYKk>bZ%D)Ce*L*msb4s?+pUJBLo9+;SbmtUuwL+ z8|p&>;=5yop~X&#=TfHj=Fpg^2rSUQBnm;-*13l(Vu z&@WqAG~n#av)E8$u(OYVHG~j^lN8vnVj1XmAR?e20f`(KcE@^C z=3{PTe{dK?jCmc;HpL{VATVhdwuhtSAtu>Q4U~CK=ofP3L>|uMlAYieLY#RD+#z|D z$)($nKx1vRj$7@O^V3xev_fOs-GqrKKJ#q8C)vL%Am{7s3+$_h368OPbNJMJHT-ne zSe@^637U31TPTG&u?b&3*hZ+jkcvj73Z#8d`P+a#3`U@9IPpwJabvmBSdD`mgMJ1| zz=eTOP2x-vXmS{d{q#jx3>wFgFE%PHx7D97v4|BoVe%4Hml>n?j2e2X1jcGi$%VmE zGCQl8usu0^GL{*qEEK8C6j=jPbQt-f>l@HzaxgMC5-F-tJ(VdE*B(3ZDKfMM%cfCY z1M#zkUMR?vt>D1Y)x9BQI=}*dN=BvOcb;A$-5K4}?}JoLw#2 zsmd{yTd}w(@X!o-I6#;SR{A^N2?5CV#3@ZHG$?qgjvg$#iB0v;p;=j<0Njkc>@M)8 zMOvTcKDHJr`f~EzhvZBpb&;b4EN+nSXs3Nb%wnFQ{`atCYN0{ka3G7i?cUeex9R$K z?YMsVHaTXRt(xzzuqri4o}n59`iEw{grgPHAt#*vDxipmi4nfBLZ8X5XB(Z;6}7SL zp6F$F9uTg522(;j6!3jJMtO0Rfq9x~6p=>n7GB~p+((B}={CIcL5iy&nm-t3=mj|0 z&9qWd=(Uopl!1UrRU!(M?r6m9GZ*%qi&b5fgcH$#JdI;Y;K+Z(%gRZS+eDCBgy<#G zV6B?Jx@NXU1=R+k9FY`()`vT&&vZ7mvti%uIo{PZFpxlX6En?tK}FwMm~oJCrJ^Ah9!u;oPLL!f zXNY1t42#b{NNK>4YulCEV|5wNblyO5$NKPn2{Mt29$Qg6!n9*ppz_{)nIy?UykY(? ztoRQEe&fFX>wx)g2{{`(Svt5lGcy1Glw(np0R|BS{eLf*|L^Ww0{^xCpXKxat^JSp zzr(Ko=>LwEz{c+){C`OHzcv2fVC;X%|I=9e*7zTw_P-VX3H);=dm7 z|631I@PFui4-7cOKOOMz4>m9m5aTzOA4twqMM;)O!`{i-$kfi*f=JHZ#MFk!(8<`s l(#@2JnSlw$_8*1b+1SF=*3g-U=)0kBY;R*@YHkYie*hv*6x09! diff --git a/schemaModel.sql b/schemaModel.sql deleted file mode 100644 index b03f0ac..0000000 --- a/schemaModel.sql +++ /dev/null @@ -1,167 +0,0 @@ --- Server version 8.0.32 - --- --- Table structure for table `users` --- - -CREATE TABLE `users` ( - `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), - `username` varchar(30) NOT NULL, - `email` varchar(128) NOT NULL, - `password` binary(64) NOT NULL, - `display_name` varchar(30) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `idusers_UNIQUE` (`id`), - UNIQUE KEY `username_UNIQUE` (`username`), - UNIQUE KEY `email_UNIQUE` (`email`) -); - --- --- Table structure for table `clients` --- - -CREATE TABLE `clients` ( - `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), - `name` varchar(128) DEFAULT NULL, - `address` varchar(128) DEFAULT NULL, - `phone` varchar(16) DEFAULT NULL, - `email` varchar(128) DEFAULT NULL, - PRIMARY KEY (`id`) -); - --- --- Table structure for table `orders` --- - -CREATE TABLE `orders` ( - `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), - `client` bigint unsigned NOT NULL, - `user` bigint unsigned NOT NULL, - `is_draft` tinyint NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `user_idx` (`user`), - KEY `client_idx` (`client`), - CONSTRAINT `client` FOREIGN KEY (`client`) REFERENCES `clients` (`id`), - CONSTRAINT `user` FOREIGN KEY (`user`) REFERENCES `users` (`id`) -); - --- --- Table structure for table `imported_products` --- - -CREATE TABLE `imported_products` ( - `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), - `order` bigint unsigned NOT NULL, - `name` varchar(128) DEFAULT NULL, - `link` varchar(1024) NOT NULL, - `price_imported` decimal(10,2) NOT NULL DEFAULT '0.00', - `price` decimal(10,2) NOT NULL DEFAULT '0.00', - PRIMARY KEY (`id`), - KEY `order_idx` (`order`), - CONSTRAINT `order2` FOREIGN KEY (`order`) REFERENCES `orders` (`id`) -); - --- --- Table structure for table `offer` --- - -CREATE TABLE `offer` ( - `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), - `name` varchar(45) NOT NULL, - `description` text, - `recommended_price` decimal(10,2) DEFAULT NULL, - PRIMARY KEY (`id`) -); - --- --- Table structure for table `order_templates` --- - -CREATE TABLE `order_templates` ( - `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), - `name` varchar(45) NOT NULL, - `description` text, - PRIMARY KEY (`id`) -); - --- --- Table structure for table `sessions` --- - -CREATE TABLE `sessions` ( - `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), - `user` bigint unsigned NOT NULL, - `expiry_date` timestamp NULL DEFAULT ((now() + interval 30 day)), - PRIMARY KEY (`id`), - KEY `user_idx` (`user`), - CONSTRAINT `user_session` FOREIGN KEY (`user`) REFERENCES `users` (`id`) -); - --- --- Table structure for table `work` --- - -CREATE TABLE `work` ( - `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), - `order` bigint unsigned NOT NULL, - `offer` bigint unsigned NOT NULL, - `price` decimal(10,2) NOT NULL, - `notes` text, - `is_fulfilled` tinyint NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - KEY `order_idx` (`order`), - KEY `offer_idx` (`offer`), - CONSTRAINT `offer` FOREIGN KEY (`offer`) REFERENCES `offer` (`id`), - CONSTRAINT `order` FOREIGN KEY (`order`) REFERENCES `orders` (`id`) -); - --- --- Table structure for table `work_templates` --- - -CREATE TABLE `work_templates` ( - `id` bigint unsigned NOT NULL DEFAULT (((unix_timestamp() * 1000 * pow(2,22)) + floor((rand() * pow(2,12))))), - `order_template` bigint unsigned NOT NULL, - `offer` bigint unsigned NOT NULL, - `price` decimal(10,2) NOT NULL DEFAULT '0.00', - `notes` text, - PRIMARY KEY (`id`), - KEY `order_template_idx` (`order_template`), - KEY `offer_idx` (`offer`), - CONSTRAINT `offer2` FOREIGN KEY (`offer`) REFERENCES `offer` (`id`), - CONSTRAINT `order_template` FOREIGN KEY (`order_template`) REFERENCES `order_templates` (`id`) -); - --- --- Final view structure for view `orderSummaries` --- - -CREATE VIEW `orderSummaries` AS -SELECT - `id`, - `client`, - `user`, - `is_draft`, - (COALESCE(`imported_products`.`price`, 0) + COALESCE(`work`.`price`, 0)) AS `value`, - COALESCE(`imported_products`.`count`, 0) as `imported_products_count`, - COALESCE(`work`.`count`, 0) as `work_count` -FROM -`orders` -LEFT JOIN -( - SELECT - `order`, - SUM(`price`) as `price`, - COUNT(*) AS `count` - FROM `imported_products` - GROUP BY `order` -) as `imported_products` ON `orders`.`id` = `imported_products`.`order` -LEFT JOIN -( - SELECT - `order`, - SUM(`price`) AS `price`, - COUNT(*) AS `count` - FROM `work` - GROUP BY `work`.`order` -) AS `work` ON `work`.`order` = `orders`.`id`; diff --git a/server/api/clients.get.ts b/server/api/clients.get.ts index 8d2d498..5a8c756 100644 --- a/server/api/clients.get.ts +++ b/server/api/clients.get.ts @@ -1,11 +1,10 @@ -import { defineEventHandler, getQuery } from "h3"; -import { createError } from "#imports"; +import { defineEventHandler } from "h3"; -import BaaPagination from "~/server/utils/baaPagination"; -import { type client } from "~/utils/types/database"; - -export const baaWrapper = new BaaPagination("clients", "id"); +import getPaginatedParameters from "../utils/baaPageParsing"; +import { database } from "../utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; export default defineEventHandler((e) => { - return baaWrapper.RESTget(e); + const pageParameters = getPaginatedParameters(e, 50, 200); + return database.client.findPaginated(pageParameters, {}).then(prismaToWeb); }); diff --git a/server/api/clients.post.ts b/server/api/clients.post.ts index 6dbe778..97df465 100644 --- a/server/api/clients.post.ts +++ b/server/api/clients.post.ts @@ -1,7 +1,10 @@ -import { defineEventHandler, readBody } from "h3"; +import { defineEventHandler, readBody, setResponseStatus } from "h3"; +import { type Client } from "@prisma/client"; -import { baaWrapper } from "./clients.get"; -import { type client } from "~/utils/types/database"; +import getRequestingUser from "../utils/getRequestingUser"; +import { database } from "../utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; +import Snowflake from "~/utils/snowflake"; import { createError } from "#imports"; @@ -12,10 +15,10 @@ const clientKeys: Array = [ "email", ]; -export function checkIsClient( +export function checkIsClient( value: any, - required = false, -): value is Partial> { + patch: Patch, +): value is Patch extends true ? Partial> : Omit { const errors = new Map(); if (typeof value !== "object") { @@ -25,12 +28,12 @@ export function checkIsClient( }); } - if (!(typeof value.name === "string" || value.name === null || (!required && value.name === undefined))) errors.set("name", "is not string or null"); - if (!(typeof value.address === "string" || value.address === null || (!required && value.address === undefined))) errors.set("address", "is not string or null"); - if (!(typeof value.phone === "string" || value.phone === null || (!required && value.phone === undefined))) errors.set("phone", "is not string or null"); - if (!(typeof value.email === "string" || value.email === null || (!required && value.email === undefined))) errors.set("email", "is not string or null"); + if (!(typeof value.name === "string" || value.name === null || (!patch && value.name === undefined))) errors.set("name", "is not string or null"); + if (!(typeof value.address === "string" || value.address === null || (!patch && value.address === undefined))) errors.set("address", "is not string or null"); + if (!(typeof value.phone === "string" || value.phone === null || (!patch && value.phone === undefined))) errors.set("phone", "is not string or null"); + if (!(typeof value.email === "string" || value.email === null || (!patch && value.email === undefined))) errors.set("email", "is not string or null"); - for (const i in value as Partial>) + for (const i in value as Partial>) if (!clientKeys.includes(i)) errors.set(i, `excessive property`); if (errors.size !== 0) { @@ -50,6 +53,20 @@ export function checkIsClient( return true; } -export default defineEventHandler((e) => { - return baaWrapper.RESTpost(e, clientKeys as Array>, (o): o is Omit => checkIsClient(o, true)); +export default defineEventHandler(async (e) => { + const body = await readBody(e); + const id = new Snowflake().state; + const user = await getRequestingUser(e); + + if (!checkIsClient(body, false)) throw createError({ message: "Invalid body", statusCode: 400 }); + + const rvalue = await database.client.create({ + data: { + ...body, + id, + }, + }); + + setResponseStatus(e, 201); + return prismaToWeb(rvalue); }); diff --git a/server/api/clients/[id].delete.ts b/server/api/clients/[id].delete.ts index 9b6ab20..b740270 100644 --- a/server/api/clients/[id].delete.ts +++ b/server/api/clients/[id].delete.ts @@ -1,7 +1,22 @@ import { defineEventHandler } from "h3"; -import { baaWrapper } from "../clients.get"; +import { database } from "~/server/utils/database"; -export default defineEventHandler((e) => { - return baaWrapper.RESTdeleteRecord(e); +import { createError } from "#imports"; + +export default defineEventHandler(async (e) => { + const id = e.context.params?.id as string; + + try { + await database.client.delete({ + where: { + id: BigInt(id), + }, + }); + } catch (e) { + // FIXME: should be 500 on errors other than "RecordNotFound" + throw createError({ statusCode: 404 }); + } + + return null; }); diff --git a/server/api/clients/[id].get.ts b/server/api/clients/[id].get.ts index 75fcc79..89696e0 100644 --- a/server/api/clients/[id].get.ts +++ b/server/api/clients/[id].get.ts @@ -1,7 +1,18 @@ import { defineEventHandler } from "h3"; -import { baaWrapper } from "../clients.get"; +import { database } from "~/server/utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; -export default defineEventHandler((e) => { - return baaWrapper.RESTgetRecord(e); +import { createError } from "#imports"; + +export default defineEventHandler(async (e) => { + const key = e.context.params?.id as string; + const rvalue = await database.client.findUnique({ + where: { + id: BigInt(key), + }, + }); + + if (!rvalue) throw createError({ statusCode: 404 }); + return prismaToWeb(rvalue); }); diff --git a/server/api/clients/[id].patch.ts b/server/api/clients/[id].patch.ts index 55163ca..604fd4a 100644 --- a/server/api/clients/[id].patch.ts +++ b/server/api/clients/[id].patch.ts @@ -1,8 +1,23 @@ -import { defineEventHandler } from "h3"; +import { defineEventHandler, readBody } from "h3"; import { checkIsClient } from "../clients.post"; -import { baaWrapper } from "../clients.get"; +import { database } from "~/server/utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; -export default defineEventHandler((e) => { - return baaWrapper.RESTpatchRecord(e, checkIsClient); +import { createError } from "#imports"; + +export default defineEventHandler(async (e) => { + const body = await readBody(e); + const id = e.context.params?.id as string; + + if (!checkIsClient(body, true)) throw createError({ message: "Invalid body", statusCode: 400 }); + + const rvalue = await database.client.update({ + where: { + id: BigInt(id), + }, + data: body, + }); + + return prismaToWeb(rvalue); }); diff --git a/server/api/clients/[id]/orders.get.ts b/server/api/clients/[id]/orders.get.ts index de76c37..4279100 100644 --- a/server/api/clients/[id]/orders.get.ts +++ b/server/api/clients/[id]/orders.get.ts @@ -1,9 +1,16 @@ import { defineEventHandler } from "h3"; -import { baaWrapper } from "~/server/api/orders.get"; +import { getOrders } from "~/server/api/orders.get"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; +import getPaginatedParameters from "~/server/utils/baaPageParsing"; -export default defineEventHandler(async (e) => { - const baa = await baaWrapper.RESTget(e, 50, 200, "`client` = ?", [e.context.params?.id]); - console.log(baa); - return baa; +export default defineEventHandler((e) => { + const pageParameters = getPaginatedParameters(e, 50, 200); + const clientId = e.context.params?.id as string; + return getOrders( + pageParameters, + { + clientId: BigInt(clientId), + }, + ).then(prismaToWeb); }); diff --git a/server/api/clients/count.get.ts b/server/api/clients/count.get.ts index 565dcd2..d374451 100644 --- a/server/api/clients/count.get.ts +++ b/server/api/clients/count.get.ts @@ -1,7 +1,9 @@ import { defineEventHandler } from "h3"; -import { baaWrapper } from "../clients.get"; +import { database } from "~/server/utils/database"; -export default defineEventHandler((e) => { - return baaWrapper.RESTrecordCount(e); +export default defineEventHandler(async (e) => { + return { + count: await database.client.count({}), + }; }); diff --git a/server/api/firstRun.get.ts b/server/api/firstRun.get.ts index 21ccb65..a9c60ad 100644 --- a/server/api/firstRun.get.ts +++ b/server/api/firstRun.get.ts @@ -1,13 +1,14 @@ import { defineEventHandler } from "h3"; -import { type data, database } from "../utils/database"; +import { database } from "../utils/database"; export async function isFirstRun() { - const [tables] = await database.query({ sql: "SHOW TABLES", rowsAsArray: true }, []) as data<[string]>; - if (tables.length === 0) return true; - if (!tables.find(a => a[0] === "users")) return true; - const [[users]] = await database.query("SELECT COUNT(*) as `count` FROM `users`") as data<{count: number}>; - if (users.count === 0) return true; - return false; + try { + const numberOfUsers = await database.user.count(); + return numberOfUsers === 0; + } catch { + // We could fall here if the database is not initialized + return true; + } } export default defineEventHandler((e) => { diff --git a/server/api/firstRun.post.ts b/server/api/firstRun.post.ts index 16436cf..714be3b 100644 --- a/server/api/firstRun.post.ts +++ b/server/api/firstRun.post.ts @@ -1,7 +1,7 @@ -import fs from "node:fs/promises"; +import { execSync } from "node:child_process"; import { defineEventHandler, setResponseStatus, readBody } from "h3"; -import { database as db } from "../utils/database"; +import { database } from "../utils/database"; import { isFirstRun } from "./firstRun.get"; import { getPasswordHash } from "./login.post"; import Snowflake from "~/utils/snowflake"; @@ -11,7 +11,7 @@ import { createError } from "#imports"; export default defineEventHandler(async (e) => { if (!isFirstRun()) { setResponseStatus(e, 404); - return ""; + return null; } const body = await readBody(e); @@ -23,12 +23,14 @@ export default defineEventHandler(async (e) => { const email = body.email; if (typeof email !== "string") throw createError({ message: "email is not string", statusCode: 400 }); - const sql = await fs.readFile("./schemaModel.sql", "utf-8"); - - const database = await db.new({ multipleStatements: true }); - await database.query(sql); - await database.execute( - "INSERT INTO `users` (`id`, `username`, `password`, `email`) VALUES (?, ?, ?, ?)", - [new Snowflake().toString(), username, getPasswordHash(password), email]); - return ""; + execSync("npx prisma db push --force-reset"); + database.user.create({ + data: { + id: new Snowflake().state, + username, + email, + password: getPasswordHash(password), + }, + }); + return null; }); diff --git a/server/api/login.post.ts b/server/api/login.post.ts index 49f8690..1b7f00d 100644 --- a/server/api/login.post.ts +++ b/server/api/login.post.ts @@ -1,7 +1,7 @@ import crypto from "crypto"; import { defineEventHandler, getCookie, setCookie, readBody } from "h3"; -import { database, type data } from "../utils/database"; +import { database } from "../utils/database"; import { isString } from "../utils/isString"; import { cookieSettings } from "../utils/rootUtils"; import Snowflake from "~/utils/snowflake"; @@ -28,19 +28,26 @@ export default defineEventHandler(async (e) => { const hashedPassword = getPasswordHash(password); - const [account] = await database.query( - "SELECT CONVERT(`id`, CHAR(32)) AS `id` from `users` WHERE `username` = ? AND `password` = ? LIMIT 1", - [login, hashedPassword], - )as unknown as data<{id: string}>; + const account = await database.user.findUnique({ + where: { + username: login, + password: hashedPassword, + }, + select: { + id: true, + }, + }); - if (account.length === 0) throw createError({ statusCode: 400, message: "Invalid username or password." }); + if (account === null) throw createError({ statusCode: 400, message: "Invalid username or password." }); - const sessionId = new Snowflake().toString(); + const sessionId = new Snowflake(); - await database.query( - "INSERT INTO `sessions` (`id`, `user`) VALUES ( ? , ? )", - [sessionId, account[0].id], - ); - setCookie(e, "token", sessionId, cookieSettings); - return { message: "Login successful", token: sessionId }; + await database.session.create({ + data: { + id: sessionId.state, + userId: account.id, + }, + }); + setCookie(e, "token", sessionId.toString(), cookieSettings); + return { message: "Login successful", token: sessionId.toString() }; }); diff --git a/server/api/logout.ts b/server/api/logout.ts index 59ce9b6..91ddfe8 100644 --- a/server/api/logout.ts +++ b/server/api/logout.ts @@ -23,9 +23,10 @@ export default defineEventHandler(async (e) => { }); } - database.query( - "DELETE FROM `sessions` WHERE `id` = ?", - [token], - ); + database.session.delete({ + where: { + id: BigInt(token), + }, + }); return { message: "Logged out" }; }); diff --git a/server/api/orders.get.ts b/server/api/orders.get.ts index 526401b..a11820b 100644 --- a/server/api/orders.get.ts +++ b/server/api/orders.get.ts @@ -1,37 +1,65 @@ import { defineEventHandler } from "h3"; +import { type Order, type Client, Prisma } from "@prisma/client"; -import BaaPagination from "../utils/baaPagination"; -import { type data, database } from "../utils/database"; -import { type client, type orderSummary } from "~/utils/types/database"; +import getPaginatedParameters, { type pageData } from "../utils/baaPageParsing"; +import { database } from "../utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; -export const baaWrapper = new BaaPagination( - "orderSummaries", - "id", - "*, CONVERT(`client`, CHAR) AS `client`, CONVERT(`user`, CHAR) as `user`", -); +type orderSummary = Omit & { + client: Client; + value: number; + imported_products_count: number; + work_count: number; +}; -export default defineEventHandler(async (e) => { - const orders = await baaWrapper.RESTget(e, 50, 200); +export async function getOrders( + pageParameters: pageData, + where?: Prisma.OrderWhereInput, +) { + const data = await database.order.findPaginated( + pageParameters, + { + select: { + id: true, + client: true, + userId: true, + draft: true, + imported_products: { + select: { + price: true, + }, + }, + work: { + select: { + price: true, + }, + }, + }, + where, + }, + ); - const uniqueClients: Array = []; - for (const i of orders) { - if (!uniqueClients.includes(i.client)) - uniqueClients.push(database.escape(i.client)); + const rvalue = new Array(); + + for (const i of data) { + const importedProductsPriceSum = i.imported_products.reduce((pv, cv) => pv + cv.price.toNumber(), 0); + const workPriceSum = i.work.reduce((pv, cv) => pv + cv.price.toNumber(), 0); + + rvalue.push({ + id: i.id, + client: i.client, + draft: i.draft, + imported_products_count: i.imported_products.length, + userId: i.userId, + value: importedProductsPriceSum + workPriceSum, + work_count: i.work.length, + }); } - const [clients] = await database.query( - ["SELECT", - "*,", - "CONVERT(`id`, CHAR) AS `id`", - "FROM `clients`", - "WHERE `id` IN", - `(${uniqueClients.join(', ')})`, - ].join(" "), - ) as data; - - const rvalue: Array | { client?: client }> = []; - - for (const i of orders) - rvalue.push({ ...i, client: clients.find(e => i.client === e.id) }); return rvalue; +} + +export default defineEventHandler((e) => { + const pageParameters = getPaginatedParameters(e, 50, 200); + return getOrders(pageParameters, {}).then(prismaToWeb); }); diff --git a/server/api/orders.post.ts b/server/api/orders.post.ts index e67913d..f5679eb 100644 --- a/server/api/orders.post.ts +++ b/server/api/orders.post.ts @@ -1,39 +1,44 @@ import { defineEventHandler, readBody, setResponseStatus } from "h3"; +import * as Prisma from "@prisma/client"; import { createValidationError, handleRecursedValidationError } from "../utils/validation"; -import { database as db } from "../utils/database"; +import { database } from "../utils/database"; import getRequestingUser from "../utils/getRequestingUser"; import { getOrder } from "./orders/[id].get"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; import Snowflake from "~/utils/snowflake"; import { createError } from "#imports"; -type importedProduct = { +type importedProduct = { + orderId: inOrder extends true ? never : string, name: string | null, link: string, price_imported: number, price: number, } -type work = { - offer: string, +type work = { + orderId: inOrder extends true ? never : string, + offerId: string, price: number, notes: string | null, - is_fulfilled: boolean | 0 | 1, + fulfilled: boolean, } type order = { - client: string, - // user: string, - is_draft: boolean | 0 | 1, - imported_products: Array, - work: Array, + clientId: string, + // userId: string, + draft: boolean, + imported_products: Array>, + work: Array>, }; -export function checkIsWork( +export function checkIsWork( value: any, patch: Patch, -): value is Patch extends true ? Partial : work { + needsOrderId: inOrder, +): value is Patch extends true ? Partial> : work { const errors = new Map(); if (typeof value !== "object") { @@ -43,19 +48,24 @@ export function checkIsWork( }); } - if (!(typeof value.offer === "string" || (patch && value.offer === undefined))) errors.set("offer", "is not string"); + if (!(typeof value.orderId === "string" || (patch && value.orderId === undefined) || !needsOrderId)) errors.set("orderId", "is not string"); + if (!(typeof value.offerId === "string" || (patch && value.offerId === undefined))) errors.set("offerId", "is not string"); if (!(typeof value.price === "number" || (patch && value.price === undefined))) errors.set("price", "is not price"); if (!(typeof value.notes === "string" || value.notes === null || (patch && value.notes === undefined))) errors.set("notes", "is not string or null"); - if (!(typeof value.is_fulfilled === "boolean" || value.is_fulfilled === 0 || value.is_fulfilled === 1 || (patch && value.is_fulfilled === undefined))) errors.set("is_fulfilled", "is not boolean"); + if (!(typeof value.is_fulfilled === "boolean" || (patch && value.is_fulfilled === undefined))) errors.set("is_fulfilled", "is not boolean"); + + // TODO: Excessive property checking + // Excessive properties should be checked and an error should be thrown if there is one if (errors.size !== 0) throw createValidationError(errors); return true; } -export function checkIsImportedProduct( +export function checkIsImportedProduct( value: any, patch: Patch, -): value is Patch extends true ? Partial : importedProduct { + needsOrderId: inOrder, +): value is Patch extends true ? Partial> : importedProduct { const errors = new Map(); if (typeof value !== "object") { @@ -65,10 +75,14 @@ export function checkIsImportedProduct( }); } + if (!(typeof value.orderId === "string" || (patch && value.orderId === undefined) || !needsOrderId)) errors.set("orderId", "is not string"); if (!(typeof value.name === "string" || value.name === null || (patch && value.name === undefined))) errors.set("name", "is not string or null"); if (!(typeof value.link === "string" || (patch && value.name === undefined))) errors.set("link", "is not string"); if (!(typeof value.price_imported === "number" || (patch && value.name === undefined))) errors.set("price_imported", "is not number"); - if (!(typeof value.price || (patch && value.price === undefined))) errors.set("price", "is not number"); + if (!(typeof value.price === "number" || (patch && value.price === undefined))) errors.set("price", "is not number"); + + // TODO: Excessive property checking + // Excessive properties should be checked and an error should be thrown if there is one if (errors.size !== 0) throw createValidationError(errors); @@ -78,7 +92,7 @@ export function checkIsImportedProduct( export function checkIsOrder( value: any, patch: Patch, -): value is Patch extends true ? Partial> : order { +): value is Patch extends true ? Partial> : order { const errors = new Map(); if (typeof value !== "object") { @@ -88,19 +102,22 @@ export function checkIsOrder( }); } - if (!(typeof value.client === "string" || (patch && value.client === undefined))) errors.set("client", "is not string"); - if (!(typeof value.is_draft === "boolean" || value.is_draft === 0 || value.is_draft === 1 || (patch && value.is_draft === undefined))) errors.set("is_draft", "is not boolean"); + if (!(typeof value.clientId === "string" || (patch && value.clientId === undefined))) errors.set("clientId", "is not string"); + if (!(typeof value.draft === "boolean" || (patch && value.is_draft === undefined))) errors.set("draft", "is not boolean"); if (!(value.imported_products instanceof Array)) errors.set("imported_products", "is not array"); else if (patch && value.imported_products !== undefined) errors.set("imported_products", "cannot patch from order"); if (!(value.work instanceof Array)) errors.set("work", "is not array"); else if (patch && value.work !== undefined) errors.set("work", "cannot patch from order"); + // TODO: Excessive property checking + // Excessive properties should be checked and an error should be thrown if there is one + if (!patch) { const importedProducts = value.imported_products; if (importedProducts instanceof Array) { for (const i in importedProducts) { try { - checkIsImportedProduct(importedProducts[i], patch); + checkIsImportedProduct(importedProducts[i], patch, false); } catch (e) { handleRecursedValidationError(e, errors, `imported_products[${i}]`); } @@ -111,7 +128,7 @@ export function checkIsOrder( if (work instanceof Array) { for (const i in work) { try { - checkIsWork(work[i], patch); + checkIsWork(work[i], patch, false); } catch (e) { handleRecursedValidationError(e, errors, `work[${i}]`); } @@ -126,49 +143,49 @@ export function checkIsOrder( export default defineEventHandler(async (e) => { const body = await readBody(e); - const id = new Snowflake().toString(); + const id = new Snowflake().state; const user = await getRequestingUser(e); if (!checkIsOrder(body, false)) throw createError({ message: "Invalid body", statusCode: 400 }); - const database = await db.new(); - await database.beginTransaction(); - - await database.query( - ["INSERT INTO", - "`orders`", - "VALUES", - "(?, ?, ?, ?)", - ].join(" "), - [id, body.client, user.id, body.is_draft], - ); - - const promises: Array> = []; - for (const i of body.imported_products) { - promises.push(database.query( - ["INSERT INTO", - "`imported_products`", - "VALUES", - "(?, ?, ?, ?, ?, ?)", - ].join(" "), - [new Snowflake().toString(), id, i.name, i.link, i.price_imported, i.price], - )); - } - - for (const i of body.work) { - promises.push(database.query( - ["INSERT INTO", - "`work`", - "VALUES", - "(?, ?, ?, ?, ?, ?)", - ].join(" "), - [new Snowflake().toString(), id, i.offer, i.price, i.notes, i.is_fulfilled], - )); - } - - await Promise.all(promises); - await database.commit(); + await database.order.create({ + data: { + clientId: BigInt(body.clientId), + draft: body.draft, + imported_products: { + createMany: { + data: body.imported_products.reduce( + (pV, cV) => { + pV.push({ + ...cV, + id: new Snowflake().state, + }); + return pV; + }, + [] as Array>, + ), + }, + }, + work: { + createMany: { + data: body.work.reduce( + (pV, cV) => { + pV.push({ + ...cV, + id: new Snowflake().state, + offerId: BigInt(cV.offerId), + }); + return pV; + }, + [] as Array>, + ), + }, + }, + id, + userId: user.id, + }, + }); setResponseStatus(e, 201); - return getOrder(id); + return getOrder(id).then(prismaToWeb); }); diff --git a/server/api/orders/[id].delete.ts b/server/api/orders/[id].delete.ts index 662e7d2..532305d 100644 --- a/server/api/orders/[id].delete.ts +++ b/server/api/orders/[id].delete.ts @@ -1,19 +1,22 @@ import { defineEventHandler } from "h3"; -import { type ResultSetHeader } from "mysql2"; import { database } from "~/server/utils/database"; import { createError } from "#imports"; export default defineEventHandler(async (e) => { - const id = e.context.params?.id; + const id = e.context.params?.id as string; - const [result] = await database.query( - "DELETE FROM `orders` WHERE `id` = ?", - [id], - ) as unknown as [ResultSetHeader]; - - if (result.affectedRows === 0) throw createError({ statusCode: 404 }); + try { + await database.order.delete({ + where: { + id: BigInt(id), + }, + }); + } catch (e) { + // FIXME: should be 500 on errors other than "RecordNotFound" + throw createError({ statusCode: 404 }); + } return null; }); diff --git a/server/api/orders/[id].get.ts b/server/api/orders/[id].get.ts index 6069201..a98bca9 100644 --- a/server/api/orders/[id].get.ts +++ b/server/api/orders/[id].get.ts @@ -1,109 +1,38 @@ import { defineEventHandler } from "h3"; import { createError } from "#imports"; -import { type offer as offerType, type order } from "~/utils/types/database"; -import { database, type data } from "~/server/utils/database"; +import { database } from "~/server/utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; -export async function orderExists(id: string) { - const [[exists]] = await database.query( - "SELECT EXISTS(*) AS `exists` FROM `orders` WHERE `id` = ?", - [id], - ) as data<{exists: 0 | 1}>; - - return exists.exists === 1; +export async function orderExists(id: bigint) { + const exists = await database.order.findUnique({ + where: { + id, + }, + }); + return exists !== null; } -export async function getImportedProducts(id: string) { - const [importedProducts] = await database.query( - ["SELECT", - "CONVERT(`id`, CHAR) AS `id`,", - "`name`,", - "`link`,", - "`price`,", - "`price_imported`", - "FROM `imported_products`", - "WHERE `order` = ?", - ].join(" "), - [id], - ) as data<{ - id: string, - name: string | null, - link: string, - price: string, - price_imported: string - }>; - - return importedProducts; -} - -export async function getWork(id: string) { - const [work] = await database.query( - ["SELECT", - "CONVERT(`id`, CHAR) AS `id`,", - "CONVERT(`offer`, CHAR) AS `offer`,", - "`price`,", - "`notes`,", - "`is_fulfilled`", - "FROM `work`", - "WHERE `order` = ?", - ].join(" "), - [id], - ) as data<{ - id: string, - offer: offerType, - price: number, - notes: string | null, - is_fulfilled: 0 | 1, - }>; - - const [offer] = await database.query( - ["SELECT", - "CONVERT(`offer`.`id`, CHAR) AS `id`,", - "`offer`.`name`,", - "`offer`.`description`,", - "`offer`.`recommended_price`", - "FROM", - "`work`", - "LEFT JOIN `offer` ON `work`.`offer` = `offer`.`id`", - "WHERE `work`.`order` = ?", - ].join(" "), - [id], - ) as data; - - // @ts-ignore i.offer is string, but it needs to be an offer object - for (const i of work) i.offer = offer.find(e => e.id === i.offer) as offerType; - return work; -} - -export async function getOrder(id: string): Promise { - const [[order]] = await database.query( - ["SELECT", - "CONVERT(`id`, CHAR) AS `id`,", - "CONVERT(`client`, CHAR) AS `client`,", - "CONVERT(`user`, CHAR) AS `user`, ", - "`is_draft`,", - "`value`", - "FROM `orderSummaries`", - "WHERE `id` = ?", - ].join(" "), - [id], - ) as data<{ - id: string, - client: string, - user: string, - is_draft: 0 | 1, - value: number, - }>; +export async function getOrder(id: bigint) { + const order = await database.order.findUnique({ + where: { + id, + }, + include: { + imported_products: true, + work: { + include: { + offer: true, + }, + }, + }, + }); if (!order) throw createError({ statusCode: 404 }); - - const importedProducts = await getImportedProducts(id); - const work = await getWork(id); - - return { ...order, imported_products: importedProducts, work }; + return order; } export default defineEventHandler((e) => { - const key = e.context.params?.id; - return getOrder(key as string); + const key = e.context.params?.id as string; + return getOrder(BigInt(key)).then(prismaToWeb); }); diff --git a/server/api/orders/[id].patch.ts b/server/api/orders/[id].patch.ts index 687066a..9c0a787 100644 --- a/server/api/orders/[id].patch.ts +++ b/server/api/orders/[id].patch.ts @@ -1,19 +1,27 @@ import { defineEventHandler, readBody } from "h3"; import { checkIsOrder } from "../orders.post"; -import { database as db } from "~/server/utils/database"; +import { getOrder } from "./[id].get"; +import { database } from "~/server/utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; import { createError } from "#imports"; export default defineEventHandler(async (e) => { const body = await readBody(e); - const id = e.context.params?.id; + const id = e.context.params?.id as string; - if (!checkIsOrder(e, true)) throw createError({ message: "Invalid body", statusCode: 400 }); + if (!checkIsOrder(body, true)) throw createError({ message: "Invalid body", statusCode: 400 }); - const database = await db.new(); - await database.beginTransaction(); + await database.order.update({ + where: { + id: BigInt(id), + }, + data: { + clientId: body.clientId ? BigInt(body.clientId) : undefined, + draft: body.draft, + }, + }); - for (const [k, v] of Object.entries(body)) - database.query(`UPDATE TABLE \`orders\` SET \`${k}\` = ? WHERE \`id\` = ?`, [v, id]); + return getOrder(BigInt(id)).then(prismaToWeb); }); diff --git a/server/api/orders/[id]/imported_products.get.ts b/server/api/orders/[id]/imported_products.get.ts index 1e6a027..636d2c1 100644 --- a/server/api/orders/[id]/imported_products.get.ts +++ b/server/api/orders/[id]/imported_products.get.ts @@ -1,14 +1,27 @@ import { defineEventHandler } from "h3"; -import { orderExists, getImportedProducts } from "../[id].get"; +import { orderExists } from "../[id].get"; +import { database } from "~/server/utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; import { createError } from "#imports"; export default defineEventHandler(async (e) => { - const id = e.context.params?.id as string; + const orderId = e.context.params?.id as string; - if (!orderExists(id)) throw createError({ statusCode: 404 }); + if (!(await orderExists(BigInt(orderId)))) throw createError({ statusCode: 404 }); - const importedProducts = await getImportedProducts(id); - return importedProducts; + return database.importedProduct.findMany({ + where: { + orderId: BigInt(orderId), + }, + select: { + id: true, + link: true, + name: true, + orderId: true, + price: true, + price_imported: true, + }, + }).then(prismaToWeb); }); diff --git a/server/api/orders/[id]/imported_products.post.ts b/server/api/orders/[id]/imported_products.post.ts index debf1a8..72aa628 100644 --- a/server/api/orders/[id]/imported_products.post.ts +++ b/server/api/orders/[id]/imported_products.post.ts @@ -1,29 +1,33 @@ import { defineEventHandler, readBody, setResponseStatus } from "h3"; import { checkIsImportedProduct } from "../../orders.post"; -import { getImportedProducts, orderExists } from "../[id].get"; +import { orderExists } from "../[id].get"; import Snowflake from "~/utils/snowflake"; import { database } from "~/server/utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; import { createError } from "#imports"; export default defineEventHandler(async (e) => { const body = await readBody(e); const idOrder = e.context.params?.id as string; - const idImportedProducts = new Snowflake().toString(); + const idImportedProduct = new Snowflake().state; - if (!orderExists(idOrder)) throw createError({ statusCode: 404 }); - if (!checkIsImportedProduct(body, false)) throw createError({ message: "Invalid body", statusCode: 400 }); + if (!await orderExists(BigInt(idOrder))) throw createError({ statusCode: 404 }); + if (!checkIsImportedProduct(body, false, false)) throw createError({ message: "Invalid body", statusCode: 400 }); - await database.query( - ["INSERT INTO", - "`imported_products`", - "VALUES", - "(?, ?, ?, ?, ?, ?)", - ].join(" "), - [idImportedProducts, idOrder, body.name, body.link, body.price_imported, body.price], - ); + const rvalue = await database.importedProduct.create({ + data: { + id: idImportedProduct, + link: body.link, + name: body.name, + orderId: BigInt(idOrder), + price: body.price, + price_imported: body.price_imported, + }, + }); setResponseStatus(e, 201); - return getImportedProducts(idOrder); + + return prismaToWeb(rvalue); }); diff --git a/server/api/orders/[id]/work.get.ts b/server/api/orders/[id]/work.get.ts index 02bd815..21f4f86 100644 --- a/server/api/orders/[id]/work.get.ts +++ b/server/api/orders/[id]/work.get.ts @@ -1,14 +1,31 @@ import { defineEventHandler } from "h3"; -import { orderExists, getWork } from "../[id].get"; +import { orderExists } from "../[id].get"; +import { database } from "~/server/utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; import { createError } from "#imports"; export default defineEventHandler(async (e) => { - const id = e.context.params?.id as string; + const orderId = e.context.params?.id as string; - if (!orderExists(id)) throw createError({ statusCode: 404 }); + if (!await orderExists(BigInt(orderId))) throw createError({ statusCode: 404 }); - const work = await getWork(id); - return work; + const data = await database.work.findMany({ + where: { + orderId: BigInt(orderId), + }, + select: { + id: true, + fulfilled: true, + notes: true, + offer: true, + orderId: true, + price: true, + }, + }); + + if (!data) throw createError({ statusCode: 404 }); + + return prismaToWeb(data); }); diff --git a/server/api/orders/[id]/work.post.ts b/server/api/orders/[id]/work.post.ts index f153ae6..eec5c67 100644 --- a/server/api/orders/[id]/work.post.ts +++ b/server/api/orders/[id]/work.post.ts @@ -1,30 +1,34 @@ import { defineEventHandler, readBody, setResponseStatus } from "h3"; +import { Decimal } from "@prisma/client/runtime/library"; import { checkIsWork } from "../../orders.post"; -import { getWork, orderExists } from "../[id].get"; +import { orderExists } from "../[id].get"; import Snowflake from "~/utils/snowflake"; import { database } from "~/server/utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; import { createError } from "#imports"; export default defineEventHandler(async (e) => { const body = await readBody(e); const idOrder = e.context.params?.id as string; - const idWork = new Snowflake().toString(); + const idWork = new Snowflake().state; - if (!orderExists(idOrder)) throw createError({ statusCode: 404 }); - if (!checkIsWork(body, false)) throw createError({ message: "Invalid body", statusCode: 400 }); + if (!orderExists(BigInt(idOrder))) throw createError({ statusCode: 404 }); + if (!checkIsWork(body, false, false)) throw createError({ message: "Invalid body", statusCode: 400 }); - await database.query( - ["INSERT INTO", - "`work`", - "VALUES", - "(?, ?, ?, ?, ?, ?)", - ].join(" "), - [idWork, idOrder, body.offer, body.price, body.notes, body.is_fulfilled], - ); + const rvalue = await database.work.create({ + data: { + id: BigInt(idWork), + fulfilled: body.fulfilled, + notes: body.notes, + offerId: BigInt(body.offerId), + orderId: BigInt(body.orderId), + price: new Decimal(body.price), + }, + }); setResponseStatus(e, 201); - return getWork(idWork); + return prismaToWeb(rvalue); }); diff --git a/server/api/orders/[id]/work/[idWork].delete.ts b/server/api/orders/[id]/work/[idWork].delete.ts index 9c7ef0e..c0cfd5d 100644 --- a/server/api/orders/[id]/work/[idWork].delete.ts +++ b/server/api/orders/[id]/work/[idWork].delete.ts @@ -1,7 +1,5 @@ import { defineEventHandler } from "h3"; -import { type ResultSetHeader } from "mysql2"; -import { orderExists } from "../../[id].get"; import { database } from "~/server/utils/database"; import { createError } from "#imports"; @@ -10,13 +8,17 @@ export default defineEventHandler(async (e) => { const idOrder = e.context.params?.id as string; const idWork = e.context.params?.idWork as string; - if (!orderExists(idOrder)) throw createError({ statusCode: 404 }); + try { + await database.work.delete({ + where: { + id: BigInt(idWork), + orderId: BigInt(idOrder), + }, + }); + } catch (e) { + // FIXME: should be 500 on errors other than "RecordNotFound" + throw createError({ statusCode: 404 }); + } - const [response] = await database.query( - "DELETE FROM `work` WHERE `id` = ?", - [idWork], - ) as unknown as [ResultSetHeader]; - - if (response.affectedRows === 0) throw createError({ statusCode: 404 }); return null; }); diff --git a/server/api/orders/[id]/work/[idWork].get.ts b/server/api/orders/[id]/work/[idWork].get.ts index 9c21067..835ee65 100644 --- a/server/api/orders/[id]/work/[idWork].get.ts +++ b/server/api/orders/[id]/work/[idWork].get.ts @@ -1,13 +1,32 @@ import { defineEventHandler } from "h3"; -import { orderExists, getWork } from "../../[id].get"; +import { orderExists } from "../../[id].get"; +import { database } from "~/server/utils/database"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; import { createError } from "#imports"; -export default defineEventHandler((e) => { +export default defineEventHandler(async (e) => { const idOrder = e.context.params?.id as string; const idWork = e.context.params?.idWork as string; - if (!orderExists(idOrder)) throw createError({ statusCode: 404 }); - return getWork(idWork); + if (!await orderExists(BigInt(idOrder))) throw createError({ statusCode: 404 }); + const data = await database.work.findUnique({ + where: { + orderId: BigInt(idOrder), + id: BigInt(idWork), + }, + select: { + id: true, + fulfilled: true, + notes: true, + offer: true, + orderId: true, + price: true, + }, + }); + + if (!data) throw createError({ statusCode: 404 }); + + return prismaToWeb(data); }); diff --git a/server/api/users/me.get.ts b/server/api/users/me.get.ts index 1e2f156..ef9c0cd 100644 --- a/server/api/users/me.get.ts +++ b/server/api/users/me.get.ts @@ -1,15 +1,8 @@ -/* global defineEventHandler, getCookie */ -import { defineEventHandler, getCookie } from "h3"; +import { defineEventHandler } from "h3"; -import { database, type data } from "~/server/utils/database"; -import { type user } from "~/utils/types/database"; +import getRequestingUser from "~/server/utils/getRequestingUser"; +import { prismaToWeb } from "~/server/utils/prismaToWeb"; -export default defineEventHandler(async (e) => { - const token = getCookie(e, "token"); - const [[userData]] = await database.query( - "SELECT CONVERT(`users`.`id`, CHAR(32)) as `id`, `users`.`username` as `username`, `users`.`email` as `email`, `users`.`display_name` as `display_name` FROM `sessions` LEFT JOIN `users` ON `sessions`.`user` = `users`.`id` WHERE `sessions`.`id` = ?", - [token], - ) as unknown as data; - - return userData; +export default defineEventHandler((e) => { + return getRequestingUser(e).then(prismaToWeb); }); diff --git a/server/middleware/auth.ts b/server/middleware/auth.ts index ad4dc48..fb91a7d 100644 --- a/server/middleware/auth.ts +++ b/server/middleware/auth.ts @@ -1,7 +1,8 @@ import { defineEventHandler, getCookie } from "h3"; import { createError } from "#imports"; -import { database, type data } from "~/server/utils/database"; +import { database } from "~/server/utils/database"; +import getRequestingUser from "~/server/utils/getRequestingUser"; const endpointsWithoutAuth: string[] = [ "/dbtest", @@ -34,13 +35,14 @@ export default defineEventHandler(async (e) => { export async function isAuthorised(token: string | undefined): Promise { if (!token) return false; try { - const [[session]] = await database.query( - "SELECT EXISTS(SELECT `id` FROM `sessions` WHERE `id` = ? AND `expiry_date` >= NOW()) as `logged_in`", - [token], - ) as unknown as data<{logged_in: number}>; + await database.session.findUniqueOrThrow({ + where: { + id: BigInt(token), + }, + }); - return session.logged_in === 1; - } catch { + return true; + } catch (e) { return false; } } diff --git a/server/utils/baaPageParsing.ts b/server/utils/baaPageParsing.ts new file mode 100644 index 0000000..2bce640 --- /dev/null +++ b/server/utils/baaPageParsing.ts @@ -0,0 +1,108 @@ +// BAA stands for Before Around After + +import { getQuery, type H3Event } from "h3"; +import { type QueryObject } from "ufo"; + +import { isString } from "./isString"; + +import { createError } from "#imports"; + +type queryType = none extends false ? { + type: "before" | "after" | "around", + id: bigint +} : { + type: null +}; + +export type pageData = queryType & { count: number } + +/** + * Gets queryType for a given query with a value + * @param query the query to parse + * @throws if query malformed (multiple before/after/around) + */ +function getLocationParameterType(query: QueryObject): queryType { + const before = query.before; + const after = query.after; + const around = query.around; + + let setLocationParametersCount = 0; + let rvalue: queryType = { type: null }; + + if (isString(before)) { + setLocationParametersCount++; + rvalue = { type: "before", id: BigInt(before) }; + } + + if (isString(after)) { + setLocationParametersCount++; + rvalue = { type: "after", id: BigInt(after) }; + } + + if (isString(around)) { + setLocationParametersCount++; + rvalue = { type: "around", id: BigInt(around) }; + } + + if (setLocationParametersCount > 1) { + throw createError({ + statusCode: 400, + message: "multiple location parameters not allowed", + }); + } + + return rvalue; +} + +/** Gets the count parameter from the query object. + * @param query the query to check. + * @param defaultCount the default count if the query doesn't have count parameter. (default 50) + * @param countLimit the maximum count of the parameter before throwing. (default 200) + * @returns the value of count parameter. + * @throws if the parameter in query exceeds provided countLimit. + */ +function getRequestedCount( + query: QueryObject, + defaultCount = 50, + countLimit = 200, +) { + let count = defaultCount; + if (query.limit) count = Number(query.limit); + + if (count > countLimit) { + throw createError({ + statusCode: 400, + message: `Cannot retrieve more than ${countLimit} records`, + }); + } + if (count <= 0) { + throw createError({ + statusCode: 400, + message: "Tried to retireve 0 or less records", + }); + } + + return count; +} + +/** Gets the baa page parameters from the H3event, + * @param e the H3event to fetch parameters. + * @param defaultCount the default count to use if there is no count parameter. (default 50) + * @param countLimit the maximum value of the count parameter before throwing an error. (default 200) + * @returns the page data found in the query. + * @throws if event has a count parameter in the query that exceed provided countLimit. + */ +export default function getPaginatedParameters( + e: H3Event, + defaultCount = 50, + countLimit = 200, +): pageData { + const query = getQuery(e); + const queryParameters = getLocationParameterType(query); + const queryCount = getRequestedCount(query, defaultCount, countLimit); + + return { + ...queryParameters, + count: queryCount, + }; +} diff --git a/server/utils/baaPagination.ts b/server/utils/baaPagination.ts deleted file mode 100644 index aa78ec7..0000000 --- a/server/utils/baaPagination.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { defineEventHandler, getQuery, readBody, setResponseStatus, H3Event } from "h3"; -import { type ResultSetHeader } from "mysql2/promise"; - -import { type data, database } from "./database"; -import { isString } from "./isString"; -import Snowflake from "~/utils/snowflake"; -import { type client } from "~/utils/types/database"; - -import { createError } from "#imports"; - -type queryType = { - type: "before" | "after" | "around", - id: string -} | { - type: null -}; - -/** - * Before, around, after pagination wrapper - */ -export default class BaaPagination { - readonly table: string; - readonly key: keyType; - readonly select: string; - readonly groupBy: string; - - private get sqlGroupBy() { - return this.groupBy !== "" ? `GROUP BY ${this.groupBy}` : ""; - } - - /** - * Gets queryType for a given query with a value - * @param query the query to parse - * @throws if query malformed (multiple before/after/around) - */ - static getLocationParameterType(query: any): queryType { - const before = query.before; - const after = query.after; - const around = query.around; - - let setLocationParametersCount = 0; - let rvalue: queryType = { type: null }; - - if (isString(before)) { - setLocationParametersCount++; - rvalue = { type: "before", id: before }; - } - - if (isString(after)) { - setLocationParametersCount++; - rvalue = { type: "after", id: after }; - } - - if (isString(around)) { - setLocationParametersCount++; - rvalue = { type: "around", id: around }; - } - - if (setLocationParametersCount > 1) { - throw createError({ - statusCode: 400, - message: "multiple location parameters not allowed", - }); - } - - return rvalue; - } - - async getPagedResults( - queryType: queryType, - limit = 50, - where = "", - bind: Array = [], - ) { - const sqlwhere = where !== "" ? `AND (${where})` : ""; - switch (queryType.type) { - case "before": { - const [data] = await database.query( - `SELECT ${this.select}, CONVERT(\`${this.key}\`, CHAR) AS \`${this.key}\` FROM \`${this.table}\` WHERE \`${this.key}\` < ? ${sqlwhere} ORDER BY \`${this.key}\` DESC ${this.sqlGroupBy} LIMIT ?`, - [queryType.id, ...bind, limit], - ) as unknown as data; - return data; - } - case "after": { - const [data] = await database.query( - `SELECT ${this.select}, CONVERT(\`${this.key}\`, CHAR) AS \`${this.key}\` FROM \`${this.table}\` WHERE \`${this.key}\` > ? ${sqlwhere} ORDER BY \`${this.key}\` DESC ${this.sqlGroupBy} LIMIT ?`, - [queryType.id, ...bind, limit], - ) as unknown as data; - return data; - } - case "around": { - const [data] = await database.query( - ` SELECT ${this.select}, CONVERT(\`${this.key}\`, CHAR) AS \`${this.key}\` FROM (\n` + - `(SELECT * FROM \`${this.table}\` WHERE \`${this.key}\` >= ? ${sqlwhere} ORDER BY \`${this.key}\` ${this.sqlGroupBy} ASC LIMIT ?)\n` + - "UNION ALL\n" + - `(SELECT ${this.select} FROM \`${this.table}\` WHERE \`${this.key}\` < ? ${sqlwhere} ORDER BY \`${this.key}\` DESC ${this.sqlGroupBy} LIMIT ?)\n` + - `) as \`x\` ORDER BY \`${this.key}\` DESC`, - [queryType.id, ...bind, Math.ceil(limit / 2), queryType.id, ...bind, Math.floor(limit / 2)], - ) as unknown as data; - return data; - } - case null: { - const [data] = await database.query( - `SELECT ${this.select}, CONVERT(\`${this.key}\`, CHAR) AS \`${this.key}\` FROM \`${this.table}\` WHERE TRUE ${sqlwhere} ORDER BY \`${this.key}\` DESC ${this.sqlGroupBy} LIMIT ?`, - [...bind, limit], - ) as unknown as data; - return data; - } - default: - throw createError("Not implemented"); - } - } - - RESTget( - e: H3Event, - defaultLimit = 50, - limitLimit = 200, - where = "", - bind: Array = [], - ) { - const query = getQuery(e); - - let limit = defaultLimit; - if (query.limit) limit = Number(query.limit); - if (limit > limitLimit) { - throw createError({ - statusCode: 400, - message: `Cannot retrieve more than ${limitLimit} records`, - }); - } - if (limit <= 0) { - throw createError({ - statusCode: 400, - message: "Tried to retireve 0 or less records", - }); - } - - const queryData = BaaPagination.getLocationParameterType(query); - - return this.getPagedResults(queryData, limit, where, bind); - } - - async RESTpost>( - e: H3Event, - fields: Array, - valueChecker: (obj: unknown) => obj is {[P in K]: T[P]}, - ) { - const body = await readBody(e); - const id = new Snowflake().toString(); - - if (!valueChecker(body)) throw createError({ message: "Invalid body", statusCode: 400 }); - - const arrayToInsert: Array = [id]; - arrayToInsert.push(...fields.map(field => body[field])); - - await database.query( - `INSERT INTO \`${this.table}\` ` + - `(\`${this.key}\`,\`${fields.join("`, `")}\`) ` + - "VALUES (" + - "?, ".repeat(fields.length) + - "?)", - arrayToInsert, - ); - - setResponseStatus(e, 201); - - // FIXME: data may be turncated in the database - // either throw an error when data is too large or - // reply with turncated data - return { id, ...body }; - } - - async RESTgetRecord(e: H3Event) { - const key = e.context.params?.[this.key]; - const [data] = await database.query( - `SELECT ${this.select}, CONVERT(\`${this.key}\`, CHAR) AS \`${this.key}\` FROM \`${this.table}\` WHERE \`${this.key}\` = ?`, - [key], - ) as data; - - if (!data[0]) { - throw createError({ - statusCode: 404, - }); - } - - return data[0]; - } - - async RESTpatchRecord( - e: H3Event, - valueChecker: (obj: unknown) => obj is Partial>, - ) { - const body = await readBody(e); - const key = e.context.params?.[this.key]; - - if (!valueChecker(body)) throw createError({ message: "Invalid body", statusCode: 400 }); - - for (const [k, v] of Object.entries(body)) { - // FIXME: use single database.query method instead of looping through keys and values - const [res] = await database.query( - // I believe it is safe to put key (k) in the template - // because it is limited to 4 values here - `UPDATE \`${this.table}\` SET \`${k}\` = ? WHERE \`${this.key}\` = ?`, - [v, key], - ) as unknown as [ResultSetHeader]; - - if (res.affectedRows !== 1) { - throw createError({ - statusCode: 404, - }); - } - } - - const [data] = await database.query( - `SELECT ${this.select}, CONVERT(\`${this.key}\`, CHAR) AS \`${this.key}\` FROM \`${this.table}\` WHERE \`${this.key}\` = ?`, - [key], - ) as data; - - return data[0]; - } - - async RESTdeleteRecord(e: H3Event) { - const key = e.context.params?.[this.key]; - - const [result] = await database.query( - `DELETE FROM \`${this.table}\` WHERE \`${this.key}\` = ?`, - [key], - ) as unknown as [ResultSetHeader]; - - if (result.affectedRows === 0) throw createError({ statusCode: 404 }); - - return null; - } - - async RESTrecordCount( - e :H3Event, - where = "", - bind: Array = [], - ) { - const sqlwhere = where !== "" ? `WHERE ${where}` : ""; - const [[data]] = await database.query( - `SELECT COUNT(*) as \`count\` FROM \`${this.table}\` ${sqlwhere} ${this.sqlGroupBy}`, - bind, - ) as data<{count: number}>; - - if (!data) throw createError("Database returned no rows"); - return data; - } - - constructor( - table: string, - key: keyType, - select = "*", - groupBy = "", - ) { - this.table = table; - this.key = key; - this.select = select; - this.groupBy = groupBy; - } -} diff --git a/server/utils/database.ts b/server/utils/database.ts index 9d7cab6..8223437 100644 --- a/server/utils/database.ts +++ b/server/utils/database.ts @@ -1,19 +1,99 @@ -import mysql, { type Connection } from "mysql2/promise"; +import { PrismaClient, Prisma } from "@prisma/client"; -const connectionOptions: mysql.ConnectionOptions = { - host: process.env.DB_HOST, - port: Number(process.env.DB_PORT), - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_SCHEMA, - decimalNumbers: true, - supportBigNumbers: true, -}; +import { type pageData } from "./baaPageParsing"; -export const database = - await mysql.createConnection(connectionOptions) as Connection & { - new: (localConnectionOptions?: mysql.ConnectionOptions | undefined) => Promise - }; -database.new = (localConnectionOptions?: mysql.ConnectionOptions | undefined) => { return mysql.createConnection({ ...localConnectionOptions, ...connectionOptions }); }; +type model = PrismaClient[Uncapitalize]; -export type data = [T[], mysql.FieldPacket[]]; +function getBeforeParameters( + pageData: pageData, + fetchArgs: Prisma.Args, +) { + const _fetchArgs = Object.assign({}, fetchArgs); + return Object.assign(_fetchArgs, { + take: pageData.count, + orderBy: [ + { id: "desc" }, + ], + where: { + AND: [ + { + id: { + _lt: pageData.id, + }, + }, + fetchArgs.where, + ], + }, + }); +} + +function getAfterParameters( + pageData: pageData, + fetchArgs: Prisma.Args, +) { + const _fetchArgs = Object.assign({}, fetchArgs); + return Object.assign(_fetchArgs, { + take: pageData.count, + orderBy: [ + { id: "desc" }, + ], + where: { + AND: [ + { + id: { + _gt: pageData.id, + }, + }, + fetchArgs.where, + ], + }, + }); +} + +function getNullParameters( + pageData: pageData, + fetchArgs: Prisma.Args, +) { + const _fetchArgs = Object.assign({}, fetchArgs); + return Object.assign(_fetchArgs, { + take: pageData.count, + orderBy: [ + { id: "desc" }, + ], + }); +} + +export const database = new PrismaClient().$extends({ + model: { + $allModels: { + findPaginated( + this: T, + pageData: pageData, + fetchArgs: Prisma.Exact>, + ): Promise> { + const context = Prisma.getExtensionContext(this) as any; + switch (pageData.type) { + case "before": + return context.findMany(getBeforeParameters(pageData, fetchArgs)); + case "after": + return context.findMany(getAfterParameters(pageData, fetchArgs)); + case "around": + return Promise.all([ + context.findMany(getBeforeParameters({ + type: "before", + id: pageData.id, + count: Math.ceil(pageData.count), + }, fetchArgs)), + context.findMany(getAfterParameters({ + type: "after", + id: pageData.id, + count: Math.floor(pageData.count), + }, fetchArgs)), + ]).then(rv => rv.flat()) as Promise; + case null: + return context.findMany(getNullParameters(pageData, fetchArgs)); + } + }, + }, + }, +}); diff --git a/server/utils/getRequestingUser.ts b/server/utils/getRequestingUser.ts index 02f5b0b..13ed3f9 100644 --- a/server/utils/getRequestingUser.ts +++ b/server/utils/getRequestingUser.ts @@ -1,25 +1,30 @@ import { getCookie, H3Event } from "h3"; -import { database, type data } from "./database"; -import { type user } from "~/utils/types/database"; +import { database } from "./database"; import { createError } from "#imports"; export default async function getRequestingUser(e: H3Event) { const cookie = getCookie(e, "token"); - const [[user]] = await database.query( - ["SELECT", - "CONVERT(`users`.`id`, CHAR) as `id`,", - "`users`.`username`,", - "`users`.`email`,", - "`users`.`display_name`", - "FROM", - "`sessions`", - "LEFT JOIN `users` ON `sessions`.`user` = `users`.`id`", - "WHERE `sessions`.`id` = ?", - ].join(" "), - [cookie], - ) as data; + if (!cookie) throw createError("User not found"); + const { user } = await database.session.findUnique({ + where: { + id: BigInt(cookie), + }, + select: { + user: { + select: { + display_name: true, + email: true, + id: true, + username: true, + }, + }, + }, + }).then((e) => { + if (e === null) throw createError("User not found"); + return e; + }); if (!user) throw createError("User not found"); return user; diff --git a/server/utils/prismaToWeb.ts b/server/utils/prismaToWeb.ts new file mode 100644 index 0000000..d307e5d --- /dev/null +++ b/server/utils/prismaToWeb.ts @@ -0,0 +1,44 @@ +import { Decimal } from "@prisma/client/runtime/library"; + +type func = (...args: any[]) => any | Function; + +export type replaceJsonUnparsableToString = + T extends Array ? Array> + : { + [K in keyof T]: + T[K] extends null ? null + : T[K] extends func ? never + : T[K] extends Decimal ? `${number}` + : T[K] extends Array ? Array> + : T[K] extends object ? replaceJsonUnparsableToString + : T[K] extends bigint ? `${bigint}` + : T[K] + }; + +type exactToInterface = (...args: any[]) => any extends Function ? true : false; + +function arrayPrismaToWeb(array: Array) { + return array.reduce( + (pV, cV) => { + pV.push(prismaToWeb(cV)); + return pV; + }, + [] as Array>, + ); +} + +export function prismaToWeb(ivalue: T): replaceJsonUnparsableToString { + const rvalue: any = ivalue instanceof Array ? [] : {}; + + for (const i in ivalue) { + const current = ivalue[i]; + if (current === null) rvalue[i] = null; + else if (typeof current === 'function') continue; + else if (current instanceof Decimal) rvalue[i] = current.toString(); + else if (current instanceof Array) rvalue[i] = arrayPrismaToWeb(current); + else if (typeof current === 'object') rvalue[i] = prismaToWeb(current); + else if (typeof current === 'bigint') rvalue[i] = current.toString(); + else rvalue[i] = current; + } + return rvalue; +} diff --git a/utils/types/database.ts b/utils/types/database.ts deleted file mode 100644 index 28a4ddc..0000000 --- a/utils/types/database.ts +++ /dev/null @@ -1,99 +0,0 @@ -export interface client { - id: string; - name: string | null; - address: string | null; - phone: string | null; - email: string | null; -} - -export interface user { - id: string; - username: string; - email: string; - display_name?: string; -} - -export interface session { - id: string; - user: string; - expiry_date: string; -} - -export interface imported_product { - id: string; - // order: string, - name?: string; - link: string; - price_imported: string; - price: string; -} - -export interface offer { - id: string; - name: string; - description?: string; - recommended_price?: string; -} - -export interface work { - id: string; - // order: string, - offer: string | offer; - price: string; - notes: string; - is_fulfilled: boolean; -} - -export interface order { - imported_products: Array<{ - id: string; - name: string | null; - link: string; - price: string; - price_imported: string; - }>; - work: { - id: string; - offer: offer; - price: number; - notes: string | null; - is_fulfilled: 0 | 1; - }[]; - id: string; - client: string; - user: string; - is_draft: 0 | 1; - value: number; -} - -export interface orderSummary { - id: string; - client: string; - user: string; - is_draft: 0 | 1; - value: string; - imported_products_count: number; - work_count: number; -} - -export interface work_template { - id: string; - // order_template: string, - offer: string | offer; - price: string; - notes?: string; -} - -export interface order_template { - id: string; - name: string; - description?: string; -} - -// 1 is true, 0 is false -export type Dboolean = - | boolean - | 0 // false - | 1; // true - -export type Dnumber = number | `${number}`; From aa645e710e80bdf2343609cce394f456a91d15a2 Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Wed, 8 Nov 2023 06:03:30 +0100 Subject: [PATCH 10/40] Add nix shell --- shell.nix | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 shell.nix diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..675b0ca --- /dev/null +++ b/shell.nix @@ -0,0 +1,86 @@ +{ pkgs ? import {} }: + +let + # Updating this package will force an update for nodePackages.prisma. The + # version of prisma-engines and nodePackages.prisma must be the same for them to + # function correctly. + prisma-version = "5.5.2"; + prisma-src = pkgs.fetchFromGitHub { + owner = "prisma"; + repo = "prisma-engines"; + rev = prisma-version; + hash = "sha256-d24b+Jobt5+vH7SGYOnDIR9DOtM0Y2XSfHZGkr7EidA="; + }; + new-prisma-engines = pkgs.rustPlatform.buildRustPackage { + pname = "prisma-engines"; + version = prisma-version; + + src = builtins.storePath prisma-src; + + # Use system openssl. + OPENSSL_NO_VENDOR = 1; + + nativeBuildInputs = [ pkgs.pkg-config pkgs.git ]; + + buildInputs = [ + pkgs.openssl + pkgs.protobuf + ]; + + cargoLock = { + lockFile = "${prisma-src}/Cargo.lock"; + outputHashes = { + "barrel-0.6.6-alpha.0" = "sha256-USh0lQ1z+3Spgc69bRFySUzhuY79qprLlEExTmYWFN8="; + "graphql-parser-0.3.0" = "sha256-0ZAsj2mW6fCLhwTETucjbu4rPNzfbNiHu2wVTBlTNe4="; + "mysql_async-0.31.3" = "sha256-QIO9s0Upc0/1W7ux1RNJNGKqzO4gB4gMV3NoakAbxkQ="; + "postgres-native-tls-0.5.0" = "sha256-UYPsxhCkXXWk8yPbqjNS0illwjS5mVm3Z/jFwpVwqfw="; + }; + }; + + preBuild = '' + export OPENSSL_DIR=${pkgs.lib.getDev pkgs.openssl} + export OPENSSL_LIB_DIR=${pkgs.lib.getLib pkgs.openssl}/lib + + export PROTOC=${pkgs.protobuf}/bin/protoc + export PROTOC_INCLUDE="${pkgs.protobuf}/include"; + + export SQLITE_MAX_VARIABLE_NUMBER=250000 + export SQLITE_MAX_EXPR_DEPTH=10000 + ''; + + cargoBuildFlags = [ + "-p" "query-engine" + "-p" "query-engine-node-api" + "-p" "schema-engine-cli" + "-p" "prisma-fmt" + ]; + + postInstall = '' + mv $out/lib/libquery_engine${pkgs.stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/libquery_engine.node + ''; + + # Tests are long to compile + doCheck = false; + + # meta = with lib; { + # description = "A collection of engines that power the core stack for Prisma"; + # homepage = "https://www.prisma.io/"; + # license = licenses.asl20; + # platforms = platforms.unix; + # maintainers = with maintainers; [ pimeys tomhoule ivan aqrln ]; + # }; + }; +in +pkgs.mkShell { + nativeBuildInputs = [ + new-prisma-engines + pkgs.nodejs_18 + pkgs.openssl + ]; + shellHook = '' + export PRISMA_SCHEMA_ENGINE_BINARY="${new-prisma-engines}/bin/schema-engine" + export PRISMA_QUERY_ENGINE_BINARY="${new-prisma-engines}/bin/query-engine" + export PRISMA_QUERY_ENGINE_LIBRARY="${new-prisma-engines}/lib/libquery_engine.node" + export PRISMA_FMT_BINARY="${new-prisma-engines}/bin/prisma-fmt" + ''; +} From f26206de8703707eb2995c91266042299d17942e Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 00:45:37 +0100 Subject: [PATCH 11/40] Reconfigure Vuetify to be installed as Vuetify doc states As of today, the vutetify doc states how to install it in the nuxt. So following the guide I did it. Now the website layout does not "jump" with offsets on load. --- nuxt.config.ts | 15 ++++++++++++++- plugins/vuetify.ts | 2 -- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 78ca3e0..37c9e53 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -1,10 +1,19 @@ import { defineNuxtConfig } from "nuxt/config"; +import vuetify, { transformAssetUrls } from 'vite-plugin-vuetify'; + // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ pages: true, build: { transpile: ["vuetify"], }, + modules: [ + (_options, nuxt) => { + nuxt.hooks.hook('vite:extendConfig', (config) => { + config.plugins?.push(vuetify({ autoImport: true })); + }); + }, + ], css: [ "vuetify/lib/styles/main.sass", "@mdi/font/css/materialdesignicons.min.css", @@ -18,7 +27,11 @@ export default defineNuxtConfig({ }, }, vite: { - // devBundler: "legacy" + vue: { + template: { + transformAssetUrls, + }, + }, }, imports: { autoImport: false, diff --git a/plugins/vuetify.ts b/plugins/vuetify.ts index 166e486..97b4e04 100644 --- a/plugins/vuetify.ts +++ b/plugins/vuetify.ts @@ -6,8 +6,6 @@ import { defineNuxtPlugin } from '#app'; export default defineNuxtPlugin((nuxtApp) => { const vuetify = createVuetify({ ssr: true, - components, - directives, theme: { }, }); From d5d2f2e889759fa964d3b6151f021a164c9ec91b Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 02:28:33 +0100 Subject: [PATCH 12/40] Add forgejo actions --- .forgejo/workflows/build.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .forgejo/workflows/build.yml diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml new file mode 100644 index 0000000..324f6fd --- /dev/null +++ b/.forgejo/workflows/build.yml @@ -0,0 +1,32 @@ +name: Build dev + +on: + push: + +jobs: + build: + runs-on: docker + steps: + # Setup + - uses: https://code.forgejo.org/actions/setup-node@v3 + with: + node-version: 18 + - uses: https://code.forgejo.org/actions/checkout@v3 + - name: Install dependencies + run: npm install -D + + # Compile + - name: Build project + if: success() + run: npx nuxi build + + # Upload + - name: Package to zip + if: success() + run: tar --create --file build-${{ github.run_number }}.tar .output + - name: Upload build + if: success() + uses: https://code.forgejo.org/actions/upload-artifact@v3 + with: + name: Build-${{ github.run_number }} + path: build-${{ github.run_number }}.tar From 95137acbed97481ce434f7b75d637ce210ed56e8 Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 02:43:24 +0100 Subject: [PATCH 13/40] Workflow: rename the artifact with a better name --- .forgejo/workflows/build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml index 324f6fd..b0ec143 100644 --- a/.forgejo/workflows/build.yml +++ b/.forgejo/workflows/build.yml @@ -19,14 +19,14 @@ jobs: - name: Build project if: success() run: npx nuxi build - + # Upload - - name: Package to zip + - name: Package to tar if: success() - run: tar --create --file build-${{ github.run_number }}.tar .output + run: tar --create --file build.tar .output/* - name: Upload build if: success() uses: https://code.forgejo.org/actions/upload-artifact@v3 with: - name: Build-${{ github.run_number }} - path: build-${{ github.run_number }}.tar + name: WorkshopTasker-${{ github.ref_name }}-${{ github.run_number }}.tar + path: build.tar From 5602c228614ca82b61440f65ab81f5a837302908 Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 04:34:25 +0100 Subject: [PATCH 14/40] Don't import Decimal from internal libraries This was causing the project build to not work properly. --- server/api/orders/[id]/work.post.ts | 4 ++-- server/utils/prismaToWeb.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/api/orders/[id]/work.post.ts b/server/api/orders/[id]/work.post.ts index eec5c67..8ada127 100644 --- a/server/api/orders/[id]/work.post.ts +++ b/server/api/orders/[id]/work.post.ts @@ -1,5 +1,5 @@ import { defineEventHandler, readBody, setResponseStatus } from "h3"; -import { Decimal } from "@prisma/client/runtime/library"; +import { Prisma } from "@prisma/client"; import { checkIsWork } from "../../orders.post"; import { orderExists } from "../[id].get"; @@ -24,7 +24,7 @@ export default defineEventHandler(async (e) => { notes: body.notes, offerId: BigInt(body.offerId), orderId: BigInt(body.orderId), - price: new Decimal(body.price), + price: new Prisma.Decimal(body.price), }, }); diff --git a/server/utils/prismaToWeb.ts b/server/utils/prismaToWeb.ts index d307e5d..518ab8e 100644 --- a/server/utils/prismaToWeb.ts +++ b/server/utils/prismaToWeb.ts @@ -1,4 +1,4 @@ -import { Decimal } from "@prisma/client/runtime/library"; +import { Prisma } from "@prisma/client"; type func = (...args: any[]) => any | Function; @@ -8,7 +8,7 @@ export type replaceJsonUnparsableToString = [K in keyof T]: T[K] extends null ? null : T[K] extends func ? never - : T[K] extends Decimal ? `${number}` + : T[K] extends Prisma.Decimal ? `${number}` : T[K] extends Array ? Array> : T[K] extends object ? replaceJsonUnparsableToString : T[K] extends bigint ? `${bigint}` @@ -34,7 +34,7 @@ export function prismaToWeb(ivalue: T): replaceJsonUnparsableToString { const current = ivalue[i]; if (current === null) rvalue[i] = null; else if (typeof current === 'function') continue; - else if (current instanceof Decimal) rvalue[i] = current.toString(); + else if (current instanceof Prisma.Decimal) rvalue[i] = current.toString(); else if (current instanceof Array) rvalue[i] = arrayPrismaToWeb(current); else if (typeof current === 'object') rvalue[i] = prismaToWeb(current); else if (typeof current === 'bigint') rvalue[i] = current.toString(); From ccbbfd1d3b69458919570f57a0efc2f86675e427 Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 04:43:54 +0100 Subject: [PATCH 15/40] README: Precise a description of running of a project. --- README.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 379b005..146d2aa 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,7 @@ Allows for managing order tasks and imported products for a small workshop. # Running -The project was tested with the nodejs version v18.16.0. It may not work with newer versions of nodejs. - -Dev dependencies are required. `npm install -D` +The project was tested with the nodejs version v18.17.1. It may not work with versions higher than 18 of nodejs. Project uses Oracle MySQL as a database store. It uses environment variables for the connection settings. All provided variables below are required. @@ -16,4 +14,18 @@ Project uses Oracle MySQL as a database store. It uses environment variables for |----------------------|-------------------| | `DB_URL` | Database url, see [this](https://www.prisma.io/docs/concepts/database-connectors/mysql#connection-url) | -After setting variables, you can run the project using `npx nuxi dev` or `npx nuxi preview`. +## From Repository + +Dev dependencies are required. `npm install -D`. + +After setting variables, you can run the project using `npx nuxi dev`. +You can also setup variables by placing .env file in the root of the repository. + +When using nix, you can use `nix-shell` to get prisma engines installed in your environment. + +## From Actions + +You can download build from [repository actions](https://git.proot.pl/Wroclaw/WorkshopTasker/actions?workflow=build.yml). + +You need to extract tar file. +After setting environment variables, you can launch the project using the `node server/index.mjs` command. From f5b205f90cc943522c2ce2bd6237ac903a478967 Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 11:38:36 +0100 Subject: [PATCH 16/40] api/clients.post (checkIsClient): Fix opposite condition for the patch parameter. previously, when patch was true, it was requiring the values in the fields. and vice versa. It turns out the "patch" variable was negated for some reason. --- server/api/clients.post.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/api/clients.post.ts b/server/api/clients.post.ts index 97df465..486e35b 100644 --- a/server/api/clients.post.ts +++ b/server/api/clients.post.ts @@ -28,10 +28,10 @@ export function checkIsClient( }); } - if (!(typeof value.name === "string" || value.name === null || (!patch && value.name === undefined))) errors.set("name", "is not string or null"); - if (!(typeof value.address === "string" || value.address === null || (!patch && value.address === undefined))) errors.set("address", "is not string or null"); - if (!(typeof value.phone === "string" || value.phone === null || (!patch && value.phone === undefined))) errors.set("phone", "is not string or null"); - if (!(typeof value.email === "string" || value.email === null || (!patch && value.email === undefined))) errors.set("email", "is not string or null"); + if (!(typeof value.name === "string" || value.name === null || (patch && value.name === undefined))) errors.set("name", "is not string or null"); + if (!(typeof value.address === "string" || value.address === null || (patch && value.address === undefined))) errors.set("address", "is not string or null"); + if (!(typeof value.phone === "string" || value.phone === null || (patch && value.phone === undefined))) errors.set("phone", "is not string or null"); + if (!(typeof value.email === "string" || value.email === null || (patch && value.email === undefined))) errors.set("email", "is not string or null"); for (const i in value as Partial>) if (!clientKeys.includes(i)) errors.set(i, `excessive property`); From 500a9ad59505c7b9d005b36e5f0c4b59d390332c Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 11:35:12 +0100 Subject: [PATCH 17/40] page/client: Don't default form to undefined. This fixes an issue when user does not click the form field. it is not being defined, meaning the field will not be updated. --- pages/client/[id].vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/client/[id].vue b/pages/client/[id].vue index b64c240..ee7f852 100644 --- a/pages/client/[id].vue +++ b/pages/client/[id].vue @@ -55,10 +55,10 @@ function updatePagedListVModel(element: Array) { const editMode = ref(route.query?.edit === "1"); function editorFields(): Array { return [ - { key: "name", type: "text", label: "Name", value: client.value.name ?? undefined }, - { key: "address", type: "text", label: "Address", value: client.value.address ?? undefined }, - { key: "phone", type: "text", label: "Phone", value: client.value.phone ?? undefined }, - { key: "email", type: "text", label: "E-mail", value: client.value.email ?? undefined }, + { key: "name", type: "text", label: "Name", value: client.value.name ?? "" }, + { key: "address", type: "text", label: "Address", value: client.value.address ?? "" }, + { key: "phone", type: "text", label: "Phone", value: client.value.phone ?? "" }, + { key: "email", type: "text", label: "E-mail", value: client.value.email ?? "" }, ]; } From e509bb22c10459ab778497ce03ac9eb8fb2cba2a Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 13:16:21 +0100 Subject: [PATCH 18/40] components/entryEditor: Remove unused "modelValue" property makes eslint happy about that file :) --- components/entryEditor.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/components/entryEditor.vue b/components/entryEditor.vue index 49a0651..2ab5d35 100644 --- a/components/entryEditor.vue +++ b/components/entryEditor.vue @@ -14,7 +14,6 @@ export type fieldDefinition = { const props = defineProps<{ fields: Array, - modelValue?: any, }>(); // eslint-disable-next-line func-call-spacing From 434ae5843e8e3cfa6de89435a6ab441a79e9f2cf Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 17:29:41 +0100 Subject: [PATCH 19/40] api/firstRun.post: await for user creation --- server/api/firstRun.post.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api/firstRun.post.ts b/server/api/firstRun.post.ts index 714be3b..70aa5a8 100644 --- a/server/api/firstRun.post.ts +++ b/server/api/firstRun.post.ts @@ -24,7 +24,7 @@ export default defineEventHandler(async (e) => { if (typeof email !== "string") throw createError({ message: "email is not string", statusCode: 400 }); execSync("npx prisma db push --force-reset"); - database.user.create({ + await database.user.create({ data: { id: new Snowflake().state, username, From ebf5690519aa3d4de9cc7a3ab01fdf513a9a6447 Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 18:28:09 +0100 Subject: [PATCH 20/40] [BREAKING] Auth: replace current auth tokens with more secure ones previously tokens were only like IDs, time based and incrementing counter. An attacker could easily bruteforce them. This patch changes tokens to be completely random. fixes #2 --- schema.prisma | 10 ++++--- server/api/login.post.ts | 13 ++++---- server/middleware/auth.ts | 9 ++++-- server/utils/SessionToken.ts | 49 +++++++++++++++++++++++++++++++ server/utils/getRequestingUser.ts | 6 +++- 5 files changed, 72 insertions(+), 15 deletions(-) create mode 100644 server/utils/SessionToken.ts diff --git a/schema.prisma b/schema.prisma index a507bf7..52e3f86 100644 --- a/schema.prisma +++ b/schema.prisma @@ -20,12 +20,14 @@ model User { } model Session { - id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt - userId BigInt @map("user") @db.UnsignedBigInt - expiry_date DateTime? @default(dbgenerated("(now() + interval 30 day)")) @db.Timestamp(0) - user User @relation(fields: [userId], references: [id]) + id BigInt @id @default(dbgenerated("(((unix_timestamp() * 1000) * pow(2,22)) + floor((rand() * pow(2,12))))")) @db.UnsignedBigInt + userId BigInt @map("user") @db.UnsignedBigInt + sessionToken Bytes @db.Binary(64) + expiry_date DateTime? @default(dbgenerated("(now() + interval 30 day)")) @db.Timestamp(0) + user User @relation(fields: [userId], references: [id]) @@index([userId], map: "user_idx") + @@index([sessionToken]) @@map("sessions") } diff --git a/server/api/login.post.ts b/server/api/login.post.ts index 1b7f00d..bb7e022 100644 --- a/server/api/login.post.ts +++ b/server/api/login.post.ts @@ -4,7 +4,7 @@ import { defineEventHandler, getCookie, setCookie, readBody } from "h3"; import { database } from "../utils/database"; import { isString } from "../utils/isString"; import { cookieSettings } from "../utils/rootUtils"; -import Snowflake from "~/utils/snowflake"; +import SessionToken from "../utils/SessionToken"; import { createError } from "#imports"; @@ -40,14 +40,11 @@ export default defineEventHandler(async (e) => { if (account === null) throw createError({ statusCode: 400, message: "Invalid username or password." }); - const sessionId = new Snowflake(); + const session = new SessionToken(account.id); await database.session.create({ - data: { - id: sessionId.state, - userId: account.id, - }, + data: session.toPrisma(), }); - setCookie(e, "token", sessionId.toString(), cookieSettings); - return { message: "Login successful", token: sessionId.toString() }; + setCookie(e, "token", session.toString(), cookieSettings); + return { message: "Login successful", token: session.toString() }; }); diff --git a/server/middleware/auth.ts b/server/middleware/auth.ts index fb91a7d..e07e947 100644 --- a/server/middleware/auth.ts +++ b/server/middleware/auth.ts @@ -1,9 +1,11 @@ import { defineEventHandler, getCookie } from "h3"; -import { createError } from "#imports"; +import SessionToken from "../utils/SessionToken"; import { database } from "~/server/utils/database"; import getRequestingUser from "~/server/utils/getRequestingUser"; +import { createError } from "#imports"; + const endpointsWithoutAuth: string[] = [ "/dbtest", "/echo", @@ -37,7 +39,10 @@ export async function isAuthorised(token: string | undefined): Promise try { await database.session.findUniqueOrThrow({ where: { - id: BigInt(token), + ...SessionToken.fromString(token).toPrisma(), + expiry_date: { + gte: new Date(), + }, }, }); diff --git a/server/utils/SessionToken.ts b/server/utils/SessionToken.ts new file mode 100644 index 0000000..6a3129c --- /dev/null +++ b/server/utils/SessionToken.ts @@ -0,0 +1,49 @@ +import crypto from "node:crypto"; +import { type Session } from "@prisma/client"; + +import Snowflake from "~/utils/snowflake"; + +/** Represents a Session token, without expiry data. */ +export default class SessionToken { + userId: bigint; + sessionId: bigint; + sessionToken: Buffer; + + constructor(userId: bigint, sessionId?: bigint, sessionToken?: Buffer) { + this.userId = userId; + this.sessionId = sessionId ?? new Snowflake().state; + this.sessionToken = sessionToken ?? crypto.randomBytes(64); + } + + /** Creates SessionToken from a string. + * @param string The strinct to create from. + * @returns The SessionToken object. + */ + static fromString(string: string): SessionToken { + const parameters = string.split("."); + return new SessionToken( + Buffer.from(parameters[0], "base64").readBigUInt64LE(), + Buffer.from(parameters[1], "base64").readBigUInt64LE(), + Buffer.from(parameters[2], "base64"), + ); + } + + toString(): string { + const stringUserId = Buffer.copyBytesFrom(new BigUint64Array([this.userId])).toString("base64"); + const stringSessionId = Buffer.copyBytesFrom(new BigUint64Array([this.sessionId])).toString("base64"); + const stringSessionToken = this.sessionToken.toString("base64"); + return `${stringUserId}.${stringSessionId}.${stringSessionToken}`; + } + + /** Returns this SessionToken as Prisma object. + * For use in where parameter. + * @returns this as prisma object. + */ + toPrisma(): Omit { + return { + id: this.sessionId, + userId: this.userId, + sessionToken: this.sessionToken, + }; + } +} diff --git a/server/utils/getRequestingUser.ts b/server/utils/getRequestingUser.ts index 13ed3f9..60c4173 100644 --- a/server/utils/getRequestingUser.ts +++ b/server/utils/getRequestingUser.ts @@ -1,6 +1,7 @@ import { getCookie, H3Event } from "h3"; import { database } from "./database"; +import SessionToken from "./SessionToken"; import { createError } from "#imports"; @@ -9,7 +10,10 @@ export default async function getRequestingUser(e: H3Event) { if (!cookie) throw createError("User not found"); const { user } = await database.session.findUnique({ where: { - id: BigInt(cookie), + ...SessionToken.fromString(cookie).toPrisma(), + expiry_date: { + gte: new Date(), + }, }, select: { user: { From 1d8220d92c27802bc0b5ef858cef4ca786b9276b Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 18:48:37 +0100 Subject: [PATCH 21/40] page/firstRun: use password input for password because why password should be shown in plain text?? --- components/entryEditor.vue | 2 +- pages/firstRun.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/entryEditor.vue b/components/entryEditor.vue index 2ab5d35..4f2bda2 100644 --- a/components/entryEditor.vue +++ b/components/entryEditor.vue @@ -7,7 +7,7 @@ type optionalMap = Optional extends true ? undefined : string | number export type fieldDefinition = { key: string, label?: string, - type: "text" | "number", + type: "text" | "password" | "number", optional?: Optional, value?: optionalMap, } diff --git a/pages/firstRun.vue b/pages/firstRun.vue index 7e8b54d..238ef05 100644 --- a/pages/firstRun.vue +++ b/pages/firstRun.vue @@ -9,7 +9,7 @@ import Alerts, { type AlertData } from '~/components/alerts.vue'; const editorFields: Array = [ { key: "username", type: "text", label: "Username", optional: false }, - { key: "password", type: "text", label: "Password", optional: false }, + { key: "password", type: "password", label: "Password", optional: false }, { key: "email", type: "text", label: "email", optional: false }, ]; From 10ff342991b44f96ac9e7a9dede9608e410c87fc Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Thu, 9 Nov 2023 23:52:56 +0100 Subject: [PATCH 22/40] api/firstRun.post: properly initialize database using @prisma/migrate instead of executing the command, which was not available in the build now we use the proper library to initialize the database. --- package-lock.json | 2966 +++++++++++++++++++++++++++++++---- package.json | 1 + server/api/firstRun.post.ts | 20 +- 3 files changed, 2694 insertions(+), 293 deletions(-) diff --git a/package-lock.json b/package-lock.json index 70c125e..8cfa056 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "hasInstallScript": true, "dependencies": { "@prisma/client": "5.5.2", + "@prisma/migrate": "^5.5.2", "mysql2": "^3.2.3" }, "devDependencies": { @@ -47,6 +48,21 @@ "node": ">=6.0.0" } }, + "node_modules/@antfu/ni": { + "version": "0.21.8", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.8.tgz", + "integrity": "sha512-90X8pU2szlvw0AJo9EZMbYc2eQKkmO7mAdC4tD4r5co2Mm56MT37MIG8EyB7p4WRheuzGxuLDxJ63mF6+Zajiw==", + "peer": true, + "bin": { + "na": "bin/na.mjs", + "nci": "bin/nci.mjs", + "ni": "bin/ni.mjs", + "nlx": "bin/nlx.mjs", + "nr": "bin/nr.mjs", + "nu": "bin/nu.mjs", + "nun": "bin/nun.mjs" + } + }, "node_modules/@antfu/utils": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz", @@ -56,11 +72,310 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", + "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.7.3.tgz", + "integrity": "sha512-kleJ1iUTxcO32Y06dH9Pfi9K4U+Tlb111WXEnbt7R/ne+NLRwppZiTGJuTD5VVoxTMK5NTbEtm5t2vcdNCFe2g==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.0.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-http-compat": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-1.3.0.tgz", + "integrity": "sha512-ZN9avruqbQ5TxopzG3ih3KRy52n8OAbitX3fnZT5go4hzu0J+KVPSzkL+Wt3hpJpdG8WIfg1sBD1tWkgUdEpBA==", + "dependencies": { + "@azure/abort-controller": "^1.0.4", + "@azure/core-client": "^1.3.0", + "@azure/core-rest-pipeline": "^1.3.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-lro": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.4.tgz", + "integrity": "sha512-3GJiMVH7/10bulzOKGrrLeG/uCBH/9VtxqaMcB9lIqAeamI/xYQSHJL/KcsLDuH+yTjYpro/u6D/MuRe4dN70Q==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.2.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-paging": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz", + "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.2.tgz", + "integrity": "sha512-wLLJQdL4v1yoqYtEtjKNjf8pJ/G/BqVomAWxcKOR1KbZJyCEnCv04yks7Y1NhJ3JzxbDs307W67uX0JzklFdCg==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "form-data": "^4.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.6.1.tgz", + "integrity": "sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.4.0.tgz", + "integrity": "sha512-PZ42Fkp0vNQYLbmEn0ryd9ejOdFH30rLAaQfDkZsiU/rtZjfymGi5fqG7jOaT6RgpPYsTbnhj6asPbgF6dhUCw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.5.0", + "@azure/core-client": "^1.4.0", + "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.6.1", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^3.5.0", + "@azure/msal-common": "^13.1.0", + "@azure/msal-node": "^2.5.1", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^8.0.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/identity/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@azure/keyvault-keys": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.7.2.tgz", + "integrity": "sha512-VdIH6PjbQ3J5ntK+xeI8eOe1WsDxF9ndXw8BPR/9MZVnIj0vQNtNCS6gpR7EFQeGcs8XjzMfHm0AvKGErobqJQ==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-client": "^1.5.0", + "@azure/core-http-compat": "^1.3.0", + "@azure/core-lro": "^2.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/core-rest-pipeline": "^1.8.1", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.0.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", + "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.5.0.tgz", + "integrity": "sha512-2NtMuel4CI3UEelCPKkNRXgKzpWEX48fvxIvPz7s0/sTcCaI08r05IOkH2GkXW+czUOtuY6+oGafJCpumnjRLg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@azure/msal-common": "14.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.4.0.tgz", + "integrity": "sha512-ffCymScQuMKVj+YVfwNI52A5Tu+uiZO2eTf+c+3TXxdAssks4nokJhtr+uOOMxH0zDi6d1OjFKFKeXODK0YLSg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.3.1.tgz", + "integrity": "sha512-Lrk1ozoAtaP/cp53May3v6HtcFSVxdFrg2Pa/1xu5oIvsIwhxW6zSPibKefCOVgd5osgykMi5jjcZHv8XkzZEQ==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.5.1.tgz", + "integrity": "sha512-PsPRISqCG253HQk1cAS7eJW7NWTbnBGpG+vcGGz5z4JYRdnM2EIXlj1aBpXCdozenEPtXEVvHn2ELleW1w82nQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@azure/msal-common": "14.4.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": "16|| 18 || 20" + } + }, + "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.4.0.tgz", + "integrity": "sha512-ffCymScQuMKVj+YVfwNI52A5Tu+uiZO2eTf+c+3TXxdAssks4nokJhtr+uOOMxH0zDi6d1OjFKFKeXODK0YLSg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -73,7 +388,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -85,7 +399,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -99,7 +412,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -107,14 +419,12 @@ "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -123,7 +433,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -132,7 +441,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -451,7 +759,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -483,7 +790,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -497,7 +803,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -509,7 +814,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -523,7 +827,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -531,14 +834,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -547,7 +848,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -556,7 +856,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -1371,6 +1670,11 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@js-joda/core": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.1.tgz", + "integrity": "sha512-Xla/d7ZMMR6+zRd6lTio0wRZECfcfFJP7GGe9A9L4tDOlD5CX4YcZ4YZle9w58bBYzssojVapI84RraKWDQZRg==" + }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -1437,6 +1741,15 @@ "integrity": "sha512-SWxvzRbUQRfewlIV+OF4/YF4DkeTjMWoT8Hh9yeU/5UBVdJZj9Uf4a9+cXjknSIhIaMxZ/4N1O/s7ojApOOGjg==", "dev": true }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", + "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@netlify/functions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-2.3.0.tgz", @@ -1476,7 +1789,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1489,7 +1801,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -1498,7 +1809,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2033,6 +2343,15 @@ "eslint": "^8.48.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", + "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@parcel/watcher": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.3.0.tgz", @@ -2382,11 +2701,20 @@ } } }, + "node_modules/@prisma/debug": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.5.2.tgz", + "integrity": "sha512-OeyuNABo1dgWHIQuJAdvW5qp5ccFfbI0CKNvdg8D34YWOfo6L+4J0gmnRI/j+h40HvM3S5WH2T8e3W9bPa7EVg==", + "dependencies": { + "@types/debug": "4.1.9", + "debug": "4.3.4", + "strip-ansi": "6.0.1" + } + }, "node_modules/@prisma/engines": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.5.2.tgz", "integrity": "sha512-Be5hoNF8k+lkB3uEMiCHbhbfF6aj1GnrTBnn5iYFT7GEr3TsOEp1soviEcBR0tYCgHbxjcIxJMhdbvxALJhAqg==", - "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { @@ -2394,6 +2722,662 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.5.1-1.aebc046ce8b88ebbcb45efe31cbe7d06fd6abc0a.tgz", "integrity": "sha512-O+qHFnZvAyOFk1tUco2/VdiqS0ym42a3+6CYLScllmnpbyiTplgyLt2rK/B9BTjYkSHjrgMhkG47S0oqzdIckA==" }, + "node_modules/@prisma/fetch-engine": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.5.2.tgz", + "integrity": "sha512-Ab6vZSQhuMeew0jmP6PFzdJOt9YZ957rlu6IU/T0pNZRhk2cKb8IwCq4K1ru1c5iKpFBJIjA2bUw7eTAE0gTDw==", + "peer": true, + "dependencies": { + "@prisma/debug": "5.5.2", + "@prisma/get-platform": "5.5.2", + "execa": "5.1.1", + "find-cache-dir": "3.3.2", + "fs-extra": "11.1.1", + "hasha": "5.2.2", + "http-proxy-agent": "7.0.0", + "https-proxy-agent": "7.0.2", + "kleur": "4.1.5", + "node-fetch": "2.7.0", + "p-filter": "2.1.0", + "p-map": "4.0.0", + "p-retry": "4.6.2", + "progress": "2.0.3", + "rimraf": "3.0.2", + "temp-dir": "2.0.0", + "tempy": "1.0.1" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/generator-helper": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-5.5.2.tgz", + "integrity": "sha512-qQz4JfhjjMs+C/dbZUoGAU+JV685Qe72iGonDM0c9H05A5s5MCWj5wV2kVi1/DNiy7jkfqGGM7bX8k0/8yO0FQ==", + "peer": true, + "dependencies": { + "@prisma/debug": "5.5.2", + "@types/cross-spawn": "6.0.3", + "cross-spawn": "7.0.3", + "kleur": "4.1.5" + } + }, + "node_modules/@prisma/generator-helper/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.5.2.tgz", + "integrity": "sha512-Y4jLZYyAtd/kIPGhP3OpxJvroxX0K28wdUv1c94jIfCNelOMMLvWsPx/q3XLe0fzeXvSsdHkw0mPKCh/iupvhQ==", + "dependencies": { + "@prisma/debug": "5.5.2", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "fs-jetpack": "5.1.0", + "kleur": "4.1.5", + "replace-string": "3.1.0", + "strip-ansi": "6.0.1", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "ts-pattern": "4.3.0" + } + }, + "node_modules/@prisma/get-platform/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@prisma/get-platform/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@prisma/get-platform/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/get-platform/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/get-platform/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/get-platform/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@prisma/get-platform/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/get-platform/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/internals": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-5.5.2.tgz", + "integrity": "sha512-+2F04bTP6yxijP/kqhyqWEKEplNUXJk+dwqjK8UZ8MzGQC8es/aaSvZW5evFGMFaXxbWkEPoX2sz3asmpG3q9g==", + "peer": true, + "dependencies": { + "@antfu/ni": "0.21.8", + "@opentelemetry/api": "1.6.0", + "@prisma/debug": "5.5.2", + "@prisma/engines": "5.5.2", + "@prisma/fetch-engine": "5.5.2", + "@prisma/generator-helper": "5.5.2", + "@prisma/get-platform": "5.5.2", + "@prisma/prisma-schema-wasm": "5.5.1-1.aebc046ce8b88ebbcb45efe31cbe7d06fd6abc0a", + "archiver": "6.0.1", + "arg": "5.0.2", + "checkpoint-client": "1.1.27", + "cli-truncate": "2.1.0", + "dotenv": "16.0.3", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "find-up": "5.0.0", + "fp-ts": "2.16.1", + "fs-extra": "11.1.1", + "fs-jetpack": "5.1.0", + "global-dirs": "3.0.1", + "globby": "11.1.0", + "indent-string": "4.0.0", + "is-windows": "1.0.2", + "is-wsl": "2.2.0", + "kleur": "4.1.5", + "new-github-issue-url": "0.2.1", + "node-fetch": "2.7.0", + "npm-packlist": "5.1.3", + "open": "7.4.2", + "p-map": "4.0.0", + "prompts": "2.4.2", + "read-pkg-up": "7.0.1", + "replace-string": "3.1.0", + "resolve": "1.22.6", + "string-width": "4.2.3", + "strip-ansi": "6.0.1", + "strip-indent": "3.0.0", + "temp-dir": "2.0.0", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "tmp": "0.2.1", + "ts-pattern": "4.3.0" + } + }, + "node_modules/@prisma/internals/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@prisma/internals/node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@prisma/internals/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@prisma/internals/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@prisma/internals/node_modules/ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "peer": true, + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@prisma/internals/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/internals/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/internals/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/internals/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/internals/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@prisma/internals/node_modules/npm-bundled": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "peer": true, + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@prisma/internals/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "peer": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@prisma/internals/node_modules/npm-packlist": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "peer": true, + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@prisma/internals/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@prisma/internals/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/internals/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/internals/node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "peer": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@prisma/internals/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/migrate": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@prisma/migrate/-/migrate-5.5.2.tgz", + "integrity": "sha512-LdjW1KdS378RTPdsv35Ab9GUFVnaIn06l6cPNKCXG0gqx+4QMciDRgdaqq3FFFSH3PQYXq0stFzzCR6QeF1hHQ==", + "dependencies": { + "@prisma/debug": "5.5.2", + "@prisma/get-platform": "5.5.2", + "@sindresorhus/slugify": "1.1.2", + "arg": "5.0.2", + "execa": "5.1.1", + "fp-ts": "2.16.1", + "get-stdin": "8.0.0", + "has-yarn": "2.1.0", + "indent-string": "4.0.0", + "kleur": "4.1.5", + "log-update": "4.0.0", + "mariadb": "3.2.1", + "mongoose": "7.6.0", + "mssql": "10.0.1", + "ora": "5.4.1", + "pg": "8.11.3", + "pkg-up": "3.1.0", + "prompts": "2.4.2", + "strip-ansi": "6.0.1", + "strip-indent": "3.0.0", + "ts-pattern": "4.3.0" + }, + "peerDependencies": { + "@prisma/generator-helper": "*", + "@prisma/internals": "*" + } + }, + "node_modules/@prisma/migrate/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@prisma/migrate/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@prisma/migrate/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/migrate/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/migrate/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/migrate/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@prisma/migrate/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/migrate/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/prisma-schema-wasm": { + "version": "5.5.1-1.aebc046ce8b88ebbcb45efe31cbe7d06fd6abc0a", + "resolved": "https://registry.npmjs.org/@prisma/prisma-schema-wasm/-/prisma-schema-wasm-5.5.1-1.aebc046ce8b88ebbcb45efe31cbe7d06fd6abc0a.tgz", + "integrity": "sha512-dPOyEqjExFgXsfZTzKOuYM2ycWQbep5WtF/23KP8C+xq+XTr1725CMpERa8KaKQlDlRn+aE53qOON/wqXptGdg==", + "peer": true + }, "node_modules/@rollup/plugin-alias": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.0.1.tgz", @@ -2669,6 +3653,57 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@sindresorhus/slugify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", + "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", + "dependencies": { + "@sindresorhus/transliterate": "^0.1.1", + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", + "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", + "dependencies": { + "escape-string-regexp": "^2.0.0", + "lodash.deburr": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@tediousjs/connection-string": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.5.0.tgz", + "integrity": "sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -2724,12 +3759,34 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@types/cross-spawn": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.3.tgz", + "integrity": "sha512-BDAkU7WHHRHnvBf5z89lcvACsvkz/n7Tv+HyD/uW76O29HoH1Tk/W6iQrepaZVbisvlEek4ygwT8IW7ow9XLAA==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", + "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/geojson": { + "version": "7946.0.13", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.13.tgz", + "integrity": "sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==" + }, "node_modules/@types/http-proxy": { "version": "1.17.14", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", @@ -2751,11 +3808,15 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "20.9.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -2763,8 +3824,7 @@ "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" }, "node_modules/@types/resolve": { "version": "1.20.2", @@ -2772,12 +3832,32 @@ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "peer": true + }, "node_modules/@types/semver": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", @@ -3353,6 +4433,17 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { "version": "8.11.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", @@ -3378,7 +4469,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, "dependencies": { "debug": "^4.3.4" }, @@ -3390,7 +4480,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -3428,7 +4517,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -3443,7 +4531,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -3455,7 +4542,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3464,7 +4550,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3518,7 +4603,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz", "integrity": "sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==", - "dev": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -3536,7 +4620,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", - "dev": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -3562,6 +4645,11 @@ "node": ">=10" } }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3572,7 +4660,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -3604,7 +4691,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "engines": { "node": ">=8" } @@ -3668,7 +4754,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -3726,11 +4811,18 @@ "node": ">=16.14.0" } }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-sema": { "version": "3.1.1", @@ -3738,6 +4830,11 @@ "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", "dev": true }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/autoprefixer": { "version": "10.4.16", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", @@ -3779,7 +4876,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3790,14 +4886,31 @@ "node_modules/b4a": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/big-integer": { "version": "1.6.51", @@ -3835,6 +4948,16 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -3857,7 +4980,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3867,7 +4989,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3907,21 +5028,64 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, "engines": { "node": "*" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -4068,7 +5232,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2", "get-intrinsic": "^1.2.1", @@ -4135,7 +5298,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4147,6 +5309,76 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/checkpoint-client": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.27.tgz", + "integrity": "sha512-xstymfUalJOv6ZvTtmkwP4ORJN36ikT4PvrIoLe3wstbYf87XIXCcZrSmbFQOjyB0v1qbBnCsAscDpfdZlCkFA==", + "peer": true, + "dependencies": { + "ci-info": "3.8.0", + "env-paths": "2.2.1", + "make-dir": "4.0.0", + "ms": "2.1.3", + "node-fetch": "2.6.12", + "uuid": "9.0.0" + } + }, + "node_modules/checkpoint-client/node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/checkpoint-client/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "peer": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/checkpoint-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "peer": true + }, + "node_modules/checkpoint-client/node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "peer": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -4244,7 +5476,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, "engines": { "node": ">=6" } @@ -4258,6 +5489,44 @@ "node": "*" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "peer": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clipboardy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", @@ -4378,6 +5647,14 @@ "node": ">=12" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/cluster-key-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", @@ -4391,7 +5668,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4402,8 +5678,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-support": { "version": "1.1.3", @@ -4426,6 +5701,17 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -4438,14 +5724,12 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/compress-commons": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.1.tgz", "integrity": "sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==", - "dev": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", @@ -4459,8 +5743,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/consola": { "version": "3.2.3", @@ -4492,14 +5775,12 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -4511,7 +5792,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.0.tgz", "integrity": "sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==", - "dev": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -4530,7 +5810,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4540,6 +5819,14 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, "node_modules/css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -4723,7 +6010,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -4785,11 +6071,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -4803,7 +6099,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, "engines": { "node": ">=8" } @@ -4812,7 +6107,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -4831,6 +6125,35 @@ "integrity": "sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==", "dev": true }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -4898,7 +6221,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -5024,6 +6346,14 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -5039,8 +6369,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encodeurl": { "version": "1.0.2", @@ -5055,7 +6384,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -5090,7 +6418,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "engines": { "node": ">=6" } @@ -5105,7 +6432,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -5123,7 +6449,6 @@ "version": "1.22.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", @@ -5172,11 +6497,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-aggregate-error": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.11.tgz", + "integrity": "sha512-DCiZiNlMlbvofET/cE55My387NiLvuGToBEZDdK9U2G3svDCjL8WOgO5Il6lO83nQ8qmag/R9nArdpaFQ/m3lA==", + "dependencies": { + "define-data-property": "^1.1.0", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.2", "has-tostringtag": "^1.0.0", @@ -5199,7 +6544,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5268,7 +6612,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -5828,6 +7171,22 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/execa": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", @@ -5878,14 +7237,12 @@ "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5901,7 +7258,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5925,7 +7281,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -5952,7 +7307,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5964,7 +7318,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -5981,7 +7334,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6026,7 +7378,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -6059,6 +7410,24 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fp-ts": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.1.tgz", + "integrity": "sha512-by7U5W8dkIzcvDofUcO42yl9JbnHTEDBrzu3pt5fKT+Z4Oy85I21K80EYJYdjQGC2qum4Vo55Ag57iiIK4FYuA==" + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -6085,7 +7454,6 @@ "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6095,6 +7463,33 @@ "node": ">=14.14" } }, + "node_modules/fs-jetpack": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-5.1.0.tgz", + "integrity": "sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/fs-jetpack/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/fs-jetpack/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -6110,8 +7505,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -6131,7 +7525,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6140,7 +7533,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -6158,7 +7550,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6213,7 +7604,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, "dependencies": { "function-bind": "^1.1.2", "has-proto": "^1.0.1", @@ -6230,11 +7620,21 @@ "integrity": "sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==", "dev": true }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -6246,7 +7646,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -6320,7 +7719,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6351,7 +7749,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -6360,7 +7757,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6372,7 +7768,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, "dependencies": { "ini": "2.0.0" }, @@ -6402,7 +7797,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, "dependencies": { "define-properties": "^1.1.3" }, @@ -6417,7 +7811,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6437,7 +7830,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -6448,8 +7840,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -6492,7 +7883,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6501,7 +7891,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -6510,7 +7899,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.2" }, @@ -6522,7 +7910,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6534,7 +7921,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6546,7 +7932,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -6563,17 +7948,61 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, "node_modules/hash-sum": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", "dev": true }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "peer": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -6646,7 +8075,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6669,7 +8097,6 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6704,11 +8131,29 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, "engines": { "node": ">= 4" } @@ -6793,7 +8238,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "engines": { "node": ">=8" } @@ -6802,7 +8246,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6811,14 +8254,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, "engines": { "node": ">=10" } @@ -6827,7 +8268,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.2", "hasown": "^2.0.0", @@ -6864,8 +8304,7 @@ "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, "node_modules/iron-webcrypto": { "version": "0.10.1", @@ -6880,7 +8319,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -6893,14 +8331,12 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -6924,7 +8360,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -6955,7 +8390,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6967,7 +8401,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -6979,7 +8412,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7009,7 +8441,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7018,7 +8449,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -7027,7 +8457,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -7069,6 +8498,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -7085,7 +8522,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7097,7 +8533,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -7106,7 +8541,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7117,11 +8551,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -7159,7 +8600,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7175,7 +8615,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -7208,7 +8647,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7223,7 +8661,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -7238,7 +8675,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, "dependencies": { "which-typed-array": "^1.1.11" }, @@ -7249,11 +8685,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -7261,11 +8707,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -7277,7 +8731,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, "bin": { "is-docker": "cli.js" }, @@ -7291,14 +8744,12 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/jackspeak": { "version": "2.3.6", @@ -7327,11 +8778,15 @@ "jiti": "bin/jiti.js" } }, + "node_modules/js-md4": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -7345,6 +8800,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", + "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==" + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -7406,7 +8866,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -7423,6 +8882,73 @@ "node >= 0.2.0" ] }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -7436,7 +8962,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, "engines": { "node": ">=6" } @@ -7476,7 +9001,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -7487,14 +9011,12 @@ "node_modules/lazystream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7508,14 +9030,12 @@ "node_modules/lazystream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -7545,8 +9065,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/listhen": { "version": "1.5.5", @@ -7593,7 +9112,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -7607,8 +9125,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -7616,18 +9133,53 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.deburr": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", + "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==" + }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", "dev": true }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -7640,6 +9192,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", @@ -7652,6 +9209,67 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", @@ -7704,7 +9322,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -7719,7 +9336,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -7746,23 +9362,55 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/mariadb": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.2.1.tgz", + "integrity": "sha512-EWCsvu8IwK5WRYPJ9iRekFiBfHfKB/wBcUwAzbhQKhSc6ivbvLcO/cktkYTCz3HVoGNYVWhBN38485Cq3qMSbQ==", + "dependencies": { + "@types/geojson": "^7946.0.10", + "@types/node": "^17.0.45", + "denque": "^2.1.0", + "iconv-lite": "^0.6.3", + "lru-cache": "^10.0.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mariadb/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/mariadb/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -7771,7 +9419,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -7792,6 +9439,25 @@ "node": ">=10.0.0" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -7808,7 +9474,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, "engines": { "node": ">=4" } @@ -7817,7 +9482,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8027,6 +9691,131 @@ "ufo": "^1.3.0" } }, + "node_modules/mongodb": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.0.tgz", + "integrity": "sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA==", + "dependencies": { + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongoose": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.6.0.tgz", + "integrity": "sha512-ztQ12rm0BQN5i7LB6xhWX4l9a9w2aa3jEwa/mM2vAutYJRyAwOzcusvKJBULMzFHyUDBOVW15grisexypgMIWA==", + "dependencies": { + "bson": "^5.4.0", + "kareem": "2.5.1", + "mongodb": "5.9.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -8048,8 +9837,34 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mssql": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mssql/-/mssql-10.0.1.tgz", + "integrity": "sha512-k0Xkav/3OppZs8Kj+FIo7k7ejbcsVNxp5/ePayxfXzuBZhxD/Y/RhIhrtfHyH6FmlJnBQPj7eDI2IN7B0BiSxQ==", + "dependencies": { + "@tediousjs/connection-string": "^0.5.0", + "commander": "^11.0.0", + "debug": "^4.3.3", + "rfdc": "^1.3.0", + "tarn": "^3.0.2", + "tedious": "^16.4.0" + }, + "bin": { + "mssql": "bin/mssql" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/mssql/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "engines": { + "node": ">=16" + } }, "node_modules/mysql2": { "version": "3.6.3", @@ -8106,6 +9921,11 @@ "node": "^14 || ^16 || >=18" } }, + "node_modules/native-duplexpair": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", + "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==" + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8121,6 +9941,15 @@ "node": ">= 0.6" } }, + "node_modules/new-github-issue-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz", + "integrity": "sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==", + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/nitropack": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.7.2.tgz", @@ -8262,6 +10091,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + }, "node_modules/node-addon-api": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", @@ -8272,7 +10106,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -8472,7 +10305,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8860,7 +10692,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8869,7 +10700,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -8878,7 +10708,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -8971,7 +10800,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -8995,7 +10823,6 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -9012,7 +10839,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, "bin": { "is-docker": "cli.js" }, @@ -9069,11 +10895,53 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "peer": true, + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -9088,7 +10956,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9103,7 +10970,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -9114,15 +10980,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "peer": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "peer": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "node_modules/pacote": { "version": "17.0.4", "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.4.tgz", @@ -9190,7 +11082,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -9207,8 +11098,7 @@ "node_modules/parse-json/node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/parse-path": { "version": "7.0.0", @@ -9241,7 +11131,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -9250,7 +11139,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9259,7 +11147,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -9267,8 +11154,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.10.1", @@ -9299,7 +11185,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -9316,6 +11201,89 @@ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "dev": true }, + "node_modules/pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -9326,7 +11294,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -9338,7 +11305,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -9350,7 +11316,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9363,7 +11328,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -9375,7 +11339,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9390,7 +11353,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -9409,6 +11371,73 @@ "pathe": "^1.1.0" } }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -9890,6 +11919,41 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9936,11 +12000,27 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "peer": true, + "engines": { + "node": ">=0.4.0" + } }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -9965,7 +12045,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -9984,7 +12063,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -9993,7 +12071,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -10012,8 +12089,7 @@ "node_modules/queue-tick": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" }, "node_modules/radix3": { "version": "1.1.0", @@ -10128,7 +12204,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -10143,7 +12218,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -10160,7 +12234,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -10173,7 +12246,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -10185,7 +12257,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -10200,7 +12271,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -10212,7 +12282,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, "engines": { "node": ">=8" } @@ -10220,14 +12289,12 @@ "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -10239,7 +12306,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, "bin": { "semver": "bin/semver" } @@ -10248,7 +12314,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, "engines": { "node": ">=8" } @@ -10257,7 +12322,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10271,7 +12335,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, "dependencies": { "minimatch": "^5.1.0" } @@ -10280,7 +12343,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -10289,7 +12351,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10343,7 +12404,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -10368,6 +12428,17 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/replace-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/replace-string/-/replace-string-3.1.0.tgz", + "integrity": "sha512-yPpxc4ZR2makceA9hy/jHNqc7QVkd4Je/N0WRHm6bs3PtivPuPynxE5ejU/mp5EhnCv8+uZL7vhz8rkluSlx+Q==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -10381,7 +12452,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -10412,6 +12482,40 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -10425,17 +12529,20 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -10450,7 +12557,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10616,7 +12722,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -10639,7 +12744,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -10657,7 +12761,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -10686,7 +12789,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -10728,7 +12830,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -10743,7 +12844,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -10856,7 +12956,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, "dependencies": { "define-data-property": "^1.1.1", "get-intrinsic": "^1.2.1", @@ -10871,7 +12970,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, "dependencies": { "define-data-property": "^1.0.1", "functions-have-names": "^1.2.3", @@ -10891,7 +12989,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -10903,7 +13000,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -10921,7 +13017,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -10931,11 +13026,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sigstore": { "version": "2.1.0", @@ -10984,14 +13083,26 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, "engines": { "node": ">=8" } @@ -11000,7 +13111,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -11016,7 +13126,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -11077,11 +13186,19 @@ "node": ">=0.10.0" } }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -11090,14 +13207,12 @@ "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -11106,8 +13221,20 @@ "node_modules/spdx-license-ids": { "version": "3.0.16", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, "node_modules/sqlstring": { "version": "2.3.3", @@ -11150,11 +13277,19 @@ "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", "dev": true }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, "node_modules/streamx": { "version": "2.15.2", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.2.tgz", "integrity": "sha512-b62pAV/aeMjUoRN2C/9F0n+G8AfcJjNC0zw/ZmOHeFsIe4m4GzjVW9m6VHXVjk536NbdU9JRwKMJRfkc+zUFTg==", - "dev": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -11164,7 +13299,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -11173,7 +13307,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11202,7 +13335,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -11219,7 +13351,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -11233,7 +13364,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -11247,7 +13377,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11293,7 +13422,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, "dependencies": { "min-indent": "^1.0.0" }, @@ -11345,7 +13473,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11353,11 +13480,22 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -11425,7 +13563,6 @@ "version": "3.1.6", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -11465,6 +13602,215 @@ "node": ">=8" } }, + "node_modules/tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/tedious": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-16.6.0.tgz", + "integrity": "sha512-Gsi/XzWtJ+oyYsoDHSxjV5k/LzZb/3pJseC1NJoCkQ1VJF66rxj7pRLDF6jOFL4F52uSqOhtYTucs3K1sKYB7g==", + "dependencies": { + "@azure/identity": "^2.0.4", + "@azure/keyvault-keys": "^4.4.0", + "@js-joda/core": "^5.5.3", + "bl": "^6.0.3", + "es-aggregate-error": "^1.0.9", + "iconv-lite": "^0.6.3", + "js-md4": "^0.3.2", + "jsbi": "^4.3.0", + "native-duplexpair": "^1.0.0", + "node-abort-controller": "^3.1.1", + "punycode": "^2.3.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tedious/node_modules/@azure/identity": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.1.0.tgz", + "integrity": "sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-client": "^1.4.0", + "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.0.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^2.26.0", + "@azure/msal-common": "^7.0.0", + "@azure/msal-node": "^1.10.0", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^8.0.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tedious/node_modules/@azure/identity/node_modules/@azure/msal-common": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.6.0.tgz", + "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tedious/node_modules/@azure/msal-browser": { + "version": "2.38.3", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.38.3.tgz", + "integrity": "sha512-2WuLFnWWPR1IdvhhysT18cBbkXx1z0YIchVss5AwVA95g7CU5CpT3d+5BcgVGNXDXbUU7/5p0xYHV99V5z8C/A==", + "deprecated": "A newer major version of this library is available. Please upgrade to the latest available version.", + "dependencies": { + "@azure/msal-common": "13.3.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tedious/node_modules/@azure/msal-node": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.18.4.tgz", + "integrity": "sha512-Kc/dRvhZ9Q4+1FSfsTFDME/v6+R2Y1fuMty/TfwqE5p9GTPw08BPbKgeWinE8JRHRp+LemjQbUZsn4Q4l6Lszg==", + "deprecated": "A newer major version of this library is available. Please upgrade to the latest available version.", + "dependencies": { + "@azure/msal-common": "13.3.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": "10 || 12 || 14 || 16 || 18" + } + }, + "node_modules/tedious/node_modules/bl": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.8.tgz", + "integrity": "sha512-HCRq8z0+3vrGCjEKrbnK6blpDZ1xzhfZKCCuyvPC7upGcfXZSmaCumpVao/jC8o1hs/fOqJoCSPMabl+CQTPXg==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "node_modules/tedious/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/tedious/node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/tedious/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terser": { "version": "5.24.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", @@ -11513,6 +13859,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "peer": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -11526,7 +13884,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -11555,8 +13912,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-api-utils": { "version": "1.0.3", @@ -11570,6 +13926,11 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-pattern": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.3.0.tgz", + "integrity": "sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==" + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -11594,6 +13955,11 @@ "json5": "lib/cli.js" } }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/tuf-js": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.1.0.tgz", @@ -11636,7 +14002,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -11650,7 +14015,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -11668,7 +14032,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -11687,7 +14050,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -11727,7 +14089,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -11771,8 +14132,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unenv": { "version": "1.7.4", @@ -11857,11 +14217,21 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -12088,14 +14458,21 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -12936,11 +15313,18 @@ } } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack-sources": { "version": "3.2.3", @@ -12961,7 +15345,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -12971,7 +15354,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -12986,7 +15368,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -13002,7 +15383,6 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.4", @@ -13064,8 +15444,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "8.14.2", @@ -13097,6 +15476,14 @@ "node": ">=12" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -13109,8 +15496,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "2.3.4", @@ -13152,7 +15538,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -13173,7 +15558,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.1.tgz", "integrity": "sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==", - "dev": true, "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", diff --git a/package.json b/package.json index 78d8280..f50be08 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ }, "dependencies": { "@prisma/client": "5.5.2", + "@prisma/migrate": "^5.5.2", "mysql2": "^3.2.3" } } diff --git a/server/api/firstRun.post.ts b/server/api/firstRun.post.ts index 70aa5a8..705f000 100644 --- a/server/api/firstRun.post.ts +++ b/server/api/firstRun.post.ts @@ -1,5 +1,8 @@ -import { execSync } from "node:child_process"; +import url from "node:url"; +import path from "node:path"; import { defineEventHandler, setResponseStatus, readBody } from "h3"; +// @ts-expect-error +import { DbPush } from "@prisma/migrate"; import { database } from "../utils/database"; import { isFirstRun } from "./firstRun.get"; @@ -23,7 +26,20 @@ export default defineEventHandler(async (e) => { const email = body.email; if (typeof email !== "string") throw createError({ message: "email is not string", statusCode: 400 }); - execSync("npx prisma db push --force-reset"); + const dbPushParam = [ + "--force-reset", + "--skip-generate", + ]; + + if (!import.meta.dev ?? true) { + const mainPath = path.dirname(url.fileURLToPath(import.meta.url)); + dbPushParam.push( + "--schema", + `${mainPath}/node_modules/.prisma/client/schema.prisma`, + ); + } + + await DbPush.new().parse(dbPushParam); await database.user.create({ data: { id: new Snowflake().state, From f7519f32b3ddf075002b7046657f52deb72c903a Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Tue, 12 Dec 2023 16:17:21 +0100 Subject: [PATCH 23/40] nav: select automatically current page when visiting first time for example after refresh, or when component gets loaded --- components/navigation/navigation.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/components/navigation/navigation.vue b/components/navigation/navigation.vue index 6e5a674..e001d88 100644 --- a/components/navigation/navigation.vue +++ b/components/navigation/navigation.vue @@ -1,10 +1,13 @@