From a34eba6777518dcea65b0f1c6c51380ee777aeb2 Mon Sep 17 00:00:00 2001 From: sianida26 Date: Sat, 4 May 2024 04:03:40 +0700 Subject: [PATCH] Added v2 --- .env | 5 - .env.development | 2 - .eslintrc.js | 10 + .eslintrc.json | 11 - .gitignore | 50 +- .npmrc | 0 .vscode/launch.json | 15 - .vscode/settings.json | 7 + README.md | 89 +- apps/backend/.gitignore | 1 + apps/backend/README.md | 8 + apps/backend/drizzle.config.ts | 17 + apps/backend/package.json | 36 + apps/backend/src/data/permissions.ts | 42 + .../backend/src/data/roles.ts | 8 +- apps/backend/src/data/sidebarMenus.ts | 19 + apps/backend/src/drizzle/index.ts | 29 + apps/backend/src/drizzle/migration.ts | 19 + .../0000_watery_phantom_reporter.sql | 12 + .../migrations/0001_robust_misty_knight.sql | 2 + .../drizzle/migrations/0002_smooth_prism.sql | 25 + .../drizzle/migrations/0003_brave_khan.sql | 19 + .../migrations/0004_uneven_jamie_braddock.sql | 45 + .../migrations/meta/0000_snapshot.json | 91 + .../migrations/meta/0001_snapshot.json | 90 + .../migrations/meta/0002_snapshot.json | 191 + .../migrations/meta/0003_snapshot.json | 197 + .../migrations/meta/0004_snapshot.json | 367 + .../src/drizzle/migrations/meta/_journal.json | 41 + .../backend/src/drizzle/schema/permissions.ts | 23 + .../src/drizzle/schema/permissionsToRoles.ts | 35 + .../src/drizzle/schema/permissionsToUsers.ts | 35 + apps/backend/src/drizzle/schema/roles.ts | 19 + .../src/drizzle/schema/rolesToUsers.ts | 32 + apps/backend/src/drizzle/schema/users.ts | 30 + apps/backend/src/drizzle/seed.ts | 18 + .../src/drizzle/seeds/permissionSeeder.ts | 17 + apps/backend/src/drizzle/seeds/rolesSeeder.ts | 78 + apps/backend/src/drizzle/seeds/userSeeder.ts | 63 + apps/backend/src/index.ts | 122 + .../backend/src/middlewares/authMiddleware.ts | 0 apps/backend/src/routes/auth/route.ts | 190 + apps/backend/src/routes/dashboard/routes.ts | 115 + apps/backend/src/routes/permissions/route.ts | 18 + apps/backend/src/routes/roles/route.ts | 19 + apps/backend/src/routes/users/route.ts | 327 + apps/backend/src/types/SidebarMenu.d.ts | 16 + apps/backend/src/types/index.d.ts | 3 + apps/backend/src/utils/authUtils.ts | 58 + apps/backend/src/utils/httpErrors.ts | 7 + apps/backend/src/utils/passwordUtils.ts | 11 + apps/backend/tsconfig.json | 11 + apps/frontend/.eslintrc.cjs | 18 + apps/frontend/.gitignore | 24 + apps/frontend/README.md | 30 + apps/frontend/index.html | 13 + apps/frontend/package.json | 50 + apps/frontend/postcss.config.js | 16 + apps/frontend/public/vite.svg | 1 + apps/frontend/src/App.tsx | 37 + apps/frontend/src/assets/logos/README.md | 9 + .../frontend/src}/assets/logos/logo.png | Bin apps/frontend/src/assets/react.svg | 1 + .../frontend/src}/components/AppHeader.tsx | 30 +- apps/frontend/src/components/AppNavbar.tsx | 44 + .../src}/components/DashboardTable.tsx | 5 +- .../src/components/NavbarChildMenu.tsx | 9 +- .../src/components/NavbarMenuItem.tsx | 50 +- .../components/styles/appHeader.module.css | 0 .../styles/navbarChildMenu.module.css | 23 + .../styles/navbarMenuItem.module.css | 23 + apps/frontend/src/honoClient.ts | 10 + apps/frontend/src/index.css | 0 apps/frontend/src/main.tsx | 11 + .../modals/UserDeleteModal.tsx | 106 + .../usersManagement/modals/UserFormModal.tsx | 275 + .../usersManagement/queries/userQueries.ts | 73 + .../usersManagement/tables/UsersTable.tsx | 74 + .../usersManagement/tables}/columns.tsx | 37 +- apps/frontend/src/routeTree.gen.ts | 96 + apps/frontend/src/routes/__root.tsx | 16 + apps/frontend/src/routes/_dashboardLayout.tsx | 54 + .../src/routes/_dashboardLayout/README.md | 3 + .../_dashboardLayout/dashboard/index.tsx | 5 + .../_dashboardLayout/users/index.lazy.tsx | 33 + apps/frontend/src/routes/index.lazy.tsx | 5 + apps/frontend/src/routes/login/index.tsx | 153 + apps/frontend/src/styles/tailwind.css | 3 + apps/frontend/src/types/CrudPermission.d.ts | 8 + apps/frontend/src/types/index.d.ts | 3 + .../src}/utils/createActionButton.tsx | 7 +- apps/frontend/src/utils/isAuthenticated.ts | 6 + .../frontend/src}/utils/stringToColorHex.ts | 30 +- apps/frontend/src/vite-env.d.ts | 1 + apps/frontend/tailwind.config.js | 8 + apps/frontend/tsconfig.json | 29 + apps/frontend/tsconfig.node.json | 11 + apps/frontend/vite.config.ts | 13 + env.ts | 15 - logs/.gitignore | 1 - next.config.js | 4 - package.json | 71 +- packages/eslint-config/README.md | 3 + packages/eslint-config/library.js | 34 + packages/eslint-config/next.js | 35 + packages/eslint-config/package.json | 19 + packages/eslint-config/react-internal.js | 43 + packages/typescript-config/base.json | 20 + packages/typescript-config/nextjs.json | 13 + packages/typescript-config/package.json | 9 + packages/typescript-config/react-library.json | 8 + packages/ui/.eslintrc.js | 10 + packages/ui/package.json | 26 + packages/ui/src/button.tsx | 20 + packages/ui/src/card.tsx | 25 + packages/ui/src/code.tsx | 9 + packages/ui/tsconfig.json | 8 + packages/ui/tsconfig.lint.json | 8 + packages/ui/turbo/generators/config.ts | 30 + .../turbo/generators/templates/component.hbs | 8 + pnpm-lock.yaml | 6726 ++++++++++++++--- pnpm-workspace.yaml | 3 + postcss.config.js | 17 - .../20240107135405_auth/migration.sql | 57 - .../migration.sql | 2 - .../migration.sql | 11 - .../migration.sql | 12 - .../migration.sql | 22 - .../migration.sql | 66 - .../migration.sql | 5 - .../migration.sql | 14 - prisma/migrations/migration_lock.toml | 3 - prisma/schema.prisma | 39 - prisma/seed.ts | 22 - prisma/seeds/permissionSeed.ts | 22 - prisma/seeds/roleSeed.ts | 41 - prisma/seeds/userSeed.ts | 36 - public/next.svg | 1 - public/vercel.svg | 1 - src/app/api/login/route.ts | 32 - src/app/api/register/route.ts | 37 - src/app/dashboard/coba/page.tsx | 7 - src/app/dashboard/layout.tsx | 36 - src/app/dashboard/login/layout.tsx | 13 - src/app/dashboard/login/page.tsx | 77 - src/app/dashboard/logout/page.tsx | 18 - src/app/dashboard/page.tsx | 15 - src/app/dashboard/permissions/page.tsx | 31 - src/app/dashboard/register/layout.tsx | 12 - src/app/dashboard/register/page.tsx | 128 - src/app/dashboard/roles/page.tsx | 34 - src/app/dashboard/users/page.tsx | 32 - src/app/favicon.ico | Bin 25931 -> 0 bytes src/app/globals.css | 5 - src/app/layout.tsx | 32 - src/app/page.tsx | 12 - src/assets/logos/logo-dsg.png | Bin 14581 -> 0 bytes src/config/auth.ts | 5 - src/config/cookie.ts | 6 - src/core/db/index.ts | 15 - src/core/error/BaseError.ts | 56 - src/core/error/ClientError.ts | 43 - src/core/error/FileError.ts | 26 - src/core/logger/Logger.ts | 45 - src/core/utils/applicationJsonOnly.ts | 11 - src/core/utils/handleCatchApi.ts | 23 - src/core/utils/jsonToFormData.ts | 33 - .../utils/onlyAllowFollowingContentType.ts | 32 - src/db/index.ts | 15 - src/modules/auth/actions/createUserAction.ts | 26 - src/modules/auth/actions/getMyDetailAction.ts | 47 - src/modules/auth/actions/guestOnly.ts | 20 - src/modules/auth/actions/logoutAction.ts | 18 - .../auth/actions/nonAdminRegisterAction.ts | 27 - src/modules/auth/actions/signInAction.ts | 70 - src/modules/auth/authConfig.ts | 5 - src/modules/auth/contexts/AuthContext.tsx | 63 - src/modules/auth/error/AuthError.ts | 31 - .../auth/formSchemas/CreateUserFormSchema.ts | 23 - src/modules/auth/formSchemas/signInSchema.ts | 8 - src/modules/auth/services/createUser.ts | 69 - src/modules/auth/services/getCurrentUser.ts | 13 - src/modules/auth/services/getMyDetail.ts | 32 - src/modules/auth/services/nonAdminRegister.ts | 38 - src/modules/auth/services/signIn.ts | 54 - .../auth/types/NonAdminRegisterFormType.d.ts | 5 - src/modules/auth/types/SignInFormData.d.ts | 21 - src/modules/auth/types/UserClaims.d.ts | 7 - .../auth/utils/cachedGetUserFromToken.ts | 6 - .../auth/utils/checkMultiplePermissions.ts | 39 - src/modules/auth/utils/checkPermission.ts | 50 - src/modules/auth/utils/comparePassword.ts | 17 - src/modules/auth/utils/createJwtToken.ts | 20 - src/modules/auth/utils/decodeJwtToken.ts | 21 - src/modules/auth/utils/getCurrentUser.ts | 28 - src/modules/auth/utils/getTokenFromHeaders.ts | 10 - src/modules/auth/utils/getUserFromToken.ts | 38 - src/modules/auth/utils/getUserPermissions.ts | 27 - src/modules/auth/utils/getUserRoles.ts | 12 - src/modules/auth/utils/hashPassword.ts | 14 - .../actions/getSidebarMenusAction.ts | 22 - src/modules/dashboard/actions/getUserMenus.ts | 20 - .../dashboard/components/AppNavbar.tsx | 27 - .../dashboard/components/DashboardLayout.tsx | 55 - .../dashboard/components/UserMenuItem.tsx | 25 - .../styles/sidebarChildMenu.module.css | 16 - .../styles/sidebarMenuItem.module.css | 17 - src/modules/dashboard/dashboard.config.ts | 9 - src/modules/dashboard/data/sidebarMenus.ts | 30 - .../dashboard/errors/DashboardError.ts | 48 - .../dashboard/services/getSidebarMenus.ts | 55 - .../dashboard/types/CrudPermissions.d.ts | 8 - .../dashboard/types/ServerResponseAction.d.ts | 22 - src/modules/dashboard/types/SidebarMenu.d.ts | 17 - src/modules/dashboard/types/UserMenuItem.d.ts | 6 - src/modules/dashboard/utils/handleCatch.ts | 40 - src/modules/dashboard/utils/notFound.ts | 17 - src/modules/dashboard/utils/unauthorized.ts | 13 - .../dashboard/utils/withServerAction.ts | 36 - .../actions/deletePermissionAction.ts | 26 - .../actions/getAllPermissionsAction.ts | 34 - .../actions/getPermissionByIdAction.ts | 32 - .../actions/upsertPermissionAction.ts | 48 - .../permission/data/initialPermissions.ts | 118 - .../formSchemas/PermissionFormData.ts | 19 - .../modals/PermissionDeleteModal.tsx | 100 - .../permission/modals/PermissionFormModal.tsx | 211 - .../permission/services/deletePermission.ts | 15 - .../permission/services/getAllPermissions.ts | 32 - .../permission/services/getPermissionById.ts | 22 - .../permission/services/upsertPermission.ts | 50 - .../PermissionTable/PermissionTable.tsx | 123 - .../tables/PermissionTable/columns.tsx | 105 - src/modules/permission/types/Permission.d.ts | 11 - src/modules/role/actions/deleteRoleAction.ts | 27 - src/modules/role/actions/getAllRolesAction.ts | 34 - src/modules/role/actions/getRoleByIdAction.ts | 24 - src/modules/role/actions/upsertRoleAction.ts | 47 - src/modules/role/formSchemas/RoleFormData.ts | 21 - src/modules/role/modals/DeleteModal.tsx | 101 - src/modules/role/modals/FormModal.tsx | 273 - src/modules/role/services/deleteRole.ts | 12 - src/modules/role/services/getAllRoles.ts | 32 - src/modules/role/services/getRoleById.ts | 40 - src/modules/role/services/upsertRole.ts | 59 - .../role/tables/RolesTable/RolesTable.tsx | 120 - .../role/tables/RolesTable/columns.tsx | 103 - src/modules/role/types/Role.d.ts | 9 - .../actions/deleteUserAction.ts | 29 - .../actions/getAllUsersAction.ts | 24 - .../actions/getUserDetailByIdAction.ts | 46 - .../actions/upsertUserAction.ts | 46 - .../errors/UserManagementError.ts | 27 - .../formSchemas/userFormSchema.ts | 26 - .../userManagement/modals/UserDeleteModal.tsx | 101 - .../userManagement/modals/UserFormModal.tsx | 243 - .../userManagement/services/deleteUser.ts | 26 - .../userManagement/services/getAllUsers.ts | 29 - .../userManagement/services/getUserById.ts | 24 - .../userManagement/services/upsertUser.ts | 80 - .../tables/UsersTable/UsersTable.tsx | 132 - src/types/ContentType.d.ts | 14 - src/utils/areUrlSame.ts | 13 - src/utils/mapObjectToFirstValue.ts | 16 - src/utils/notifications.ts | 33 - tailwind.config.ts | 15 - tsconfig.json | 27 +- turbo.json | 17 + 268 files changed, 9825 insertions(+), 6831 deletions(-) delete mode 100644 .env delete mode 100644 .env.development create mode 100644 .eslintrc.js delete mode 100644 .eslintrc.json create mode 100644 .npmrc delete mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 apps/backend/.gitignore create mode 100644 apps/backend/README.md create mode 100644 apps/backend/drizzle.config.ts create mode 100644 apps/backend/package.json create mode 100644 apps/backend/src/data/permissions.ts rename src/modules/role/data/initialRoles.ts => apps/backend/src/data/roles.ts (71%) create mode 100644 apps/backend/src/data/sidebarMenus.ts create mode 100644 apps/backend/src/drizzle/index.ts create mode 100644 apps/backend/src/drizzle/migration.ts create mode 100644 apps/backend/src/drizzle/migrations/0000_watery_phantom_reporter.sql create mode 100644 apps/backend/src/drizzle/migrations/0001_robust_misty_knight.sql create mode 100644 apps/backend/src/drizzle/migrations/0002_smooth_prism.sql create mode 100644 apps/backend/src/drizzle/migrations/0003_brave_khan.sql create mode 100644 apps/backend/src/drizzle/migrations/0004_uneven_jamie_braddock.sql create mode 100644 apps/backend/src/drizzle/migrations/meta/0000_snapshot.json create mode 100644 apps/backend/src/drizzle/migrations/meta/0001_snapshot.json create mode 100644 apps/backend/src/drizzle/migrations/meta/0002_snapshot.json create mode 100644 apps/backend/src/drizzle/migrations/meta/0003_snapshot.json create mode 100644 apps/backend/src/drizzle/migrations/meta/0004_snapshot.json create mode 100644 apps/backend/src/drizzle/migrations/meta/_journal.json create mode 100644 apps/backend/src/drizzle/schema/permissions.ts create mode 100644 apps/backend/src/drizzle/schema/permissionsToRoles.ts create mode 100644 apps/backend/src/drizzle/schema/permissionsToUsers.ts create mode 100644 apps/backend/src/drizzle/schema/roles.ts create mode 100644 apps/backend/src/drizzle/schema/rolesToUsers.ts create mode 100644 apps/backend/src/drizzle/schema/users.ts create mode 100644 apps/backend/src/drizzle/seed.ts create mode 100644 apps/backend/src/drizzle/seeds/permissionSeeder.ts create mode 100644 apps/backend/src/drizzle/seeds/rolesSeeder.ts create mode 100644 apps/backend/src/drizzle/seeds/userSeeder.ts create mode 100644 apps/backend/src/index.ts create mode 100644 apps/backend/src/middlewares/authMiddleware.ts create mode 100644 apps/backend/src/routes/auth/route.ts create mode 100644 apps/backend/src/routes/dashboard/routes.ts create mode 100644 apps/backend/src/routes/permissions/route.ts create mode 100644 apps/backend/src/routes/roles/route.ts create mode 100644 apps/backend/src/routes/users/route.ts create mode 100644 apps/backend/src/types/SidebarMenu.d.ts create mode 100644 apps/backend/src/types/index.d.ts create mode 100644 apps/backend/src/utils/authUtils.ts create mode 100644 apps/backend/src/utils/httpErrors.ts create mode 100644 apps/backend/src/utils/passwordUtils.ts create mode 100644 apps/backend/tsconfig.json create mode 100644 apps/frontend/.eslintrc.cjs create mode 100644 apps/frontend/.gitignore create mode 100644 apps/frontend/README.md create mode 100644 apps/frontend/index.html create mode 100644 apps/frontend/package.json create mode 100644 apps/frontend/postcss.config.js create mode 100644 apps/frontend/public/vite.svg create mode 100644 apps/frontend/src/App.tsx create mode 100644 apps/frontend/src/assets/logos/README.md rename {src => apps/frontend/src}/assets/logos/logo.png (100%) create mode 100644 apps/frontend/src/assets/react.svg rename {src/modules/dashboard => apps/frontend/src}/components/AppHeader.tsx (74%) create mode 100644 apps/frontend/src/components/AppNavbar.tsx rename {src/modules/dashboard => apps/frontend/src}/components/DashboardTable.tsx (96%) rename src/modules/dashboard/components/SidebarChildMenu.tsx => apps/frontend/src/components/NavbarChildMenu.tsx (74%) rename src/modules/dashboard/components/SidebarMenuItem.tsx => apps/frontend/src/components/NavbarMenuItem.tsx (59%) rename {src/modules/dashboard => apps/frontend/src}/components/styles/appHeader.module.css (100%) create mode 100644 apps/frontend/src/components/styles/navbarChildMenu.module.css create mode 100644 apps/frontend/src/components/styles/navbarMenuItem.module.css create mode 100644 apps/frontend/src/honoClient.ts create mode 100644 apps/frontend/src/index.css create mode 100644 apps/frontend/src/main.tsx create mode 100644 apps/frontend/src/modules/usersManagement/modals/UserDeleteModal.tsx create mode 100644 apps/frontend/src/modules/usersManagement/modals/UserFormModal.tsx create mode 100644 apps/frontend/src/modules/usersManagement/queries/userQueries.ts create mode 100644 apps/frontend/src/modules/usersManagement/tables/UsersTable.tsx rename {src/modules/userManagement/tables/UsersTable => apps/frontend/src/modules/usersManagement/tables}/columns.tsx (76%) create mode 100644 apps/frontend/src/routeTree.gen.ts create mode 100644 apps/frontend/src/routes/__root.tsx create mode 100644 apps/frontend/src/routes/_dashboardLayout.tsx create mode 100644 apps/frontend/src/routes/_dashboardLayout/README.md create mode 100644 apps/frontend/src/routes/_dashboardLayout/dashboard/index.tsx create mode 100644 apps/frontend/src/routes/_dashboardLayout/users/index.lazy.tsx create mode 100644 apps/frontend/src/routes/index.lazy.tsx create mode 100644 apps/frontend/src/routes/login/index.tsx create mode 100644 apps/frontend/src/styles/tailwind.css create mode 100644 apps/frontend/src/types/CrudPermission.d.ts create mode 100644 apps/frontend/src/types/index.d.ts rename {src/modules/dashboard => apps/frontend/src}/utils/createActionButton.tsx (85%) create mode 100644 apps/frontend/src/utils/isAuthenticated.ts rename {src/core => apps/frontend/src}/utils/stringToColorHex.ts (52%) create mode 100644 apps/frontend/src/vite-env.d.ts create mode 100644 apps/frontend/tailwind.config.js create mode 100644 apps/frontend/tsconfig.json create mode 100644 apps/frontend/tsconfig.node.json create mode 100644 apps/frontend/vite.config.ts delete mode 100644 env.ts delete mode 100644 logs/.gitignore delete mode 100644 next.config.js create mode 100644 packages/eslint-config/README.md create mode 100644 packages/eslint-config/library.js create mode 100644 packages/eslint-config/next.js create mode 100644 packages/eslint-config/package.json create mode 100644 packages/eslint-config/react-internal.js create mode 100644 packages/typescript-config/base.json create mode 100644 packages/typescript-config/nextjs.json create mode 100644 packages/typescript-config/package.json create mode 100644 packages/typescript-config/react-library.json create mode 100644 packages/ui/.eslintrc.js create mode 100644 packages/ui/package.json create mode 100644 packages/ui/src/button.tsx create mode 100644 packages/ui/src/card.tsx create mode 100644 packages/ui/src/code.tsx create mode 100644 packages/ui/tsconfig.json create mode 100644 packages/ui/tsconfig.lint.json create mode 100644 packages/ui/turbo/generators/config.ts create mode 100644 packages/ui/turbo/generators/templates/component.hbs create mode 100644 pnpm-workspace.yaml delete mode 100644 postcss.config.js delete mode 100644 prisma/migrations/20240107135405_auth/migration.sql delete mode 100644 prisma/migrations/20240107153345_add_password_hash_to_user/migration.sql delete mode 100644 prisma/migrations/20240122063550_add_user_photo_profile/migration.sql delete mode 100644 prisma/migrations/20240122063854_move_user_profile_image_from_user_to_user_photo_table/migration.sql delete mode 100644 prisma/migrations/20240125182804_remove_unused_tables/migration.sql delete mode 100644 prisma/migrations/20240125192659_added_role_and_permission_table/migration.sql delete mode 100644 prisma/migrations/20240125193103_add_status_for_role_and_permission/migration.sql delete mode 100644 prisma/migrations/20240214052727_move_photo_profile_into_table/migration.sql delete mode 100644 prisma/migrations/migration_lock.toml delete mode 100644 prisma/schema.prisma delete mode 100644 prisma/seed.ts delete mode 100644 prisma/seeds/permissionSeed.ts delete mode 100644 prisma/seeds/roleSeed.ts delete mode 100644 prisma/seeds/userSeed.ts delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg delete mode 100644 src/app/api/login/route.ts delete mode 100644 src/app/api/register/route.ts delete mode 100644 src/app/dashboard/coba/page.tsx delete mode 100644 src/app/dashboard/layout.tsx delete mode 100644 src/app/dashboard/login/layout.tsx delete mode 100644 src/app/dashboard/login/page.tsx delete mode 100644 src/app/dashboard/logout/page.tsx delete mode 100644 src/app/dashboard/page.tsx delete mode 100644 src/app/dashboard/permissions/page.tsx delete mode 100644 src/app/dashboard/register/layout.tsx delete mode 100644 src/app/dashboard/register/page.tsx delete mode 100644 src/app/dashboard/roles/page.tsx delete mode 100644 src/app/dashboard/users/page.tsx delete mode 100644 src/app/favicon.ico delete mode 100644 src/app/globals.css delete mode 100644 src/app/layout.tsx delete mode 100644 src/app/page.tsx delete mode 100644 src/assets/logos/logo-dsg.png delete mode 100644 src/config/auth.ts delete mode 100644 src/config/cookie.ts delete mode 100644 src/core/db/index.ts delete mode 100644 src/core/error/BaseError.ts delete mode 100644 src/core/error/ClientError.ts delete mode 100644 src/core/error/FileError.ts delete mode 100644 src/core/logger/Logger.ts delete mode 100644 src/core/utils/applicationJsonOnly.ts delete mode 100644 src/core/utils/handleCatchApi.ts delete mode 100644 src/core/utils/jsonToFormData.ts delete mode 100644 src/core/utils/onlyAllowFollowingContentType.ts delete mode 100644 src/db/index.ts delete mode 100644 src/modules/auth/actions/createUserAction.ts delete mode 100644 src/modules/auth/actions/getMyDetailAction.ts delete mode 100644 src/modules/auth/actions/guestOnly.ts delete mode 100644 src/modules/auth/actions/logoutAction.ts delete mode 100644 src/modules/auth/actions/nonAdminRegisterAction.ts delete mode 100644 src/modules/auth/actions/signInAction.ts delete mode 100644 src/modules/auth/authConfig.ts delete mode 100644 src/modules/auth/contexts/AuthContext.tsx delete mode 100644 src/modules/auth/error/AuthError.ts delete mode 100644 src/modules/auth/formSchemas/CreateUserFormSchema.ts delete mode 100644 src/modules/auth/formSchemas/signInSchema.ts delete mode 100644 src/modules/auth/services/createUser.ts delete mode 100644 src/modules/auth/services/getCurrentUser.ts delete mode 100644 src/modules/auth/services/getMyDetail.ts delete mode 100644 src/modules/auth/services/nonAdminRegister.ts delete mode 100644 src/modules/auth/services/signIn.ts delete mode 100644 src/modules/auth/types/NonAdminRegisterFormType.d.ts delete mode 100644 src/modules/auth/types/SignInFormData.d.ts delete mode 100644 src/modules/auth/types/UserClaims.d.ts delete mode 100644 src/modules/auth/utils/cachedGetUserFromToken.ts delete mode 100644 src/modules/auth/utils/checkMultiplePermissions.ts delete mode 100644 src/modules/auth/utils/checkPermission.ts delete mode 100644 src/modules/auth/utils/comparePassword.ts delete mode 100644 src/modules/auth/utils/createJwtToken.ts delete mode 100644 src/modules/auth/utils/decodeJwtToken.ts delete mode 100644 src/modules/auth/utils/getCurrentUser.ts delete mode 100644 src/modules/auth/utils/getTokenFromHeaders.ts delete mode 100644 src/modules/auth/utils/getUserFromToken.ts delete mode 100644 src/modules/auth/utils/getUserPermissions.ts delete mode 100644 src/modules/auth/utils/getUserRoles.ts delete mode 100644 src/modules/auth/utils/hashPassword.ts delete mode 100644 src/modules/dashboard/actions/getSidebarMenusAction.ts delete mode 100644 src/modules/dashboard/actions/getUserMenus.ts delete mode 100644 src/modules/dashboard/components/AppNavbar.tsx delete mode 100644 src/modules/dashboard/components/DashboardLayout.tsx delete mode 100644 src/modules/dashboard/components/UserMenuItem.tsx delete mode 100644 src/modules/dashboard/components/styles/sidebarChildMenu.module.css delete mode 100644 src/modules/dashboard/components/styles/sidebarMenuItem.module.css delete mode 100644 src/modules/dashboard/dashboard.config.ts delete mode 100644 src/modules/dashboard/data/sidebarMenus.ts delete mode 100644 src/modules/dashboard/errors/DashboardError.ts delete mode 100644 src/modules/dashboard/services/getSidebarMenus.ts delete mode 100644 src/modules/dashboard/types/CrudPermissions.d.ts delete mode 100644 src/modules/dashboard/types/ServerResponseAction.d.ts delete mode 100644 src/modules/dashboard/types/SidebarMenu.d.ts delete mode 100644 src/modules/dashboard/types/UserMenuItem.d.ts delete mode 100644 src/modules/dashboard/utils/handleCatch.ts delete mode 100644 src/modules/dashboard/utils/notFound.ts delete mode 100644 src/modules/dashboard/utils/unauthorized.ts delete mode 100644 src/modules/dashboard/utils/withServerAction.ts delete mode 100644 src/modules/permission/actions/deletePermissionAction.ts delete mode 100644 src/modules/permission/actions/getAllPermissionsAction.ts delete mode 100644 src/modules/permission/actions/getPermissionByIdAction.ts delete mode 100644 src/modules/permission/actions/upsertPermissionAction.ts delete mode 100644 src/modules/permission/data/initialPermissions.ts delete mode 100644 src/modules/permission/formSchemas/PermissionFormData.ts delete mode 100644 src/modules/permission/modals/PermissionDeleteModal.tsx delete mode 100644 src/modules/permission/modals/PermissionFormModal.tsx delete mode 100644 src/modules/permission/services/deletePermission.ts delete mode 100644 src/modules/permission/services/getAllPermissions.ts delete mode 100644 src/modules/permission/services/getPermissionById.ts delete mode 100644 src/modules/permission/services/upsertPermission.ts delete mode 100644 src/modules/permission/tables/PermissionTable/PermissionTable.tsx delete mode 100644 src/modules/permission/tables/PermissionTable/columns.tsx delete mode 100644 src/modules/permission/types/Permission.d.ts delete mode 100644 src/modules/role/actions/deleteRoleAction.ts delete mode 100644 src/modules/role/actions/getAllRolesAction.ts delete mode 100644 src/modules/role/actions/getRoleByIdAction.ts delete mode 100644 src/modules/role/actions/upsertRoleAction.ts delete mode 100644 src/modules/role/formSchemas/RoleFormData.ts delete mode 100644 src/modules/role/modals/DeleteModal.tsx delete mode 100644 src/modules/role/modals/FormModal.tsx delete mode 100644 src/modules/role/services/deleteRole.ts delete mode 100644 src/modules/role/services/getAllRoles.ts delete mode 100644 src/modules/role/services/getRoleById.ts delete mode 100644 src/modules/role/services/upsertRole.ts delete mode 100644 src/modules/role/tables/RolesTable/RolesTable.tsx delete mode 100644 src/modules/role/tables/RolesTable/columns.tsx delete mode 100644 src/modules/role/types/Role.d.ts delete mode 100644 src/modules/userManagement/actions/deleteUserAction.ts delete mode 100644 src/modules/userManagement/actions/getAllUsersAction.ts delete mode 100644 src/modules/userManagement/actions/getUserDetailByIdAction.ts delete mode 100644 src/modules/userManagement/actions/upsertUserAction.ts delete mode 100644 src/modules/userManagement/errors/UserManagementError.ts delete mode 100644 src/modules/userManagement/formSchemas/userFormSchema.ts delete mode 100644 src/modules/userManagement/modals/UserDeleteModal.tsx delete mode 100644 src/modules/userManagement/modals/UserFormModal.tsx delete mode 100644 src/modules/userManagement/services/deleteUser.ts delete mode 100644 src/modules/userManagement/services/getAllUsers.ts delete mode 100644 src/modules/userManagement/services/getUserById.ts delete mode 100644 src/modules/userManagement/services/upsertUser.ts delete mode 100644 src/modules/userManagement/tables/UsersTable/UsersTable.tsx delete mode 100644 src/types/ContentType.d.ts delete mode 100644 src/utils/areUrlSame.ts delete mode 100644 src/utils/mapObjectToFirstValue.ts delete mode 100644 src/utils/notifications.ts delete mode 100644 tailwind.config.ts create mode 100644 turbo.json diff --git a/.env b/.env deleted file mode 100644 index e88e6fc..0000000 --- a/.env +++ /dev/null @@ -1,5 +0,0 @@ -DATABASE_URL=mysql://root:root@localhost:3306/dashboard_template - -JWT_SECRET= - -ERROR_LOG_PATH=./logs \ No newline at end of file diff --git a/.env.development b/.env.development deleted file mode 100644 index 9c36dce..0000000 --- a/.env.development +++ /dev/null @@ -1,2 +0,0 @@ -WS_PORT=4001 -WS_HOST=ws://localhost:$WS_PORT \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..e928b86 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,10 @@ +// This configuration only applies to the package manager root. +/** @type {import("eslint").Linter.Config} */ +module.exports = { + ignorePatterns: ["apps/**", "packages/**"], + extends: ["@repo/eslint-config/library.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 3e8ce47..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "next/core-web-vitals", - "plugins": ["@typescript-eslint"], - "parserOptions": { - "project": "./tsconfig.json" - }, - "rules": { - "@typescript-eslint/no-floating-promises": "warn", - "@typescript-eslint/no-unused-vars": "warn" - } -} diff --git a/.gitignore b/.gitignore index fd3dbb5..96fab4f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,38 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -# dependencies -/node_modules -/.pnp +# Dependencies +node_modules +.pnp .pnp.js -.yarn/install-state.gz -# testing -/coverage +# Local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local -# next.js -/.next/ -/out/ +# Testing +coverage -# production -/build +# Turbo +.turbo -# misc -.DS_Store -*.pem +# Vercel +.vercel -# debug +# Build Outputs +.next/ +out/ +build +dist + + +# Debug npm-debug.log* yarn-debug.log* yarn-error.log* -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts +# Misc +.DS_Store +*.pem diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..e69de29 diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 2ba986f..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "chrome", - "request": "launch", - "name": "Launch Chrome against localhost", - "url": "http://localhost:8080", - "webRoot": "${workspaceFolder}" - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..44a73ec --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "eslint.workingDirectories": [ + { + "mode": "auto" + } + ] +} diff --git a/README.md b/README.md index c403366..7a4658a 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,81 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). +# Turborepo starter -## Getting Started +This is an official starter Turborepo. -First, run the development server: +## Using this example -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev +Run the following command: + +```sh +npx create-turbo@latest ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +## What's inside? -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +This Turborepo includes the following packages/apps: -This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. +### Apps and Packages -## Learn More +- `docs`: a [Next.js](https://nextjs.org/) app +- `web`: another [Next.js](https://nextjs.org/) app +- `@repo/ui`: a stub React component library shared by both `web` and `docs` applications +- `@repo/eslint-config`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) +- `@repo/typescript-config`: `tsconfig.json`s used throughout the monorepo -To learn more about Next.js, take a look at the following resources: +Each package/app is 100% [TypeScript](https://www.typescriptlang.org/). -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +### Utilities -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! +This Turborepo has some additional tools already setup for you: -## Deploy on Vercel +- [TypeScript](https://www.typescriptlang.org/) for static type checking +- [ESLint](https://eslint.org/) for code linting +- [Prettier](https://prettier.io) for code formatting -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +### Build -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. +To build all apps and packages, run the following command: + +``` +cd my-turborepo +pnpm build +``` + +### Develop + +To develop all apps and packages, run the following command: + +``` +cd my-turborepo +pnpm dev +``` + +### Remote Caching + +Turborepo can use a technique known as [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) to share cache artifacts across machines, enabling you to share build caches with your team and CI/CD pipelines. + +By default, Turborepo will cache locally. To enable Remote Caching you will need an account with Vercel. If you don't have an account you can [create one](https://vercel.com/signup), then enter the following commands: + +``` +cd my-turborepo +npx turbo login +``` + +This will authenticate the Turborepo CLI with your [Vercel account](https://vercel.com/docs/concepts/personal-accounts/overview). + +Next, you can link your Turborepo to your Remote Cache by running the following command from the root of your Turborepo: + +``` +npx turbo link +``` + +## Useful Links + +Learn more about the power of Turborepo: + +- [Tasks](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks) +- [Caching](https://turbo.build/repo/docs/core-concepts/caching) +- [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) +- [Filtering](https://turbo.build/repo/docs/core-concepts/monorepos/filtering) +- [Configuration Options](https://turbo.build/repo/docs/reference/configuration) +- [CLI Usage](https://turbo.build/repo/docs/reference/command-line-reference) diff --git a/apps/backend/.gitignore b/apps/backend/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/apps/backend/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/apps/backend/README.md b/apps/backend/README.md new file mode 100644 index 0000000..e12b31d --- /dev/null +++ b/apps/backend/README.md @@ -0,0 +1,8 @@ +``` +npm install +npm run dev +``` + +``` +open http://localhost:3000 +``` diff --git a/apps/backend/drizzle.config.ts b/apps/backend/drizzle.config.ts new file mode 100644 index 0000000..11be074 --- /dev/null +++ b/apps/backend/drizzle.config.ts @@ -0,0 +1,17 @@ +import "dotenv/config"; +import type { Config } from "drizzle-kit"; + +const databaseUrl = process.env.DATABASE_URL; + +if (!databaseUrl) { + throw new Error("DATABASE_URL is not set"); +} + +export default { + schema: "./src/drizzle/schema/*", + out: "./src/drizzle/migrations", + driver: "pg", + dbCredentials: { + connectionString: databaseUrl, + }, +} satisfies Config; diff --git a/apps/backend/package.json b/apps/backend/package.json new file mode 100644 index 0000000..8d029f4 --- /dev/null +++ b/apps/backend/package.json @@ -0,0 +1,36 @@ +{ + "name": "backend", + "scripts": { + "dev": "tsx watch src/index.ts", + "db:generate": "drizzle-kit generate:pg", + "db:push": "drizzle-kit push:pg", + "db:seed": "tsx src/drizzle/seed.ts", + "db:migrate": "tsx src/drizzle/migration.ts", + "db:studio": "drizzle-kit studio" + }, + "dependencies": { + "@hono/node-server": "^1.11.0", + "@hono/zod-validator": "^0.2.1", + "@paralleldrive/cuid2": "^2.2.2", + "bcrypt": "^5.1.1", + "dotenv": "^16.4.5", + "drizzle-orm": "^0.30.9", + "hono": "^4.2.9", + "jsonwebtoken": "^9.0.2", + "moment": "^2.30.1", + "postgres": "^3.4.4", + "zod": "^3.23.4" + }, + "devDependencies": { + "@types/bcrypt": "^5.0.2", + "@types/jsonwebtoken": "^9.0.6", + "@types/node": "^20.11.24", + "drizzle-kit": "^0.20.17", + "pg": "^8.11.5", + "tsx": "^4.7.1" + }, + "exports": { + ".": "./src/index.ts", + "./types": "./src/types/index.d.ts" + } +} diff --git a/apps/backend/src/data/permissions.ts b/apps/backend/src/data/permissions.ts new file mode 100644 index 0000000..d7f4517 --- /dev/null +++ b/apps/backend/src/data/permissions.ts @@ -0,0 +1,42 @@ +const permissionsData = [ + { + code: "users.readAll", + }, + { + code: "users.create", + }, + { + code: "users.update", + }, + { + code: "users.delete", + }, + { + code: "users.restore", + }, + { + code: "permissions.read", + }, + { + code: "roles.read", + }, + { + code: "roles.create", + }, + { + code: "roles.update", + }, + { + code: "roles.delete", + }, +] as const; + +export type SpecificPermissionCode = (typeof permissionsData)[number]["code"]; + +export type PermissionCode = + | SpecificPermissionCode + | "*" + | "authenticated-only" + | "guest-only"; + +export default permissionsData; diff --git a/src/modules/role/data/initialRoles.ts b/apps/backend/src/data/roles.ts similarity index 71% rename from src/modules/role/data/initialRoles.ts rename to apps/backend/src/data/roles.ts index 2662b8c..2c42327 100644 --- a/src/modules/role/data/initialRoles.ts +++ b/apps/backend/src/data/roles.ts @@ -1,6 +1,4 @@ -import exportedPermissionData, { - SpecificPermissionCode, -} from "../../permission/data/initialPermissions"; +import permissionsData, { SpecificPermissionCode } from "./permissions"; export type RoleData = { code: RoleCode; @@ -17,9 +15,7 @@ const roleData: RoleData[] = [ "Has full access to the system and can manage all features and settings", isActive: true, name: "Super Admin", - permissions: exportedPermissionData.map( - (x) => x.code as SpecificPermissionCode - ), + permissions: permissionsData.map((permission) => permission.code), }, ]; diff --git a/apps/backend/src/data/sidebarMenus.ts b/apps/backend/src/data/sidebarMenus.ts new file mode 100644 index 0000000..8201480 --- /dev/null +++ b/apps/backend/src/data/sidebarMenus.ts @@ -0,0 +1,19 @@ +import { SidebarMenu } from "../types"; + +const sidebarMenus: SidebarMenu[] = [ + { + label: "Dashboard", + icon: { tb: "TbLayoutDashboard" }, + allowedPermissions: ["*"], + link: "/", + }, + { + label: "Users", + icon: { tb: "TbUsers" }, + allowedPermissions: ["permissions.read"], + link: "/users", + color: "red", + }, +]; + +export default sidebarMenus; diff --git a/apps/backend/src/drizzle/index.ts b/apps/backend/src/drizzle/index.ts new file mode 100644 index 0000000..c157f56 --- /dev/null +++ b/apps/backend/src/drizzle/index.ts @@ -0,0 +1,29 @@ +import { configDotenv } from "dotenv"; +import { drizzle } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; +import * as usersSchema from "./schema/users"; +import * as permissionsSchema from "./schema/permissions"; +import * as rolesSchema from "./schema/roles"; +import * as permissionsToRolesSchema from "./schema/permissionsToRoles"; +import * as permissionsToUsersSchema from "./schema/permissionsToUsers"; +import * as rolesToUsersSchema from "./schema/rolesToUsers"; + +configDotenv(); + +const dbUrl = process.env.DATABASE_URL; + +if (!dbUrl) throw new Error("DATABASE_URL is not set"); + +const queryClient = postgres(dbUrl); +const db = drizzle(queryClient, { + schema: { + ...usersSchema, + ...permissionsSchema, + ...rolesSchema, + ...permissionsToRolesSchema, + ...permissionsToUsersSchema, + ...rolesToUsersSchema, + }, +}); + +export default db; diff --git a/apps/backend/src/drizzle/migration.ts b/apps/backend/src/drizzle/migration.ts new file mode 100644 index 0000000..757dc93 --- /dev/null +++ b/apps/backend/src/drizzle/migration.ts @@ -0,0 +1,19 @@ +import { configDotenv } from "dotenv"; +import { drizzle } from "drizzle-orm/postgres-js"; +import { migrate } from "drizzle-orm/postgres-js/migrator"; +import postgres from "postgres"; + +configDotenv(); + +const dbUrl = process.env.DATABASE_URL; + +if (!dbUrl) throw new Error("DATABASE_URL is not set"); + +const migrationClient = postgres(dbUrl, { max: 1 }); + +migrate(drizzle(migrationClient), { + migrationsFolder: "./src/drizzle/migrations", +}).then(() => { + console.log("Migrations complete"); + process.exit(0); +}); diff --git a/apps/backend/src/drizzle/migrations/0000_watery_phantom_reporter.sql b/apps/backend/src/drizzle/migrations/0000_watery_phantom_reporter.sql new file mode 100644 index 0000000..738242d --- /dev/null +++ b/apps/backend/src/drizzle/migrations/0000_watery_phantom_reporter.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS "users" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "name" varchar(255) NOT NULL, + "username" varchar NOT NULL, + "email" varchar, + "password" text NOT NULL, + "is_enable" boolean DEFAULT true, + "created_at" timestamp DEFAULT now(), + "updated_at" timestamp DEFAULT now(), + "deleted_at" timestamp, + CONSTRAINT "users_username_unique" UNIQUE("username") +); diff --git a/apps/backend/src/drizzle/migrations/0001_robust_misty_knight.sql b/apps/backend/src/drizzle/migrations/0001_robust_misty_knight.sql new file mode 100644 index 0000000..cbb7462 --- /dev/null +++ b/apps/backend/src/drizzle/migrations/0001_robust_misty_knight.sql @@ -0,0 +1,2 @@ +ALTER TABLE "users" ALTER COLUMN "id" SET DATA TYPE text;--> statement-breakpoint +ALTER TABLE "users" ALTER COLUMN "id" DROP DEFAULT; \ No newline at end of file diff --git a/apps/backend/src/drizzle/migrations/0002_smooth_prism.sql b/apps/backend/src/drizzle/migrations/0002_smooth_prism.sql new file mode 100644 index 0000000..2c976dc --- /dev/null +++ b/apps/backend/src/drizzle/migrations/0002_smooth_prism.sql @@ -0,0 +1,25 @@ +CREATE TABLE IF NOT EXISTS "permissions" ( + "id" text PRIMARY KEY NOT NULL, + "code" varchar(50) NOT NULL, + "description" varchar(255), + "created_at" timestamp DEFAULT now(), + "updated_at" timestamp DEFAULT now(), + CONSTRAINT "permissions_code_unique" UNIQUE("code") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "permissions_to_users" ( + "id" text NOT NULL, + CONSTRAINT "permissions_to_users_id_id_pk" PRIMARY KEY("id","id") +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "permissions_to_users" ADD CONSTRAINT "permissions_to_users_id_users_id_fk" FOREIGN KEY ("id") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "permissions_to_users" ADD CONSTRAINT "permissions_to_users_id_permissions_id_fk" FOREIGN KEY ("id") REFERENCES "permissions"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/apps/backend/src/drizzle/migrations/0003_brave_khan.sql b/apps/backend/src/drizzle/migrations/0003_brave_khan.sql new file mode 100644 index 0000000..4f4e964 --- /dev/null +++ b/apps/backend/src/drizzle/migrations/0003_brave_khan.sql @@ -0,0 +1,19 @@ +ALTER TABLE "permissions_to_users" RENAME COLUMN "id" TO "userId";--> statement-breakpoint +ALTER TABLE "permissions_to_users" DROP CONSTRAINT "permissions_to_users_id_users_id_fk"; +--> statement-breakpoint +ALTER TABLE "permissions_to_users" DROP CONSTRAINT "permissions_to_users_id_permissions_id_fk"; +--> statement-breakpoint +ALTER TABLE "permissions_to_users" DROP CONSTRAINT "permissions_to_users_id_id_pk";--> statement-breakpoint +ALTER TABLE "permissions_to_users" ADD CONSTRAINT "permissions_to_users_userId_permissionId_pk" PRIMARY KEY("userId","permissionId");--> statement-breakpoint +ALTER TABLE "permissions_to_users" ADD COLUMN "permissionId" text NOT NULL;--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "permissions_to_users" ADD CONSTRAINT "permissions_to_users_userId_users_id_fk" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "permissions_to_users" ADD CONSTRAINT "permissions_to_users_permissionId_permissions_id_fk" FOREIGN KEY ("permissionId") REFERENCES "permissions"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/apps/backend/src/drizzle/migrations/0004_uneven_jamie_braddock.sql b/apps/backend/src/drizzle/migrations/0004_uneven_jamie_braddock.sql new file mode 100644 index 0000000..f2cf7ac --- /dev/null +++ b/apps/backend/src/drizzle/migrations/0004_uneven_jamie_braddock.sql @@ -0,0 +1,45 @@ +CREATE TABLE IF NOT EXISTS "permissions_to_roles" ( + "roleId" text NOT NULL, + "permissionId" text NOT NULL, + CONSTRAINT "permissions_to_roles_roleId_permissionId_pk" PRIMARY KEY("roleId","permissionId") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "roles" ( + "id" text PRIMARY KEY NOT NULL, + "code" varchar(50) NOT NULL, + "name" varchar(255) NOT NULL, + "description" varchar(255), + "created_at" timestamp DEFAULT now(), + "updated_at" timestamp DEFAULT now(), + CONSTRAINT "roles_code_unique" UNIQUE("code") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "roles_to_users" ( + "userId" text NOT NULL, + "roleId" text NOT NULL, + CONSTRAINT "roles_to_users_userId_roleId_pk" PRIMARY KEY("userId","roleId") +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "permissions_to_roles" ADD CONSTRAINT "permissions_to_roles_roleId_users_id_fk" FOREIGN KEY ("roleId") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "permissions_to_roles" ADD CONSTRAINT "permissions_to_roles_permissionId_permissions_id_fk" FOREIGN KEY ("permissionId") REFERENCES "permissions"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "roles_to_users" ADD CONSTRAINT "roles_to_users_userId_users_id_fk" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "roles_to_users" ADD CONSTRAINT "roles_to_users_roleId_roles_id_fk" FOREIGN KEY ("roleId") REFERENCES "roles"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/apps/backend/src/drizzle/migrations/meta/0000_snapshot.json b/apps/backend/src/drizzle/migrations/meta/0000_snapshot.json new file mode 100644 index 0000000..99de7ee --- /dev/null +++ b/apps/backend/src/drizzle/migrations/meta/0000_snapshot.json @@ -0,0 +1,91 @@ +{ + "id": "c5fd8300-ffba-40cf-b8d1-fb2d5cb17334", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "5", + "dialect": "pg", + "tables": { + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_enable": { + "name": "is_enable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + } + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/backend/src/drizzle/migrations/meta/0001_snapshot.json b/apps/backend/src/drizzle/migrations/meta/0001_snapshot.json new file mode 100644 index 0000000..6ea0ddd --- /dev/null +++ b/apps/backend/src/drizzle/migrations/meta/0001_snapshot.json @@ -0,0 +1,90 @@ +{ + "id": "1d1b923d-587d-4c8f-91f0-fe32e4dc9907", + "prevId": "c5fd8300-ffba-40cf-b8d1-fb2d5cb17334", + "version": "5", + "dialect": "pg", + "tables": { + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_enable": { + "name": "is_enable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + } + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/backend/src/drizzle/migrations/meta/0002_snapshot.json b/apps/backend/src/drizzle/migrations/meta/0002_snapshot.json new file mode 100644 index 0000000..53cb346 --- /dev/null +++ b/apps/backend/src/drizzle/migrations/meta/0002_snapshot.json @@ -0,0 +1,191 @@ +{ + "id": "2bf359eb-f1b7-4049-9743-5713887eae25", + "prevId": "1d1b923d-587d-4c8f-91f0-fe32e4dc9907", + "version": "5", + "dialect": "pg", + "tables": { + "permissions": { + "name": "permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "code": { + "name": "code", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "permissions_code_unique": { + "name": "permissions_code_unique", + "nullsNotDistinct": false, + "columns": [ + "code" + ] + } + } + }, + "permissions_to_users": { + "name": "permissions_to_users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "permissions_to_users_id_users_id_fk": { + "name": "permissions_to_users_id_users_id_fk", + "tableFrom": "permissions_to_users", + "tableTo": "users", + "columnsFrom": [ + "id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "permissions_to_users_id_permissions_id_fk": { + "name": "permissions_to_users_id_permissions_id_fk", + "tableFrom": "permissions_to_users", + "tableTo": "permissions", + "columnsFrom": [ + "id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "permissions_to_users_id_id_pk": { + "name": "permissions_to_users_id_id_pk", + "columns": [ + "id", + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_enable": { + "name": "is_enable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + } + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/backend/src/drizzle/migrations/meta/0003_snapshot.json b/apps/backend/src/drizzle/migrations/meta/0003_snapshot.json new file mode 100644 index 0000000..8126406 --- /dev/null +++ b/apps/backend/src/drizzle/migrations/meta/0003_snapshot.json @@ -0,0 +1,197 @@ +{ + "id": "0cf959e6-de9a-4b7c-94ea-5b49880302f1", + "prevId": "2bf359eb-f1b7-4049-9743-5713887eae25", + "version": "5", + "dialect": "pg", + "tables": { + "permissions": { + "name": "permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "code": { + "name": "code", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "permissions_code_unique": { + "name": "permissions_code_unique", + "nullsNotDistinct": false, + "columns": [ + "code" + ] + } + } + }, + "permissions_to_users": { + "name": "permissions_to_users", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permissionId": { + "name": "permissionId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "permissions_to_users_userId_users_id_fk": { + "name": "permissions_to_users_userId_users_id_fk", + "tableFrom": "permissions_to_users", + "tableTo": "users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "permissions_to_users_permissionId_permissions_id_fk": { + "name": "permissions_to_users_permissionId_permissions_id_fk", + "tableFrom": "permissions_to_users", + "tableTo": "permissions", + "columnsFrom": [ + "permissionId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "permissions_to_users_userId_permissionId_pk": { + "name": "permissions_to_users_userId_permissionId_pk", + "columns": [ + "userId", + "permissionId" + ] + } + }, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_enable": { + "name": "is_enable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + } + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/backend/src/drizzle/migrations/meta/0004_snapshot.json b/apps/backend/src/drizzle/migrations/meta/0004_snapshot.json new file mode 100644 index 0000000..089fc9a --- /dev/null +++ b/apps/backend/src/drizzle/migrations/meta/0004_snapshot.json @@ -0,0 +1,367 @@ +{ + "id": "06ebf3b9-d0c5-414c-bcab-9f22fab750c4", + "prevId": "0cf959e6-de9a-4b7c-94ea-5b49880302f1", + "version": "5", + "dialect": "pg", + "tables": { + "permissions": { + "name": "permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "code": { + "name": "code", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "permissions_code_unique": { + "name": "permissions_code_unique", + "nullsNotDistinct": false, + "columns": [ + "code" + ] + } + } + }, + "permissions_to_roles": { + "name": "permissions_to_roles", + "schema": "", + "columns": { + "roleId": { + "name": "roleId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permissionId": { + "name": "permissionId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "permissions_to_roles_roleId_users_id_fk": { + "name": "permissions_to_roles_roleId_users_id_fk", + "tableFrom": "permissions_to_roles", + "tableTo": "users", + "columnsFrom": [ + "roleId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "permissions_to_roles_permissionId_permissions_id_fk": { + "name": "permissions_to_roles_permissionId_permissions_id_fk", + "tableFrom": "permissions_to_roles", + "tableTo": "permissions", + "columnsFrom": [ + "permissionId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "permissions_to_roles_roleId_permissionId_pk": { + "name": "permissions_to_roles_roleId_permissionId_pk", + "columns": [ + "roleId", + "permissionId" + ] + } + }, + "uniqueConstraints": {} + }, + "permissions_to_users": { + "name": "permissions_to_users", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permissionId": { + "name": "permissionId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "permissions_to_users_userId_users_id_fk": { + "name": "permissions_to_users_userId_users_id_fk", + "tableFrom": "permissions_to_users", + "tableTo": "users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "permissions_to_users_permissionId_permissions_id_fk": { + "name": "permissions_to_users_permissionId_permissions_id_fk", + "tableFrom": "permissions_to_users", + "tableTo": "permissions", + "columnsFrom": [ + "permissionId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "permissions_to_users_userId_permissionId_pk": { + "name": "permissions_to_users_userId_permissionId_pk", + "columns": [ + "userId", + "permissionId" + ] + } + }, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "code": { + "name": "code", + "type": "varchar(50)", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_code_unique": { + "name": "roles_code_unique", + "nullsNotDistinct": false, + "columns": [ + "code" + ] + } + } + }, + "roles_to_users": { + "name": "roles_to_users", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "roleId": { + "name": "roleId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "roles_to_users_userId_users_id_fk": { + "name": "roles_to_users_userId_users_id_fk", + "tableFrom": "roles_to_users", + "tableTo": "users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "roles_to_users_roleId_roles_id_fk": { + "name": "roles_to_users_roleId_roles_id_fk", + "tableFrom": "roles_to_users", + "tableTo": "roles", + "columnsFrom": [ + "roleId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "roles_to_users_userId_roleId_pk": { + "name": "roles_to_users_userId_roleId_pk", + "columns": [ + "userId", + "roleId" + ] + } + }, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_enable": { + "name": "is_enable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + } + } + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/backend/src/drizzle/migrations/meta/_journal.json b/apps/backend/src/drizzle/migrations/meta/_journal.json new file mode 100644 index 0000000..66d0b64 --- /dev/null +++ b/apps/backend/src/drizzle/migrations/meta/_journal.json @@ -0,0 +1,41 @@ +{ + "version": "5", + "dialect": "pg", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1714235312241, + "tag": "0000_watery_phantom_reporter", + "breakpoints": true + }, + { + "idx": 1, + "version": "5", + "when": 1714304745571, + "tag": "0001_robust_misty_knight", + "breakpoints": true + }, + { + "idx": 2, + "version": "5", + "when": 1714314063411, + "tag": "0002_smooth_prism", + "breakpoints": true + }, + { + "idx": 3, + "version": "5", + "when": 1714314149914, + "tag": "0003_brave_khan", + "breakpoints": true + }, + { + "idx": 4, + "version": "5", + "when": 1714321209072, + "tag": "0004_uneven_jamie_braddock", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/apps/backend/src/drizzle/schema/permissions.ts b/apps/backend/src/drizzle/schema/permissions.ts new file mode 100644 index 0000000..f4a2461 --- /dev/null +++ b/apps/backend/src/drizzle/schema/permissions.ts @@ -0,0 +1,23 @@ +import { createId } from "@paralleldrive/cuid2"; +import { relations } from "drizzle-orm"; +import { pgTable, text, timestamp, varchar } from "drizzle-orm/pg-core"; +import { permissionsToUsers } from "./permissionsToUsers"; +import { permissionsToRoles } from "./permissionsToRoles"; + +export const permissionsSchema = pgTable("permissions", { + id: text("id") + .primaryKey() + .$defaultFn(() => createId()), + code: varchar("code", { length: 50 }).notNull().unique(), + description: varchar("description", { length: 255 }), + createdAt: timestamp("created_at").defaultNow(), + updatedAt: timestamp("updated_at").defaultNow(), +}); + +export const permissionsRelations = relations( + permissionsSchema, + ({ many }) => ({ + permissionsToUsers: many(permissionsToUsers), + permissionsToRoles: many(permissionsToRoles), + }) +); diff --git a/apps/backend/src/drizzle/schema/permissionsToRoles.ts b/apps/backend/src/drizzle/schema/permissionsToRoles.ts new file mode 100644 index 0000000..ddce625 --- /dev/null +++ b/apps/backend/src/drizzle/schema/permissionsToRoles.ts @@ -0,0 +1,35 @@ +import { pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { permissionsSchema } from "./permissions"; +import { relations } from "drizzle-orm"; +import { rolesSchema } from "./roles"; + +export const permissionsToRoles = pgTable( + "permissions_to_roles", + { + roleId: text("roleId") + .notNull() + .references(() => rolesSchema.id), + permissionId: text("permissionId") + .notNull() + .references(() => permissionsSchema.id), + }, + (table) => ({ + pk: primaryKey({ + columns: [table.roleId, table.permissionId], + }), + }) +); + +export const permissionsToRolesRelations = relations( + permissionsToRoles, + ({ one }) => ({ + role: one(rolesSchema, { + fields: [permissionsToRoles.roleId], + references: [rolesSchema.id], + }), + permission: one(permissionsSchema, { + fields: [permissionsToRoles.permissionId], + references: [permissionsSchema.id], + }), + }) +); diff --git a/apps/backend/src/drizzle/schema/permissionsToUsers.ts b/apps/backend/src/drizzle/schema/permissionsToUsers.ts new file mode 100644 index 0000000..110b433 --- /dev/null +++ b/apps/backend/src/drizzle/schema/permissionsToUsers.ts @@ -0,0 +1,35 @@ +import { pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { users } from "./users"; +import { permissionsSchema } from "./permissions"; +import { relations } from "drizzle-orm"; + +export const permissionsToUsers = pgTable( + "permissions_to_users", + { + userId: text("userId") + .notNull() + .references(() => users.id), + permissionId: text("permissionId") + .notNull() + .references(() => permissionsSchema.id), + }, + (table) => ({ + pk: primaryKey({ + columns: [table.userId, table.permissionId], + }), + }) +); + +export const permissionsToUsersRelations = relations( + permissionsToUsers, + ({ one }) => ({ + user: one(users, { + fields: [permissionsToUsers.userId], + references: [users.id], + }), + permission: one(permissionsSchema, { + fields: [permissionsToUsers.permissionId], + references: [permissionsSchema.id], + }), + }) +); diff --git a/apps/backend/src/drizzle/schema/roles.ts b/apps/backend/src/drizzle/schema/roles.ts new file mode 100644 index 0000000..6b8bfe5 --- /dev/null +++ b/apps/backend/src/drizzle/schema/roles.ts @@ -0,0 +1,19 @@ +import { createId } from "@paralleldrive/cuid2"; +import { relations } from "drizzle-orm"; +import { pgTable, text, timestamp, varchar } from "drizzle-orm/pg-core"; +import { permissionsToRoles } from "./permissionsToRoles"; + +export const rolesSchema = pgTable("roles", { + id: text("id") + .primaryKey() + .$defaultFn(() => createId()), + code: varchar("code", { length: 50 }).notNull().unique(), + name: varchar("name", { length: 255 }).notNull(), + description: varchar("description", { length: 255 }), + createdAt: timestamp("created_at").defaultNow(), + updatedAt: timestamp("updated_at").defaultNow(), +}); + +export const rolesRelations = relations(rolesSchema, ({ many }) => ({ + permissionsToRoles: many(permissionsToRoles), +})); diff --git a/apps/backend/src/drizzle/schema/rolesToUsers.ts b/apps/backend/src/drizzle/schema/rolesToUsers.ts new file mode 100644 index 0000000..dcf422c --- /dev/null +++ b/apps/backend/src/drizzle/schema/rolesToUsers.ts @@ -0,0 +1,32 @@ +import { pgTable, primaryKey, text } from "drizzle-orm/pg-core"; +import { users } from "./users"; +import { relations } from "drizzle-orm"; +import { rolesSchema } from "./roles"; + +export const rolesToUsers = pgTable( + "roles_to_users", + { + userId: text("userId") + .notNull() + .references(() => users.id), + roleId: text("roleId") + .notNull() + .references(() => rolesSchema.id), + }, + (table) => ({ + pk: primaryKey({ + columns: [table.userId, table.roleId], + }), + }) +); + +export const rolesToUsersRelations = relations(rolesToUsers, ({ one }) => ({ + user: one(users, { + fields: [rolesToUsers.userId], + references: [users.id], + }), + role: one(rolesSchema, { + fields: [rolesToUsers.roleId], + references: [rolesSchema.id], + }), +})); diff --git a/apps/backend/src/drizzle/schema/users.ts b/apps/backend/src/drizzle/schema/users.ts new file mode 100644 index 0000000..af91337 --- /dev/null +++ b/apps/backend/src/drizzle/schema/users.ts @@ -0,0 +1,30 @@ +import { createId } from "@paralleldrive/cuid2"; +import { relations } from "drizzle-orm"; +import { + boolean, + pgTable, + text, + timestamp, + varchar, +} from "drizzle-orm/pg-core"; +import { permissionsToUsers } from "./permissionsToUsers"; +import { rolesToUsers } from "./rolesToUsers"; + +export const users = pgTable("users", { + id: text("id") + .primaryKey() + .$defaultFn(() => createId()), + name: varchar("name", { length: 255 }).notNull(), + username: varchar("username").notNull().unique(), + email: varchar("email"), + password: text("password").notNull(), + isEnabled: boolean("is_enable").default(true), + createdAt: timestamp("created_at", { mode: "date" }).defaultNow(), + updatedAt: timestamp("updated_at", { mode: "date" }).defaultNow(), + deletedAt: timestamp("deleted_at", { mode: "date" }), +}); + +export const usersRelations = relations(users, ({ many }) => ({ + permissionsToUsers: many(permissionsToUsers), + rolesToUsers: many(rolesToUsers), +})); diff --git a/apps/backend/src/drizzle/seed.ts b/apps/backend/src/drizzle/seed.ts new file mode 100644 index 0000000..305be1b --- /dev/null +++ b/apps/backend/src/drizzle/seed.ts @@ -0,0 +1,18 @@ +import db from "."; +import permissionSeeder from "./seeds/permissionSeeder"; +import roleSeeder from "./seeds/rolesSeeder"; +import userSeeder from "./seeds/userSeeder"; + +(async () => { + console.time("Done seeding"); + // await userSeeder + await permissionSeeder(); + await roleSeeder(); + await userSeeder(); +})().then(() => { + console.log("\n"); + console.timeEnd("Done seeding"); + process.exit(0); +}); + +export {}; diff --git a/apps/backend/src/drizzle/seeds/permissionSeeder.ts b/apps/backend/src/drizzle/seeds/permissionSeeder.ts new file mode 100644 index 0000000..4b0fd40 --- /dev/null +++ b/apps/backend/src/drizzle/seeds/permissionSeeder.ts @@ -0,0 +1,17 @@ +import permissionsData from "@/data/permissions"; +import db from ".."; +import { permissionsSchema } from "../schema/permissions"; + +const permissionSeeder = async () => { + const permissionsSeedData = + permissionsData as unknown as (typeof permissionsSchema.$inferInsert)[]; + + console.log("Seeding permissions..."); + + await db + .insert(permissionsSchema) + .values(permissionsSeedData) + .onConflictDoNothing(); +}; + +export default permissionSeeder; diff --git a/apps/backend/src/drizzle/seeds/rolesSeeder.ts b/apps/backend/src/drizzle/seeds/rolesSeeder.ts new file mode 100644 index 0000000..16827d7 --- /dev/null +++ b/apps/backend/src/drizzle/seeds/rolesSeeder.ts @@ -0,0 +1,78 @@ +import exportedRoleData from "@/data/roles"; +import { rolesSchema } from "../schema/roles"; +import db from ".."; +import { permissionsToRoles } from "../schema/permissionsToRoles"; +import { permissionsSchema } from "../schema/permissions"; +import { eq } from "drizzle-orm"; + +const roleSeeder = async () => { + console.log("Seeding roles..."); + + const memoizedPermissions: Map = new Map(); + + for (let role of exportedRoleData) { + let insertedRole = ( + await db + .insert(rolesSchema) + .values(role) + .returning() + .onConflictDoNothing() + )[0]; + + if (insertedRole) { + console.log(`Role ${role.name} inserted`); + } else { + console.warn(`Role ${role.name} already exists`); + insertedRole = ( + await db + .select() + .from(rolesSchema) + .where(eq(rolesSchema.name, role.name)) + )[0]; + } + + for (let permissionCode of role.permissions) { + if (!memoizedPermissions.has(permissionCode)) { + const permission = ( + await db + .select({ id: permissionsSchema.id }) + .from(permissionsSchema) + .where(eq(permissionsSchema.code, permissionCode)) + )[0]; + + if (!permission) + throw new Error( + `Permission ${permissionCode} does not exists in database` + ); + + memoizedPermissions.set(permissionCode, permission.id); + } + + console.log("here"); + + const insertedPermission = await db + .insert(permissionsToRoles) + .values({ + roleId: insertedRole.id, + permissionId: memoizedPermissions.get(permissionCode)!, + }) + .onConflictDoNothing() + .returning(); + // .catch((e) => + // console.log("The permission might already been set") + // ); + + if (insertedPermission) { + console.log( + `Permission ${permissionCode} inserted to role ${role.name}` + ); + } else { + console.warn( + `Permission ${permissionCode} already exists in role ${role.name}` + ); + } + } + } +}; + +export default roleSeeder; diff --git a/apps/backend/src/drizzle/seeds/userSeeder.ts b/apps/backend/src/drizzle/seeds/userSeeder.ts new file mode 100644 index 0000000..1707a51 --- /dev/null +++ b/apps/backend/src/drizzle/seeds/userSeeder.ts @@ -0,0 +1,63 @@ +import { hashPassword } from "@/utils/passwordUtils"; +import { users } from "../schema/users"; +import db from ".."; +import { rolesSchema } from "../schema/roles"; +import { eq } from "drizzle-orm"; +import { rolesToUsers } from "../schema/rolesToUsers"; + +const userSeeder = async () => { + const usersData: (typeof users.$inferInsert & { roles: string[] })[] = [ + { + name: "Super Admin", + password: await hashPassword("123456"), + username: "superadmin", + roles: ["super-admin"], + }, + ]; + + console.log("Seeding users..."); + + const memoizedRoleIds: Map = new Map(); + + for (let user of usersData) { + const insertedUser = ( + await db + .insert(users) + .values(usersData) + .onConflictDoNothing() + .returning() + )[0]; + + if (insertedUser) { + for (let roleCode of user.roles) { + if (!memoizedRoleIds.has(roleCode)) { + const role = ( + await db + .select({ id: rolesSchema.id }) + .from(rolesSchema) + .where(eq(rolesSchema.code, roleCode)) + )[0]; + + if (!role) + throw new Error( + `Role ${roleCode} does not exists on database` + ); + + memoizedRoleIds.set(roleCode, role.id); + } + + await db.insert(rolesToUsers).values({ + roleId: memoizedRoleIds.get(roleCode)!, + userId: insertedUser.id, + }); + console.log(`User ${user.name} created`); + } + } else { + console.log(`User ${user.name} already exists`); + } + } + + // await db.insert(users).values(usersData).onConflictDoNothing().returning(); +}; + +export default userSeeder; diff --git a/apps/backend/src/index.ts b/apps/backend/src/index.ts new file mode 100644 index 0000000..1d1473a --- /dev/null +++ b/apps/backend/src/index.ts @@ -0,0 +1,122 @@ +import { serve } from "@hono/node-server"; +import { configDotenv } from "dotenv"; +import { Hono } from "hono"; +import authRoutes from "./routes/auth/route"; +import usersRoute from "./routes/users/route"; +import { verifyAccessToken } from "./utils/authUtils"; +import permissionRoutes from "./routes/permissions/route"; +import { cors } from "hono/cors"; +import { HTTPException } from "hono/http-exception"; +import { getSignedCookie } from "hono/cookie"; +import dashboardRoutes from "./routes/dashboard/routes"; +import rolesRoute from "./routes/roles/route"; +import { logger } from "hono/logger"; + +configDotenv(); + +export type HonoVariables = { + uid?: string; +}; + +const app = new Hono<{ Variables: HonoVariables }>(); + +// app.use(async (c, next) => { +// const authHeader = c.req.header("Authorization"); + +// if (authHeader && authHeader.startsWith("Bearer ")) { +// const token = authHeader.substring(7); +// const payload = await verifyAccessToken(token); + +// if (payload) c.set("uid", payload.uid); +// } + +// await next(); +// }); + +const routes = app + .use(logger()) + .use( + cors({ + origin: "*", + }) + ) + .use(async (c, next) => { + const cookieSecret = process.env.COOKIE_SECRET; + + if (!cookieSecret) + throw new HTTPException(500, { + message: "The 'COOKIE_SECRET' env is not set", + }); + + const accessToken = await getSignedCookie( + c, + cookieSecret, + "access_token", + "secure" + ); + + if (accessToken) { + const payload = await verifyAccessToken(accessToken); + + if (payload) c.set("uid", payload.uid); + } else { + const authHeader = c.req.header("Authorization"); + + if (authHeader && authHeader.startsWith("Bearer ")) { + const token = authHeader.substring(7); + const payload = await verifyAccessToken(token); + + if (payload) c.set("uid", payload.uid); + } + } + + await next(); + }) + .use(async (c, next) => { + console.log("Incoming request:", c.req.path); + await next(); + console.log("Outgoing response:", c.res.status); + if (c.res.status !== 200) { + console.log(await c.res.text()); + } + }) + .get("/test", (c) => { + return c.json({ + message: "Server is up", + } as const); + }) + .route("/auth", authRoutes) + .route("/users", usersRoute) + .route("/permissions", permissionRoutes) + .route("/dashboard", dashboardRoutes) + .route("/roles", rolesRoute) + .onError((err, c) => { + if (err instanceof HTTPException) { + console.log(err); + return c.json( + { + message: err.message, + }, + err.status + ); + } else { + console.error(err); + return c.json( + { + message: + "Something is wrong in our side. We're working to fix it", + }, + 500 + ); + } + }); + +const port = +(process.env.APP_PORT ?? 3000); +console.log(`Server is running on port ${port}`); + +serve({ + fetch: app.fetch, + port, +}); + +export type AppType = typeof routes; diff --git a/apps/backend/src/middlewares/authMiddleware.ts b/apps/backend/src/middlewares/authMiddleware.ts new file mode 100644 index 0000000..e69de29 diff --git a/apps/backend/src/routes/auth/route.ts b/apps/backend/src/routes/auth/route.ts new file mode 100644 index 0000000..10d0ca9 --- /dev/null +++ b/apps/backend/src/routes/auth/route.ts @@ -0,0 +1,190 @@ +import { zValidator } from "@hono/zod-validator"; +import { and, eq, isNull, or } from "drizzle-orm"; +import { Hono } from "hono"; +import { deleteCookie } from "hono/cookie"; +import { HTTPException } from "hono/http-exception"; +import { z } from "zod"; +import { HonoVariables } from "../.."; +import db from "../../drizzle"; +import { users } from "../../drizzle/schema/users"; +import { checkPassword } from "../../utils/passwordUtils"; +import { + generateAccessToken, + generateRefreshToken, + verifyRefreshToken, +} from "../../utils/authUtils"; +import { rolesSchema } from "../../drizzle/schema/roles"; +import { rolesToUsers } from "../../drizzle/schema/rolesToUsers"; + +const authRoutes = new Hono<{ Variables: HonoVariables }>() + .post( + "/login", + zValidator( + "form", + z.object({ + username: z.string(), + password: z.string(), + ___jwt: z.string().default("false"), + }) + ), + async (c) => { + const formData = c.req.valid("form"); + + const user = ( + await db + .select({ + id: users.id, + username: users.username, + email: users.email, + password: users.password, + }) + .from(users) + .where( + and( + isNull(users.deletedAt), + eq(users.isEnabled, true), + or( + eq(users.username, formData.username), + eq(users.email, formData.username) + ) + ) + ) + )[0]; + + if (!user) { + throw new HTTPException(400, { + message: "Invalid username or password", + }); + } + + const isSuccess = await checkPassword( + formData.password, + user.password + ); + + if (!isSuccess) { + throw new HTTPException(400, { + message: "Invalid username or password", + }); + } + + const accessToken = await generateAccessToken({ + uid: user.id, + }); + + const refreshToken = await generateRefreshToken({ + uid: user.id, + }); + + const cookieSecret = process.env.COOKIE_SECRET; + + if (!cookieSecret) + throw new HTTPException(500, { + message: "The 'COOKIE_SECRET' env var is not set", + }); + + // await setSignedCookie( + // c, + // "access_token", + // accessToken, + // cookieSecret, + // { + // secure: true, + // httpOnly: true, + // prefix: "secure", + // expires: + // } + // ); + + return c.json({ + accessToken, + refreshToken, + }); + } + ) + .post( + "/refresh-token", + zValidator( + "json", + z.object({ + refreshToken: z.string(), + }) + ), + async (c) => { + const { refreshToken } = c.req.valid("json"); + + const decoded = await verifyRefreshToken(refreshToken); + + if (!decoded) { + throw new HTTPException(401, { + message: "Invalid refresh token", + }); + } + + const accessToken = await generateAccessToken({ + uid: decoded.uid, + }); + + return c.json({ + accessToken, + }); + } + ) + .get("/my-profile", async (c) => { + const uid = c.var.uid; + + if (!uid) { + throw new HTTPException(401, { message: "Unauthorized" }); + } + + const user = await db + .select({ + id: users.id, + username: users.username, + email: users.email, + roles: rolesSchema.code, + }) + .from(rolesToUsers) + .innerJoin(users, eq(users.id, rolesToUsers.userId)) + .innerJoin(rolesSchema, eq(rolesToUsers.roleId, rolesSchema.id)) + .where(eq(users.id, uid)) + .then((userData) => { + return userData.reduce( + (prev, curr) => ({ + ...prev, + roles: [...prev.roles, curr.roles], + }), + { + id: uid, + username: userData[0].username, + email: userData[0].email, + roles: [] as string[], + } + ); + }); + + if (!user) { + throw new HTTPException(401, { message: "Unauthorized" }); + } + + return c.json(user); + }) + .get("/logout", (c) => { + const uid = c.var.uid; + + if (!uid) { + return c.notFound(); + } + + deleteCookie(c, "access_token", { + secure: true, + httpOnly: true, + prefix: "secure", + }); + + return c.json({ + message: "Logged out successfully", + }); + }); + +export default authRoutes; diff --git a/apps/backend/src/routes/dashboard/routes.ts b/apps/backend/src/routes/dashboard/routes.ts new file mode 100644 index 0000000..4f22a93 --- /dev/null +++ b/apps/backend/src/routes/dashboard/routes.ts @@ -0,0 +1,115 @@ +import sidebarMenus from "../../data/sidebarMenus"; +import db from "../../drizzle"; +import { permissionsSchema } from "../../drizzle/schema/permissions"; +import { permissionsToRoles } from "../../drizzle/schema/permissionsToRoles"; +import { permissionsToUsers } from "../../drizzle/schema/permissionsToUsers"; +import { rolesSchema } from "../../drizzle/schema/roles"; +import { rolesToUsers } from "../../drizzle/schema/rolesToUsers"; +import { users } from "../../drizzle/schema/users"; +import { SidebarMenu } from "../../types"; +import { forbidden } from "../../utils/httpErrors"; +import { and, eq, or } from "drizzle-orm"; +import { Hono } from "hono"; +import { HonoVariables } from "../.."; + +const router = new Hono<{ Variables: HonoVariables }>(); + +const dashboardRoutes = router.get("/getSidebarItems", async (c) => { + const uid = c.var.uid; + + if (!uid) throw forbidden(); + + const queryResult = await db + .selectDistinctOn([permissionsSchema.id], { + id: users.id, + name: users.name, + email: users.email, + isEnabled: users.isEnabled, + role: { + id: rolesSchema.id, + code: rolesSchema.code, + }, + permission: { + id: permissionsSchema.id, + code: permissionsSchema.code, + }, + }) + .from(users) + .where(and(eq(users.id, uid), eq(users.isEnabled, true))) + .leftJoin(permissionsToUsers, eq(permissionsToUsers.userId, users.id)) + .leftJoin(rolesToUsers, eq(rolesToUsers.userId, users.id)) + .leftJoin(rolesSchema, eq(rolesToUsers.roleId, rolesSchema.id)) + .leftJoin( + permissionsToRoles, + eq(permissionsToRoles.roleId, rolesSchema.id) + ) + .innerJoin( + permissionsSchema, + or( + eq(permissionsSchema.id, permissionsToUsers.permissionId), + eq(permissionsSchema.id, permissionsToRoles.permissionId) + ) + ); + + if (!queryResult.length) throw forbidden(); + + const permissions = [...new Set(queryResult.map((r) => r.permission.code))]; + + const filteredMenus = sidebarMenus.reduce( + (prev, menu) => { + //if menu has children, check if any permission match + if (menu.children) { + const children = menu.children.filter( + (child) => + child.allowedPermissions?.some((perm) => + permissions.includes(perm) + ) || child.allowedPermissions?.includes("*") + ); + + if (children.length) { + //add children and hide the allowed permissions field + return [ + ...prev, + { ...menu, children, allowedPermissions: undefined }, + ]; + } + } + + //if menu has no children, check if permission match + else { + if ( + menu.allowedPermissions?.some((perm) => + permissions.includes(perm) + ) || + menu.allowedPermissions?.includes("*") + ) { + //add menu and hide the allowed permissions field + return [ + ...prev, + { ...menu, allowedPermissions: undefined }, + ]; + } + } + + //dont add permission to menu if it doesnt match + return prev; + }, + [] as Omit[] + ); + + //I don't know why but it is not working without redefining the type + return c.json( + filteredMenus as { + label: string; + icon: Record<"tb", string>; + children?: { + label: string; + link: string; + }[]; + link?: string; + color?: string; + }[] + ); +}); + +export default dashboardRoutes; diff --git a/apps/backend/src/routes/permissions/route.ts b/apps/backend/src/routes/permissions/route.ts new file mode 100644 index 0000000..12d3d55 --- /dev/null +++ b/apps/backend/src/routes/permissions/route.ts @@ -0,0 +1,18 @@ +import db from "../../drizzle"; +import { permissionsSchema } from "../../drizzle/schema/permissions"; +import { Hono } from "hono"; + +const permissionRoutes = new Hono() + //get all permissions + .get("/", async (c) => { + const permissions = await db + .select({ + id: permissionsSchema.id, + code: permissionsSchema.code, + }) + .from(permissionsSchema); + + return c.json(permissions); + }); + +export default permissionRoutes; diff --git a/apps/backend/src/routes/roles/route.ts b/apps/backend/src/routes/roles/route.ts new file mode 100644 index 0000000..199c857 --- /dev/null +++ b/apps/backend/src/routes/roles/route.ts @@ -0,0 +1,19 @@ +import { Hono } from "hono"; +import db from "../../drizzle"; +import { rolesSchema } from "../../drizzle/schema/roles"; + +const rolesRoute = new Hono() + //get all permissions + .get("/", async (c) => { + const roles = await db + .select({ + id: rolesSchema.id, + code: rolesSchema.code, + name: rolesSchema.name, + }) + .from(rolesSchema); + + return c.json(roles); + }); + +export default rolesRoute; diff --git a/apps/backend/src/routes/users/route.ts b/apps/backend/src/routes/users/route.ts new file mode 100644 index 0000000..bd4d718 --- /dev/null +++ b/apps/backend/src/routes/users/route.ts @@ -0,0 +1,327 @@ +import { and, eq, isNull } from "drizzle-orm"; +import { Hono } from "hono"; + +import { zValidator } from "@hono/zod-validator"; +import { z } from "zod"; +import { HTTPException } from "hono/http-exception"; +import db from "../../drizzle"; +import { users } from "../../drizzle/schema/users"; +import { HonoVariables } from "../.."; +import { hashPassword } from "../../utils/passwordUtils"; +import { rolesToUsers } from "../../drizzle/schema/rolesToUsers"; +import { rolesSchema } from "../../drizzle/schema/roles"; + +const userFormSchema = z.object({ + name: z.string().min(1).max(255), + username: z.string().min(1).max(255), + email: z.string().email().optional().or(z.literal("")), + password: z.string().min(6), + isEnabled: z.string().default("false"), + roles: z + .string() + .refine( + (data) => { + console.log(data); + try { + const parsed = JSON.parse(data); + return Array.isArray(parsed); + } catch { + return false; + } + }, + { + message: "Roles must be an array", + } + ) + .optional(), +}); + +const userUpdateSchema = userFormSchema.extend({ + password: z.string().min(6).optional().or(z.literal("")), +}); + +const usersRoute = new Hono<{ Variables: HonoVariables }>() + .use(async (c, next) => { + const uid = c.get("uid"); + + if (uid) { + await next(); + } else { + throw new HTTPException(401, { + message: "Unauthorized", + }); + } + }) + .get( + "/", + zValidator( + "query", + z.object({ + includeTrashed: z.string().default("false"), + }) + ), + async (c) => { + const includeTrashed = + c.req.query("includeTrashed")?.toLowerCase() === "true"; + + let usersData = await db + .select({ + id: users.id, + name: users.name, + email: users.email, + username: users.username, + isEnabled: users.isEnabled, + createdAt: users.createdAt, + updatedAt: users.updatedAt, + ...(includeTrashed ? { deletedAt: users.deletedAt } : {}), + + // password: users.password, + }) + .from(users) + .where(!includeTrashed ? isNull(users.deletedAt) : undefined); + + return c.json(usersData); + } + ) + //get user by id + .get( + "/:id", + zValidator( + "query", + z.object({ + includeTrashed: z.string().default("false"), + }) + ), + async (c) => { + const userId = c.req.param("id"); + + const includeTrashed = + c.req.query("includeTrashed")?.toLowerCase() === "true"; + + const queryResult = await db + .select({ + id: users.id, + name: users.name, + email: users.email, + username: users.username, + isEnabled: users.isEnabled, + createdAt: users.createdAt, + updatedAt: users.updatedAt, + ...(includeTrashed ? { deletedAt: users.deletedAt } : {}), + role: { + name: rolesSchema.name, + id: rolesSchema.id, + }, + }) + .from(users) + .leftJoin(rolesToUsers, eq(users.id, rolesToUsers.userId)) + .leftJoin(rolesSchema, eq(rolesToUsers.roleId, rolesSchema.id)) + .where( + and( + eq(users.id, userId), + !includeTrashed ? isNull(users.deletedAt) : undefined + ) + ); + + if (!queryResult.length) + throw new HTTPException(404, { + message: "The user does not exists", + }); + + const roles = queryResult.reduce((prev, curr) => { + if (!curr.role) return prev; + prev.set(curr.role.id, curr.role.name); + return prev; + }, new Map()); //Map + + const userData = { + ...queryResult[0], + role: undefined, + roles: Array.from(roles, ([id, name]) => ({ id, name })), + }; + + return c.json(userData); + } + ) + //create user + .post( + "/", + zValidator("form", userFormSchema, (result) => { + if (!result.success) { + let errors = result.error.flatten().fieldErrors as Record< + string, + string[] + >; + let firstErrors: Record = {}; + for (let field in errors) { + firstErrors[field] = errors[field][0]; // Grabbing the first error message for each field + } + throw new HTTPException(422, { + message: JSON.stringify(firstErrors), + }); + } + }), + async (c) => { + const userData = c.req.valid("form"); + + const user = await db + .insert(users) + .values({ + name: userData.name, + username: userData.username, + email: userData.email, + password: await hashPassword(userData.password), + isEnabled: userData.isEnabled.toLowerCase() === "true", + }) + .returning(); + + if (userData.roles) { + const roles = JSON.parse(userData.roles) as string[]; + console.log(roles); + + if (roles.length) { + await db.insert(rolesToUsers).values( + roles.map((role) => ({ + userId: user[0].id, + roleId: role, + })) + ); + } + } + + return c.json( + { + message: "User created successfully", + }, + 201 + ); + } + ) + + //update user + .patch( + "/:id", + zValidator("form", userUpdateSchema, (result) => { + if (!result.success) { + let errors = result.error.flatten().fieldErrors as Record< + string, + string[] + >; + let firstErrors: Record = {}; + for (let field in errors) { + firstErrors[field] = errors[field][0]; // Grabbing the first error message for each field + } + throw new HTTPException(422, { + message: JSON.stringify(firstErrors), + }); + } + }), + async (c) => { + const userId = c.req.param("id"); + const userData = c.req.valid("form"); + + const user = await db + .select() + .from(users) + .where(and(eq(users.id, userId), isNull(users.deletedAt))); + + if (!user[0]) return c.notFound(); + + await db + .update(users) + .set({ + ...userData, + ...(userData.password + ? { password: await hashPassword(userData.password) } + : {}), + updatedAt: new Date(), + isEnabled: userData.isEnabled.toLowerCase() === "true", + }) + .where(eq(users.id, userId)); + + return c.json({ + message: "User updated successfully", + }); + } + ) + + //delete user + .delete( + "/:id", + zValidator( + "form", + z.object({ + skipTrash: z.string().default("false"), + }) + ), + async (c) => { + const userId = c.req.param("id"); + const currentUserId = c.var.uid; + + const skipTrash = + c.req.valid("form").skipTrash.toLowerCase() === "true"; + + const user = await db + .select() + .from(users) + .where( + and( + eq(users.id, userId), + skipTrash ? undefined : isNull(users.deletedAt) + ) + ); + + if (!user[0]) + throw new HTTPException(404, { + message: "The user is not found", + }); + + if (user[0].id === currentUserId) { + throw new HTTPException(400, { + message: "You cannot delete yourself", + }); + } + + if (skipTrash) { + await db.delete(users).where(eq(users.id, userId)); + } else { + await db + .update(users) + .set({ + deletedAt: new Date(), + }) + .where(and(eq(users.id, userId), isNull(users.deletedAt))); + } + return c.json({ + message: "User deleted successfully", + }); + } + ) + + //undo delete + .patch("/restore/:id", async (c) => { + const userId = c.req.param("id"); + + const user = ( + await db.select().from(users).where(eq(users.id, userId)) + )[0]; + + if (!user) return c.notFound(); + + if (!user.deletedAt) { + throw new HTTPException(400, { + message: "The user is not deleted", + }); + } + + await db + .update(users) + .set({ deletedAt: null }) + .where(eq(users.id, userId)); + + return c.json({ + message: "User restored successfully", + }); + }); + +export default usersRoute; diff --git a/apps/backend/src/types/SidebarMenu.d.ts b/apps/backend/src/types/SidebarMenu.d.ts new file mode 100644 index 0000000..c67b7b3 --- /dev/null +++ b/apps/backend/src/types/SidebarMenu.d.ts @@ -0,0 +1,16 @@ +import { PermissionCode } from "@/data/permissions"; + +interface SidebarMenu { + label: string; + icon: Record<"tb", string>; + children?: { + label: string; + link: string; + allowedPermissions?: PermissionCode[]; + }[]; + link?: string; + color?: string; + allowedPermissions?: PermissionCode[]; +} + +export default SidebarMenu; diff --git a/apps/backend/src/types/index.d.ts b/apps/backend/src/types/index.d.ts new file mode 100644 index 0000000..9d6a3b7 --- /dev/null +++ b/apps/backend/src/types/index.d.ts @@ -0,0 +1,3 @@ +import type SidebarMenu from "./SidebarMenu"; + +export { SidebarMenu }; diff --git a/apps/backend/src/utils/authUtils.ts b/apps/backend/src/utils/authUtils.ts new file mode 100644 index 0000000..12807f3 --- /dev/null +++ b/apps/backend/src/utils/authUtils.ts @@ -0,0 +1,58 @@ +import jwt from "jsonwebtoken"; + +const accessTokenSecret = + process.env.ACCESS_TOKEN_SECRET ?? "some-random-secret"; +const refreshTokenSecret = + process.env.REFRESH_TOKEN_SECRET ?? "some-very-random-secret"; +const algorithm: jwt.Algorithm = "HS256"; + +export const accessTokenExpiry: number | string | null = null; // null for no expiry +export const refreshTokenExpiry: number | string | null = "30d"; // null for no expiry + +interface AccessTokenPayload { + uid: string; +} + +interface RefreshTokenPayload { + uid: string; +} + +export const generateAccessToken = async (payload: AccessTokenPayload) => { + const token = jwt.sign(payload, accessTokenSecret, { + algorithm, + ...(accessTokenExpiry ? { expiresIn: accessTokenExpiry } : {}), + }); + return token; +}; + +export const generateRefreshToken = async (payload: RefreshTokenPayload) => { + const token = jwt.sign(payload, refreshTokenSecret, { + algorithm, + ...(refreshTokenExpiry ? { expiresIn: refreshTokenExpiry } : {}), + }); + return token; +}; + +export const verifyAccessToken = async (token: string) => { + try { + const payload = jwt.verify( + token, + accessTokenSecret + ) as AccessTokenPayload; + return payload; + } catch { + return null; + } +}; + +export const verifyRefreshToken = async (token: string) => { + try { + const payload = jwt.verify( + token, + refreshTokenSecret + ) as RefreshTokenPayload; + return payload; + } catch { + return null; + } +}; diff --git a/apps/backend/src/utils/httpErrors.ts b/apps/backend/src/utils/httpErrors.ts new file mode 100644 index 0000000..a08795b --- /dev/null +++ b/apps/backend/src/utils/httpErrors.ts @@ -0,0 +1,7 @@ +import { HTTPException } from "hono/http-exception"; + +export const forbidden = () => { + throw new HTTPException(403, { + message: "You are not allowed nor authorized to do this action", + }); +}; diff --git a/apps/backend/src/utils/passwordUtils.ts b/apps/backend/src/utils/passwordUtils.ts new file mode 100644 index 0000000..85ba823 --- /dev/null +++ b/apps/backend/src/utils/passwordUtils.ts @@ -0,0 +1,11 @@ +import bcrypt from "bcrypt"; + +const saltRounds = 10; + +export const hashPassword = async (password: string) => { + return await bcrypt.hash(password, saltRounds); +}; + +export const checkPassword = async (password: string, hash: string) => { + return await bcrypt.compare(password, hash); +}; diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json new file mode 100644 index 0000000..3c73f74 --- /dev/null +++ b/apps/backend/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "types": ["node"], + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx" + } +} diff --git a/apps/frontend/.eslintrc.cjs b/apps/frontend/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/apps/frontend/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/apps/frontend/.gitignore b/apps/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/apps/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/frontend/README.md b/apps/frontend/README.md new file mode 100644 index 0000000..0d6babe --- /dev/null +++ b/apps/frontend/README.md @@ -0,0 +1,30 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/apps/frontend/index.html b/apps/frontend/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/apps/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/apps/frontend/package.json b/apps/frontend/package.json new file mode 100644 index 0000000..8f1f3e6 --- /dev/null +++ b/apps/frontend/package.json @@ -0,0 +1,50 @@ +{ + "name": "frontend", + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.4", + "@mantine/core": "^7.9.0", + "@mantine/form": "^7.8.1", + "@mantine/hooks": "^7.9.0", + "@mantine/notifications": "^7.9.0", + "@tanstack/react-query": "^5.32.0", + "@tanstack/react-router": "^1.31.1", + "@tanstack/react-table": "^8.16.0", + "backend": "workspace:*", + "clsx": "^2.1.1", + "hono": "^4.2.9", + "mantine-form-zod-resolver": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.1.0", + "zod": "^3.23.4" + }, + "devDependencies": { + "@tanstack/eslint-plugin-query": "^5.28.11", + "@tanstack/router-devtools": "^1.31.1", + "@tanstack/router-vite-plugin": "^1.30.0", + "@types/node": "^20.11.24", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.19", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "postcss": "^8.4.38", + "postcss-preset-mantine": "^1.15.0", + "postcss-simple-vars": "^7.0.1", + "tailwindcss": "^3.4.3", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } +} diff --git a/apps/frontend/postcss.config.js b/apps/frontend/postcss.config.js new file mode 100644 index 0000000..c5f3b3a --- /dev/null +++ b/apps/frontend/postcss.config.js @@ -0,0 +1,16 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + "postcss-preset-mantine": {}, + "postcss-simple-vars": { + variables: { + "mantine-breakpoint-xs": "36em", + "mantine-breakpoint-sm": "48em", + "mantine-breakpoint-md": "62em", + "mantine-breakpoint-lg": "75em", + "mantine-breakpoint-xl": "88em", + }, + }, + }, +}; diff --git a/apps/frontend/public/vite.svg b/apps/frontend/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/apps/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/frontend/src/App.tsx b/apps/frontend/src/App.tsx new file mode 100644 index 0000000..4eda94d --- /dev/null +++ b/apps/frontend/src/App.tsx @@ -0,0 +1,37 @@ +import { RouterProvider, createRouter } from "@tanstack/react-router"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + +import { MantineProvider } from "@mantine/core"; +import { Notifications } from "@mantine/notifications"; + +import { routeTree } from "./routeTree.gen"; + +import "@mantine/core/styles.css"; +import "@mantine/notifications/styles.css"; + +const queryClient = new QueryClient(); + +const router = createRouter({ + routeTree, + context: { queryClient: queryClient }, + defaultPreloadStaleTime: 0, +}); + +declare module "@tanstack/react-router" { + interface Register { + router: typeof router; + } +} + +function App() { + return ( + + + + + + + ); +} + +export default App; diff --git a/apps/frontend/src/assets/logos/README.md b/apps/frontend/src/assets/logos/README.md new file mode 100644 index 0000000..0e90a65 --- /dev/null +++ b/apps/frontend/src/assets/logos/README.md @@ -0,0 +1,9 @@ +# Logos Folder + +This folder contains graphic assets for logos. + +## Important File + +- `logo.png`: This file is mandatory and will be used as the logo on the dashboard. + +Ensure that the `logo.png` file is always updated as it is crucial for the dashboard's branding. diff --git a/src/assets/logos/logo.png b/apps/frontend/src/assets/logos/logo.png similarity index 100% rename from src/assets/logos/logo.png rename to apps/frontend/src/assets/logos/logo.png diff --git a/apps/frontend/src/assets/react.svg b/apps/frontend/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/apps/frontend/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/dashboard/components/AppHeader.tsx b/apps/frontend/src/components/AppHeader.tsx similarity index 74% rename from src/modules/dashboard/components/AppHeader.tsx rename to apps/frontend/src/components/AppHeader.tsx index ead78fb..a5a62b6 100644 --- a/src/modules/dashboard/components/AppHeader.tsx +++ b/apps/frontend/src/components/AppHeader.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import { useState } from "react"; import { AppShell, Avatar, @@ -9,14 +9,13 @@ import { Text, rem, } from "@mantine/core"; -import Image from "next/image"; -import logo from "@/assets/logos/logo-dsg.png"; +import logo from "@/assets/logos/logo.png"; import cx from "clsx"; import classNames from "./styles/appHeader.module.css"; import { TbChevronDown } from "react-icons/tb"; -import getUserMenus from "../actions/getUserMenus"; -import { useAuth } from "@/modules/auth/contexts/AuthContext"; -import UserMenuItem from "./UserMenuItem"; +// import getUserMenus from "../actions/getUserMenus"; +// import { useAuth } from "@/modules/auth/contexts/AuthContext"; +// import UserMenuItem from "./UserMenuItem"; interface Props { openNavbar: boolean; @@ -32,11 +31,11 @@ interface Props { export default function AppHeader(props: Props) { const [userMenuOpened, setUserMenuOpened] = useState(false); - const { user } = useAuth(); + // const { user } = useAuth(); - const userMenus = getUserMenus().map((item, i) => ( - - )); + // const userMenus = getUserMenus().map((item, i) => ( + // + // )); return ( @@ -47,7 +46,7 @@ export default function AppHeader(props: Props) { hiddenFrom="sm" size="sm" /> - + - {user?.name} + {/* {user?.name} */} + Username Settings - {userMenus} + {/* {userMenus} */} diff --git a/apps/frontend/src/components/AppNavbar.tsx b/apps/frontend/src/components/AppNavbar.tsx new file mode 100644 index 0000000..d44397c --- /dev/null +++ b/apps/frontend/src/components/AppNavbar.tsx @@ -0,0 +1,44 @@ +import { AppShell, ScrollArea } from "@mantine/core"; +import { useQuery } from "@tanstack/react-query"; +import client from "../honoClient"; +import MenuItem from "./NavbarMenuItem"; + +// import MenuItem from "./SidebarMenuItem"; +// import { useAuth } from "@/modules/auth/contexts/AuthContext"; + +/** + * `AppNavbar` is a React functional component that renders the application's navigation bar. + * It utilizes data from `allMenu` to create a list of menu items displayed in a scrollable area. + * + * @returns A React element representing the application's navigation bar. + */ +export default function AppNavbar() { + // const {user} = useAuth(); + + const { data } = useQuery({ + queryKey: ["sidebarData"], + queryFn: async () => { + const res = await client.dashboard.getSidebarItems.$get(); + if (res.ok) { + const data = await res.json(); + + return data; + } + console.error("Error:", res.status, res.statusText); + + //TODO: Handle error properly + throw new Error("Error fetching sidebar data"); + }, + }); + + return ( + + + {data?.map((menu, i) => )} + {/* {user?.sidebarMenus.map((menu, i) => ( + + )) ?? null} */} + + + ); +} diff --git a/src/modules/dashboard/components/DashboardTable.tsx b/apps/frontend/src/components/DashboardTable.tsx similarity index 96% rename from src/modules/dashboard/components/DashboardTable.tsx rename to apps/frontend/src/components/DashboardTable.tsx index 1f7bc15..f5f4e1e 100644 --- a/src/modules/dashboard/components/DashboardTable.tsx +++ b/apps/frontend/src/components/DashboardTable.tsx @@ -1,6 +1,3 @@ -"use client"; -import React from "react"; - import { Table, Center, ScrollArea } from "@mantine/core"; import { Table as ReactTable, flexRender } from "@tanstack/react-table"; @@ -29,7 +26,7 @@ export default function DashboardTable({ table }: Props) { : flexRender( header.column.columnDef.header, header.getContext() - )} + )} ))} diff --git a/src/modules/dashboard/components/SidebarChildMenu.tsx b/apps/frontend/src/components/NavbarChildMenu.tsx similarity index 74% rename from src/modules/dashboard/components/SidebarChildMenu.tsx rename to apps/frontend/src/components/NavbarChildMenu.tsx index f43b8dc..3f09f2f 100644 --- a/src/modules/dashboard/components/SidebarChildMenu.tsx +++ b/apps/frontend/src/components/NavbarChildMenu.tsx @@ -1,10 +1,7 @@ -import React from "react"; - import { Text } from "@mantine/core"; -import classNames from "./styles/sidebarChildMenu.module.css"; -import SidebarMenu from "../types/SidebarMenu"; -import dashboardConfig from "../dashboard.config"; +import classNames from "./styles/navbarChildMenu.module.css"; +import { SidebarMenu } from "backend/types"; interface Props { item: NonNullable[number]; @@ -28,7 +25,7 @@ export default function ChildMenu(props: Props) { component="a" className={classNames.link} - href={`${dashboardConfig.baseRoute}${linkPath}`} + href={`${linkPath}`} fw={props.active ? "bold" : "normal"} > {props.item.label} diff --git a/src/modules/dashboard/components/SidebarMenuItem.tsx b/apps/frontend/src/components/NavbarMenuItem.tsx similarity index 59% rename from src/modules/dashboard/components/SidebarMenuItem.tsx rename to apps/frontend/src/components/NavbarMenuItem.tsx index a0c9a9d..fc0e202 100644 --- a/src/modules/dashboard/components/SidebarMenuItem.tsx +++ b/apps/frontend/src/components/NavbarMenuItem.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import { useState } from "react"; import { Box, @@ -11,17 +11,21 @@ import { import { TbChevronRight } from "react-icons/tb"; import * as TbIcons from "react-icons/tb"; -import ChildMenu from "./SidebarChildMenu"; -import classNames from "./styles/sidebarMenuItem.module.css"; -import SidebarMenu from "../types/SidebarMenu"; -import dashboardConfig from "../dashboard.config"; -import { usePathname } from "next/navigation"; -import areURLsSame from "@/utils/areUrlSame"; +import classNames from "./styles/navbarMenuItem.module.css"; +// import dashboardConfig from "../dashboard.config"; +// import { usePathname } from "next/navigation"; +// import areURLsSame from "@/utils/areUrlSame"; + +import { SidebarMenu } from "backend/types"; +import ChildMenu from "./NavbarChildMenu"; +import { Link } from "@tanstack/react-router"; interface Props { menu: SidebarMenu; } +//TODO: Make bold and collapsed when the item is active + /** * `MenuItem` is a React functional component that displays an individual menu item. * It can optionally include a collapsible sub-menu for items with children. @@ -33,9 +37,14 @@ interface Props { export default function MenuItem({ menu }: Props) { const hasChildren = Array.isArray(menu.children); - const pathname = usePathname() + // const pathname = usePathname(); - const [opened, setOpened] = useState(menu.children?.some(child => areURLsSame(`${dashboardConfig.baseRoute}${child.link}`, pathname)) ?? false); + const [opened, setOpened] = useState( + // menu.children?.some((child) => + // areURLsSame(`${dashboardConfig.baseRoute}${child.link}`, pathname) + // ) ?? false + false + ); const toggleOpenMenu = () => { setOpened((prev) => !prev); @@ -43,23 +52,28 @@ export default function MenuItem({ menu }: Props) { // Mapping children menu items if available const subItems = (hasChildren ? menu.children! : []).map((child, index) => ( - + )); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const Icons = TbIcons as any; - const Icon = typeof menu.icon === "string" ? Icons[menu.icon] : menu.icon; + const Icon = + typeof menu.icon.tb === "string" ? Icons[menu.icon.tb] : menu.icon.tb; - const isActive = areURLsSame(`${dashboardConfig.baseRoute}${menu.link}`, pathname) + // const isActive = areURLsSame( + // `${dashboardConfig.baseRoute}${menu.link}`, + // pathname + // ); return ( <> {/* Main Menu Item */} - + onClick={toggleOpenMenu} - className={classNames.control} - href={menu.link ? dashboardConfig.baseRoute + menu.link : ""} - component={menu.link ? "a" : "button"} + className={`${classNames.control} py-2`} + to={menu.link} + component={menu.link ? Link : "button"} > {/* Icon and Label */} @@ -68,7 +82,9 @@ export default function MenuItem({ menu }: Props) { - {menu.label} + + {menu.label} + {/* Chevron Icon for collapsible items */} diff --git a/src/modules/dashboard/components/styles/appHeader.module.css b/apps/frontend/src/components/styles/appHeader.module.css similarity index 100% rename from src/modules/dashboard/components/styles/appHeader.module.css rename to apps/frontend/src/components/styles/appHeader.module.css diff --git a/apps/frontend/src/components/styles/navbarChildMenu.module.css b/apps/frontend/src/components/styles/navbarChildMenu.module.css new file mode 100644 index 0000000..5ddaa44 --- /dev/null +++ b/apps/frontend/src/components/styles/navbarChildMenu.module.css @@ -0,0 +1,23 @@ +.link { + font-weight: 500; + display: block; + text-decoration: none; + padding: var(--mantine-spacing-xs) var(--mantine-spacing-md); + padding-left: var(--mantine-spacing-md); + margin-left: var(--mantine-spacing-xl); + font-size: var(--mantine-font-size-sm); + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-0)); + border-left: 1px solid + light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + + @mixin hover { + background-color: light-dark( + var(--mantine-color-gray-0), + var(--mantine-color-dark-7) + ); + color: light-dark( + var(--mantine-color-black), + var(--mantine-color-dark-0) + ); + } +} diff --git a/apps/frontend/src/components/styles/navbarMenuItem.module.css b/apps/frontend/src/components/styles/navbarMenuItem.module.css new file mode 100644 index 0000000..e83329a --- /dev/null +++ b/apps/frontend/src/components/styles/navbarMenuItem.module.css @@ -0,0 +1,23 @@ +.control { + font-weight: 500; + display: block; + width: 100%; + padding: var(--mantine-spacing-xs) var(--mantine-spacing-md); + color: var(--mantine-color-text); + font-size: var(--mantine-font-size-sm); + + @mixin hover { + background-color: light-dark( + var(--mantine-color-gray-0), + var(--mantine-color-dark-7) + ); + color: light-dark( + var(--mantine-color-black), + var(--mantine-color-dark-0) + ); + } +} + +.chevron { + transition: transform 200ms ease; +} diff --git a/apps/frontend/src/honoClient.ts b/apps/frontend/src/honoClient.ts new file mode 100644 index 0000000..13f409f --- /dev/null +++ b/apps/frontend/src/honoClient.ts @@ -0,0 +1,10 @@ +import { hc } from "hono/client"; +import { AppType } from "backend"; + +const client = hc("http://localhost:3000", { + headers: { + Authorization: `Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJkeG5icHQ0N3BwdXZ6NW1vbTF1NjF5cnMiLCJpYXQiOjE3MTQ1NjY4MDB9.920-iiSuLiPK0t0GiWIuT_n8BHngPxp1FyvYZ7SBJ7E`, + }, +}); + +export default client; diff --git a/apps/frontend/src/index.css b/apps/frontend/src/index.css new file mode 100644 index 0000000..e69de29 diff --git a/apps/frontend/src/main.tsx b/apps/frontend/src/main.tsx new file mode 100644 index 0000000..dca3695 --- /dev/null +++ b/apps/frontend/src/main.tsx @@ -0,0 +1,11 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App.tsx"; +import "./index.css"; +import "./styles/tailwind.css"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + +); diff --git a/apps/frontend/src/modules/usersManagement/modals/UserDeleteModal.tsx b/apps/frontend/src/modules/usersManagement/modals/UserDeleteModal.tsx new file mode 100644 index 0000000..3f791c4 --- /dev/null +++ b/apps/frontend/src/modules/usersManagement/modals/UserDeleteModal.tsx @@ -0,0 +1,106 @@ +import client from "@/honoClient"; +import { Button, Flex, Modal, Text } from "@mantine/core"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { getRouteApi, useSearch } from "@tanstack/react-router"; +import { deleteUser } from "../queries/userQueries"; +import { notifications } from "@mantine/notifications"; + +const routeApi = getRouteApi("/_dashboardLayout/users/"); + +export default function UserDeleteModal() { + const queryClient = useQueryClient(); + + const searchParams = useSearch({ from: "/_dashboardLayout/users/" }) as { + delete: string; + }; + + const userId = searchParams.delete; + const navigate = routeApi.useNavigate(); + + const userQuery = useQuery({ + queryKey: ["users", userId], + queryFn: async () => { + if (!userId) return null; + const res = await client.users[":id"].$get({ + param: { + id: userId, + }, + query: {}, + }); + + if (res.ok) { + console.log("ok"); + return await res.json(); + } + console.log("not ok"); + throw new Error(await res.text()); + }, + }); + + const mutation = useMutation({ + mutationKey: ["deleteUserMutation"], + mutationFn: async ({ id }: { id: string }) => { + return await deleteUser(id); + }, + onError: (error) => { + try { + const message = JSON.parse(error.message); + notifications.show({ + message: message.message ?? "Failed to delete User.", + color: "red", + }); + } catch (e) { + console.log(error); + } + }, + onSuccess: () => { + notifications.show({ + message: "User deleted successfully.", + color: "green", + }); + queryClient.removeQueries({ queryKey: ["user", userId] }); + queryClient.invalidateQueries({ queryKey: ["users"] }); + navigate({ search: {} }); + }, + }); + + const isModalOpen = Boolean(searchParams.delete && userQuery.data); + + return ( + navigate({ search: {} })} + title={`Delete confirmation`} + > + + Are you sure you want to delete user{" "} + + {userQuery.data?.name} + + ? This action is irreversible. + + + {/* {errorMessage && {errorMessage}} */} + {/* Buttons */} + + + + + + ); +} diff --git a/apps/frontend/src/modules/usersManagement/modals/UserFormModal.tsx b/apps/frontend/src/modules/usersManagement/modals/UserFormModal.tsx new file mode 100644 index 0000000..5c1998f --- /dev/null +++ b/apps/frontend/src/modules/usersManagement/modals/UserFormModal.tsx @@ -0,0 +1,275 @@ +import stringToColorHex from "@/utils/stringToColorHex"; +import { + Avatar, + Button, + Center, + Flex, + Modal, + MultiSelect, + PasswordInput, + ScrollArea, + Stack, + TextInput, +} from "@mantine/core"; +import { useForm } from "@mantine/form"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { getRouteApi, useSearch } from "@tanstack/react-router"; +import { createUser, updateUser } from "../queries/userQueries"; +import { TbDeviceFloppy } from "react-icons/tb"; +import client from "../../../honoClient"; +import { useEffect } from "react"; +import { notifications } from "@mantine/notifications"; + +const routeApi = getRouteApi("/_dashboardLayout/users/"); + +export default function UserFormModal() { + const searchParams = useSearch({ from: "/_dashboardLayout/users/" }) as { + detail: string; + edit: string; + create: boolean; + }; + + const queryClient = useQueryClient(); + + const userId = searchParams.detail || searchParams.edit; + + const rolesQuery = useQuery({ + queryKey: ["roles"], + queryFn: async () => { + const res = await client.roles.$get(); + + if (res.ok) { + return await res.json(); + } + + throw new Error(await res.text()); + }, + }); + + const userQuery = useQuery({ + queryKey: ["users", userId], + enabled: Boolean(userId), + queryFn: async () => { + if (!userId) return null; + const res = await client.users[":id"].$get({ + param: { + id: userId, + }, + query: {}, + }); + + if (res.ok) { + console.log("ok"); + return await res.json(); + } + console.log("not ok"); + throw new Error(await res.text()); + }, + }); + + const isModalOpen = + Boolean(userId && userQuery.data) || searchParams.create; + + const mutation = useMutation({ + mutationKey: ["usersMutation"], + mutationFn: async ( + options: + | { action: "edit"; data: Parameters[0] } + | { action: "create"; data: Parameters[0] } + ) => { + console.log("called"); + return options.action === "edit" + ? await updateUser(options.data) + : await createUser(options.data); + }, + onError: (error) => { + try { + form.setErrors(JSON.parse(JSON.parse(error.message).message)); + } catch (e) { + console.error(e); + } + }, + }); + + const navigate = routeApi.useNavigate(); + + const detailId = searchParams.detail; + const editId = searchParams.edit; + + const formType = detailId ? "detail" : editId ? "edit" : "create"; + const modalTitle = + formType.charAt(0).toUpperCase() + formType.slice(1) + " User"; + + const form = useForm({ + initialValues: { + id: "", + email: "", + name: "", + username: "", + photoProfileUrl: "", + password: "", + roles: [] as string[], + }, + // validate: zodResolver(userFormDataSchema), + // validateInputOnChange: false, + }); + + useEffect(() => { + const data = userQuery.data; + + if (!data) { + form.reset(); + return; + } + + form.setValues({ + id: data.id, + email: data.email ?? "", + name: data.name, + photoProfileUrl: "", + username: data.username, + password: "", + roles: data.roles.map((v) => v.id), //only extract the id + }); + + form.setErrors({}); + }, [userQuery.data]); + + const handleSubmit = async (values: typeof form.values) => { + if (formType === "detail") return; + + //TODO: OPtimize this code + if (formType === "create") { + await mutation.mutateAsync({ + action: formType, + data: { + email: values.email, + name: values.name, + password: values.password, + roles: JSON.stringify(values.roles), + isEnabled: "true", + username: values.username, + }, + }); + } else { + await mutation.mutateAsync({ + action: formType, + data: { + id: values.id, + email: values.email, + name: values.name, + password: values.password, + roles: JSON.stringify(values.roles), + isEnabled: "true", + username: values.username, + }, + }); + } + queryClient.invalidateQueries({ queryKey: ["users"] }); + notifications.show({ + message: `The ser is ${formType === "create" ? "created" : "edited"}`, + }); + + navigate({ search: {} }); + }; + + return ( + navigate({ search: {} })} + title={modalTitle} //Uppercase first letter + scrollAreaComponent={ScrollArea.Autosize} + size="md" + > +
handleSubmit(values))}> + + {/* Avatar */} +
+ + {form.values.name?.[0]?.toUpperCase()} + +
+
+ + {form.values.id && ( + + )} + + + + + + + + {formType === "create" && ( + + )} + + {/* Role */} + form.setFieldValue("roles", values)} + data={rolesQuery.data?.map((role) => ({ + value: role.id, + label: role.name, + }))} + error={form.errors.roles} + /> + + {/* Buttons */} + + + {formType !== "detail" && ( + + )} + + +
+ ); +} diff --git a/apps/frontend/src/modules/usersManagement/queries/userQueries.ts b/apps/frontend/src/modules/usersManagement/queries/userQueries.ts new file mode 100644 index 0000000..549e282 --- /dev/null +++ b/apps/frontend/src/modules/usersManagement/queries/userQueries.ts @@ -0,0 +1,73 @@ +import client from "@/honoClient"; +import { queryOptions } from "@tanstack/react-query"; +import { InferRequestType } from "hono"; + +export const userQueryOptions = queryOptions({ + queryKey: ["users"], + queryFn: () => fetchUsers(), +}); + +export const fetchUsers = async () => { + const res = await client.users.$get({ + query: {}, + }); + + if (res.ok) { + return await res.json(); + } + + //TODO: Handle error + throw new Error(res.statusText); +}; + +export const createUser = async ( + form: InferRequestType["form"] +) => { + const res = await client.users.$post({ + form, + }); + + if (res.ok) { + return await res.json(); + } + + //TODO: Handle error + throw Error(await res.text()); +}; + +export const updateUser = async ( + form: InferRequestType<(typeof client.users)[":id"]["$patch"]>["form"] & { + id: string; + } +) => { + form; + const res = await client.users[":id"].$patch({ + param: { + id: form.id, + }, + form, + }); + + if (res.ok) { + return await res.json(); + } + + //TODO: Handle error + throw new Error(await res.text()); +}; + +export const deleteUser = async (id: string) => { + const res = await client.users[":id"].$delete({ + param: { + id, + }, + form: {}, + }); + + if (res.ok) { + return await res.json(); + } + + //TODO: Handle error + throw new Error(await res.text()); +}; diff --git a/apps/frontend/src/modules/usersManagement/tables/UsersTable.tsx b/apps/frontend/src/modules/usersManagement/tables/UsersTable.tsx new file mode 100644 index 0000000..e7b0ef5 --- /dev/null +++ b/apps/frontend/src/modules/usersManagement/tables/UsersTable.tsx @@ -0,0 +1,74 @@ +import { Button, Flex, Text } from "@mantine/core"; +import { Link, getRouteApi } from "@tanstack/react-router"; +import React from "react"; +import { TbPlus } from "react-icons/tb"; +import DashboardTable from "../../../components/DashboardTable"; +import { getCoreRowModel, useReactTable } from "@tanstack/react-table"; +import createColumns from "./columns"; +import { useSuspenseQuery } from "@tanstack/react-query"; +import { userQueryOptions } from "../queries/userQueries"; +import UserFormModal from "../modals/UserFormModal"; +import UserDeleteModal from "../modals/UserDeleteModal"; + +const routeApi = getRouteApi("/_dashboardLayout/users/"); + +export default function UsersTable() { + const navigate = routeApi.useNavigate(); + + const usersQuery = useSuspenseQuery(userQueryOptions); + + const table = useReactTable({ + data: usersQuery.data, + columns: createColumns({ + permissions: { + create: true, + read: true, + delete: true, + update: true, + }, + actions: { + detail: (id: string) => + navigate({ + search: { + detail: id, + }, + }), + edit: (id: string) => + navigate({ + search: { + edit: id, + }, + }), + delete: (id: string) => + navigate({ + search: { + delete: id, + }, + }), + }, + }), + getCoreRowModel: getCoreRowModel(), + defaultColumn: { + cell: (props) => {props.getValue() as React.ReactNode}, + }, + }); + + return ( + <> + + + + + + + + + + ); +} diff --git a/src/modules/userManagement/tables/UsersTable/columns.tsx b/apps/frontend/src/modules/usersManagement/tables/columns.tsx similarity index 76% rename from src/modules/userManagement/tables/UsersTable/columns.tsx rename to apps/frontend/src/modules/usersManagement/tables/columns.tsx index 28e100b..581d4c0 100644 --- a/src/modules/userManagement/tables/UsersTable/columns.tsx +++ b/apps/frontend/src/modules/usersManagement/tables/columns.tsx @@ -1,21 +1,15 @@ import { createColumnHelper } from "@tanstack/react-table"; import { Badge, Flex, Group, Avatar, Text, Anchor } from "@mantine/core"; import { TbEye, TbPencil, TbTrash } from "react-icons/tb"; -import CrudPermissions from "@/modules/dashboard/types/CrudPermissions"; -import stringToColorHex from "@/core/utils/stringToColorHex"; -import Link from "next/link"; -import createActionButtons from "@/modules/dashboard/utils/createActionButton"; - -export interface UserRow { - id: string; - name: string | null; - email: string | null; - photoUrl: string | null; - roles: string[] -} +import { CrudPermission } from "@/types"; +import stringToColorHex from "@/utils/stringToColorHex"; +import createActionButtons from "@/utils/createActionButton"; +import client from "@/honoClient"; +import { InferResponseType } from "hono"; +import { Link } from "@tanstack/react-router"; interface ColumnOptions { - permissions: Partial; + permissions: Partial; actions: { detail: (id: string) => void; edit: (id: string) => void; @@ -24,7 +18,10 @@ interface ColumnOptions { } const createColumns = (options: ColumnOptions) => { - const columnHelper = createColumnHelper(); + const columnHelper = + createColumnHelper< + InferResponseType[number] + >(); const columns = [ columnHelper.display({ @@ -40,7 +37,7 @@ const createColumns = (options: ColumnOptions) => { {props.getValue()?.[0].toUpperCase()} @@ -56,7 +53,7 @@ const createColumns = (options: ColumnOptions) => { header: "Email", cell: (props) => ( @@ -65,10 +62,10 @@ const createColumns = (options: ColumnOptions) => { ), }), - columnHelper.accessor("roles", { - header: "Role", - cell: (props) => {props.getValue()[0]} - }), + // columnHelper.accessor("roles", { + // header: "Role", + // cell: (props) => {props.getValue()[0]}, + // }), columnHelper.display({ id: "status", diff --git a/apps/frontend/src/routeTree.gen.ts b/apps/frontend/src/routeTree.gen.ts new file mode 100644 index 0000000..e398fcb --- /dev/null +++ b/apps/frontend/src/routeTree.gen.ts @@ -0,0 +1,96 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +import { createFileRoute } from '@tanstack/react-router' + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as DashboardLayoutImport } from './routes/_dashboardLayout' +import { Route as LoginIndexImport } from './routes/login/index' +import { Route as DashboardLayoutDashboardIndexImport } from './routes/_dashboardLayout/dashboard/index' + +// Create Virtual Routes + +const IndexLazyImport = createFileRoute('/')() +const DashboardLayoutUsersIndexLazyImport = createFileRoute( + '/_dashboardLayout/users/', +)() + +// Create/Update Routes + +const DashboardLayoutRoute = DashboardLayoutImport.update({ + id: '/_dashboardLayout', + getParentRoute: () => rootRoute, +} as any) + +const IndexLazyRoute = IndexLazyImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any).lazy(() => import('./routes/index.lazy').then((d) => d.Route)) + +const LoginIndexRoute = LoginIndexImport.update({ + path: '/login/', + getParentRoute: () => rootRoute, +} as any) + +const DashboardLayoutUsersIndexLazyRoute = + DashboardLayoutUsersIndexLazyImport.update({ + path: '/users/', + getParentRoute: () => DashboardLayoutRoute, + } as any).lazy(() => + import('./routes/_dashboardLayout/users/index.lazy').then((d) => d.Route), + ) + +const DashboardLayoutDashboardIndexRoute = + DashboardLayoutDashboardIndexImport.update({ + path: '/dashboard/', + getParentRoute: () => DashboardLayoutRoute, + } as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + preLoaderRoute: typeof IndexLazyImport + parentRoute: typeof rootRoute + } + '/_dashboardLayout': { + preLoaderRoute: typeof DashboardLayoutImport + parentRoute: typeof rootRoute + } + '/login/': { + preLoaderRoute: typeof LoginIndexImport + parentRoute: typeof rootRoute + } + '/_dashboardLayout/dashboard/': { + preLoaderRoute: typeof DashboardLayoutDashboardIndexImport + parentRoute: typeof DashboardLayoutImport + } + '/_dashboardLayout/users/': { + preLoaderRoute: typeof DashboardLayoutUsersIndexLazyImport + parentRoute: typeof DashboardLayoutImport + } + } +} + +// Create and export the route tree + +export const routeTree = rootRoute.addChildren([ + IndexLazyRoute, + DashboardLayoutRoute.addChildren([ + DashboardLayoutDashboardIndexRoute, + DashboardLayoutUsersIndexLazyRoute, + ]), + LoginIndexRoute, +]) + +/* prettier-ignore-end */ diff --git a/apps/frontend/src/routes/__root.tsx b/apps/frontend/src/routes/__root.tsx new file mode 100644 index 0000000..72086a5 --- /dev/null +++ b/apps/frontend/src/routes/__root.tsx @@ -0,0 +1,16 @@ +import { QueryClient } from "@tanstack/react-query"; +import { Outlet, createRootRouteWithContext } from "@tanstack/react-router"; +import { TanStackRouterDevtools } from "@tanstack/router-devtools"; + +interface RouteContext { + queryClient: QueryClient; +} + +export const Route = createRootRouteWithContext()({ + component: () => ( + <> + + + + ), +}); diff --git a/apps/frontend/src/routes/_dashboardLayout.tsx b/apps/frontend/src/routes/_dashboardLayout.tsx new file mode 100644 index 0000000..ad398d8 --- /dev/null +++ b/apps/frontend/src/routes/_dashboardLayout.tsx @@ -0,0 +1,54 @@ +import { AppShell } from "@mantine/core"; +import { Outlet, createFileRoute, useNavigate } from "@tanstack/react-router"; +import { useDisclosure } from "@mantine/hooks"; +import AppHeader from "../components/AppHeader"; +import AppNavbar from "../components/AppNavbar"; +import isAuthenticated from "@/utils/isAuthenticated"; +import { useEffect } from "react"; + +export const Route = createFileRoute("/_dashboardLayout")({ + component: DashboardLayout, + + // beforeLoad: ({ location }) => { + // if (true) { + // throw redirect({ + // to: "/login", + // }); + // } + // }, +}); + +function DashboardLayout() { + const [openNavbar, { toggle }] = useDisclosure(false); + + const navigate = useNavigate(); + + useEffect(() => { + if (!isAuthenticated()) { + navigate({ to: "/login", replace: true }); + } + }, [navigate]); + + return ( + + + + + + + + + + ); +} diff --git a/apps/frontend/src/routes/_dashboardLayout/README.md b/apps/frontend/src/routes/_dashboardLayout/README.md new file mode 100644 index 0000000..273efcb --- /dev/null +++ b/apps/frontend/src/routes/_dashboardLayout/README.md @@ -0,0 +1,3 @@ +This is dashboard layout folder + +Any routes that inside this folder will have Dashboard Header and Navbar diff --git a/apps/frontend/src/routes/_dashboardLayout/dashboard/index.tsx b/apps/frontend/src/routes/_dashboardLayout/dashboard/index.tsx new file mode 100644 index 0000000..33810e1 --- /dev/null +++ b/apps/frontend/src/routes/_dashboardLayout/dashboard/index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/_dashboardLayout/dashboard/")({ + component: () =>
Hello /dashboard/!
, +}); diff --git a/apps/frontend/src/routes/_dashboardLayout/users/index.lazy.tsx b/apps/frontend/src/routes/_dashboardLayout/users/index.lazy.tsx new file mode 100644 index 0000000..c79efc0 --- /dev/null +++ b/apps/frontend/src/routes/_dashboardLayout/users/index.lazy.tsx @@ -0,0 +1,33 @@ +import { Card, Stack, Title } from "@mantine/core"; +import { createFileRoute } from "@tanstack/react-router"; +import UsersTable from "../../../modules/usersManagement/tables/UsersTable"; +import { z } from "zod"; +import { userQueryOptions } from "@/modules/usersManagement/queries/userQueries"; + +const searchParamSchema = z.object({ + create: z.boolean().default(false).optional(), + edit: z.string().default("").optional(), + delete: z.string().default("").optional(), + detail: z.string().default("").optional(), +}); + +export const Route = createFileRoute("/_dashboardLayout/users/")({ + component: UsersPage, + + validateSearch: searchParamSchema, + + loader: ({ context: { queryClient } }) => { + queryClient.ensureQueryData(userQueryOptions); + }, +}); + +export default function UsersPage() { + return ( + + Users + + + + + ); +} diff --git a/apps/frontend/src/routes/index.lazy.tsx b/apps/frontend/src/routes/index.lazy.tsx new file mode 100644 index 0000000..71343ca --- /dev/null +++ b/apps/frontend/src/routes/index.lazy.tsx @@ -0,0 +1,5 @@ +import { createLazyFileRoute } from "@tanstack/react-router"; + +export const Route = createLazyFileRoute("/")({ + component: () =>
Hello !
, +}); diff --git a/apps/frontend/src/routes/login/index.tsx b/apps/frontend/src/routes/login/index.tsx new file mode 100644 index 0000000..d4a7007 --- /dev/null +++ b/apps/frontend/src/routes/login/index.tsx @@ -0,0 +1,153 @@ +import { createFileRoute, useNavigate } from "@tanstack/react-router"; +import { useMutation } from "@tanstack/react-query"; +import { + Paper, + PasswordInput, + Stack, + Text, + TextInput, + Group, + Button, + Alert, +} from "@mantine/core"; +import client from "../../honoClient"; +import { useForm } from "@mantine/form"; +import { z } from "zod"; +import { zodResolver } from "mantine-form-zod-resolver"; +import { useEffect, useState } from "react"; +import isAuthenticated from "@/utils/isAuthenticated"; + +export const Route = createFileRoute("/login/")({ + component: LoginPage, +}); + +type FormSchema = { + username: string; + password: string; +}; + +const formSchema = z.object({ + username: z.string().min(1, "This field is required"), + password: z.string().min(1, "This field is required"), +}); + +export default function LoginPage() { + const [errorMessage, setErrorMessage] = useState(""); + const navigate = useNavigate(); + + const form = useForm({ + initialValues: { + username: "", + password: "", + }, + validate: zodResolver(formSchema), + }); + + useEffect(() => { + if (isAuthenticated()) { + navigate({ + to: "/dashboard", + replace: true, + }); + } + }, []); + + const loginMutation = useMutation({ + mutationFn: async (values: FormSchema) => { + const res = await client.auth.login.$post({ + form: values, + }); + + if (res.ok) { + return await res.json(); + } + + throw res; + }, + + onSuccess: (data) => { + console.log(data); + + localStorage.setItem("accessToken", data.accessToken); + + navigate({ + to: "/dashboard", + }); + }, + + onError: async (error) => { + console.log("error!"); + if (error instanceof Response) { + const body = await error.json(); + setErrorMessage(body.message as string); + return; + } + console.log("bukan error"); + }, + }); + + const handleSubmit = (values: FormSchema) => { + loginMutation.mutate(values); + }; + + return ( +
+ + + Welcome + +
+ + {errorMessage ? ( + + {errorMessage} + + ) : null} + + + + + + {/* + Don't have an account? Register + */} +
+ + + + + +
+ ); +} diff --git a/apps/frontend/src/styles/tailwind.css b/apps/frontend/src/styles/tailwind.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/apps/frontend/src/styles/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/apps/frontend/src/types/CrudPermission.d.ts b/apps/frontend/src/types/CrudPermission.d.ts new file mode 100644 index 0000000..1b945d2 --- /dev/null +++ b/apps/frontend/src/types/CrudPermission.d.ts @@ -0,0 +1,8 @@ +type CrudPermissions = { + create: boolean; + read: boolean; + update: boolean; + delete: boolean; +}; + +export default CrudPermissions; diff --git a/apps/frontend/src/types/index.d.ts b/apps/frontend/src/types/index.d.ts new file mode 100644 index 0000000..38925ff --- /dev/null +++ b/apps/frontend/src/types/index.d.ts @@ -0,0 +1,3 @@ +import type CrudPermission from "./CrudPermission"; + +export { CrudPermission }; diff --git a/src/modules/dashboard/utils/createActionButton.tsx b/apps/frontend/src/utils/createActionButton.tsx similarity index 85% rename from src/modules/dashboard/utils/createActionButton.tsx rename to apps/frontend/src/utils/createActionButton.tsx index 59875b9..ae8f2a6 100644 --- a/src/modules/dashboard/utils/createActionButton.tsx +++ b/apps/frontend/src/utils/createActionButton.tsx @@ -4,7 +4,7 @@ import { MantineColor, Tooltip, } from "@mantine/core"; -import Link from "next/link"; +import { Link } from "@tanstack/react-router"; import React from "react"; interface Action { @@ -24,12 +24,13 @@ export default function createActionButtons(actions: Action[]) { const elements = actions.map((action, i) => action.permission ? ( - {typeof action.action === "string" || action.action === undefined ? ( + {typeof action.action === "string" || + action.action === undefined ? ( {action.icon} diff --git a/apps/frontend/src/utils/isAuthenticated.ts b/apps/frontend/src/utils/isAuthenticated.ts new file mode 100644 index 0000000..6e44146 --- /dev/null +++ b/apps/frontend/src/utils/isAuthenticated.ts @@ -0,0 +1,6 @@ +function isAuthenticated(): boolean { + const accessToken = localStorage.getItem("accessToken"); + return accessToken !== null; +} + +export default isAuthenticated; diff --git a/src/core/utils/stringToColorHex.ts b/apps/frontend/src/utils/stringToColorHex.ts similarity index 52% rename from src/core/utils/stringToColorHex.ts rename to apps/frontend/src/utils/stringToColorHex.ts index d5693c2..a2118cf 100644 --- a/src/core/utils/stringToColorHex.ts +++ b/apps/frontend/src/utils/stringToColorHex.ts @@ -1,26 +1,26 @@ /** * Generates a consistent hex color code from a given string. - * + * * The function uses a hash algorithm to convert the input string into a number, * which is then converted into a hexadecimal color code. The same input string * will always produce the same color hex code. - * + * * @param inputString - The input string from which the color is generated. * @returns The generated hex color code. */ export default function stringToColorHex(inputString: string): string { - // Hash function to convert string to number - let hash = 0; - for (let i = 0; i < inputString.length; i++) { - hash = inputString.charCodeAt(i) + ((hash << 5) - hash); - } + // Hash function to convert string to number + let hash = 0; + for (let i = 0; i < inputString.length; i++) { + hash = inputString.charCodeAt(i) + ((hash << 5) - hash); + } - // Convert the number to a hex color code - let color = '#'; - for (let i = 0; i < 3; i++) { - const value = (hash >> (i * 8)) & 0xFF; - color += ('00' + value.toString(16)).substr(-2); - } + // Convert the number to a hex color code + let color = "#"; + for (let i = 0; i < 3; i++) { + const value = (hash >> (i * 8)) & 0xff; + color += ("00" + value.toString(16)).substr(-2); + } - return color; -} \ No newline at end of file + return color; +} diff --git a/apps/frontend/src/vite-env.d.ts b/apps/frontend/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/apps/frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/frontend/tailwind.config.js b/apps/frontend/tailwind.config.js new file mode 100644 index 0000000..f7de5e9 --- /dev/null +++ b/apps/frontend/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/apps/frontend/tsconfig.json b/apps/frontend/tsconfig.json new file mode 100644 index 0000000..aa30e69 --- /dev/null +++ b/apps/frontend/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/apps/frontend/tsconfig.node.json b/apps/frontend/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/apps/frontend/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts new file mode 100644 index 0000000..b478f1e --- /dev/null +++ b/apps/frontend/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; +import { TanStackRouterVite } from "@tanstack/router-vite-plugin"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), TanStackRouterVite()], + resolve: { + alias: { + "@": "/src", + }, + }, +}); diff --git a/env.ts b/env.ts deleted file mode 100644 index a7863d8..0000000 --- a/env.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { z } from "zod"; -const envVariables = z.object({ - DATABASE_URL: z.string(), - JWT_SECRET: z.string(), - WS_PORT: z.string().optional(), - WS_HOST: z.string().optional(), - ERROR_LOG_PATH: z.string() -}); -envVariables.parse(process.env); - -declare global { - namespace NodeJS { - interface ProcessEnv extends z.infer {} - } -} diff --git a/logs/.gitignore b/logs/.gitignore deleted file mode 100644 index bf0824e..0000000 --- a/logs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.log \ No newline at end of file diff --git a/next.config.js b/next.config.js deleted file mode 100644 index 767719f..0000000 --- a/next.config.js +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = {} - -module.exports = nextConfig diff --git a/package.json b/package.json index e38b522..982e593 100644 --- a/package.json +++ b/package.json @@ -1,63 +1,20 @@ { - "name": "dashboard-template", - "version": "0.0.1", + "name": "dashboard-template-v2", "private": true, "scripts": { - "check-env": "ts-node env.ts && run ./env.ts", - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "prisma": { - "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts" - }, - "dependencies": { - "@auth/prisma-adapter": "^1.1.0", - "@mantine/core": "^7.7.1", - "@mantine/form": "^7.7.1", - "@mantine/hooks": "^7.7.1", - "@mantine/notifications": "^7.7.1", - "@prisma/client": "5.11.0", - "@tanstack/react-query": "^4.36.1", - "@tanstack/react-query-devtools": "^4.36.1", - "@tanstack/react-table": "^8.11.7", - "@trpc/client": "^10.45.0", - "@trpc/next": "^10.45.0", - "@trpc/react-query": "^10.45.0", - "@trpc/server": "^10.45.0", - "@types/bcrypt": "^5.0.2", - "@types/jsonwebtoken": "^9.0.5", - "@typescript-eslint/eslint-plugin": "^6.19.1", - "bcrypt": "^5.1.1", - "client-only": "^0.0.1", - "clsx": "^2.1.0", - "date-fns": "^3.3.1", - "jsonwebtoken": "^9.0.2", - "mantine-form-zod-resolver": "^1.1.0", - "next": "14.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-icons": "^5.0.1", - "sass": "^1.70.0", - "server-only": "^0.0.1", - "superjson": "^2.2.1", - "ts-node": "^10.9.2", - "zod": "^3.22.4" + "build": "turbo build", + "dev": "turbo dev", + "lint": "turbo lint", + "format": "prettier --write \"**/*.{ts,tsx,md}\"" }, "devDependencies": { - "@types/bun": "^1.0.5", - "@types/node": "^20.11.7", - "@types/react": "^18.2.48", - "@types/react-dom": "^18.2.18", - "autoprefixer": "^10.4.17", - "eslint": "^8.56.0", - "eslint-config-next": "14.0.4", - "postcss": "^8.4.33", - "postcss-preset-mantine": "^1.12.3", - "postcss-simple-vars": "^7.0.1", - "prisma": "^5.11.0", - "tailwindcss": "^3.4.1", - "typescript": "^5.3.3" + "@repo/eslint-config": "workspace:*", + "@repo/typescript-config": "workspace:*", + "prettier": "^3.2.5", + "turbo": "latest" + }, + "packageManager": "pnpm@8.9.0", + "engines": { + "node": ">=18" } -} \ No newline at end of file +} diff --git a/packages/eslint-config/README.md b/packages/eslint-config/README.md new file mode 100644 index 0000000..8b42d90 --- /dev/null +++ b/packages/eslint-config/README.md @@ -0,0 +1,3 @@ +# `@turbo/eslint-config` + +Collection of internal eslint configurations. diff --git a/packages/eslint-config/library.js b/packages/eslint-config/library.js new file mode 100644 index 0000000..c667cd1 --- /dev/null +++ b/packages/eslint-config/library.js @@ -0,0 +1,34 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["eslint:recommended", "prettier", "eslint-config-turbo"], + plugins: ["only-warn"], + globals: { + React: true, + JSX: true, + }, + env: { + node: true, + }, + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: [ + // Ignore dotfiles + ".*.js", + "node_modules/", + "dist/", + ], + overrides: [ + { + files: ["*.js?(x)", "*.ts?(x)"], + }, + ], +}; diff --git a/packages/eslint-config/next.js b/packages/eslint-config/next.js new file mode 100644 index 0000000..6000e54 --- /dev/null +++ b/packages/eslint-config/next.js @@ -0,0 +1,35 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: [ + "eslint:recommended", + "prettier", + require.resolve("@vercel/style-guide/eslint/next"), + "eslint-config-turbo", + ], + globals: { + React: true, + JSX: true, + }, + env: { + node: true, + browser: true, + }, + plugins: ["only-warn"], + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: [ + // Ignore dotfiles + ".*.js", + "node_modules/", + ], + overrides: [{ files: ["*.js?(x)", "*.ts?(x)"] }], +}; diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json new file mode 100644 index 0000000..5c51c03 --- /dev/null +++ b/packages/eslint-config/package.json @@ -0,0 +1,19 @@ +{ + "name": "@repo/eslint-config", + "version": "0.0.0", + "private": true, + "files": [ + "library.js", + "next.js", + "react-internal.js" + ], + "devDependencies": { + "@vercel/style-guide": "^5.2.0", + "eslint-config-turbo": "^1.12.4", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-only-warn": "^1.1.0", + "@typescript-eslint/parser": "^7.1.0", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "typescript": "^5.3.3" + } +} diff --git a/packages/eslint-config/react-internal.js b/packages/eslint-config/react-internal.js new file mode 100644 index 0000000..f56c924 --- /dev/null +++ b/packages/eslint-config/react-internal.js @@ -0,0 +1,43 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/* + * This is a custom ESLint configuration for use with + * internal (bundled by their consumer) libraries + * that utilize React. + * + * This config extends the Vercel Engineering Style Guide. + * For more information, see https://github.com/vercel/style-guide + * + */ + +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["eslint:recommended", "prettier", "eslint-config-turbo"], + plugins: ["only-warn"], + globals: { + React: true, + JSX: true, + }, + env: { + browser: true, + }, + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: [ + // Ignore dotfiles + ".*.js", + "node_modules/", + "dist/", + ], + overrides: [ + // Force ESLint to detect .tsx files + { files: ["*.js?(x)", "*.ts?(x)"] }, + ], +}; diff --git a/packages/typescript-config/base.json b/packages/typescript-config/base.json new file mode 100644 index 0000000..0f80cfd --- /dev/null +++ b/packages/typescript-config/base.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "incremental": false, + "isolatedModules": true, + "lib": ["es2022", "DOM", "DOM.Iterable"], + "module": "NodeNext", + "moduleDetection": "force", + "moduleResolution": "NodeNext", + "noUncheckedIndexedAccess": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES2022" + } +} diff --git a/packages/typescript-config/nextjs.json b/packages/typescript-config/nextjs.json new file mode 100644 index 0000000..44f4289 --- /dev/null +++ b/packages/typescript-config/nextjs.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Next.js", + "extends": "./base.json", + "compilerOptions": { + "plugins": [{ "name": "next" }], + "module": "ESNext", + "moduleResolution": "Bundler", + "allowJs": true, + "jsx": "preserve", + "noEmit": true + } +} diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json new file mode 100644 index 0000000..27c0e60 --- /dev/null +++ b/packages/typescript-config/package.json @@ -0,0 +1,9 @@ +{ + "name": "@repo/typescript-config", + "version": "0.0.0", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/typescript-config/react-library.json b/packages/typescript-config/react-library.json new file mode 100644 index 0000000..44924d9 --- /dev/null +++ b/packages/typescript-config/react-library.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "React Library", + "extends": "./base.json", + "compilerOptions": { + "jsx": "react-jsx" + } +} diff --git a/packages/ui/.eslintrc.js b/packages/ui/.eslintrc.js new file mode 100644 index 0000000..4646413 --- /dev/null +++ b/packages/ui/.eslintrc.js @@ -0,0 +1,10 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ["@repo/eslint-config/react-internal.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.lint.json", + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/ui/package.json b/packages/ui/package.json new file mode 100644 index 0000000..4d5e99e --- /dev/null +++ b/packages/ui/package.json @@ -0,0 +1,26 @@ +{ + "name": "@repo/ui", + "version": "0.0.0", + "private": true, + "exports": { + "./button": "./src/button.tsx", + "./card": "./src/card.tsx", + "./code": "./src/code.tsx" + }, + "scripts": { + "lint": "eslint . --max-warnings 0", + "generate:component": "turbo gen react-component" + }, + "devDependencies": { + "@repo/eslint-config": "workspace:*", + "@repo/typescript-config": "workspace:*", + "@turbo/gen": "^1.12.4", + "@types/node": "^20.11.24", + "@types/eslint": "^8.56.5", + "@types/react": "^18.2.61", + "@types/react-dom": "^18.2.19", + "eslint": "^8.57.0", + "react": "^18.2.0", + "typescript": "^5.3.3" + } +} diff --git a/packages/ui/src/button.tsx b/packages/ui/src/button.tsx new file mode 100644 index 0000000..78e5420 --- /dev/null +++ b/packages/ui/src/button.tsx @@ -0,0 +1,20 @@ +"use client"; + +import { ReactNode } from "react"; + +interface ButtonProps { + children: ReactNode; + className?: string; + appName: string; +} + +export const Button = ({ children, className, appName }: ButtonProps) => { + return ( + + ); +}; diff --git a/packages/ui/src/card.tsx b/packages/ui/src/card.tsx new file mode 100644 index 0000000..f69672e --- /dev/null +++ b/packages/ui/src/card.tsx @@ -0,0 +1,25 @@ +export function Card({ + className, + title, + children, + href, +}: { + className?: string; + title: string; + children: React.ReactNode; + href: string; +}): JSX.Element { + return ( + +

+ {title} -> +

+

{children}

+
+ ); +} diff --git a/packages/ui/src/code.tsx b/packages/ui/src/code.tsx new file mode 100644 index 0000000..769d971 --- /dev/null +++ b/packages/ui/src/code.tsx @@ -0,0 +1,9 @@ +export function Code({ + children, + className, +}: { + children: React.ReactNode; + className?: string; +}): JSX.Element { + return {children}; +} diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json new file mode 100644 index 0000000..ca86687 --- /dev/null +++ b/packages/ui/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@repo/typescript-config/react-library.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/ui/tsconfig.lint.json b/packages/ui/tsconfig.lint.json new file mode 100644 index 0000000..df2762e --- /dev/null +++ b/packages/ui/tsconfig.lint.json @@ -0,0 +1,8 @@ +{ + "extends": "@repo/typescript-config/react-library.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["src", "turbo"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/ui/turbo/generators/config.ts b/packages/ui/turbo/generators/config.ts new file mode 100644 index 0000000..b3facf1 --- /dev/null +++ b/packages/ui/turbo/generators/config.ts @@ -0,0 +1,30 @@ +import type { PlopTypes } from "@turbo/gen"; + +// Learn more about Turborepo Generators at https://turbo.build/repo/docs/core-concepts/monorepos/code-generation + +export default function generator(plop: PlopTypes.NodePlopAPI): void { + // A simple generator to add a new React component to the internal UI library + plop.setGenerator("react-component", { + description: "Adds a new react component", + prompts: [ + { + type: "input", + name: "name", + message: "What is the name of the component?", + }, + ], + actions: [ + { + type: "add", + path: "src/{{kebabCase name}}.tsx", + templateFile: "templates/component.hbs", + }, + { + type: "append", + path: "package.json", + pattern: /"exports": {(?)/g, + template: '"./{{kebabCase name}}": "./src/{{kebabCase name}}.tsx",', + }, + ], + }); +} diff --git a/packages/ui/turbo/generators/templates/component.hbs b/packages/ui/turbo/generators/templates/component.hbs new file mode 100644 index 0000000..d968b9e --- /dev/null +++ b/packages/ui/turbo/generators/templates/component.hbs @@ -0,0 +1,8 @@ +export const {{ pascalCase name }} = ({ children }: { children: React.ReactNode }) => { + return ( +
+

{{ pascalCase name }} Component

+ {children} +
+ ); +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b2fa21..07d7d69 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,200 +4,1475 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@auth/prisma-adapter': - specifier: ^1.1.0 - version: 1.5.0(@prisma/client@5.11.0) - '@mantine/core': - specifier: ^7.7.1 - version: 7.7.1(@mantine/hooks@7.7.1)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) - '@mantine/form': - specifier: ^7.7.1 - version: 7.7.1(react@18.2.0) - '@mantine/hooks': - specifier: ^7.7.1 - version: 7.7.1(react@18.2.0) - '@mantine/notifications': - specifier: ^7.7.1 - version: 7.7.1(@mantine/core@7.7.1)(@mantine/hooks@7.7.1)(react-dom@18.2.0)(react@18.2.0) - '@prisma/client': - specifier: 5.11.0 - version: 5.11.0(prisma@5.11.0) - '@tanstack/react-query': - specifier: ^4.36.1 - version: 4.36.1(react-dom@18.2.0)(react@18.2.0) - '@tanstack/react-query-devtools': - specifier: ^4.36.1 - version: 4.36.1(@tanstack/react-query@4.36.1)(react-dom@18.2.0)(react@18.2.0) - '@tanstack/react-table': - specifier: ^8.11.7 - version: 8.13.2(react-dom@18.2.0)(react@18.2.0) - '@trpc/client': - specifier: ^10.45.0 - version: 10.45.2(@trpc/server@10.45.2) - '@trpc/next': - specifier: ^10.45.0 - version: 10.45.2(@tanstack/react-query@4.36.1)(@trpc/client@10.45.2)(@trpc/react-query@10.45.2)(@trpc/server@10.45.2)(next@14.1.0)(react-dom@18.2.0)(react@18.2.0) - '@trpc/react-query': - specifier: ^10.45.0 - version: 10.45.2(@tanstack/react-query@4.36.1)(@trpc/client@10.45.2)(@trpc/server@10.45.2)(react-dom@18.2.0)(react@18.2.0) - '@trpc/server': - specifier: ^10.45.0 - version: 10.45.2 - '@types/bcrypt': - specifier: ^5.0.2 - version: 5.0.2 - '@types/jsonwebtoken': - specifier: ^9.0.5 - version: 9.0.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.19.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.2) - bcrypt: - specifier: ^5.1.1 - version: 5.1.1 - client-only: - specifier: ^0.0.1 - version: 0.0.1 - clsx: - specifier: ^2.1.0 - version: 2.1.0 - date-fns: - specifier: ^3.3.1 - version: 3.4.0 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - mantine-form-zod-resolver: - specifier: ^1.1.0 - version: 1.1.0(@mantine/form@7.7.1)(zod@3.22.4) - next: - specifier: 14.1.0 - version: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - react-icons: - specifier: ^5.0.1 - version: 5.0.1(react@18.2.0) - sass: - specifier: ^1.70.0 - version: 1.71.1 - server-only: - specifier: ^0.0.1 - version: 0.0.1 - superjson: - specifier: ^2.2.1 - version: 2.2.1 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.27)(typescript@5.4.2) - zod: - specifier: ^3.22.4 - version: 3.22.4 +importers: -devDependencies: - '@types/bun': - specifier: ^1.0.5 - version: 1.0.8 - '@types/node': - specifier: ^20.11.7 - version: 20.11.27 - '@types/react': - specifier: ^18.2.48 - version: 18.2.65 - '@types/react-dom': - specifier: ^18.2.18 - version: 18.2.22 - autoprefixer: - specifier: ^10.4.17 - version: 10.4.18(postcss@8.4.35) - eslint: - specifier: ^8.56.0 - version: 8.57.0 - eslint-config-next: - specifier: 14.0.4 - version: 14.0.4(eslint@8.57.0)(typescript@5.4.2) - postcss: - specifier: ^8.4.33 - version: 8.4.35 - postcss-preset-mantine: - specifier: ^1.12.3 - version: 1.13.0(postcss@8.4.35) - postcss-simple-vars: - specifier: ^7.0.1 - version: 7.0.1(postcss@8.4.35) - prisma: - specifier: ^5.11.0 - version: 5.11.0 - tailwindcss: - specifier: ^3.4.1 - version: 3.4.1(ts-node@10.9.2) - typescript: - specifier: ^5.3.3 - version: 5.4.2 + .: + devDependencies: + '@repo/eslint-config': + specifier: workspace:* + version: link:packages/eslint-config + '@repo/typescript-config': + specifier: workspace:* + version: link:packages/typescript-config + prettier: + specifier: ^3.2.5 + version: 3.2.5 + turbo: + specifier: latest + version: 1.13.2 + + apps/backend: + dependencies: + '@hono/node-server': + specifier: ^1.11.0 + version: 1.11.0 + '@hono/zod-validator': + specifier: ^0.2.1 + version: 0.2.1(hono@4.2.9)(zod@3.23.4) + '@paralleldrive/cuid2': + specifier: ^2.2.2 + version: 2.2.2 + bcrypt: + specifier: ^5.1.1 + version: 5.1.1 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + drizzle-orm: + specifier: ^0.30.9 + version: 0.30.9(pg@8.11.5)(postgres@3.4.4) + hono: + specifier: ^4.2.9 + version: 4.2.9 + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 + moment: + specifier: ^2.30.1 + version: 2.30.1 + postgres: + specifier: ^3.4.4 + version: 3.4.4 + zod: + specifier: ^3.23.4 + version: 3.23.4 + devDependencies: + '@types/bcrypt': + specifier: ^5.0.2 + version: 5.0.2 + '@types/jsonwebtoken': + specifier: ^9.0.6 + version: 9.0.6 + '@types/node': + specifier: ^20.11.24 + version: 20.11.24 + drizzle-kit: + specifier: ^0.20.17 + version: 0.20.17 + pg: + specifier: ^8.11.5 + version: 8.11.5 + tsx: + specifier: ^4.7.1 + version: 4.7.2 + + apps/frontend: + dependencies: + '@emotion/react': + specifier: ^11.11.4 + version: 11.11.4(@types/react@18.2.79)(react@18.2.0) + '@mantine/core': + specifier: ^7.9.0 + version: 7.9.0(@mantine/hooks@7.9.0)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) + '@mantine/form': + specifier: ^7.8.1 + version: 7.8.1(react@18.2.0) + '@mantine/hooks': + specifier: ^7.9.0 + version: 7.9.0(react@18.2.0) + '@mantine/notifications': + specifier: ^7.9.0 + version: 7.9.0(@mantine/core@7.9.0)(@mantine/hooks@7.9.0)(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': + specifier: ^5.32.0 + version: 5.32.0(react@18.2.0) + '@tanstack/react-router': + specifier: ^1.31.1 + version: 1.31.1(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-table': + specifier: ^8.16.0 + version: 8.16.0(react-dom@18.2.0)(react@18.2.0) + backend: + specifier: workspace:* + version: link:../backend + clsx: + specifier: ^2.1.1 + version: 2.1.1 + hono: + specifier: ^4.2.9 + version: 4.2.9 + mantine-form-zod-resolver: + specifier: ^1.1.0 + version: 1.1.0(@mantine/form@7.8.1)(zod@3.23.4) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-icons: + specifier: ^5.1.0 + version: 5.1.0(react@18.2.0) + zod: + specifier: ^3.23.4 + version: 3.23.4 + devDependencies: + '@tanstack/eslint-plugin-query': + specifier: ^5.28.11 + version: 5.28.11(eslint@8.57.0)(typescript@5.3.3) + '@tanstack/router-devtools': + specifier: ^1.31.1 + version: 1.31.1(csstype@3.1.2)(react-dom@18.2.0)(react@18.2.0) + '@tanstack/router-vite-plugin': + specifier: ^1.30.0 + version: 1.30.0(vite@5.2.10) + '@types/node': + specifier: ^20.11.24 + version: 20.11.24 + '@types/react': + specifier: ^18.2.66 + version: 18.2.79 + '@types/react-dom': + specifier: ^18.2.22 + version: 18.2.25 + '@typescript-eslint/eslint-plugin': + specifier: ^7.2.0 + version: 7.7.1(@typescript-eslint/parser@7.7.1)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: ^7.2.0 + version: 7.7.1(eslint@8.57.0)(typescript@5.3.3) + '@vitejs/plugin-react-swc': + specifier: ^3.5.0 + version: 3.6.0(vite@5.2.10) + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.38) + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.57.0) + eslint-plugin-react-refresh: + specifier: ^0.4.6 + version: 0.4.6(eslint@8.57.0) + postcss: + specifier: ^8.4.38 + version: 8.4.38 + postcss-preset-mantine: + specifier: ^1.15.0 + version: 1.15.0(postcss@8.4.38) + postcss-simple-vars: + specifier: ^7.0.1 + version: 7.0.1(postcss@8.4.38) + tailwindcss: + specifier: ^3.4.3 + version: 3.4.3 + typescript: + specifier: ^5.2.2 + version: 5.3.3 + vite: + specifier: ^5.2.0 + version: 5.2.10(@types/node@20.11.24) + + packages/eslint-config: + devDependencies: + '@typescript-eslint/eslint-plugin': + specifier: ^7.1.0 + version: 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: ^7.1.0 + version: 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@vercel/style-guide': + specifier: ^5.2.0 + version: 5.2.0(eslint@8.57.0)(prettier@3.2.5)(typescript@5.3.3) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-config-turbo: + specifier: ^1.12.4 + version: 1.12.4(eslint@8.57.0) + eslint-plugin-only-warn: + specifier: ^1.1.0 + version: 1.1.0 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + + packages/typescript-config: {} + + packages/ui: + devDependencies: + '@repo/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@repo/typescript-config': + specifier: workspace:* + version: link:../typescript-config + '@turbo/gen': + specifier: ^1.12.4 + version: 1.12.4(@types/node@20.11.24)(typescript@5.3.3) + '@types/eslint': + specifier: ^8.56.5 + version: 8.56.5 + '@types/node': + specifier: ^20.11.24 + version: 20.11.24 + '@types/react': + specifier: ^18.2.61 + version: 18.2.61 + '@types/react-dom': + specifier: ^18.2.19 + version: 18.2.19 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + react: + specifier: ^18.2.0 + version: 18.2.0 + typescript: + specifier: ^5.3.3 + version: 5.3.3 packages: /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} + dev: true /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} dev: true - /@auth/core@0.28.0: - resolution: {integrity: sha512-/fh/tb/L4NMSYcyPoo4Imn8vN6MskcVfgESF8/ndgtI4fhD/7u7i5fTVzWgNRZ4ebIEGHNDbWFRxaTu1NtQgvA==} - peerDependencies: - '@simplewebauthn/browser': ^9.0.1 - '@simplewebauthn/server': ^9.0.2 - nodemailer: ^6.8.0 - peerDependenciesMeta: - '@simplewebauthn/browser': - optional: true - '@simplewebauthn/server': - optional: true - nodemailer: - optional: true + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} dependencies: - '@panva/hkdf': 1.1.1 - '@types/cookie': 0.6.0 - cookie: 0.6.0 - jose: 5.2.3 - oauth4webapi: 2.10.3 - preact: 10.11.3 - preact-render-to-string: 5.2.3(preact@10.11.3) - dev: false + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true - /@auth/prisma-adapter@1.5.0(@prisma/client@5.11.0): - resolution: {integrity: sha512-TNDY7z5VhC3E5xetb4qhTmSmjvyEurafaTM6dlYlhTGj+7K3xTki7fJ0oJwgkFsQ2fT1weJJJSBmjtH8Nqsnuw==} - peerDependencies: - '@prisma/client': '>=2.26.0 || >=3 || >=4 || >=5' - dependencies: - '@auth/core': 0.28.0 - '@prisma/client': 5.11.0(prisma@5.11.0) - transitivePeerDependencies: - - '@simplewebauthn/browser' - - '@simplewebauthn/server' - - nodemailer - dev: false - - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.1 + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + dev: true + + /@babel/compat-data@7.23.3: + resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.3: + resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.3 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/eslint-parser@7.23.3(@babel/core@7.23.3)(eslint@8.57.0): + resolution: {integrity: sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.23.3 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + dev: true + + /@babel/generator@7.23.3: + resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + + /@babel/parser@7.23.3: + resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==} + engines: {node: '>=6.0.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.4): + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/types': 7.24.0 + dev: true + + /@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) + dev: true + + /@babel/runtime-corejs3@7.22.10: + resolution: {integrity: sha512-IcixfV2Jl3UrqZX4c81+7lVg5++2ufYJyAFW3Aux/ZTvY6LVYYhJ9rMgnbX0zGVq6eqfVpnoatTjZdVki/GmWA==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.32.1 + regenerator-runtime: 0.14.0 + dev: true + + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + dev: true + + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + dev: true + + /@babel/traverse@7.23.3: + resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.3: + resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.2 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.4 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0): + resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.2 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.2.79 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize@1.1.4: + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.2 + dev: false + + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild-kit/core-utils@3.3.2: + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader@2.6.5: + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.7.2 + dev: true + + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} @@ -207,10 +1482,12 @@ packages: dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 + dev: true /@eslint-community/regexpp@4.10.0: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true /@eslint/eslintrc@2.1.4: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} @@ -227,52 +1504,67 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: true /@eslint/js@8.57.0: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - /@floating-ui/core@1.6.0: - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + /@floating-ui/core@1.6.1: + resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} dependencies: - '@floating-ui/utils': 0.2.1 + '@floating-ui/utils': 0.2.2 dev: false - /@floating-ui/dom@1.6.3: - resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + /@floating-ui/dom@1.6.4: + resolution: {integrity: sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==} dependencies: - '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.1 + '@floating-ui/core': 1.6.1 + '@floating-ui/utils': 0.2.2 dev: false - /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + /@floating-ui/react-dom@2.0.9(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.6.3 + '@floating-ui/dom': 1.6.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@floating-ui/react@0.26.9(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-p86wynZJVEkEq2BBjY/8p2g3biQ6TlgT4o/3KgFKyTWoJLU1GZ8wpctwRqtkEl2tseYA+kw7dBAIDFcednfI5w==} + /@floating-ui/react@0.26.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kBa9wntpugzrZ8t/4yWelvSmEKZdeTXTJzrxqyrLmcU/n1SM4nvse8yQh2e1b37rJGvtu0EplV9+IkBrCJ1vkw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) - '@floating-ui/utils': 0.2.1 + '@floating-ui/react-dom': 2.0.9(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/utils': 0.2.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tabbable: 6.2.0 dev: false - /@floating-ui/utils@0.2.1: - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + /@floating-ui/utils@0.2.2: + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} dev: false + /@hono/node-server@1.11.0: + resolution: {integrity: sha512-TLIJq9TMtD1NEG1mVoqNUn1Ita0qSaB5XboZErjFBcO/GJYXwWY4dVdTi9G0lbxtu0x+hJXDItcLaFHb7rlFTw==} + engines: {node: '>=18.14.1'} + + /@hono/zod-validator@0.2.1(hono@4.2.9)(zod@3.23.4): + resolution: {integrity: sha512-HFoxln7Q6JsE64qz2WBS28SD33UB2alp3aRKmcWnNLDzEL1BLsWfbdX6e1HIiUprHYTIXf5y7ax8eYidKUwyaA==} + peerDependencies: + hono: '>=3.9.0' + zod: ^3.19.1 + dependencies: + hono: 4.2.9 + zod: 3.23.4 + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -282,13 +1574,16 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: true /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + dev: true /@humanwhocodes/object-schema@2.0.2: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: true /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -302,6 +1597,15 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -311,9 +1615,15 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} @@ -322,42 +1632,51 @@ packages: /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + dev: true - /@mantine/core@7.7.1(@mantine/hooks@7.7.1)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-SdPzjvqvEK7uHFuVD3a8w3OZyQVoCwIXLSUfOtRNouDMQgsq6Ac7QjKXBBOk3wNweOWFVOU1vATLHobSmow0lQ==} + /@mantine/core@7.9.0(@mantine/hooks@7.9.0)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EhELO1uYq2s08H69h4BCcvE26mNLPaXUi6RAjApqBIynMcyJlmdluFtvGKFxjpgFZy3moeSYNrjEW//T0uTMZg==} peerDependencies: - '@mantine/hooks': 7.7.1 + '@mantine/hooks': 7.9.0 react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@floating-ui/react': 0.26.9(react-dom@18.2.0)(react@18.2.0) - '@mantine/hooks': 7.7.1(react@18.2.0) + '@floating-ui/react': 0.26.13(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.9.0(react@18.2.0) clsx: 2.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-number-format: 5.3.3(react-dom@18.2.0)(react@18.2.0) - react-remove-scroll: 2.5.7(@types/react@18.2.65)(react@18.2.0) - react-textarea-autosize: 8.5.3(@types/react@18.2.65)(react@18.2.0) - type-fest: 4.12.0 + react-number-format: 5.3.4(react-dom@18.2.0)(react@18.2.0) + react-remove-scroll: 2.5.9(@types/react@18.2.79)(react@18.2.0) + react-textarea-autosize: 8.5.3(@types/react@18.2.79)(react@18.2.0) + type-fest: 4.17.0 transitivePeerDependencies: - '@types/react' dev: false - /@mantine/form@7.7.1(react@18.2.0): - resolution: {integrity: sha512-NRbVdHsbs634dZIq6IQhqL0uCtF4nYK3OPuPhkBzQ3faqri7TZvYgVQU4KGFTMqPl0UdwC6TkrnnqTZBK6HJMw==} + /@mantine/form@7.8.1(react@18.2.0): + resolution: {integrity: sha512-Vn//YpJnTVBXJAEbGJVtWXpwSP/HPCLDFqDJXgA2AhrtVGWxmxipMgBy4m9YH3iR3dKAQ70h5pR2u3aS0qg0rg==} peerDependencies: react: ^18.2.0 dependencies: @@ -366,32 +1685,32 @@ packages: react: 18.2.0 dev: false - /@mantine/hooks@7.7.1(react@18.2.0): - resolution: {integrity: sha512-3YH2FzKMlg840tb04PBDcDXyBCi9puFOxEBVgc6Y/pN6KFqfOoAnQE/YvgOtwSNXZlbTWyDlQoYj+3je7pA7og==} + /@mantine/hooks@7.9.0(react@18.2.0): + resolution: {integrity: sha512-LKgyrlaIK0S/gcn/VDbhqLBZOYjvhXfVcH7rMs4MIBVD+wuRo2LvvAYe3cUfQbBCfmlpRjqvewwvsIYYsjSofQ==} peerDependencies: react: ^18.2.0 dependencies: react: 18.2.0 dev: false - /@mantine/notifications@7.7.1(@mantine/core@7.7.1)(@mantine/hooks@7.7.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-UGs3r4CU2hy1Vt0TVtdorDufpI7LWCd4P7qZP0US+mXVeeZqHkNTCiwRTwlledhfaIdqERmmQn9OD2lJu8Wblg==} + /@mantine/notifications@7.9.0(@mantine/core@7.9.0)(@mantine/hooks@7.9.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jGwvPrLnHCQMmWuuiuLWr8mjVHnOoOlydqPSya9JB1FFJU+MJP+wP5ncKeIbAmu1h2VlOuGomToM6KzvxksUGw==} peerDependencies: - '@mantine/core': 7.7.1 - '@mantine/hooks': 7.7.1 + '@mantine/core': 7.9.0 + '@mantine/hooks': 7.9.0 react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@mantine/core': 7.7.1(@mantine/hooks@7.7.1)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) - '@mantine/hooks': 7.7.1(react@18.2.0) - '@mantine/store': 7.7.1(react@18.2.0) + '@mantine/core': 7.9.0(@mantine/hooks@7.9.0)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) + '@mantine/hooks': 7.9.0(react@18.2.0) + '@mantine/store': 7.9.0(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /@mantine/store@7.7.1(react@18.2.0): - resolution: {integrity: sha512-dmuCOLCFlVHYhZARFsi5YckFQR2Vr4giOgs0X1hczqCVUnRDRIgRusAO5GjUhQrtNxfN0EWwFywjLdcrLkA6Lg==} + /@mantine/store@7.9.0(react@18.2.0): + resolution: {integrity: sha512-FzZkjdpy3PEh9sS6WgQ4cTVl9MvUbPRQ1nov8PV3JWWMlGOJHFuHeG6IYYGMc9f1oxu38/lryiKIYk3jcRgTSQ==} peerDependencies: react: ^18.2.0 dependencies: @@ -402,7 +1721,7 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true dependencies: - detect-libc: 2.0.2 + detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0 @@ -410,102 +1729,35 @@ packages: npmlog: 5.0.1 rimraf: 3.0.2 semver: 7.6.0 - tar: 6.2.0 + tar: 6.2.1 transitivePeerDependencies: - encoding - supports-color dev: false - /@next/env@14.1.0: - resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} - dev: false - - /@next/eslint-plugin-next@14.0.4: - resolution: {integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==} + /@microsoft/tsdoc-config@0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} dependencies: - glob: 7.1.7 + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 dev: true - /@next/swc-darwin-arm64@14.1.0: - resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: true - /@next/swc-darwin-x64@14.1.0: - resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + dependencies: + eslint-scope: 5.1.1 + dev: true - /@next/swc-linux-arm64-gnu@14.1.0: - resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true + /@noble/hashes@1.4.0: + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} dev: false - optional: true - - /@next/swc-linux-arm64-musl@14.1.0: - resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-gnu@14.1.0: - resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-musl@14.1.0: - resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-arm64-msvc@14.1.0: - resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-ia32-msvc@14.1.0: - resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-x64-msvc@14.1.0: - resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -513,20 +1765,25 @@ packages: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 + dev: true /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} + dev: true /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.15.0 + dev: true - /@panva/hkdf@1.1.1: - resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} + /@paralleldrive/cuid2@2.2.2: + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} + dependencies: + '@noble/hashes': 1.4.0 dev: false /@pkgjs/parseargs@0.11.0: @@ -536,196 +1793,525 @@ packages: dev: true optional: true - /@prisma/client@5.11.0(prisma@5.11.0): - resolution: {integrity: sha512-SWshvS5FDXvgJKM/a0y9nDC1rqd7KG0Q6ZVzd+U7ZXK5soe73DJxJJgbNBt2GNXOa+ysWB4suTpdK5zfFPhwiw==} - engines: {node: '>=16.13'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dependencies: - prisma: 5.11.0 - dev: false - - /@prisma/debug@5.11.0: - resolution: {integrity: sha512-N6yYr3AbQqaiUg+OgjkdPp3KPW1vMTAgtKX6+BiB/qB2i1TjLYCrweKcUjzOoRM5BriA4idrkTej9A9QqTfl3A==} - - /@prisma/engines-version@5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102: - resolution: {integrity: sha512-WXCuyoymvrS4zLz4wQagSsc3/nE6CHy8znyiMv8RKazKymOMd5o9FP5RGwGHAtgoxd+aB/BWqxuP/Ckfu7/3MA==} - - /@prisma/engines@5.11.0: - resolution: {integrity: sha512-gbrpQoBTYWXDRqD+iTYMirDlF9MMlQdxskQXbhARhG6A/uFQjB7DZMYocMQLoiZXO/IskfDOZpPoZE8TBQKtEw==} - requiresBuild: true - dependencies: - '@prisma/debug': 5.11.0 - '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 - '@prisma/fetch-engine': 5.11.0 - '@prisma/get-platform': 5.11.0 - - /@prisma/fetch-engine@5.11.0: - resolution: {integrity: sha512-994viazmHTJ1ymzvWugXod7dZ42T2ROeFuH6zHPcUfp/69+6cl5r9u3NFb6bW8lLdNjwLYEVPeu3hWzxpZeC0w==} - dependencies: - '@prisma/debug': 5.11.0 - '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 - '@prisma/get-platform': 5.11.0 - - /@prisma/get-platform@5.11.0: - resolution: {integrity: sha512-rxtHpMLxNTHxqWuGOLzR2QOyQi79rK1u1XYAVLZxDGTLz/A+uoDnjz9veBFlicrpWjwuieM4N6jcnjj/DDoidw==} - dependencies: - '@prisma/debug': 5.11.0 - - /@rushstack/eslint-patch@1.7.2: - resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} + cross-spawn: 7.0.3 + fast-glob: 3.3.1 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 dev: true - /@swc/helpers@0.5.2: - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} - dependencies: - tslib: 2.6.2 - dev: false + /@rollup/rollup-android-arm-eabi@4.16.4: + resolution: {integrity: sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true - /@tanstack/match-sorter-utils@8.11.8: - resolution: {integrity: sha512-3VPh0SYMGCa5dWQEqNab87UpCMk+ANWHDP4ALs5PeEW9EpfTAbrezzaOk/OiM52IESViefkoAOYuxdoa04p6aA==} - engines: {node: '>=12'} - dependencies: - remove-accents: 0.4.2 - dev: false + /@rollup/rollup-android-arm64@4.16.4: + resolution: {integrity: sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@tanstack/query-core@4.36.1: - resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} - dev: false + /@rollup/rollup-darwin-arm64@4.16.4: + resolution: {integrity: sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@tanstack/react-query-devtools@4.36.1(@tanstack/react-query@4.36.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-WYku83CKP3OevnYSG8Y/QO9g0rT75v1om5IvcWUwiUZJ4LanYGLVCZ8TdFG5jfsq4Ej/lu2wwDAULEUnRIMBSw==} + /@rollup/rollup-darwin-x64@4.16.4: + resolution: {integrity: sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.16.4: + resolution: {integrity: sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.16.4: + resolution: {integrity: sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.16.4: + resolution: {integrity: sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.16.4: + resolution: {integrity: sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.16.4: + resolution: {integrity: sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.16.4: + resolution: {integrity: sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.16.4: + resolution: {integrity: sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.16.4: + resolution: {integrity: sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.16.4: + resolution: {integrity: sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.16.4: + resolution: {integrity: sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.16.4: + resolution: {integrity: sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.16.4: + resolution: {integrity: sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/eslint-patch@1.5.1: + resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==} + dev: true + + /@swc/core-darwin-arm64@1.5.0: + resolution: {integrity: sha512-dyA25zQjm3xmMFsRPFgBpSqWSW9TITnkndZkZAiPYLjBxH9oTNMa0l09BePsaqEeXySY++tUgAeYu/9onsHLbg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.5.0: + resolution: {integrity: sha512-cO7kZMMA/fcQIBT31LBzcVNSk3AZGVYLqvEPnJhFImjPm3mGKUd6kWpARUEGR68MyRU2VsWhE6eCjMcM+G7bxw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.5.0: + resolution: {integrity: sha512-BXaXytS4y9lBFRO6vwA6ovvy1d2ZIzS02i2R1oegoZzzNu89CJDpkYXYS9bId0GvK2m9Q9y2ofoZzKE2Rp3PqQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.5.0: + resolution: {integrity: sha512-Bu4/41pGadXKnRsUbox0ig63xImATVH704oPCXcoOvNGkDyMjWgIAhzIi111vrwFNpj9utabgUE4AtlUa2tAOQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.5.0: + resolution: {integrity: sha512-lUFFvC8tsepNcTnKEHNrePWanVVef6PQ82Rv9wIeebgGHRUqDh6+CyCqodXez+aKz6NyE/PBIfp0r+jPx4hoJA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.5.0: + resolution: {integrity: sha512-c6LegFU1qdyMfk+GzNIOvrX61+mksm21Q01FBnXSy1nf1ACj/a86jmr3zkPl0zpNVHfPOw3Ry1QIuLQKD+67YA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.5.0: + resolution: {integrity: sha512-I/V8aWBmfDWwjtM1bS8ASG+6PcO/pVFYyPP5g2ok46Vz1o1MnAUd18mHnWX43nqVJokaW+BD/G4ZMZ+gXRl4zQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.5.0: + resolution: {integrity: sha512-nN685BvI7iM58xabrSOSQHUvIY10pcXh5H9DmS8LeYqG6Dkq7QZ8AwYqqonOitIS5C35MUfhSMLpOTzKoLdUqA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.5.0: + resolution: {integrity: sha512-3YjltmEHljI+TvuDOC4lspUzjBUoB3X5BhftRBprSTJx/czuMl0vdoZKs2Snzb5Eqqesp0Rl8q+iQ1E1oJ6dEA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.5.0: + resolution: {integrity: sha512-ZairtCwJsaxnUH85DcYCyGpNb9bUoIm9QXYW+VaEoXwbcB95dTIiJwN0aRxPT8B0B2MNw/CXLqjoPo6sDwz5iw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.5.0: + resolution: {integrity: sha512-fjADAC5gOOX54Rpcr1lF9DHLD+nPD5H/zXLtEgK2Ez3esmogT+LfHzCZtUxqetjvaMChKhQ0Pp0ZB6Hpz/tCbw==} + engines: {node: '>=10'} + requiresBuild: true peerDependencies: - '@tanstack/react-query': ^4.36.1 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@tanstack/match-sorter-utils': 8.11.8 - '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - superjson: 1.13.3 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: false - - /@tanstack/react-query@4.36.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' + '@swc/helpers': ^0.5.0 peerDependenciesMeta: - react-dom: - optional: true - react-native: + '@swc/helpers': optional: true dependencies: - '@tanstack/query-core': 4.36.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - use-sync-external-store: 1.2.0(react@18.2.0) + '@swc/counter': 0.1.3 + '@swc/types': 0.1.6 + optionalDependencies: + '@swc/core-darwin-arm64': 1.5.0 + '@swc/core-darwin-x64': 1.5.0 + '@swc/core-linux-arm-gnueabihf': 1.5.0 + '@swc/core-linux-arm64-gnu': 1.5.0 + '@swc/core-linux-arm64-musl': 1.5.0 + '@swc/core-linux-x64-gnu': 1.5.0 + '@swc/core-linux-x64-musl': 1.5.0 + '@swc/core-win32-arm64-msvc': 1.5.0 + '@swc/core-win32-ia32-msvc': 1.5.0 + '@swc/core-win32-x64-msvc': 1.5.0 + dev: true + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: true + + /@swc/types@0.1.6: + resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + dependencies: + '@swc/counter': 0.1.3 + dev: true + + /@tanstack/eslint-plugin-query@5.28.11(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-bODGLeG4WCGmHVKCh3bH1KLfq7xdi1jsRjTESV6ifCw1mZ0m2fBMxAjK42KjbhJwcvNdTlYHI+YY/aZWBk4Niw==} + peerDependencies: + eslint: ^8.0.0 + dependencies: + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@tanstack/history@1.28.9: + resolution: {integrity: sha512-WgTFJhHaZnGZPyt0H11xFhGGDj1MtA1mrUmdAjB/nhVpmsAYXsSB5O+hkF9N66u7MjbNb405wTb9diBsztvI5w==} + engines: {node: '>=12'} + + /@tanstack/query-core@5.32.0: + resolution: {integrity: sha512-Z3flEgCat55DRXU5UMwYU1U+DgFZKA3iufyOKs+II7iRAo0uXkeU7PH5e6sOH1CGEag0IpKmZxlUFpCg6roSKw==} dev: false - /@tanstack/react-table@8.13.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-b6mR3mYkjRtJ443QZh9sc7CvGTce81J35F/XMr0OoWbx0KIM7TTTdyNP2XKObvkLpYnLpCrYDwI3CZnLezWvpg==} + /@tanstack/react-query@5.32.0(react@18.2.0): + resolution: {integrity: sha512-+E3UudQtarnx9A6xhpgMZapyF+aJfNBGFMgI459FnduEZqT/9KhOWnMOneZahLRt52yzskSA0AuOyLkXHK0yBA==} + peerDependencies: + react: ^18.0.0 + dependencies: + '@tanstack/query-core': 5.32.0 + react: 18.2.0 + dev: false + + /@tanstack/react-router@1.31.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FZ7wYCL4UXkkT+yB703RcrnD6WO9dqphnEDWoPQIkN3f4Zk28nZPHRew3dcpK8n9o33sZJbCW24PVAdbjmpdEQ==} engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@tanstack/history': 1.28.9 + '@tanstack/react-store': 0.2.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + /@tanstack/react-store@0.2.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tEbMCQjbeVw9KOP/202LfqZMSNAVi6zYkkp1kBom8nFuMx/965Hzes3+6G6b/comCwVxoJU8Gg9IrcF8yRPthw==} peerDependencies: react: '>=16' react-dom: '>=16' dependencies: - '@tanstack/table-core': 8.13.2 + '@tanstack/store': 0.1.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.2(react@18.2.0) + + /@tanstack/react-table@8.16.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rKRjnt8ostqN2fercRVOIH/dq7MAmOENCMvVlKx6P9Iokhh6woBGnIZEkqsY/vEJf1jN3TqLOb34xQGLVRuhAg==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@tanstack/table-core': 8.16.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@tanstack/table-core@8.13.2: - resolution: {integrity: sha512-/2saD1lWBUV6/uNAwrsg2tw58uvMJ07bO2F1IWMxjFRkJiXKQRuc3Oq2aufeobD3873+4oIM/DRySIw7+QsPPw==} + /@tanstack/router-devtools@1.31.1(csstype@3.1.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vtxzLzPOHx0/5SXEXOHB4CSSUaMHnEOE1IyBTPxNBDizhGGImCxw8C74FoVzDSFQ2ED+4t6sPSLUA0m9FnnTWA==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@tanstack/react-router': 1.31.1(react-dom@18.2.0)(react@18.2.0) + clsx: 2.1.1 + date-fns: 2.30.0 + goober: 2.1.14(csstype@3.1.2) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - csstype + dev: true + + /@tanstack/router-generator@1.30.0: + resolution: {integrity: sha512-EOMm7wQRZURqnjL7pueIkMgCsTw/+4N1jtJUHTwaPRQcUsLHuAyy0GEMP6GMRcYqGrh7mb2HYFsVEcNd/1mn4g==} + engines: {node: '>=12'} + dependencies: + prettier: 3.2.5 + zod: 3.23.4 + dev: true + + /@tanstack/router-vite-plugin@1.30.0(vite@5.2.10): + resolution: {integrity: sha512-UEp6f760tf5+lKKKKTRpOWSIneInlhsR0RTWY44oz/qhe2/VwB2I1qqlLJUz2960VuZSH3YMCvTP+wk1BFvCyQ==} + engines: {node: '>=12'} + dependencies: + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + '@tanstack/router-generator': 1.30.0 + '@types/babel__core': 7.20.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + '@vitejs/plugin-react': 4.2.1(vite@5.2.10) + zod: 3.23.4 + transitivePeerDependencies: + - supports-color + - vite + dev: true + + /@tanstack/store@0.1.3: + resolution: {integrity: sha512-GnolmC8Fr4mvsHE1fGQmR3Nm0eBO3KnZjDU0a+P3TeQNM/dDscFGxtA7p31NplQNW3KwBw4t1RVFmz0VeKLxcw==} + + /@tanstack/table-core@8.16.0: + resolution: {integrity: sha512-dCG8vQGk4js5v88/k83tTedWOwjGnIyONrKpHpfmSJB8jwFHl8GSu1sBBxbtACVAPtAQgwNxl0rw1d3RqRM1Tg==} engines: {node: '>=12'} dev: false - /@trpc/client@10.45.2(@trpc/server@10.45.2): - resolution: {integrity: sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg==} - peerDependencies: - '@trpc/server': 10.45.2 - dependencies: - '@trpc/server': 10.45.2 - dev: false - - /@trpc/next@10.45.2(@tanstack/react-query@4.36.1)(@trpc/client@10.45.2)(@trpc/react-query@10.45.2)(@trpc/server@10.45.2)(next@14.1.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-RSORmfC+/nXdmRY1pQ0AalsVgSzwNAFbZLYHiTvPM5QQ8wmMEHilseCYMXpu0se/TbPt9zVR6Ka2d7O6zxKkXg==} - peerDependencies: - '@tanstack/react-query': ^4.18.0 - '@trpc/client': 10.45.2 - '@trpc/react-query': 10.45.2 - '@trpc/server': 10.45.2 - next: '*' - react: '>=16.8.0' - react-dom: '>=16.8.0' - dependencies: - '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) - '@trpc/client': 10.45.2(@trpc/server@10.45.2) - '@trpc/react-query': 10.45.2(@tanstack/react-query@4.36.1)(@trpc/client@10.45.2)(@trpc/server@10.45.2)(react-dom@18.2.0)(react@18.2.0) - '@trpc/server': 10.45.2 - next: 14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@trpc/react-query@10.45.2(@tanstack/react-query@4.36.1)(@trpc/client@10.45.2)(@trpc/server@10.45.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-BAqb9bGZIscroradlNx+Cc9522R+idY3BOSf5z0jHUtkxdMbjeGKxSSMxxu7JzoLqSIEC+LVzL3VvF8sdDWaZQ==} - peerDependencies: - '@tanstack/react-query': ^4.18.0 - '@trpc/client': 10.45.2 - '@trpc/server': 10.45.2 - react: '>=16.8.0' - react-dom: '>=16.8.0' - dependencies: - '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) - '@trpc/client': 10.45.2(@trpc/server@10.45.2) - '@trpc/server': 10.45.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@trpc/server@10.45.2: - resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} - dev: false + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + dev: true /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@turbo/gen@1.12.4(@types/node@20.11.24)(typescript@5.3.3): + resolution: {integrity: sha512-3Z8KZ6Vnc2x6rr8sNJ4QNYpkAttLBfb91uPzDlFDY7vgJg+vfXT8YWyZznVL+19ZixF2C/F4Ucp4/YjG2e1drg==} + dependencies: + '@turbo/workspaces': 1.12.4 + chalk: 2.4.2 + commander: 10.0.1 + fs-extra: 10.1.0 + inquirer: 8.2.6 + minimatch: 9.0.3 + node-plop: 0.26.3 + proxy-agent: 6.3.0 + ts-node: 10.9.1(@types/node@20.11.24)(typescript@5.3.3) + update-check: 1.5.4 + validate-npm-package-name: 5.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - supports-color + - typescript + dev: true + + /@turbo/workspaces@1.12.4: + resolution: {integrity: sha512-a1hF8Nr6MOeCpvlLR569dGTlzgRLj2Rxo6dTb4jtL+jhHwCb94A9kDPgcRnYGFr45mgulICarVaNZxDjw4/riQ==} + dependencies: + chalk: 2.4.2 + commander: 10.0.1 + execa: 5.1.1 + fast-glob: 3.3.1 + fs-extra: 10.1.0 + gradient-string: 2.0.2 + inquirer: 8.2.6 + js-yaml: 4.1.0 + ora: 4.1.1 + rimraf: 3.0.2 + semver: 7.5.4 + update-check: 1.5.4 + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.3 + '@babel/types': 7.24.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.3 + '@babel/types': 7.24.0 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.24.0 + dev: true /@types/bcrypt@5.0.2: resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} dependencies: - '@types/node': 20.11.27 - dev: false - - /@types/bun@1.0.8: - resolution: {integrity: sha512-E6UWZuN4ymAxzUBWVIGDHJ3Zey7I8cMzDZ+cB1BqhZsmd1uPb9iAQzpWMruY1mKzsuD3R+dZPoBkZz8QL1KhSA==} - dependencies: - bun-types: 1.0.29 + '@types/node': 20.11.24 dev: true - /@types/cookie@0.6.0: - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - dev: false + /@types/eslint@8.56.5: + resolution: {integrity: sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.11.24 + dev: true + + /@types/inquirer@6.5.0: + resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==} + dependencies: + '@types/through': 0.0.30 + rxjs: 6.6.7 + dev: true + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false + dev: true /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -734,45 +2320,80 @@ packages: /@types/jsonwebtoken@9.0.6: resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} dependencies: - '@types/node': 20.11.27 - dev: false - - /@types/node@20.11.27: - resolution: {integrity: sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==} - dependencies: - undici-types: 5.26.5 - - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - - /@types/react-dom@18.2.22: - resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} - dependencies: - '@types/react': 18.2.65 + '@types/node': 20.11.24 dev: true - /@types/react@18.2.65: - resolution: {integrity: sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ==} - dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + /@types/node@20.11.24: + resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: false + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + + /@types/react-dom@18.2.19: + resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} + dependencies: + '@types/react': 18.2.79 + dev: true + + /@types/react-dom@18.2.25: + resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} + dependencies: + '@types/react': 18.2.79 + dev: true + + /@types/react@18.2.61: + resolution: {integrity: sha512-NURTN0qNnJa7O/k4XUkEW2yfygA+NxS0V5h1+kp9jPwhzZy95q3ADoGMP0+JypMhrZBTTgjKAUlTctde1zzeQA==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + dev: true + + /@types/react@18.2.79: + resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} + dependencies: + '@types/prop-types': 15.7.5 + csstype: 3.1.2 + + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + dev: true + + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: true /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: false - - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - dependencies: - '@types/node': 20.11.27 dev: true - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + /@types/through@0.0.30: + resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} + dependencies: + '@types/node': 20.11.24 + dev: true + + /@types/tinycolor2@1.4.6: + resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + dev: true + + /@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -783,25 +2404,83 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/parser': 6.17.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.17.0 + '@typescript-eslint/type-utils': 6.17.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.17.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.17.0 + debug: 4.3.4 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin@7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.1.0 + '@typescript-eslint/type-utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.1.0 + debug: 4.3.4 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1)(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.7.1 + '@typescript-eslint/type-utils': 7.7.1(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.7.1 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 + ts-api-utils: 1.3.0(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: false + dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + /@typescript-eslint/parser@6.17.0(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -810,15 +2489,74 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/scope-manager': 6.17.0 + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.17.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.4.2 + typescript: 5.3.3 transitivePeerDependencies: - supports-color + dev: true + + /@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 7.1.0 + '@typescript-eslint/types': 7.1.0 + '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.1.0 + debug: 4.3.4 + eslint: 8.57.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 7.7.1 + '@typescript-eslint/types': 7.7.1 + '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.7.1 + debug: 4.3.4 + eslint: 8.57.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/scope-manager@6.17.0: + resolution: {integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/visitor-keys': 6.17.0 + dev: true /@typescript-eslint/scope-manager@6.21.0: resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} @@ -826,9 +2564,26 @@ packages: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 + dev: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + /@typescript-eslint/scope-manager@7.1.0: + resolution: {integrity: sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.1.0 + '@typescript-eslint/visitor-keys': 7.1.0 + dev: true + + /@typescript-eslint/scope-manager@7.7.1: + resolution: {integrity: sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.7.1 + '@typescript-eslint/visitor-keys': 7.7.1 + dev: true + + /@typescript-eslint/type-utils@6.17.0(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -837,21 +2592,125 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.17.0(eslint@8.57.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: false + dev: true + + /@typescript-eslint/type-utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) + '@typescript-eslint/utils': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/type-utils@7.7.1(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.3.3) + '@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types@6.17.0: + resolution: {integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true /@typescript-eslint/types@6.21.0: resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} + dev: true - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.2): + /@typescript-eslint/types@7.1.0: + resolution: {integrity: sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/types@7.7.1: + resolution: {integrity: sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): + resolution: {integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/visitor-keys': 6.17.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -867,12 +2726,96 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 + ts-api-utils: 1.3.0(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color + dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.2): + /@typescript-eslint/typescript-estree@7.1.0(typescript@5.3.3): + resolution: {integrity: sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.1.0 + '@typescript-eslint/visitor-keys': 7.1.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@7.7.1(typescript@5.3.3): + resolution: {integrity: sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.7.1 + '@typescript-eslint/visitor-keys': 7.7.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@6.17.0(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 6.17.0 + '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + eslint: 8.57.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.3.3): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -883,13 +2826,67 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - dev: false + dev: true + + /@typescript-eslint/utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 7.1.0 + '@typescript-eslint/types': 7.1.0 + '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) + eslint: 8.57.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@7.7.1(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.7.1 + '@typescript-eslint/types': 7.7.1 + '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.3.3) + eslint: 8.57.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@6.17.0: + resolution: {integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.17.0 + eslint-visitor-keys: 3.4.3 + dev: true /@typescript-eslint/visitor-keys@6.21.0: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} @@ -897,29 +2894,123 @@ packages: dependencies: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@7.1.0: + resolution: {integrity: sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.1.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@7.7.1: + resolution: {integrity: sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.7.1 + eslint-visitor-keys: 3.4.3 + dev: true /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@vercel/style-guide@5.2.0(eslint@8.57.0)(prettier@3.2.5)(typescript@5.3.3): + resolution: {integrity: sha512-fNSKEaZvSkiBoF6XEefs8CcgAV9K9e+MbcsDZjUsktHycKdA0jvjAzQi1W/FzLS+Nr5zZ6oejCwq/97dHUKe0g==} + engines: {node: '>=16'} + peerDependencies: + '@next/eslint-plugin-next': '>=12.3.0 <15' + eslint: '>=8.48.0 <9' + prettier: '>=3.0.0 <4' + typescript: '>=4.8.0 <6' + peerDependenciesMeta: + '@next/eslint-plugin-next': + optional: true + eslint: + optional: true + prettier: + optional: true + typescript: + optional: true + dependencies: + '@babel/core': 7.23.3 + '@babel/eslint-parser': 7.23.3(@babel/core@7.23.3)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.5.1 + '@typescript-eslint/eslint-plugin': 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.17.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.57.0)(typescript@5.3.3) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.6.0)(eslint@8.57.0) + eslint-plugin-react: 7.33.2(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 6.1.2(eslint@8.57.0)(typescript@5.3.3) + eslint-plugin-tsdoc: 0.2.17 + eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) + prettier: 3.2.5 + prettier-plugin-packagejson: 2.4.6(prettier@3.2.5) + typescript: 5.3.3 + transitivePeerDependencies: + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - jest + - supports-color + dev: true + + /@vitejs/plugin-react-swc@3.6.0(vite@5.2.10): + resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} + peerDependencies: + vite: ^4 || ^5 + dependencies: + '@swc/core': 1.5.0 + vite: 5.2.10(@types/node@20.11.24) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@vitejs/plugin-react@4.2.1(vite@5.2.10): + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.2.10(@types/node@20.11.24) + transitivePeerDependencies: + - supports-color + dev: true /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false - /acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.3 + acorn: 8.10.0 + dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} + dev: true - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} - hasBin: true + dev: true /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -930,6 +3021,23 @@ packages: - supports-color dev: false + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -937,6 +3045,14 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -947,11 +3063,18 @@ packages: engines: {node: '>=12'} dev: true + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 + dev: true /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} @@ -968,6 +3091,7 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + dev: true /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -983,6 +3107,7 @@ packages: /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -990,6 +3115,7 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true /aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -997,69 +3123,47 @@ packages: dequal: 2.0.3 dev: true - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bind: 1.0.5 + is-array-buffer: 3.0.2 dev: true /array-includes@3.1.7: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 - get-intrinsic: 1.2.4 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-string: 1.0.7 dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - - /array.prototype.filter@1.0.3: - resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.5 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 dev: true - /array.prototype.findlast@1.2.4: - resolution: {integrity: sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==} + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - dev: true - - /array.prototype.findlastindex@1.2.4: - resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 dev: true /array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 dev: true @@ -1067,76 +3171,71 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 dev: true - /array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + /array.prototype.tosorted@1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 dev: true - /array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - dev: true - - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 dev: true /ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true + /ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.6.2 + dev: true + /asynciterator.prototype@1.0.0: resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} dependencies: has-symbols: 1.0.3 dev: true - /autoprefixer@10.4.18(postcss@8.4.35): - resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} + /autoprefixer@10.4.19(postcss@8.4.38): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001597 + caniuse-lite: 1.0.30001614 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.0.0 dev: true /axe-core@4.7.0: @@ -1150,9 +3249,27 @@ packages: dequal: 2.0.3 dev: true + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.23.2 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /basic-ftp@5.0.3: + resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} + engines: {node: '>=10.0.0'} + dev: true + /bcrypt@5.1.1: resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} engines: {node: '>= 10.0.0'} @@ -1165,9 +3282,30 @@ packages: - supports-color dev: false - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + dev: true + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1179,20 +3317,32 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 + dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 + dev: true + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + dependencies: + caniuse-lite: 1.0.30001593 + electron-to-chromium: 1.4.583 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true /browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001597 - electron-to-chromium: 1.4.703 + caniuse-lite: 1.0.30001593 + electron-to-chromium: 1.4.750 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) dev: true @@ -1201,42 +3351,87 @@ packages: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} dev: false - /bun-types@1.0.29: - resolution: {integrity: sha512-Z+U1ORr/2UCwxelIZxE83pyPLclviYL9UewQCNEUmGeLObY8ao+3WF3D8N1+NMv2+S+hUWsdBJam+4GoPEz35g==} - dependencies: - '@types/node': 20.11.27 - '@types/ws': 8.5.10 + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: - streamsearch: 1.1.0 - dev: false + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.4 + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + /camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: true + /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} dev: true - /caniuse-lite@1.0.30001597: - resolution: {integrity: sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==} + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: true + + /caniuse-lite@1.0.30001593: + resolution: {integrity: sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==} + dev: true + + /caniuse-lite@1.0.30001614: + resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1244,6 +3439,39 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /change-case@3.1.0: + resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} + dependencies: + camel-case: 3.0.0 + constant-case: 2.0.0 + dot-case: 2.1.1 + header-case: 1.0.1 + is-lower-case: 1.1.3 + is-upper-case: 1.1.2 + lower-case: 1.1.4 + lower-case-first: 1.0.2 + no-case: 2.3.2 + param-case: 2.1.1 + pascal-case: 2.0.1 + path-case: 2.1.1 + sentence-case: 2.1.1 + snake-case: 2.1.0 + swap-case: 1.1.2 + title-case: 2.1.1 + upper-case: 1.1.3 + upper-case-first: 1.1.2 + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -1258,40 +3486,111 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 + dev: true /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} dev: false - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-color@2.0.4: + resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true /clsx@2.1.0: resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} engines: {node: '>=6'} dev: false + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true dev: false + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} dev: true + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1299,20 +3598,47 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} + /constant-case@2.0.0: + resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + dependencies: + snake-case: 2.1.0 + upper-case: 1.1.3 + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: false + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} dependencies: is-what: 4.1.16 + dev: true + + /core-js-pure@3.32.1: + resolution: {integrity: sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ==} + requiresBuild: true + dev: true + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 dev: false /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -1321,6 +3647,7 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: true /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -1328,16 +3655,32 @@ packages: hasBin: true dev: true - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + dependencies: + es5-ext: 0.10.64 + type: 2.7.2 + dev: true /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true - /date-fns@3.4.0: - resolution: {integrity: sha512-Akz4R8J9MXBsOgF1QeWeCsbv6pntT5KCPjU0Q9prBxVmWJYPLhwAIsNg3b0QAdr0ttiozYLD3L/af7Ra0jqYXw==} - dev: false + /data-uri-to-buffer@5.0.1: + resolution: {integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==} + engines: {node: '>= 14'} + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.23.2 + dev: true /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -1347,7 +3690,7 @@ packages: supports-color: optional: true dependencies: - ms: 2.1.3 + ms: 2.1.2 dev: true /debug@4.3.4: @@ -1361,27 +3704,85 @@ packages: dependencies: ms: 2.1.2 + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 + get-intrinsic: 1.2.2 gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} dev: true /define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 dev: true + /degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + dev: true + + /del@5.1.0: + resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} + engines: {node: '>=8'} + dependencies: + globby: 10.0.2 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 3.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: true + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: false @@ -1391,11 +3792,21 @@ packages: engines: {node: '>=6'} dev: true - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + /detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + dev: true + + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} dev: false + /detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false @@ -1407,12 +3818,20 @@ packages: /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + dev: true + + /difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: true /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -1430,12 +3849,145 @@ packages: engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 + dev: true /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.24.0 - csstype: 3.1.3 + '@babel/runtime': 7.23.2 + csstype: 3.1.2 + dev: false + + /dot-case@2.1.1: + resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} + dependencies: + no-case: 2.3.2 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: false + + /dreamopt@0.8.0: + resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} + engines: {node: '>=0.4.0'} + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.17: + resolution: {integrity: sha512-mLVDS4nXmO09wFVlzGrdshWnAL+U9eQGC5zRs6hTN6Q9arwQGWU2XnZ17I8BM8Quau8CQRx3Ms6VPgRWJFVp7Q==} + hasBin: true + dependencies: + '@esbuild-kit/esm-loader': 2.6.5 + '@hono/node-server': 1.11.0 + '@hono/zod-validator': 0.2.1(hono@4.2.9)(zod@3.23.4) + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + env-paths: 3.0.0 + esbuild: 0.19.12 + esbuild-register: 3.5.0(esbuild@0.19.12) + glob: 8.1.0 + hanji: 0.0.5 + hono: 4.2.9 + json-diff: 0.9.0 + minimatch: 7.4.6 + semver: 7.6.0 + superjson: 2.2.1 + zod: 3.23.4 + transitivePeerDependencies: + - supports-color + dev: true + + /drizzle-orm@0.30.9(pg@8.11.5)(postgres@3.4.4): + resolution: {integrity: sha512-VOiCFsexErmgqvNCOmbzmqDCZzZsHoz6SkWAjTFxsTr1AllKDbDJ2+GgedLXsXMDgpg/ljDG1zItIFeZtiO2LA==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.1.1' + '@libsql/client': '*' + '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + dependencies: + pg: 8.11.5 + postgres: 3.4.4 dev: false /eastasianwidth@0.2.0: @@ -1448,8 +4000,12 @@ packages: safe-buffer: 5.2.1 dev: false - /electron-to-chromium@1.4.703: - resolution: {integrity: sha512-094ZZC4nHXPKl/OwPinSMtLN9+hoFkdfQGKnvXbY+3WEAYtVDpz9UhJIViiY6Zb8agvqxiaJzNG9M+pRZWvSZw==} + /electron-to-chromium@1.4.583: + resolution: {integrity: sha512-93y1gcONABZ7uqYe/JWDVQP/Pj/sQSunF0HVAPdlg/pfBnOyBMLlQUxWvkqcljJg1+W6cjvPuYD+r1Th9Tn8mA==} + dev: true + + /electron-to-chromium@1.4.750: + resolution: {integrity: sha512-9ItEpeu15hW5m8jKdriL+BQrgwDTXEL9pn4SkillWFu73ZNNNQ2BKKLS+ZHv2vC9UkNhosAeyfxOf/5OSeTCPA==} dev: true /emoji-regex@8.0.0: @@ -1459,111 +4015,101 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 dev: true - /es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + /env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + hasown: 2.0.0 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 is-callable: 1.2.7 - is-negative-zero: 2.0.3 + is-negative-zero: 2.0.2 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.13 + is-typed-array: 1.1.12 is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 string.prototype.trim: 1.2.8 string.prototype.trimend: 1.0.7 string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.13 dev: true - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - dev: true - - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true - - /es-iterator-helpers@1.0.17: - resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} - engines: {node: '>= 0.4'} + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} dependencies: asynciterator.prototype: 1.0.0 - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.2 globalthis: 1.0.3 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.7 + internal-slot: 1.0.6 iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 + safe-array-concat: 1.0.1 dev: true - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 dev: true /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.2 + hasown: 2.0.0 dev: true /es-to-primitive@1.2.1: @@ -1575,38 +4121,194 @@ packages: is-symbol: 1.0.4 dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + /es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + dev: true + + /es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + dependencies: + d: 1.0.2 + ext: 1.7.0 + dev: true + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + dev: true + + /esbuild-register@3.5.0(esbuild@0.19.12): + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.3.4 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} dev: true + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-next@14.0.4(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' dependencies: - '@next/eslint-plugin-next': 14.0.4 - '@rushstack/eslint-patch': 1.7.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-react: 7.34.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - typescript: 5.4.2 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color + dev: true + + /eslint-config-turbo@1.12.4(eslint@8.57.0): + resolution: {integrity: sha512-5hqEaV6PNmAYLL4RTmq74OcCt8pgzOLnfDVPG/7PUXpQ0Mpz0gr926oCSFukywKKXjdum3VHD84S7Z9A/DqTAw==} + peerDependencies: + eslint: '>6.6.0' + dependencies: + eslint: 8.57.0 + eslint-plugin-turbo: 1.12.4(eslint@8.57.0) + dev: true + + /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.0): + resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} + engines: {node: '>= 4'} + peerDependencies: + eslint-plugin-import: '>=1.4.0' + dependencies: + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0) dev: true /eslint-import-resolver-node@0.3.9: @@ -1619,7 +4321,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1627,12 +4329,12 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.4 - enhanced-resolve: 5.16.0 + enhanced-resolve: 5.15.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.3 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0) + fast-glob: 3.3.1 + get-tsconfig: 4.7.2 is-core-module: 2.13.1 is-glob: 4.0.3 transitivePeerDependencies: @@ -1642,8 +4344,8 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1663,17 +4365,56 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 6.17.0(eslint@8.57.0)(typescript@5.3.3) debug: 3.2.7 eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.1.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.57.0 + ignore: 5.3.1 + dev: true + + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0): + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1682,38 +4423,59 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.3.3) array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 + array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - hasown: 2.0.2 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.1.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.7 - object.groupby: 1.0.2 + object.groupby: 1.0.1 object.values: 1.1.7 semver: 6.3.1 - tsconfig-paths: 3.15.0 + tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color dev: true + /eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.23.2 aria-query: 5.3.0 array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 @@ -1722,9 +4484,9 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.15 eslint: 8.57.0 - hasown: 2.0.2 + hasown: 2.0.0 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 @@ -1732,6 +4494,24 @@ packages: object.fromentries: 2.0.7 dev: true + /eslint-plugin-only-warn@1.1.0: + resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} + engines: {node: '>=6'} + dev: true + + /eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.6.0)(eslint@8.57.0): + resolution: {integrity: sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==} + peerDependencies: + eslint: '>=7' + eslint-plugin-jest: '>=25' + peerDependenciesMeta: + eslint-plugin-jest: + optional: true + dependencies: + eslint: 8.57.0 + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.17.0)(eslint@8.57.0)(typescript@5.3.3) + dev: true + /eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} @@ -1741,19 +4521,25 @@ packages: eslint: 8.57.0 dev: true - /eslint-plugin-react@7.34.0(eslint@8.57.0): - resolution: {integrity: sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==} + /eslint-plugin-react-refresh@0.4.6(eslint@8.57.0): + resolution: {integrity: sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==} + peerDependencies: + eslint: '>=7' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-react@7.33.2(eslint@8.57.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: array-includes: 3.1.7 - array.prototype.findlast: 1.2.4 array.prototype.flatmap: 1.3.2 - array.prototype.toreversed: 1.1.2 - array.prototype.tosorted: 1.1.3 + array.prototype.tosorted: 1.1.2 doctrine: 2.1.0 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.15 eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 @@ -1768,21 +4554,88 @@ packages: string.prototype.matchall: 4.0.10 dev: true + /eslint-plugin-testing-library@6.1.2(eslint@8.57.0)(typescript@5.3.3): + resolution: {integrity: sha512-Ra16FeBlonfbScOIdZEta9o+OxtwDqiUt+4UCpIM42TuatyLdtfU/SbwnIzPcAszrbl58PGwyZ9YGU9dwIo/tA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-tsdoc@0.2.17: + resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + dev: true + + /eslint-plugin-turbo@1.12.4(eslint@8.57.0): + resolution: {integrity: sha512-3AGmXvH7E4i/XTWqBrcgu+G7YKZJV/8FrEn79kTd50ilNsv+U3nS2IlcCrQB6Xm2m9avGD9cadLzKDR1/UF2+g==} + peerDependencies: + eslint: '>6.6.0' + dependencies: + dotenv: 16.0.3 + eslint: 8.57.0 + dev: true + + /eslint-plugin-unicorn@48.0.1(eslint@8.57.0): + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.44.0' + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + ci-info: 3.9.0 + clean-regexp: 1.0.0 + eslint: 8.57.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.5.4 + strip-indent: 3.0.0 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true /eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -1824,40 +4677,118 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: true + + /esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.2 + dev: true /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + dev: true /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 + dev: true /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + dev: true /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + dev: true + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1865,29 +4796,54 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 + dev: true /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.2.0 + flat-cache: 3.0.4 + dev: true /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 + dev: true + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -1895,17 +4851,19 @@ packages: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 + dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.3.1 - keyv: 4.5.4 + flatted: 3.2.7 rimraf: 3.0.2 + dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -1925,6 +4883,24 @@ packages: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -1940,19 +4916,19 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true + dev: true optional: true /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 functions-have-names: 1.2.3 dev: true @@ -1975,15 +4951,18 @@ packages: wide-align: 1.1.5 dev: false - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: - es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.3 + has-proto: 1.0.1 has-symbols: 1.0.3 - hasown: 2.0.2 + hasown: 2.0.0 dev: true /get-nonce@1.0.1: @@ -1991,54 +4970,70 @@ packages: engines: {node: '>=6'} dev: false - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 + /get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} dev: true - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} dependencies: resolve-pkg-maps: 1.0.0 dev: true + /get-uri@6.0.1: + resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} + engines: {node: '>= 14'} + dependencies: + basic-ftp: 5.0.3 + data-uri-to-buffer: 5.0.1 + debug: 4.3.4 + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /git-hooks-list@3.1.0: + resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 + dev: true /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 + dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 + minimatch: 9.0.4 minipass: 7.0.4 - path-scurry: 1.10.1 - dev: true - - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + path-scurry: 1.10.2 dev: true /glob@7.2.3: @@ -2051,11 +5046,28 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + /globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} @@ -2064,45 +5076,113 @@ packages: define-properties: 1.2.1 dev: true + /globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + glob: 7.2.3 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.1 ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 + dev: true + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /goober@2.1.14(csstype@3.1.2): + resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} + peerDependencies: + csstype: ^3.0.10 + dependencies: + csstype: 3.1.2 + dev: true /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.2 dev: true /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /gradient-string@2.0.2: + resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + tinygradient: 1.1.5 + dev: true /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /hanji@0.0.5: + resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - dependencies: - es-define-property: 1.0.0 dev: true - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true @@ -2111,8 +5191,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 @@ -2122,11 +5202,45 @@ packages: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: false - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 + + /header-case@1.0.1: + resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: true + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /hono@4.2.9: + resolution: {integrity: sha512-59FAv52UxDWUt/NlC0NzrRCjeVCThUnVlqlrKYm+k80XujBu6uJwBIa5gACKKZWobjA0MJ6Vds0I3URKf383Cw==} + engines: {node: '>=16.0.0'} + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color dev: true /https-proxy-agent@5.0.1: @@ -2139,13 +5253,41 @@ packages: - supports-color dev: false + /https-proxy-agent@7.0.1: + resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + /ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - - /immutable@4.3.5: - resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} - dev: false + dev: true /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -2157,6 +5299,12 @@ packages: /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -2167,13 +5315,57 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: true + + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + dev: true + + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 dev: true /invariant@2.2.4: @@ -2182,19 +5374,30 @@ packages: loose-envify: 1.4.0 dev: false - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + /ip@1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} dev: true + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + /is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /is-bigint@1.0.4: @@ -2207,14 +5410,22 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 + dev: true /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 dev: true /is-callable@1.2.7: @@ -2225,24 +5436,34 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.2 - dev: true + hasown: 2.0.0 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + dev: true /is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 dev: true /is-fullwidth-code-point@3.0.0: @@ -2253,7 +5474,7 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /is-glob@4.0.3: @@ -2261,14 +5482,32 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} dev: true - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + dependencies: + is-docker: 3.0.0 + dev: true + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-lower-case@1.1.3: + resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} + dependencies: + lower-case: 1.1.4 + dev: true + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true @@ -2276,42 +5515,66 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + dev: true + + /is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: true /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + dev: true + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: true + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + call-bind: 1.0.5 + has-tostringtag: 1.0.0 dev: true - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /is-symbol@1.0.4: @@ -2321,52 +5584,74 @@ packages: has-symbols: 1.0.3 dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.13 dev: true - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-upper-case@1.1.2: + resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} + dependencies: + upper-case: 1.1.3 + dev: true + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} dev: true /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 dev: true - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: true /is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - dev: false + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true + /isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + dev: true + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true /iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.5 - set-function-name: 2.0.2 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 dev: true /jackspeak@2.3.6: @@ -2383,35 +5668,78 @@ packages: hasBin: true dev: true - /jose@5.2.3: - resolution: {integrity: sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==} - dev: false + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true dependencies: argparse: 2.0.1 + dev: true - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + dev: true + + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + dev: true + + /json-diff@0.9.0: + resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} + hasBin: true + dependencies: + cli-color: 2.0.4 + difflib: 0.2.4 + dreamopt: 0.8.0 + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true dependencies: minimist: 1.2.8 dev: true + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + /jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -2424,7 +5752,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.isstring: 4.0.1 lodash.once: 4.1.1 - ms: 2.1.3 + ms: 2.1.2 semver: 7.6.0 dev: false @@ -2434,7 +5762,7 @@ packages: dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 - object.assign: 4.1.5 + object.assign: 4.1.4 object.values: 1.1.7 dev: true @@ -2453,11 +5781,6 @@ packages: safe-buffer: 5.2.1 dev: false - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - /klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} @@ -2480,6 +5803,7 @@ packages: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -2493,6 +5817,12 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 dev: true /locate-path@6.0.0: @@ -2500,6 +5830,11 @@ packages: engines: {node: '>=10'} dependencies: p-locate: 5.0.0 + dev: true + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true /lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -2527,28 +5862,78 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true /lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} dev: false + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log-symbols@3.0.0: + resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + engines: {node: '>=8'} + dependencies: + chalk: 2.4.2 + dev: true + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true dependencies: js-tokens: 4.0.0 - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + /lower-case-first@1.0.2: + resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} + dependencies: + lower-case: 1.1.4 + dev: true + + /lower-case@1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + dev: true + + /lru-cache@10.2.1: + resolution: {integrity: sha512-tS24spDe/zXhWbNPErCHs/AGOzbKGHT+ybSBqmdLm8WZ1xXLWvH8Qn71QPAlqVhd0qUTWjy+Kl9JmISgDdEjsA==} engines: {node: 14 || >=16.14} dev: true + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: true + + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.64 + dev: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -2558,21 +5943,40 @@ packages: /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true - /mantine-form-zod-resolver@1.1.0(@mantine/form@7.7.1)(zod@3.22.4): + /mantine-form-zod-resolver@1.1.0(@mantine/form@7.8.1)(zod@3.23.4): resolution: {integrity: sha512-hidTuYq6agSF5XbkcVVcr0mkGs9ki/x8OC9ldZMxGLVGja6bdl+x4k1hCNrigCG90DBoMDnu0bo3hprGBBlUZA==} engines: {node: '>=16.6.0'} peerDependencies: '@mantine/form': '>=7.0.0' zod: '>=3.0.0' dependencies: - '@mantine/form': 7.7.1(react@18.2.0) - zod: 3.22.4 + '@mantine/form': 7.8.1(react@18.2.0) + zod: 3.23.4 dev: false + /memoizee@0.4.15: + resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.7 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + dev: true /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} @@ -2580,17 +5984,55 @@ packages: dependencies: braces: 3.0.2 picomatch: 2.3.1 + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -2621,17 +6063,28 @@ packages: yallist: 4.0.0 dev: false + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + dependencies: + minimist: 1.2.8 + dev: true + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: false + /moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -2645,49 +6098,30 @@ packages: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: true /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true - /next@14.1.0(react-dom@18.2.0)(react@18.2.0)(sass@1.71.1): - resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - sass: - optional: true + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + dev: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} dependencies: - '@next/env': 14.1.0 - '@swc/helpers': 0.5.2 - busboy: 1.6.0 - caniuse-lite: 1.0.30001597 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - sass: 1.71.1 - styled-jsx: 5.1.1(react@18.2.0) - optionalDependencies: - '@next/swc-darwin-arm64': 14.1.0 - '@next/swc-darwin-x64': 14.1.0 - '@next/swc-linux-arm64-gnu': 14.1.0 - '@next/swc-linux-arm64-musl': 14.1.0 - '@next/swc-linux-x64-gnu': 14.1.0 - '@next/swc-linux-x64-musl': 14.1.0 - '@next/swc-win32-arm64-msvc': 14.1.0 - '@next/swc-win32-ia32-msvc': 14.1.0 - '@next/swc-win32-x64-msvc': 14.1.0 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - dev: false + lower-case: 1.1.4 + dev: true /node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} @@ -2705,6 +6139,27 @@ packages: whatwg-url: 5.0.0 dev: false + /node-plop@0.26.3: + resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} + engines: {node: '>=8.9.4'} + dependencies: + '@babel/runtime-corejs3': 7.22.10 + '@types/inquirer': 6.5.0 + change-case: 3.1.0 + del: 5.1.0 + globby: 10.0.2 + handlebars: 4.7.8 + inquirer: 7.3.3 + isbinaryfile: 4.0.10 + lodash.get: 4.4.2 + mkdirp: 0.5.6 + resolve: 1.22.8 + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true @@ -2717,15 +6172,39 @@ packages: abbrev: 1.1.1 dev: false + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + dev: true /normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} dev: true + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: @@ -2735,10 +6214,6 @@ packages: set-blocking: 2.0.0 dev: false - /oauth4webapi@2.10.3: - resolution: {integrity: sha512-9FkXEXfzVKzH63GUOZz1zMr3wBaICSzk6DLXx+CGdrQ10ItNk2ePWzYYc1fdmKq1ayGFb2aX97sRCoZ2s0mkDw==} - dev: false - /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2757,11 +6232,11 @@ packages: engines: {node: '>= 0.4'} dev: true - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -2771,44 +6246,43 @@ packages: resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 dev: true /object.fromentries@2.0.7: resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 dev: true - /object.groupby@1.0.2: - resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: - array.prototype.filter: 1.0.3 - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 dev: true /object.hasown@1.1.3: resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 dev: true /object.values@1.1.7: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 dev: true /once@1.4.0: @@ -2816,6 +6290,30 @@ packages: dependencies: wrappy: 1.0.2 + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -2826,18 +6324,112 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true + + /ora@4.1.1: + resolution: {integrity: sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==} + engines: {node: '>=8'} + dependencies: + chalk: 3.0.0 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + log-symbols: 3.0.0 + mute-stream: 0.0.8 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 + dev: true + + /p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /pac-proxy-agent@7.0.0: + resolution: {integrity: sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==} + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.0 + debug: 4.3.4 + get-uri: 6.0.1 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.1 + pac-resolver: 7.0.0 + socks-proxy-agent: 8.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /pac-resolver@7.0.0: + resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} + engines: {node: '>= 14'} + dependencies: + degenerator: 5.0.1 + ip: 1.1.8 + netmask: 2.0.2 + dev: true + + /param-case@2.1.1: + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + dependencies: + no-case: 2.3.2 + dev: true /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -2845,9 +6437,32 @@ packages: dependencies: callsites: 3.1.0 + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /pascal-case@2.0.1: + resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} + dependencies: + camel-case: 3.0.0 + upper-case-first: 1.1.2 + dev: true + + /path-case@2.1.1: + resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} + dependencies: + no-case: 2.3.2 + dev: true + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + dev: true /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} @@ -2856,16 +6471,21 @@ packages: /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.2.0 + lru-cache: 10.2.1 minipass: 7.0.4 dev: true @@ -2873,12 +6493,68 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + requiresBuild: true + optional: true + + /pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + + /pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + /pg-pool@3.6.2(pg@8.11.5): + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + peerDependencies: + pg: '>=8.0' + dependencies: + pg: 8.11.5 + + /pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + + /pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + /pg@8.11.5: + resolution: {integrity: sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + dependencies: + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.11.5) + pg-protocol: 1.6.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + /pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + dependencies: + split2: 4.2.0 + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + dev: true /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} @@ -2890,34 +6566,34 @@ packages: engines: {node: '>= 6'} dev: true - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} dev: true - /postcss-import@15.1.0(postcss@8.4.35): + /postcss-import@15.1.0(postcss@8.4.38): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 dev: true - /postcss-js@4.0.1(postcss@8.4.35): + /postcss-js@4.0.1(postcss@8.4.38): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-load-config@4.0.2(postcss@8.4.35)(ts-node@10.9.2): + /postcss-load-config@4.0.2(postcss@8.4.38): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -2930,42 +6606,41 @@ packages: optional: true dependencies: lilconfig: 3.1.1 - postcss: 8.4.35 - ts-node: 10.9.2(@types/node@20.11.27)(typescript@5.4.2) - yaml: 2.4.1 + postcss: 8.4.38 + yaml: 2.4.2 dev: true - /postcss-mixins@9.0.4(postcss@8.4.35): + /postcss-mixins@9.0.4(postcss@8.4.38): resolution: {integrity: sha512-XVq5jwQJDRu5M1XGkdpgASqLk37OqkH4JCFDXl/Dn7janOJjCTEKL+36cnRVy7bMtoBzALfO7bV7nTIsFnUWLA==} engines: {node: '>=14.0'} peerDependencies: postcss: ^8.2.14 dependencies: - fast-glob: 3.3.2 - postcss: 8.4.35 - postcss-js: 4.0.1(postcss@8.4.35) - postcss-simple-vars: 7.0.1(postcss@8.4.35) - sugarss: 4.0.1(postcss@8.4.35) + fast-glob: 3.3.1 + postcss: 8.4.38 + postcss-js: 4.0.1(postcss@8.4.38) + postcss-simple-vars: 7.0.1(postcss@8.4.38) + sugarss: 4.0.1(postcss@8.4.38) dev: true - /postcss-nested@6.0.1(postcss@8.4.35): + /postcss-nested@6.0.1(postcss@8.4.38): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-selector-parser: 6.0.16 dev: true - /postcss-preset-mantine@1.13.0(postcss@8.4.35): - resolution: {integrity: sha512-1bv/mQz2K+/FixIMxYd83BYH7PusDZaI7LpUtKbb1l/5N5w6t1p/V9ONHfRJeeAZyfa6Xc+AtR+95VKdFXRH1g==} + /postcss-preset-mantine@1.15.0(postcss@8.4.38): + resolution: {integrity: sha512-OKPs6uoORSXlU/GFH1ZtFaslecHBPwuoSikdL5W3WKJm4ZPAQM0mw9x9m3toa/Mo1JhoBmYMM28i+zEdav5Edg==} peerDependencies: postcss: '>=8.0.0' dependencies: - postcss: 8.4.35 - postcss-mixins: 9.0.4(postcss@8.4.35) - postcss-nested: 6.0.1(postcss@8.4.35) + postcss: 8.4.38 + postcss-mixins: 9.0.4(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) dev: true /postcss-selector-parser@6.0.16: @@ -2976,65 +6651,73 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-simple-vars@7.0.1(postcss@8.4.35): + /postcss-simple-vars@7.0.1(postcss@8.4.38): resolution: {integrity: sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==} engines: {node: '>=14.0'} peerDependencies: postcss: ^8.2.1 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true - /preact-render-to-string@5.2.3(preact@10.11.3): - resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} - peerDependencies: - preact: '>=10' - dependencies: - preact: 10.11.3 - pretty-format: 3.8.0 - dev: false + /postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} - /preact@10.11.3: - resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} + /postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + /postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + /postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + dependencies: + xtend: 4.0.2 + + /postgres@3.4.4: + resolution: {integrity: sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==} + engines: {node: '>=12'} dev: false /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + dev: true - /pretty-format@3.8.0: - resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - dev: false - - /prisma@5.11.0: - resolution: {integrity: sha512-KCLiug2cs0Je7kGkQBN9jDWoZ90ogE/kvZTUTgz2h94FEo8pczCkPH7fPNXkD1sGU7Yh65risGGD1HQ5DF3r3g==} - engines: {node: '>=16.13'} - hasBin: true - requiresBuild: true + /prettier-plugin-packagejson@2.4.6(prettier@3.2.5): + resolution: {integrity: sha512-5JGfzkJRL0DLNyhwmiAV9mV0hZLHDwddFCs2lc9CNxOChpoWUQVe8K4qTMktmevmDlMpok2uT10nvHUyU59sNw==} + peerDependencies: + prettier: '>= 1.16.0' + peerDependenciesMeta: + prettier: + optional: true dependencies: - '@prisma/engines': 5.11.0 + prettier: 3.2.5 + sort-package-json: 2.6.0 + synckit: 0.8.5 + dev: true + + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + dev: true /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -3043,12 +6726,43 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + /proxy-agent@6.3.0: + resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.1 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} + dev: true /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} @@ -3058,10 +6772,9 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - dev: false - /react-icons@5.0.1(react@18.2.0): - resolution: {integrity: sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==} + /react-icons@5.1.0(react@18.2.0): + resolution: {integrity: sha512-D3zug1270S4hbSlIRJ0CUS97QE1yNNKDjzQe3HqY0aefp2CBn9VgzgES27sRR2gOvFK+0CNx/BW0ggOESp6fqQ==} peerDependencies: react: '*' dependencies: @@ -3071,8 +6784,8 @@ packages: /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - /react-number-format@5.3.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-maGHWmOvwYzyeRIpL0YC6drWqYaX6iFqjisdJXpZ+HzEtSEJsL6nqw4azTpF5Sm6SAvwUeAr7JY924Ebqq8EdA==} + /react-number-format@5.3.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg==} peerDependencies: react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 @@ -3082,25 +6795,13 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /react-remove-scroll-bar@2.3.5(@types/react@18.2.65)(react@18.2.0): - resolution: {integrity: sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==} - engines: {node: '>=10'} - deprecated: please update to the following version as this contains a bug (https://github.com/theKashey/react-remove-scroll-bar/issues/57) - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.65 - react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.65)(react@18.2.0) - tslib: 2.6.2 - dev: false + /react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + dev: true - /react-remove-scroll@2.5.7(@types/react@18.2.65)(react@18.2.0): - resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + /react-remove-scroll-bar@2.3.6(@types/react@18.2.79)(react@18.2.0): + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3109,16 +6810,32 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.65 + '@types/react': 18.2.79 react: 18.2.0 - react-remove-scroll-bar: 2.3.5(@types/react@18.2.65)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.65)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.2.65)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.65)(react@18.2.0) dev: false - /react-style-singleton@2.2.1(@types/react@18.2.65)(react@18.2.0): + /react-remove-scroll@2.5.9(@types/react@18.2.79)(react@18.2.0): + resolution: {integrity: sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.79 + react: 18.2.0 + react-remove-scroll-bar: 2.3.6(@types/react@18.2.79)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.2(@types/react@18.2.79)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.2.0) + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.79)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -3128,23 +6845,23 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.65 + '@types/react': 18.2.79 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 tslib: 2.6.2 dev: false - /react-textarea-autosize@8.5.3(@types/react@18.2.65)(react@18.2.0): + /react-textarea-autosize@8.5.3(@types/react@18.2.79)(react@18.2.0): resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.23.2 react: 18.2.0 use-composed-ref: 1.3.0(react@18.2.0) - use-latest: 1.2.1(@types/react@18.2.65)(react@18.2.0) + use-latest: 1.2.1(@types/react@18.2.79)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false @@ -3155,7 +6872,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.23.2 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -3168,7 +6885,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - dev: false /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -3176,6 +6892,25 @@ packages: pify: 2.3.0 dev: true + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3183,43 +6918,61 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: false /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + dev: true - /reflect.getprototypeof@1.0.5: - resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 globalthis: 1.0.3 which-builtin-type: 1.1.3 dev: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} dev: true - /remove-accents@0.4.2: - resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} - dev: false + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /registry-auth-token@3.3.2: + resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + dependencies: + rc: 1.2.8 + safe-buffer: 5.2.1 + dev: true + + /registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + dependencies: + rc: 1.2.8 + dev: true + + /regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + dependencies: + jsesc: 0.5.0 + dev: true /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -3229,81 +6982,146 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true + /resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + dev: true + /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + onetime: 5.1.2 + signal-exit: 3.0.7 dev: true /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true dependencies: glob: 7.2.3 + /rollup@4.16.4: + resolution: {integrity: sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.16.4 + '@rollup/rollup-android-arm64': 4.16.4 + '@rollup/rollup-darwin-arm64': 4.16.4 + '@rollup/rollup-darwin-x64': 4.16.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.16.4 + '@rollup/rollup-linux-arm-musleabihf': 4.16.4 + '@rollup/rollup-linux-arm64-gnu': 4.16.4 + '@rollup/rollup-linux-arm64-musl': 4.16.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.16.4 + '@rollup/rollup-linux-riscv64-gnu': 4.16.4 + '@rollup/rollup-linux-s390x-gnu': 4.16.4 + '@rollup/rollup-linux-x64-gnu': 4.16.4 + '@rollup/rollup-linux-x64-musl': 4.16.4 + '@rollup/rollup-win32-arm64-msvc': 4.16.4 + '@rollup/rollup-win32-ia32-msvc': 4.16.4 + '@rollup/rollup-win32-x64-msvc': 4.16.4 + fsevents: 2.3.3 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 + dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: true + + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-regex: 1.1.4 dev: true - /sass@1.71.1: - resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - chokidar: 3.6.0 - immutable: 4.3.5 - source-map-js: 1.0.2 - dev: false + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 - dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + dev: true /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true /semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} @@ -3312,34 +7130,34 @@ packages: dependencies: lru-cache: 6.0.0 - /server-only@0.0.1: - resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} - dev: false + /sentence-case@2.1.1: + resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} + dependencies: + no-case: 2.3.2 + upper-case-first: 1.1.2 + dev: true /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 gopd: 1.0.1 - has-property-descriptors: 1.0.2 + has-property-descriptors: 1.0.1 dev: true - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 + define-data-property: 1.1.1 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 + has-property-descriptors: 1.0.1 dev: true /shebang-command@2.0.0: @@ -3347,43 +7165,137 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: true /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + dev: true - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 object-inspect: 1.13.1 dev: true /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} dev: true + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /snake-case@2.1.0: + resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} + dependencies: + no-case: 2.3.2 + dev: true + + /socks-proxy-agent@8.0.1: + resolution: {integrity: sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: true + + /sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + dev: true + + /sort-package-json@2.6.0: + resolution: {integrity: sha512-XSQ+lY9bAYA8ZsoChcEoPlgcSMaheziEp1beox1JVxy1SV4F2jSq9+h2rJ+3mC/Dhu9Ius1DLnInD5AWcsDXZw==} + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.1 + get-stdin: 9.0.0 + git-hooks-list: 3.1.0 + globby: 13.2.2 + is-plain-obj: 4.1.0 + sort-object-keys: 1.1.3 + dev: true + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + dev: true - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} dev: false + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3404,47 +7316,46 @@ packages: /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 - get-intrinsic: 1.2.4 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.2 - side-channel: 1.0.6 + internal-slot: 1.0.6 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 + side-channel: 1.0.4 dev: true /string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 dev: true /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 dev: true /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.22.3 dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - dev: false /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -3464,25 +7375,35 @@ packages: engines: {node: '>=4'} dev: true + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + dev: true - /styled-jsx@5.1.1(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - dependencies: - client-only: 0.0.1 - react: 18.2.0 + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} dev: false /sucrase@3.35.0: @@ -3492,53 +7413,67 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.10 + glob: 10.3.12 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 dev: true - /sugarss@4.0.1(postcss@8.4.35): + /sugarss@4.0.1(postcss@8.4.38): resolution: {integrity: sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.3.3 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /superjson@1.13.3: - resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} - engines: {node: '>=10'} - dependencies: - copy-anything: 3.0.5 - dev: false - /superjson@2.2.1: resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} engines: {node: '>=16'} dependencies: copy-anything: 3.0.5 - dev: false + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 + dev: true /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + + /swap-case@1.1.2: + resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + dependencies: + lower-case: 1.1.4 + upper-case: 1.1.3 + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 dev: true /tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: false - /tailwindcss@3.4.1(ts-node@10.9.2): - resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + /tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -3547,7 +7482,7 @@ packages: chokidar: 3.6.0 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.2 + fast-glob: 3.3.1 glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.21.0 @@ -3556,11 +7491,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.35 - postcss-import: 15.1.0(postcss@8.4.35) - postcss-js: 4.0.1(postcss@8.4.35) - postcss-load-config: 4.0.2(postcss@8.4.35)(ts-node@10.9.2) - postcss-nested: 6.0.1(postcss@8.4.35) + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) postcss-selector-parser: 6.0.16 resolve: 1.22.8 sucrase: 3.35.0 @@ -3573,8 +7508,8 @@ packages: engines: {node: '>=6'} dev: true - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 @@ -3587,6 +7522,7 @@ packages: /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} @@ -3601,30 +7537,92 @@ packages: any-promise: 1.3.0 dev: true + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.64 + next-tick: 1.1.0 + dev: true + + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + /tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: true + + /tinygradient@1.1.5: + resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} + dependencies: + '@types/tinycolor2': 1.4.6 + tinycolor2: 1.6.0 + dev: true + + /title-case@2.1.1: + resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: true + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 + dev: true /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /ts-api-utils@1.3.0(typescript@5.4.2): + /ts-api-utils@1.0.2(typescript@5.3.3): + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + + /ts-api-utils@1.3.0(typescript@5.3.3): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.4.2 + typescript: 5.3.3 + dev: true /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-node@10.9.2(@types/node@20.11.27)(typescript@5.4.2): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + /ts-node@10.9.1(@types/node@20.11.24)(typescript@5.3.3): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -3642,19 +7640,20 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.27 - acorn: 8.11.3 - acorn-walk: 8.3.2 + '@types/node': 20.11.24 + acorn: 8.10.0 + acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.2 + typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + dev: true - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -3662,78 +7661,184 @@ packages: strip-bom: 3.0.0 dev: true + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false + + /tsutils@3.21.0(typescript@5.3.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.3.3 + dev: true + + /tsx@4.7.2: + resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.19.12 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /turbo-darwin-64@1.13.2: + resolution: {integrity: sha512-CCSuD8CfmtncpohCuIgq7eAzUas0IwSbHfI8/Q3vKObTdXyN8vAo01gwqXjDGpzG9bTEVedD0GmLbD23dR0MLA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-darwin-arm64@1.13.2: + resolution: {integrity: sha512-0HySm06/D2N91rJJ89FbiI/AodmY8B3WDSFTVEpu2+8spUw7hOJ8okWOT0e5iGlyayUP9gr31eOeL3VFZkpfCw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-64@1.13.2: + resolution: {integrity: sha512-7HnibgbqZrjn4lcfIouzlPu8ZHSBtURG4c7Bedu7WJUDeZo+RE1crlrQm8wuwO54S0siYqUqo7GNHxu4IXbioQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-arm64@1.13.2: + resolution: {integrity: sha512-sUq4dbpk6SNKg/Hkwn256Vj2AEYSQdG96repio894h5/LEfauIK2QYiC/xxAeW3WBMc6BngmvNyURIg7ltrePg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-64@1.13.2: + resolution: {integrity: sha512-DqzhcrciWq3dpzllJR2VVIyOhSlXYCo4mNEWl98DJ3FZ08PEzcI3ceudlH6F0t/nIcfSItK1bDP39cs7YoZHEA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-arm64@1.13.2: + resolution: {integrity: sha512-WnPMrwfCXxK69CdDfS1/j2DlzcKxSmycgDAqV0XCYpK/812KB0KlvsVAt5PjEbZGXkY88pCJ1BLZHAjF5FcbqA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo@1.13.2: + resolution: {integrity: sha512-rX/d9f4MgRT3yK6cERPAkfavIxbpBZowDQpgvkYwGMGDQ0Nvw1nc0NVjruE76GrzXQqoxR1UpnmEP54vBARFHQ==} + hasBin: true + optionalDependencies: + turbo-darwin-64: 1.13.2 + turbo-darwin-arm64: 1.13.2 + turbo-linux-64: 1.13.2 + turbo-linux-arm64: 1.13.2 + turbo-windows-64: 1.13.2 + turbo-windows-arm64: 1.13.2 + dev: true /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: true /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + dev: true - /type-fest@4.12.0: - resolution: {integrity: sha512-5Y2/pp2wtJk8o08G0CMkuFPCO354FGwk/vbidxrdhRGZfd0tFnb4Qb8anp9XxXriwBgVPjdWbKpGl4J9lJY2jQ==} + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@4.17.0: + resolution: {integrity: sha512-9flrz1zkfLRH3jO3bLflmTxryzKMxVa7841VeMgBaNQGY6vH4RCcpN/sQLB7mQQYh1GZ5utT2deypMuCy4yicw==} engines: {node: '>=16'} dev: false - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + has-proto: 1.0.1 + is-typed-array: 1.1.12 dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + has-proto: 1.0.1 + is-typed-array: 1.1.12 dev: true - /typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} - engines: {node: '>= 0.4'} + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 + is-typed-array: 1.1.12 dev: true - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} - hasBin: true + dev: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dev: true + optional: true /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -3741,6 +7846,33 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true /update-browserslist-db@1.0.13(browserslist@4.23.0): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} @@ -3749,17 +7881,35 @@ packages: browserslist: '>= 4.21.0' dependencies: browserslist: 4.23.0 - escalade: 3.1.2 + escalade: 3.1.1 picocolors: 1.0.0 dev: true + /update-check@1.5.4: + resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + dependencies: + registry-auth-token: 3.3.2 + registry-url: 3.1.0 + dev: true + + /upper-case-first@1.1.2: + resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} + dependencies: + upper-case: 1.1.3 + dev: true + + /upper-case@1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.1 + punycode: 2.3.0 + dev: true - /use-callback-ref@1.3.1(@types/react@18.2.65)(react@18.2.0): - resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + /use-callback-ref@1.3.2(@types/react@18.2.79)(react@18.2.0): + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3768,7 +7918,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.65 + '@types/react': 18.2.79 react: 18.2.0 tslib: 2.6.2 dev: false @@ -3781,7 +7931,7 @@ packages: react: 18.2.0 dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.65)(react@18.2.0): + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.79)(react@18.2.0): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -3790,11 +7940,11 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.65 + '@types/react': 18.2.79 react: 18.2.0 dev: false - /use-latest@1.2.1(@types/react@18.2.65)(react@18.2.0): + /use-latest@1.2.1(@types/react@18.2.79)(react@18.2.0): resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' @@ -3803,12 +7953,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.65 + '@types/react': 18.2.79 react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.65)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.79)(react@18.2.0) dev: false - /use-sidecar@1.1.2(@types/react@18.2.65)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.79)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -3818,25 +7968,81 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.65 + '@types/react': 18.2.79 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 dev: false - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + /use-sync-external-store@1.2.2(react@18.2.0): + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.2.0 - dev: false /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + builtins: 5.0.1 + dev: true + + /vite@5.2.10(@types/node@20.11.24): + resolution: {integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.11.24 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.16.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -3864,7 +8070,7 @@ packages: engines: {node: '>= 0.4'} dependencies: function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-async-function: 2.0.0 is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 @@ -3873,37 +8079,36 @@ packages: is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-collection: 1.0.1 + which-typed-array: 1.1.13 dev: true - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 dev: true - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 dev: true /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} - hasBin: true dependencies: isexe: 2.0.0 + dev: true /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} @@ -3911,6 +8116,19 @@ packages: string-width: 4.2.3 dev: false + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3932,11 +8150,24 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml@2.4.1: - resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} engines: {node: '>= 14'} hasBin: true dev: true @@ -3944,11 +8175,12 @@ packages: /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} + dev: true /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + dev: true - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: false + /zod@3.23.4: + resolution: {integrity: sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw==} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..3ff5faa --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - "apps/*" + - "packages/*" diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index 2f7b444..0000000 --- a/postcss.config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - plugins: { - 'tailwindcss/nesting': {}, - tailwindcss: {}, - autoprefixer: {}, - 'postcss-preset-mantine': {}, - 'postcss-simple-vars': { - variables: { - 'mantine-breakpoint-xs': '36em', - 'mantine-breakpoint-sm': '48em', - 'mantine-breakpoint-md': '62em', - 'mantine-breakpoint-lg': '75em', - 'mantine-breakpoint-xl': '88em', - }, - }, - }, -} diff --git a/prisma/migrations/20240107135405_auth/migration.sql b/prisma/migrations/20240107135405_auth/migration.sql deleted file mode 100644 index 2a32094..0000000 --- a/prisma/migrations/20240107135405_auth/migration.sql +++ /dev/null @@ -1,57 +0,0 @@ --- CreateTable -CREATE TABLE `Account` ( - `id` VARCHAR(191) NOT NULL, - `userId` VARCHAR(191) NOT NULL, - `type` VARCHAR(191) NOT NULL, - `provider` VARCHAR(191) NOT NULL, - `providerAccountId` VARCHAR(191) NOT NULL, - `refresh_token` TEXT NULL, - `access_token` TEXT NULL, - `expires_at` INTEGER NULL, - `token_type` VARCHAR(191) NULL, - `scope` VARCHAR(191) NULL, - `id_token` TEXT NULL, - `session_state` VARCHAR(191) NULL, - - UNIQUE INDEX `Account_provider_providerAccountId_key`(`provider`, `providerAccountId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Session` ( - `id` VARCHAR(191) NOT NULL, - `sessionToken` VARCHAR(191) NOT NULL, - `userId` VARCHAR(191) NOT NULL, - `expires` DATETIME(3) NOT NULL, - - UNIQUE INDEX `Session_sessionToken_key`(`sessionToken`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `User` ( - `id` VARCHAR(191) NOT NULL, - `name` VARCHAR(191) NULL, - `email` VARCHAR(191) NULL, - `emailVerified` DATETIME(3) NULL, - `image` VARCHAR(191) NULL, - - UNIQUE INDEX `User_email_key`(`email`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `VerificationToken` ( - `identifier` VARCHAR(191) NOT NULL, - `token` VARCHAR(191) NOT NULL, - `expires` DATETIME(3) NOT NULL, - - UNIQUE INDEX `VerificationToken_token_key`(`token`), - UNIQUE INDEX `VerificationToken_identifier_token_key`(`identifier`, `token`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `Account` ADD CONSTRAINT `Account_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `Session` ADD CONSTRAINT `Session_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20240107153345_add_password_hash_to_user/migration.sql b/prisma/migrations/20240107153345_add_password_hash_to_user/migration.sql deleted file mode 100644 index 82202fe..0000000 --- a/prisma/migrations/20240107153345_add_password_hash_to_user/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE `User` ADD COLUMN `passwordHash` VARCHAR(191) NULL; diff --git a/prisma/migrations/20240122063550_add_user_photo_profile/migration.sql b/prisma/migrations/20240122063550_add_user_photo_profile/migration.sql deleted file mode 100644 index 7c605ea..0000000 --- a/prisma/migrations/20240122063550_add_user_photo_profile/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ --- CreateTable -CREATE TABLE `UserPhotoProfiles` ( - `id` VARCHAR(191) NOT NULL, - `userId` VARCHAR(191) NOT NULL, - - UNIQUE INDEX `UserPhotoProfiles_userId_key`(`userId`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `UserPhotoProfiles` ADD CONSTRAINT `UserPhotoProfiles_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20240122063854_move_user_profile_image_from_user_to_user_photo_table/migration.sql b/prisma/migrations/20240122063854_move_user_profile_image_from_user_to_user_photo_table/migration.sql deleted file mode 100644 index 6524c4f..0000000 --- a/prisma/migrations/20240122063854_move_user_profile_image_from_user_to_user_photo_table/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `image` on the `User` table. All the data in the column will be lost. - - Added the required column `path` to the `UserPhotoProfiles` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE `User` DROP COLUMN `image`; - --- AlterTable -ALTER TABLE `UserPhotoProfiles` ADD COLUMN `path` VARCHAR(191) NOT NULL; diff --git a/prisma/migrations/20240125182804_remove_unused_tables/migration.sql b/prisma/migrations/20240125182804_remove_unused_tables/migration.sql deleted file mode 100644 index fb979f9..0000000 --- a/prisma/migrations/20240125182804_remove_unused_tables/migration.sql +++ /dev/null @@ -1,22 +0,0 @@ -/* - Warnings: - - - You are about to drop the `Account` table. If the table is not empty, all the data it contains will be lost. - - You are about to drop the `Session` table. If the table is not empty, all the data it contains will be lost. - - You are about to drop the `VerificationToken` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropForeignKey -ALTER TABLE `Account` DROP FOREIGN KEY `Account_userId_fkey`; - --- DropForeignKey -ALTER TABLE `Session` DROP FOREIGN KEY `Session_userId_fkey`; - --- DropTable -DROP TABLE `Account`; - --- DropTable -DROP TABLE `Session`; - --- DropTable -DROP TABLE `VerificationToken`; diff --git a/prisma/migrations/20240125192659_added_role_and_permission_table/migration.sql b/prisma/migrations/20240125192659_added_role_and_permission_table/migration.sql deleted file mode 100644 index 8df4a92..0000000 --- a/prisma/migrations/20240125192659_added_role_and_permission_table/migration.sql +++ /dev/null @@ -1,66 +0,0 @@ --- CreateTable -CREATE TABLE `Role` ( - `id` VARCHAR(191) NOT NULL, - `code` VARCHAR(191) NOT NULL, - `name` VARCHAR(191) NOT NULL, - `description` VARCHAR(191) NOT NULL DEFAULT '', - - UNIQUE INDEX `Role_code_key`(`code`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `Permission` ( - `id` VARCHAR(191) NOT NULL, - `code` VARCHAR(191) NOT NULL, - `name` VARCHAR(191) NOT NULL, - `description` VARCHAR(191) NOT NULL DEFAULT '', - - UNIQUE INDEX `Permission_code_key`(`code`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `_RoleToUser` ( - `A` VARCHAR(191) NOT NULL, - `B` VARCHAR(191) NOT NULL, - - UNIQUE INDEX `_RoleToUser_AB_unique`(`A`, `B`), - INDEX `_RoleToUser_B_index`(`B`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `_PermissionToRole` ( - `A` VARCHAR(191) NOT NULL, - `B` VARCHAR(191) NOT NULL, - - UNIQUE INDEX `_PermissionToRole_AB_unique`(`A`, `B`), - INDEX `_PermissionToRole_B_index`(`B`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- CreateTable -CREATE TABLE `_PermissionToUser` ( - `A` VARCHAR(191) NOT NULL, - `B` VARCHAR(191) NOT NULL, - - UNIQUE INDEX `_PermissionToUser_AB_unique`(`A`, `B`), - INDEX `_PermissionToUser_B_index`(`B`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- AddForeignKey -ALTER TABLE `_RoleToUser` ADD CONSTRAINT `_RoleToUser_A_fkey` FOREIGN KEY (`A`) REFERENCES `Role`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `_RoleToUser` ADD CONSTRAINT `_RoleToUser_B_fkey` FOREIGN KEY (`B`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `_PermissionToRole` ADD CONSTRAINT `_PermissionToRole_A_fkey` FOREIGN KEY (`A`) REFERENCES `Permission`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `_PermissionToRole` ADD CONSTRAINT `_PermissionToRole_B_fkey` FOREIGN KEY (`B`) REFERENCES `Role`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `_PermissionToUser` ADD CONSTRAINT `_PermissionToUser_A_fkey` FOREIGN KEY (`A`) REFERENCES `Permission`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE `_PermissionToUser` ADD CONSTRAINT `_PermissionToUser_B_fkey` FOREIGN KEY (`B`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20240125193103_add_status_for_role_and_permission/migration.sql b/prisma/migrations/20240125193103_add_status_for_role_and_permission/migration.sql deleted file mode 100644 index 7a44158..0000000 --- a/prisma/migrations/20240125193103_add_status_for_role_and_permission/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE `Permission` ADD COLUMN `isActive` BOOLEAN NOT NULL DEFAULT false; - --- AlterTable -ALTER TABLE `Role` ADD COLUMN `isActive` BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/migrations/20240214052727_move_photo_profile_into_table/migration.sql b/prisma/migrations/20240214052727_move_photo_profile_into_table/migration.sql deleted file mode 100644 index 0d9aae9..0000000 --- a/prisma/migrations/20240214052727_move_photo_profile_into_table/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - You are about to drop the `UserPhotoProfiles` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropForeignKey -ALTER TABLE `UserPhotoProfiles` DROP FOREIGN KEY `UserPhotoProfiles_userId_fkey`; - --- AlterTable -ALTER TABLE `User` ADD COLUMN `photoProfile` VARCHAR(191) NULL; - --- DropTable -DROP TABLE `UserPhotoProfiles`; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml deleted file mode 100644 index e5a788a..0000000 --- a/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "mysql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma deleted file mode 100644 index 05bd2c1..0000000 --- a/prisma/schema.prisma +++ /dev/null @@ -1,39 +0,0 @@ -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} - -model User { - id String @id @default(cuid()) - name String? - email String? @unique - emailVerified DateTime? - passwordHash String? - photoProfile String? - directPermissions Permission[] @relation("PermissionToUser") - roles Role[] @relation("RoleToUser") -} - -model Role { - id String @id @default(cuid()) - code String @unique - name String - description String @default("") - isActive Boolean @default(false) - permissions Permission[] @relation("PermissionToRole") - users User[] @relation("RoleToUser") -} - -model Permission { - id String @id @default(cuid()) - code String @unique - name String - description String @default("") - isActive Boolean @default(false) - roles Role[] @relation("PermissionToRole") - directUsers User[] @relation("PermissionToUser") -} diff --git a/prisma/seed.ts b/prisma/seed.ts deleted file mode 100644 index 43841e3..0000000 --- a/prisma/seed.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { PrismaClient } from "@prisma/client"; -import permissionSeed from "./seeds/permissionSeed"; -import roleSeed from "./seeds/roleSeed"; -import userSeed from "./seeds/userSeed"; - -const prisma = new PrismaClient(); - -async function main() { - await permissionSeed(prisma); - await roleSeed(prisma); - await userSeed(prisma); -} - -main() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); diff --git a/prisma/seeds/permissionSeed.ts b/prisma/seeds/permissionSeed.ts deleted file mode 100644 index b9b201d..0000000 --- a/prisma/seeds/permissionSeed.ts +++ /dev/null @@ -1,22 +0,0 @@ -import permissionData from "../../src/modules/permission/data/initialPermissions"; -import { PrismaClient } from "@prisma/client"; -import { log } from "console"; - -export default async function permissionSeed(prisma: PrismaClient) { - - log("Seeding permissions...") - - await Promise.all( - permissionData.map(async (permission) => { - await prisma.permission.upsert({ - where: { - code: permission.code - }, - update: permission, - create: permission - }) - }) - ) - - console.log("Permission is seeded successfully") -} diff --git a/prisma/seeds/roleSeed.ts b/prisma/seeds/roleSeed.ts deleted file mode 100644 index 2322a52..0000000 --- a/prisma/seeds/roleSeed.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { PrismaClient } from "@prisma/client"; -import { log } from "console"; -import roleData from "../../src/modules/role/data/initialRoles"; - -export default async function roleSeed(prisma: PrismaClient) { - log("Seeding roles..."); - - await Promise.all( - roleData.map(async (role) => { - await prisma.role.upsert({ - where: { - code: role.code, - }, - update: { - code: role.code, - description: role.description, - isActive: role.isActive, - name: role.name, - permissions: { - connect: role.permissions.map((permissionCode) => ({ - code: permissionCode, - })), - }, - }, - create: { - code: role.code, - description: role.description, - isActive: role.isActive, - name: role.name, - permissions: { - connect: role.permissions.map((permissionCode) => ({ - code: permissionCode, - })), - }, - }, - }); - }) - ); - - console.log("roles is seeded successfully"); -} diff --git a/prisma/seeds/userSeed.ts b/prisma/seeds/userSeed.ts deleted file mode 100644 index 4a4fbb0..0000000 --- a/prisma/seeds/userSeed.ts +++ /dev/null @@ -1,36 +0,0 @@ -import hashPassword from "../../src/modules/auth/utils/hashPassword"; -import { User, PrismaClient, Prisma } from "@prisma/client"; -import { DefaultArgs } from "@prisma/client/runtime/library"; -import { log } from "console"; - -export default async function userSeed(prisma: PrismaClient) { - - log("Seeding users...") - - const userData: Prisma.UserUncheckedCreateInput[] = [ - { - email: "superadmin@example.com", - name: "Super Admin", - roles: { - connect: { - code: "super-admin" - } - }, - passwordHash: await hashPassword("123456") - } - ] as const; - - await Promise.all( - userData.map(async (user) => { - await prisma.user.upsert({ - where: { - email: user.email ?? undefined - }, - update: user, - create: user - }) - }) - ) - - console.log("users is seeded successfully") -} diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index d2f8422..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/api/login/route.ts b/src/app/api/login/route.ts deleted file mode 100644 index 368a36a..0000000 --- a/src/app/api/login/route.ts +++ /dev/null @@ -1,32 +0,0 @@ -import applicationJsonOnly from "@/core/utils/applicationJsonOnly"; -import handleCatchApi from "@/core/utils/handleCatchApi"; -import AuthError from "@/modules/auth/error/AuthError"; -import signInSchema from "@/modules/auth/formSchemas/signInSchema"; -import signIn from "@/modules/auth/services/signIn"; -import { cookies } from "next/headers"; -import { NextRequest, NextResponse } from "next/server"; - -export const dynamic = "force-dynamic"; - -export async function POST(request: NextRequest) { - try { - applicationJsonOnly(request.headers); - const data = signInSchema.safeParse(await request.json()); - - if (!data.success) { - throw new AuthError({ - errorCode: "INVALID_CREDENTIALS", - message: "Email or Password does not match", - statusCode: 401, - }); - } - - const result = await signIn(data.data); - - cookies().set("token", result.token); - - return NextResponse.json(result); - } catch (e) { - return handleCatchApi(e); - } -} diff --git a/src/app/api/register/route.ts b/src/app/api/register/route.ts deleted file mode 100644 index 3248cfc..0000000 --- a/src/app/api/register/route.ts +++ /dev/null @@ -1,37 +0,0 @@ -import BaseError from "@/core/error/BaseError"; -import applicationJsonOnly from "@/core/utils/applicationJsonOnly"; -import handleCatchApi from "@/core/utils/handleCatchApi"; -import nonAdminRegisterAction from "@/modules/auth/actions/nonAdminRegisterAction"; -import { createUserSchema } from "@/modules/auth/formSchemas/CreateUserFormSchema"; -import mapObjectToFirstValue from "@/utils/mapObjectToFirstValue"; -import { NextRequest, NextResponse } from "next/server"; - -export const dynamic = "force-dynamic"; - -export async function POST(request: NextRequest) { - try { - applicationJsonOnly(request.headers); - const data = createUserSchema.safeParse(await request.json()); - - if (!data.success) { - throw new BaseError({ - errorCode: "INVALID_FORM_DATA", - message: "", - formErrors: mapObjectToFirstValue( - data.error.flatten().fieldErrors - ), - statusCode: 422, - }); - } - - const result = await nonAdminRegisterAction({ - email: data.data.email, - name: data.data.name, - password: data.data.password, - }); - - return NextResponse.json(result); - } catch (e) { - return handleCatchApi(e); - } -} diff --git a/src/app/dashboard/coba/page.tsx b/src/app/dashboard/coba/page.tsx deleted file mode 100644 index 481b212..0000000 --- a/src/app/dashboard/coba/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react' - -export default function Page() { - return ( -
page
- ) -} diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx deleted file mode 100644 index 6b25c6b..0000000 --- a/src/app/dashboard/layout.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { MantineProvider } from "@mantine/core"; -import React from "react"; -import DashboardLayout from "@/modules/dashboard/components/DashboardLayout"; -import { Notifications } from "@mantine/notifications"; -import getCurrentUser from "@/modules/auth/services/getCurrentUser"; -import { AuthContextProvider } from "@/modules/auth/contexts/AuthContext"; -import getSidebarMenus from "@/modules/dashboard/services/getSidebarMenus"; - -interface Props { - children: React.ReactNode; -} - -export default async function Layout(props: Props) { - const user = (await getCurrentUser()); - - // if (!user) { - // redirect("/dashboard/login"); - // } - - const userData = user ? { - id: user.id, - name: user.name ?? "", - email: user.email ?? "", - photoProfile: user.photoProfile, - sidebarMenus: await getSidebarMenus() - } : null; - - return ( - - - - {props.children} - - - ); -} diff --git a/src/app/dashboard/login/layout.tsx b/src/app/dashboard/login/layout.tsx deleted file mode 100644 index c7b4606..0000000 --- a/src/app/dashboard/login/layout.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import guestOnly from "@/modules/auth/actions/guestOnly"; -import React from "react"; - -interface Props { - children: React.ReactNode; -} - -export default async function LoginLayout({ children }: Props) { - - await guestOnly() - - return <>{children}; -} \ No newline at end of file diff --git a/src/app/dashboard/login/page.tsx b/src/app/dashboard/login/page.tsx deleted file mode 100644 index ed42d9d..0000000 --- a/src/app/dashboard/login/page.tsx +++ /dev/null @@ -1,77 +0,0 @@ -"use client"; -import signIn from "@/modules/auth/actions/signInAction"; -import { - Paper, - PasswordInput, - Stack, - Text, - TextInput, - Group, - Anchor, - Button, - Alert, -} from "@mantine/core"; -import React from "react"; -import { useFormState } from "react-dom"; - -const initialState = { - errors: { - message: "", - }, -}; - -export default function LoginPage() { - const [state, formAction] = useFormState(signIn, initialState); - - return ( -
- - - Welcome - -
- - {state.errors.message ? ( - - {state.errors.message} - - ) : null} - - - - - - - Don't have an account? Register - - - - -
-
-
- ); -} diff --git a/src/app/dashboard/logout/page.tsx b/src/app/dashboard/logout/page.tsx deleted file mode 100644 index 99b7a27..0000000 --- a/src/app/dashboard/logout/page.tsx +++ /dev/null @@ -1,18 +0,0 @@ -"use client"; - -import logoutAction from "@/modules/auth/actions/logoutAction"; -import { useEffect } from "react"; - -/** - * LogoutPage component handles the logout process. - * It checks if a user is logged in, logs them out, and redirects to the login page. - */ -export default function LogoutPage() { - useEffect(() => { - (async () => await logoutAction())() - .then(() => {}) - .catch(() => {}); - }, []); - - return
; -} diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx deleted file mode 100644 index be12964..0000000 --- a/src/app/dashboard/page.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import checkPermission from '@/modules/auth/utils/checkPermission' -import dashboardConfig from '@/modules/dashboard/dashboard.config' -import { redirect } from 'next/navigation' -import React from 'react' - -export default async function Dashboard() { - - if (!await checkPermission("authenticated-only")) redirect(`${dashboardConfig.baseRoute}/login`) - - return ( -
-

Dashboard

-
- ) -} diff --git a/src/app/dashboard/permissions/page.tsx b/src/app/dashboard/permissions/page.tsx deleted file mode 100644 index b1ea645..0000000 --- a/src/app/dashboard/permissions/page.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import checkMultiplePermissions from "@/modules/auth/utils/checkMultiplePermissions"; -import getAllPermissions from "@/modules/permission/services/getAllPermissions"; -import PermissionsTable from "@/modules/permission/tables/PermissionTable/PermissionTable"; -import { Card, Stack, Title } from "@mantine/core"; -import { Metadata } from "next"; -import React from "react"; - -export const metadata: Metadata = { - title: "Permissions - Dashboard", -}; - -export default async function RolesPage() { - const permissions = await checkMultiplePermissions({ - create: "permissions.create", - readAll: "permissions.readAll", - read: "permissions.read", - update: "permissions.update", - delete: "permissions.delete", - }); - - const permissionsData = await getAllPermissions(); - - return ( - - Permissions - - - - - ); -} diff --git a/src/app/dashboard/register/layout.tsx b/src/app/dashboard/register/layout.tsx deleted file mode 100644 index c26712e..0000000 --- a/src/app/dashboard/register/layout.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import guestOnly from "@/modules/auth/actions/guestOnly"; -import React from "react"; - -interface Props { - children: React.ReactNode; -} - -export default async function RegisterLayout({ children }: Props) { - await guestOnly(); - - return <>{children}; -} diff --git a/src/app/dashboard/register/page.tsx b/src/app/dashboard/register/page.tsx deleted file mode 100644 index a187ed2..0000000 --- a/src/app/dashboard/register/page.tsx +++ /dev/null @@ -1,128 +0,0 @@ -"use client"; - -import ClientError from "@/core/error/ClientError"; -import createUserAction from "@/modules/auth/actions/createUserAction"; -import { CreateUserSchema } from "@/modules/auth/formSchemas/CreateUserFormSchema"; -import withServerAction from "@/modules/dashboard/utils/withServerAction"; -import { - Paper, - PasswordInput, - Stack, - Text, - TextInput, - Group, - Anchor, - Button, -} from "@mantine/core"; -import { useForm } from "@mantine/form"; -import { showNotification } from "@mantine/notifications"; -import React from "react"; - -export default function RegisterPage() { - //TODO: Display error message - // const [errorMessage, setErrorMessage] = useState(""); - - const form = useForm({ - initialValues: { - email: "", - password: "", - passwordConfirmation: "", - name: "", - }, - validate: { - email: (value: string) => - /^\S+@\S+$/.test(value) ? null : "Invalid email", - password: (value: string) => - value.length >= 6 - ? null - : "Password should be at least 6 characters", - passwordConfirmation: (value: string, values: CreateUserSchema) => - value === values.password ? null : "Passwords should match", - name: (value: string) => - value.length > 0 ? null : "Name is required", - }, - }); - - const handleSubmit = async () => { - withServerAction(createUserAction, form.values) - .then(() => { - showNotification({message: "Register Success", color: "green"}) - }) - .catch((e) => { - if (e instanceof ClientError) { - if (e.errorCode === "INVALID_FORM_DATA") { - form.setErrors(e.formErrors ?? {}); - } else { - // setErrorMessage(`ERROR: ${e.message} (${e.errorCode})`); - } - } else if (e instanceof Error) { - // setErrorMessage(`ERROR: ${e.message}`); - } else { - // setErrorMessage( - // `Unkown error is occured. Please contact administrator` - // ); - } - }) - }; - - return ( -
- - - Register - -
handleSubmit())} - > - - - - - - - - - toggle()} - size="xs" - href="/login" - > - Already have an account? Login - - - - -
-
-
- ); -} diff --git a/src/app/dashboard/roles/page.tsx b/src/app/dashboard/roles/page.tsx deleted file mode 100644 index bd9d1a6..0000000 --- a/src/app/dashboard/roles/page.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import checkMultiplePermissions from "@/modules/auth/utils/checkMultiplePermissions"; -import unauthorized from "@/modules/dashboard/utils/unauthorized"; -import getAllRoles from "@/modules/role/services/getAllRoles"; -import RolesTable from "@/modules/role/tables/RolesTable/RolesTable"; -import { Card, Stack, Title } from "@mantine/core"; -import { Metadata } from "next"; -import React from "react"; - -export const metadata: Metadata = { - title: "Roles - Dashboard", -}; - -export default async function RolesPage() { - const permissions = await checkMultiplePermissions({ - create: "roles.create", - readAll: "roles.readAll", - read: "roles.read", - update: "roles.update", - delete: "roles.delete", - }); - - if (!permissions.readAll) unauthorized() - - const roles = await getAllRoles(); - - return ( - - Roles - - - - - ); -} diff --git a/src/app/dashboard/users/page.tsx b/src/app/dashboard/users/page.tsx deleted file mode 100644 index ed2f9cd..0000000 --- a/src/app/dashboard/users/page.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Card, Stack, Title } from "@mantine/core"; -import React from "react"; -import getUsers from "@/modules/userManagement/services/getAllUsers"; -import { Metadata } from "next"; -import UsersTable from "@/modules/userManagement/tables/UsersTable/UsersTable"; -import checkMultiplePermissions from "@/modules/auth/utils/checkMultiplePermissions"; - -export const metadata: Metadata = { - title: "Users - Dashboard", -}; - -export default async function UsersPage() { - // Check for permission and return error component if not permitted - const permissions = await checkMultiplePermissions({ - create: "users.create", - readAll: "users.readAll", - read: "users.read", - update: "users.update", - delete: "users.delete", - }); - - const users = await getUsers(); - - return ( - - Users - - - - - ); -} diff --git a/src/app/favicon.ico b/src/app/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m diff --git a/src/app/globals.css b/src/app/globals.css deleted file mode 100644 index 7d76737..0000000 --- a/src/app/globals.css +++ /dev/null @@ -1,5 +0,0 @@ -@layer tailwind{ - @tailwind base; -} -@tailwind components; -@tailwind utilities; \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx deleted file mode 100644 index 21c7457..0000000 --- a/src/app/layout.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type { Metadata } from "next"; -import { Inter } from "next/font/google"; - -import "./globals.css"; -import "@mantine/core/styles.css"; -import '@mantine/notifications/styles.css'; - -import { ColorSchemeScript } from "@mantine/core"; - -const inter = Inter({ subsets: ["latin"] }); - -export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - - - - - {children} - - - ); -} diff --git a/src/app/page.tsx b/src/app/page.tsx deleted file mode 100644 index bc1f838..0000000 --- a/src/app/page.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { redirect } from 'next/navigation' -import React from 'react' - -export default function page() { - - redirect("/dashboard") - - return ( -
page
- ) -} - \ No newline at end of file diff --git a/src/assets/logos/logo-dsg.png b/src/assets/logos/logo-dsg.png deleted file mode 100644 index c65edc6b4eb91fb0fb1683d4d2372586930dab15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14581 zcmYLw1z6MH_y2ozhe$VyASo%$Kte$f6p(JDyL+M-q=%8uJJzY&oG8Qrb04N_lRC@{lcyQeR86-rw-w^W1 z4%{CiTWw7>;OhDZ+E$bd05T>HSTRz?e>7_tH62*1>>My!H zPKzs(N?2%$M;J|&IcucUGICH6sL))${P{CyldOYfy7o0K7H0Cx^8=!XBT=v*<9|<8 z^nwTc-q5ghBoSwYHu7rp$j;tlY3O?O>YwDOe(ka2#`rkJpL{YH58t@5XYp@I{u7(h zUgDyx4Jf=pq<+|)8Ag1QV!gg)fK| z?EllcSkm4!HL2bTP62D1w(Vc==HZb3Ph*4Dl9JiP5qLK_tS#f{d(t;WCThsWpk{Yw3emTu_?yYNgH;ayzvo)j{B2oY`S-Rllh7Su5aW|IbVGmOSxUUTGhkR~rgjWD`F`9^M~z{-1~TOW5{F zbvYdon*B!HDC$d$0GqY}Lx#4)~{Wzv#*d37LG*p}&OFh;3{{GZ>>M&~bYI7~40t}iZu zOiXmD+9N_I4kkw3ToyQV%=f4kJ>$}m+>zqj_kCMB!_CHJ>8VMg$b^$FbyDXo>FK^V_yV>a z8KNi6Ic~ERTODqQOuOcs`mB!T!WTvR+3D-ccLG3u_eVGc1fR-{X%t3Ki)>S==-r1j zun(O+B5-3I49wpN%~Bn$Lw}WB?NEC4r+Y}~3v!oB_)f)&?1Mk2A6UVj{ki@z?Nc-a z^f$l0sT#Yb6c}%maeGj2;!Zge^{*gz^h$r!^G}PKVJ^1a9*?oY4d;&ANg65sx6QtB zkpLE1fH1>6Gg7*FJcR}MURY9Dp-27$v3%|?E)e*EUX0b_O;&aMBIh?@fM0q;0^(w{ zl5fQyIb1}BaGva{rDQ#>u2~NptL;3N1LTzd92Lo4{60B2oxaLPkMQST!L#?WiNK8J zORTF>j<#v_aigmo)dj^fx0V7Wk{r4u>T`*~e2CW_*aC9~B`U*-;{$I>WNL4VGHO66 zr+X~@HVCeG8!T;iRSrl2sUK~Y-vUm6-%ISm0|#lb;uYa11+>s!kN_ct9|5>`EOprT zD*o8-749>VfL!aDi4`9>D6fkC1?k*?zas%a33)?yu_)Aa)0??Se9s^hK;1_8Q7I9C z@u47iw4vd4M3$y9`@xU!R&r7Z5$@f**LOC;zrD(|t7nNx`|hRmmA>f@wP$xwVj{~J ztPy~dw)op`mH_a7N*S0O$ihC+DtVo_OP8e|(~YiG)0_2FyS=k6Zu-gJ2=T-z#iC{W zG^`9PHGUb zv+6M_)}ztsW(45fAUF?A9YQuMVNY=5U~`qHY~)3=!4;VEH9?N%Y=m3Vl56Tc+uT(LULV86#G!osbqb74D5 z{^aiCqS2urN_c<;3~<-cZ;kcrwG1#*ZSCjsqXbxhYznYEV+icC3G(J+m+t(8KXkFS zeiK1)7k{-LZ7Ff>8xVhcV;Gl;;lXp_uBLQDaGvi|xV21n(7* z#usSt_N6`0paT3BK`a9FsKuGyC*4e3C-W;loPo{8ty%oV8L0*D&Qnt{{1J@+3KGkT zm2VGtS_Au*PJmmmsP7E5ua1pcUvb`M01I2lwwA+JX&#f{9P@y7%rIQEVt=~kEXVPT zJDZaR+j6+CJmM=}W%<4?oDCKHbUVa^AcjhGTviX0;gI?kN+o9ZP zkH%#)ggy2QLqjtfVRR-WehhLZX@6CPL&DctJZ5{Dr1GYiWNln4+T7#VBEMAoyM}}v z|0RKo56-^mo=k`Q2H}=Nf`hKiG^?@QJ@FtI@uvrt%>iwn1V`1D2Uyg%DbBDoIimme zxa25h7B#fXD>823T-Sr=G2Yr2A_azKgP?mBQtQb*@AfDO{%p2%`C`UZh4CTBSzLUA zJ-_-t^4sG>M3!Z9N_GqAphMc~05`$4pI=HY^bM`dkV^Lwz&2%8wVqnv#^-R{XbNyu zI=w^v*nOUKpr-0xV%DxDhu6*=B2Isqk2!5_KNzUnB$%?=?y>ote(zeX*^45-#S=<7 z>g)LS_m+*$fJ_ng@hUw7xQN*hX8C^R$@5M-Ga(FZy<3?_yxW$hp27ezF5xJhGF1%N zItEZm$t$Ye#xlzAJ+(J!85!B;X6A(4_P?ice}5c5&Tk4e?E-U(jp(Sf%a?E^%mtv%*#P+nJ(lK?&Wrf*D{Rr2Y>I&P? z5Cc+DgXFF#@Hr5-1O#et&q66C5z4l)Aal^{QIdWJ9sT&l zx;r`YQH0oIQSz)ow3at`<@GVm?o3;oM%SC4H##o;@DHV8#JnQG1BiN#Uen_3W3*=wI}dnw%7l5EUG`dn(y`@K;? z%9=#cdkNwc1u&gLh;nSV!cbZct!r8qw%<3Yz5a)4W$4@}A>8snzenlW6`Srs`ouv$ zaphEVi5ikgdD(=y7AltgrSJ8fzxDkTlJ0pUwB)X>ocVDb)xM=~^+yyJe*&AOfAfEM z=GDO(k|@Qr67g+F-+NlWvp*@~P2JZf@WUBu>}0hg@;;8`7N7ZJcXu_fohgw_$?kL| zMcMf|N!&RQ5O!1lAtN}}u%U_w#XOBUs&;wbfxJ3h2T(iVi)`8*9R}E=UCqJw96vu8 zK~iJu9AeD3Iz*YhDk|r5c92iFmG(>U%#ki;P5^X(0IF_5f#=vHSh#s94G&!J2g`p_ z>BzOM*mi#?Rj!S9J8sv7TH+m&8SYK-&c62fFV0<5QT?4II>GZS&Bro1))?XP1qGiU zEX&O;91?|fW%qjqv1+!QiIVtrOdTa-ja4iKAgJt53J0QLD%Yh4k9p%;7``2GC|`L3 zey|WbL|{*th1n$i?HF&KdSH;eYcB>nZ+?R?{$#paM1F7k^2Js-2)F49)P@_%F7)Cs zr_yZ`_&ilVNT|sVc`cMRons7}rhje$WY7CfKpE!`)s7178_ojaWf#OOPRm&DuxUWC zUtf56+!x6eA4oqLmDhN-Y2<-(75Z%>r=P!j!vY|zaFVfGBQ1$HJvl|9>bZKpqY>vhVn@#wo*a;J<5v+M~wV1WRH!%_>Zyk;=XvVIKg z=q-i8eWmX)>t7~MDxLtf?XNoePsNk+tB`apD{h zyp8W%EanT9BmGV2nAz;9FsSgtX6NDvE6-!sTbnbCT%~}2kt?_Yca3dH!1Nbks|s(m zauvzU>kIp=@9nc6hQ{N)(WZnF(!Aa$e{nS!IWi;varqg6%m$hLUkT)P<^Vvm(oVqi zXN^M71Z#Qfn54*M{rKq-wDS67%l^o$&OpSWS*XZ|lnzalT=3d5`M|YK`O?C&Tco&g zdY2BQBC~~ejGte#=Bp2Cj-RC`IO1EbsHVGh^RDI2Qz+Zq!&jJv7*5u@$a~z1hwpw?tB_NVnwgzgudx1&K%m73W;JzQi5x z7gLReKQaW%6wk~L$NdW;=;R5%2$Vk@Qup<>HBk)OIy)K)voxJmcv{%6-oqSI=c3r5 zZi6>BKna!I{yf39eA>!KgbS~SkJtcVCKwv?;Jco^OULI(p^uv-yL87_lqO94;jUF^ z3-mEjed$ym_uqa0uXpJ81TKitq7u9&S07tU+7kl(32=!nUv9~R8=pNV5x-U&@89HA zz>tLGwN~Jg+yf%y9+nO@SHzrkx20!AR%1CiRX)xG8&Ykm^Uy?c74Q`9Q^WS+zKsNU7tMvMkm$G z|ERPB*j&aZBqqjhmIyl)@_kVRfWFx7-QL&0R!_dY8*S+UloJg#arCzFaM&fhfTXsZ zZeV!qE)rBE(#`rX;oBeVw+7CwL{ImKBP$ub6Z|@Q2=^!)=KTHjxLJ+x%$_;(Jkg-{ z!RolmrAXG%D=Z$0z~Ek+6$H(Z1q~*ZEj_Q1@!p9-yM!>nsqy`SfqLZJQyK_Ea#Zf` zTW;XWbg$RyvXc!nza7ZoF7rs_tzNZvOmyhWlfWuhksFZIT`#8}6``3^dbb&(n`<8Z z-V#Fd&p!Fp_9jx7_}h?5cSuyTIUZD-8rtoVC6Fo@=W6`cezDjw1-ZM~%@x5D!VkL+Y&Y2bw`W+R9*%3%Xjks;@b^2AY& zfFGLlL`Gd%m&!{h8<;Jrvt2Jv{ahWf6KOUeR~QEhsa~2g&InM;P{=i-xhHT3!muIq zG3C3yL%m;QOh#|23s3R6s=tBPz$i!AOgXBr1eXv!ff%9F>km%9Xb~OX^;yIUg~N8V z+S_hdNPQVyv&R2u%V=akszZ;PakJD#cTw-49T!K7aX0h1I^$b1o=b7;Y4?A>&kG(; z08kG*pH@z$UWG0J!X+ZSP0#G*7|$s9mA(jpOkrko%rSoSrc00cbDZh1DMH}D#+4ZU zi1mT2udefdA2P_Mplc@uCK{ov6+%=Xh=>)$$jtbv#9N5UaP95!vMskTB4Tdjz3G}6 zZP-?LPSFUiDuQaX@0Jb_WyvFCpAX)4nzfIM3?nK?!Sb^xBu0KRR|zr2C1(1GB7Ll%Nx$H*7=b8MDP3JN=U2HgRn{@ey2B7%@L$9v&L38&nL9z&eh(e+41l1%yNH_6?~9fKpZ-oV(BxQ2Xh=2} z4d8<{+uCyl&Z@+M$t6t^Ta|nG)^l4gzWNJ1gTPu)T#PJxpb34_3gm_G=+mXQzT?YKf7 zz3TH|YX{^y@Au6IxgYu^3o(H+{okH?*@{X)VD-Oit;8!lB4E!?w`rGIvc>zeWpaLSWQ~t8FO5*sEh)F?(Cgs-K71sN(f@x_Q&a z1U-$92_z6r0{C$nR$<>ZUU^}p4T9Cy6SqK610Bis?(uRC^bbt{RYQPctS3y{c%^?9 zL2>4z1_{ujgQ`boa0!M2b!KL6=0}NEOlFNlX6$&-Te_zGS~`4uWbpmv9e>55?qi{q z(5?C-r1CZ`VCv!O6Kz;SKu$ud9&BGV$eI_30^rSOFNk4P`4MXyGt>Rl%1!U-T_*ZG zyO;pKyP!h>;RDUx_G0~Cp!B4W4Fp1(gibELrFhDrfZwmpXJ2#3@ZwDY zQ~lpUb{8~2wkl*z%lqcL-*h!n(LEOu)%I}!cyn7~2=JjDk)Tre-_t0#kqFpzTXN9@c6 z=Q)rb+t+gVsZ6NMEf?(I04Z@iCquSarc&=mzx;zlZw~?gif3MYI9u!L(T^c&na^q8 z2@%z}lu&1rF-G#0J|d)GlNgXA@~ZAAHLf$SWZKje#7m-nw~a`7*`YLBfdi0iUlvvy z6{9sry$K*1I2?f%91C!xFI%L7Aw~p*^nZz)vxMP)tpdvK2-Z}Y4-F7jQ59WLNt}(b zPc}{4AkYAm?q$hU^v;tEl!KG2txG<7rs~u)vn*EbhFXD0MuGtyH z;$llb2Zy~=O(+^$WmB%5;by>CNWXmTKj!d_DJf$^sC$+XCd;G7$ex(1c zp#?0!ICwHM?9eI`z2E2!suN&((6~BMr*XJ<=-brL39BNN47y@Bgl&Irmlr^~jEpGGC~ zH~t}(W8&~l12(OyUO^giJf|NdF$M@@7ljk;+*kYp&kXX;E#J@bU4!zT@?m{=%dMr1 z%~8JSfc3AZJ+JvL$sxJ`bX6MpObP4F9KSk?%dy&@7PaYAd3&MM)yFy3+X&gXbKT1r zoKl8d04w*Sw@&YSn+jdAz_+mSma>>M95h;b5w9MqE9kb?_-1}%*;MyHd2KtCo*drc z#FiFmXpYGSB^HrG&2FM!=&Xb?63UAoQ&^$3oyhAP1CozB@9HKKI~fL_MY^)Z7Tuk9 zyo%)k{DMzqC)%8|&U#JSJDVJ*?alp>6n6V%h5(A`c2D(s+;Ln&qNxn8E+m!nBrW{J zHS(9zh>E!HyC{wtd%w;mZeBpK^Q>galvOH%E$2vPD5H;A-(GqChIL$munQ!WSup3o zyRtkFFZkje{(D1aN2Z{82jhb)%M0*2N1>fJpGv8P*_d7%5T3l$oU>@&t-ml;hu%Z$ zGT-piDN?G@R^`SWn0e39LOBc<7PgJGDKVa(I%Y<2r@D)4T>g{bA57kxZ>~`(;rl%^ zimy5Y$N|$=4ywAUJcCmkkPF#6a&FE9C=u6eEAqV?2@e?~67gu7HBDowjc|u3bC%N} zwN;cHc=r*mMWj4h8QlEzJ$7tg|KKn>&L|zcm2gu3)t|6#)@TI~Ua)^RgtZXDKVfMY z_OT2IwZ`NYTrR|tEfL(XC<^heO2zV?f9Krz$$u}AQGgKSw8_NT!XH>W@YEW{RCgbV zq?YtFnI}2Q>JI!pegEY3HEYHk|snaJaPckg)pVBr}?bG5HI>hyt9e5SUBKGjy9ZIUGw5f#s zeu=e#ocObS&H25kl96(QfUqrP>&3u9lVNLTSEjh{pWlZVo2?42nU4fAF&)0vLT#}o zSZ+?)`B}t(M#0hgE|>k4VrSG5Sw!WGPz|1j`a;E@hUyul7~dOnI11zxe8or{G=2~y z_B$NK)@ft`ieYvITA2FSq5Np=ptR3rzA=fuWlOUIap43lu_S3C38Hz*jzY<>NYV@J zLA%gSGj8TLPnB}VOr6W}X1SloiVbG^Fdl?;?^t1GYfM@pgy1xJ@I;$qmfy}}E$xX4 z=A0tdTfLk&oB>=jLYj=gyMpX6iV+VQttM+Z5`4SIu{vo{m*Mj;9dHvjGl{PXqY1ZP z1mz-iuNZ6_`v1VXrZ3zI`Vp1bTDE}mc1Q4H>qh{UfPNz?X!K>_siPSR=35)G+u+jE+z!XUD`=0a;^m?E(6p$9q`Ke_(GCyt?c2FI9gBTo} zZ79n~*!H6Od+1$8{C(Ybv$NDwPPBctxYkyE!#I=AK3z}u{mNkqSS)GQlTmR1fZHHG zcB)866QB})E7)08UYWo(&5Y5LMdf{fDZ|=iu?^#rfsR?;Fr)a7kGvP=`HA^;_>w>G znAN8i+FPc76ZX-AM0gOqLdhT?z|Gp5-*1T6h+A1wN>WG zN1Fa-u^@rGNFzt+kZ#Fyh$)pJWEFP(aTr4J7)7?-x%bv|Mpv+~Ni}QSn;!N$N&xVy zBBb^F{HE^j%^OhpTs~rk_Tp|lPdOb$NZurXxRNgIkMXZgY*&N@wr^G0NtnsYICjkp zjffj)0fY02DpuqlT*MO^-XjTT4S838xa#9gT$x(CTFn5sCR7B?@(yQt@0Q3S{$wQsT7-Vj}nk!~`WgtxSQU=Ii ze0B4-2+}GW6YiRLm{jPS*W2R%vheiy&AajaD?xs6V6(3t$LT_aO2qWDq_vxXpMKiB zrN=p{jG>06(K#AP8(-do(vWB%#We**`z^k@wir~rkt*oYq67zCfrqgf-U%rtcgvic zxC9q#8&rS1JFqfwkKZTu?M&(IZNRlZl&~!A6JE>Rkv)VUGaDZ#H{X2wJ5J`rl8iNt2N?hgU7>y}UZVDpa6%e5$#J)n-DG218F>Pxd(+atR( zCq|O9yk7LV$+GIj>s@k%l1F+@kex8go07r|31>Y^ndbfSP8(`~-y`7g&T=2!3ns>R z?8C~jrag-@^t#4_Kf9>`5QeeFU%h&P$uts)w=w5NSu*7R%WVaVIV)Pu3|81upuWnZoryV%P|=xk{@#v0{~mT8Kth$f4u(%;>QC)4HTpA$}?-N+Jk9KdL8S^LZdAk@8Ji#K06NF;)wvmZ-4 zY_cMT*#;Mc5R&;eKPKq5tpLfdl+Y%j(%u>9w`R_33J|W?CV|%0xd)tomgpM_u6^MZ zF~u|{^PTGgS44`Q3dgeaf8mMI4}wu*^YE|fM1Y?x$Zrtd)T4gCt&%w_O+O%BB5rLh zk-jVv1TWyzkB=RoCXdt!wHKkOH8i?atMu3Oyr4Jun|aOidc~wzmTSTi0CymO^JOW{ zrk|{2_N+d8;S4z1ba6OJ#$nC7u#A9346Z%mX=T4Z9gl4FRlv3Qt{F+!fKf9(muG~1 zyI9E553gN?Oa1;TZ#|c@|GrTkvo}+Gk;S~p-!0nzsOIz8zvjvvT-aK%aM z2Ol|VZHp^h9No*lNU>G$9L}J7X7t!BCx}Y-nxTaUW@H5;5noLN<8TcC6-X;DwM^yW z{OGlgu_MjdO1>hs4 z?M6=?X*^hFd^+0!pq_?%qW8rrCcJF$l4g|Oeg7(G*!J;M@#0fP1DyMxfw+j%G3#|D zr1b~`tokaI@n2h(u_U11u03C|tafRhI{FP6qr)6(1=|#w)6s`z4TQ%EST7;*3{_eP zvqAsn69nIoE;#!7Wqsb37=`~f+`Q1OHX^&Uk5`~+_Lg9btj?&%SLMVn0p=y8PrJGG zz00f6gOBrlNEpoirvoKKmk=C#qovTF_-GJe9sa1jqcA*vxN@iSV`QLu(|lRDr^;Mf zoZ>5U#egmXvi}VVpj7ee*6oXxO%D$Rn{FL8b{PCcSMpna^!Cu+wQyekRY*u&oq|Gy!HOw(F@!2tBkdac#`uX()qus_{aVsLcMV>roMBsRZ9Ka zebN66T{=3qzrIxcKEl!XcgKK~lsw#a5$RV+z3QW~8FYWV@9Cluf;cVmoD?m`5YSq7%IRU@11?Im>SR)bYEN0Vu4DU8byR-=Hc^$D^ov{tKGRLP$&N38Ny-ncyUQ+*Y(Z6HHoXWRp!M@Hu}Jt{ zF}Jvn6UeW|7NdBnp?g8}Z^K-385rroj@z6q#}EA7jc$EKuVgTY+I}|LrY@o% z&b&p|v8C|68y6hxWkB zf4g6#q--Vuvg{_;qXqbV#`hbS8?C2SQ$j{{P{RiOga<7Kr>Byx!$(G0_UuRC-bmK`3VDgUG_UK(qE#jgq`nh>j`(vn0 zvtz<=SW&02VP-XA`kOE`;4a$upJRaL%wOotW2X3&zc?}#5&Vm(<-Agm6fgSc56cOu zJl6D_6+6($Cp?dCu{jcHrSe1+M#J|7Z6u}&`ot9MPR_n*icu=~A{bu#jqTT!(X-lE zzXF?w$G$`EqbyV6l-FYbC`(Rc+0pI)Q0_{v-$P-6T61sbc4g&>-!Y!DX%ANPmVcW{ z<=XFgw|r`XIAYE$HgBbKyj*o zy5iAq?5V#;R|u>ZM|=&zlVL!v-+NIUzSfI{p4%t_cLeLPuckBE7va31n@5A-tm2lT2mgl$w3{ zMg_?fE#!0cklp-V7`kxsn>dbHYyY1i7Rr;a+Oq_^W^h@yGbASmLBaO-`Gjj(tD5pN zG&bmOv`xOY$j0+eJEZst=M)!P7QxVczHfL=HuRVX4{fH@Hbzmr;`!gtqAm;`kN*o; zh=ZRx!)MHn3_!C12$8`_Lej?li+e)NG}Y2OPIY-vf#dV?%WQ*BP8pO zP&ZAXRzB5zm-lYRMc(|<5t(uo1e;XoIPiQk#dV`8-r`w9Qi0UFul|9b(IxTG0P5WL zw}2@Pnr^EVHoS8ePhaH*E`A8$m=^AG#FV^wud<)q7?p&}-Up!gsD$wglpLCpV(9(K z%LZig3HVB~8))Mhg~b9&7O4iGLz^)YE&NA7w*TeL8Y^T=78dXE>E%Cy!ip zam1)qJTtDg_a+DG(pYk*qAT{uTv#7;`HBM<##T&zx=+NwRxJCoaub9hL*)KK6GDtI z{JX>`oh*F0nWiBh**V4ZDqLWI;?4~!t`km2_`{N$o+%RVU>G)_IgO>k*~sH?QT_;ucE9;{xDshDY}m_x&TJ#bx-A_=>~b86kE;$bLlRdn$N6 z@mmGVgYX3UaUQ|M`;DSZEnfq*sliVY4-?4A1BRB}J6~TftP~b-AOwCZYebs#x1^Qb z%)wwP2t2QZ6!cR}u6yZgE5f$IINj(n`v6y=TtX(UTF$)Ykw%TKkMQagEawS*;6nV@ zi^+fu$UX?aX>H~lE|(PACr1oF-4SJlFhHh95n%VWfFRvpcsjwKuy}_pZ=QR9uq8k# z@s|Czl1KPrHRtO-!Yp}lpd6O178fw@IX}QjbOunNwtqbK+J!zO>Cuacknfx~+Jizi z$H~@_3XYG27KG5-AiJ|ece^%f+Mtabo;~Odd=z20z=1mJJoTZD1Mbl^VxO z=6j5|o^ZLF&#f(=n}Ipce$q9i;ppbyh3fj0&0K)lQ3M;S%>DXymzlW`dt1zsrS}ds zFCpAxN<-jn7|#!h%vns3J-;ZfcmCTi1Z$_RzHu7}Hy#Yn z`4b0|U4I8MxTi187ZQ!fuWDd-gU!Qt;0!^gdXS2%Pue2O!uC3I@^J6Tw*HXr0{#L0 z;GIQK8Zg)l>Ab8}2&bcfcF)lIH9q><ejshIflz$H95luotPw$q9ABFCo z{t6zzhfeqequ18g`>nZ3HXXJc_aV>eUM^D&F9gHWNZE36-PwUaQe6_Q5YhVz1B|2fPiRu19W!?oB9?YA!yG~E_n!(L$zOq*+ zVX>EoEDbc8gnU6vm7~0Lj^5j)_D>sTyLlKwSta*ZKi88#oT{@ zi{XHb2<#kendX>c~QsHf3-7Zmk^1a_%p2?&Mc3FHk4-);v zM?i#1z|*!}+&C@6U7AqFI&nPzkdzL&4l+xrCV}adovpj>-Y{jkh-&&zHHlgKy`gl3 zsKO=&_Dw>&jjY@re7Nu0GspsDiRlT9R51YmtYLzLsnY)5pV5dBlxO67M&FCFO5YDo z4FUJM7SZd-JE3PyIBR%6>GtDCSNiJNpv_@F#`x_xRWR6~IppFhLsx~?@m~cbjzP%G z!=J=>hhP+UePb8<0`WvJ7uW9(m4UzQ6^_ddfy35rDT31u8>B<9X`o_-!fuRT)AeLvyxH#@wdyL2UF zem?T&PkQ^(q3kkgs-D-lfuSEi)&)=&HOSpTIopxXb)L<}us~UHasJ{%rs@4dnN%gn zoZ6LAPx{~eZ(rE8#a+8UruPhMz{o51YZLLIr*nPbU3F`kZ?4J?!sn5G)X>9eju)F% z&K;ARS3^_)d_*=#tV1xq#C>U&^g3G*Fli!OTXz>^8vVJJf&)eGyUl8(&U;vFga|1D zii6+n=H__C64aWdl5z&?CR~L0BBfgHp6Htc!nbEc9*5c%GvOs2$ZoRH?8ecrob9(j zfa#uv*}a@25u#gVD=I(+k_gt#QT6v*-?^Phy7Bd**#AKBCzE}ep_N34?lP|%fImZq zrA1sa580{Xqn^jz_1)C=VI##QR{ji(L-)3iKs|jSBDX(QR~A(pbISO>a<3xOJJRwBB;P9p>vSy-YDTY+YbqGMU^!6~6ZZHKhQgBcG~ zoF+5|w-;)kRe1e=lMW7{(>&TdIoSkI-Umu5S94(ZY_uIA2z9so$+LiXZ;b;S1N)QG zDWTK#G)9H-+o82NN7k5X1%;MXMfJ-P^>JCxv8xNahP(cP!k`Kef(yrD>A0HWI`c_M zt_cvv>h+|3aZ^I3>)e25nhJayq_D7*Cjmd80sa;6{d!VT(`!DL5lpupK9RuT7(Hb0 zWMp{K?A;90Y1N++01F=Ovp8uhW>d`;z7Ac>0y*4I11-8DCUF>Y)WOEX1q#R;0Dk=u zf@pkaE!r1y)W1-i7rGTfLDABX9K_ith9Ddh8~D$JACY0|EaLr5teg)UeO&J06a_)A zOPFH&+p)q~I-GNcVk&;}&$ayok>*Sg%YkmA>pJav0`+bij)y1Bi1e%qBzJ@Uy2>c~ z<2uWP1Ssd8?OKeQ;{)FOIeIpUV*`bo*Ur*1{c@J&JQO!vZpR&tddo|Wi$AQ%X2f57 zuZP2}(C=!iZ?|)4w?y7ke#PB->WRl#F-m|%m-nY}8~#Ds|86twmHPDY`8ae<^x_St z&4?@B!R^cig&wCIjI$rlwavI=w-p!ky||zxB##xrjS9Apoloz`QC^RM+j*@u$AP3_ zxjJ{j9jd!w1ahSRy|49|rD2ihZeg1wFVGf+@X9~!{=Z9Jhb4tC7)7St5v*hcaQD$W z%*i=(?Ef$U+<5efB`z3=$F8P7fQ#>9^{dtjVgKymDh_fmWjKATUR(z>sZgHCPx;G=nMz-_1Sf;p`ycP056#1fxEUE#G`23?QsUiP{H7TG7lY0 z=eb-DUvYy%61=flE(&V@dqAOrU{>usf1?b^seQdKo9iLzHcLcJ^*@@r)+Tb%Bu zoU0&||7gX%o}n3LYV!Y{M#){@5Tmzc)&yq9DRF01vMJ`r&+B^fdRoFtDh648_F6s= lVST%7bA8z1UY2K(wmosG7p}%jxO { - return new PrismaClient(); -}; - -declare global { - var prisma: undefined | ReturnType; -} - -const db = globalThis.prisma ?? prismaClientSingleton(); - -export default db; - -if (process.env.NODE_ENV !== "production") globalThis.prisma = db; diff --git a/src/core/error/BaseError.ts b/src/core/error/BaseError.ts deleted file mode 100644 index 595de4f..0000000 --- a/src/core/error/BaseError.ts +++ /dev/null @@ -1,56 +0,0 @@ -import logger from "../logger/Logger"; - -export const BaseErrorCodes = ["UNKNOWN_ERROR", "UNSUPPORTED_CONTENT_TYPE", "INVALID_FORM_DATA"] as const; - -interface ErrorOptions { - message?: string; - errorCode: (typeof BaseErrorCodes)[number] | (string & {}); - statusCode?: number, - formErrors?: Record -} - -class BaseError extends Error { - public readonly errorCode: (typeof BaseErrorCodes)[number] | (string & {}); - public readonly statusCode: number; - public readonly formErrors?: ErrorOptions['formErrors']; - - constructor(options: ErrorOptions) { - super(options.message ?? "Undetermined Error"); - this.errorCode = options.errorCode ?? "UNKNOWN_ERROR"; - this.statusCode = options.statusCode ?? 500; - this.formErrors = options.formErrors; - - Object.setPrototypeOf(this, new.target.prototype); - - this.saveToLog(); - } - - getActionResponseObject() { - return { - success: false, - error: { - message: this.message, - errorCode: this.errorCode, - }, - } as const; - } - - getRestApiResponseObject(){ - return { - message: this.message, - errorCode: this.errorCode - } - } - - saveToLog() { - const excludedErrorCodes: string[] = []; - - if (excludedErrorCodes.includes(this.errorCode)) { - return; - } - - logger.error(JSON.stringify({errorCode: this.errorCode, message: this.message, stack: this.stack})) - } -} - -export default BaseError; diff --git a/src/core/error/ClientError.ts b/src/core/error/ClientError.ts deleted file mode 100644 index fa1b72e..0000000 --- a/src/core/error/ClientError.ts +++ /dev/null @@ -1,43 +0,0 @@ -import "client-only" -export const ClientErrorCodes = ["UNKNOWN_ERROR", "UNSUPPORTED_CONTENT_TYPE"] as const; - -interface ErrorOptions { - message?: string; - errorCode: (typeof ClientErrorCodes)[number] | (string & {}); - statusCode?: number - formErrors?: Record -} - -class ClientError extends Error { - public readonly errorCode: ErrorOptions['errorCode']; - public readonly statusCode: ErrorOptions['statusCode']; - public readonly formErrors?: ErrorOptions['formErrors']; - - constructor(options: ErrorOptions) { - super(options.message ?? "Undetermined Error"); - this.errorCode = options.errorCode ?? "UNKNOWN_ERROR"; - this.statusCode = options.statusCode ?? 500; - this.formErrors = options.formErrors; - - Object.setPrototypeOf(this, new.target.prototype); - } - - getActionResponseObject() { - return { - success: false, - error: { - message: this.message, - errorCode: this.errorCode, - }, - } as const; - } - - getRestApiResponseObject(){ - return { - message: this.message, - errorCode: this.errorCode - } - } -} - -export default ClientError; diff --git a/src/core/error/FileError.ts b/src/core/error/FileError.ts deleted file mode 100644 index 2acd73c..0000000 --- a/src/core/error/FileError.ts +++ /dev/null @@ -1,26 +0,0 @@ -import BaseError from "@/core/error/BaseError"; - -export const FileErrorCodes = [ - "INVALID_IMAGE_FORMAT", - "IMAGE_TOO_LARGE", -] as const; - -interface FileErrorOptions { - message?: string; - errorCode: (typeof FileErrorCodes)[number] | (string & {}); - statusCode?: number; -} - -export default class FileError extends BaseError { - errorCode: (typeof FileErrorCodes)[number] | (string & {}); - - constructor(options: FileErrorOptions) { - super({ - errorCode: options.errorCode, - message: options.message, - statusCode: options.statusCode, - }); - - this.errorCode = options.errorCode; - } -} diff --git a/src/core/logger/Logger.ts b/src/core/logger/Logger.ts deleted file mode 100644 index 29693ab..0000000 --- a/src/core/logger/Logger.ts +++ /dev/null @@ -1,45 +0,0 @@ -import "server-only" -import { appendFileSync } from "node:fs"; -import { format } from 'date-fns'; - -class Logger { - - logDirectory: string; - - readonly severityLevels = { - CRITICAL: 'CRITICAL', - ERROR: 'ERROR', - WARNING: 'WARNING', - }; - - constructor(){ - this.logDirectory = `${process.env.ERROR_LOG_PATH}` - } - - getLogFileName(isError = false) { - // Use a different naming convention for error logs if needed - const suffix = isError ? '-error' : ''; - return `${format(new Date(), 'yyyy-MM-dd')}${suffix}.log`; - } - - log(message: string, level = 'info') { - const timestamp = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); - const logMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`; - const isError = level === this.severityLevels.ERROR || level === this.severityLevels.CRITICAL || level === this.severityLevels.WARNING; - const logFilePath = `${this.logDirectory}/${this.getLogFileName(isError)}`; - - appendFileSync(logFilePath, logMessage); - } - - error(message: string, severity = 'ERROR') { - // Ensure the severity level is valid; default to 'ERROR' if not - if (!Object.values(this.severityLevels).includes(severity)) { - severity = this.severityLevels.ERROR; - } - this.log(message, severity); - } -} - -const logger = new Logger(); - -export default logger; diff --git a/src/core/utils/applicationJsonOnly.ts b/src/core/utils/applicationJsonOnly.ts deleted file mode 100644 index 18496d1..0000000 --- a/src/core/utils/applicationJsonOnly.ts +++ /dev/null @@ -1,11 +0,0 @@ -import BaseError from "../error/BaseError"; - -export default function applicationJsonOnly(headers: Headers) { - if (headers.get("Content-Type") !== "application/json") - throw new BaseError({ - errorCode: "UNSUPPORTED_CONTENT_TYPE", - message: - "This content type is not supported. Please use application/json instead", - statusCode: 400, - }); -} diff --git a/src/core/utils/handleCatchApi.ts b/src/core/utils/handleCatchApi.ts deleted file mode 100644 index e0cb05f..0000000 --- a/src/core/utils/handleCatchApi.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NextResponse } from "next/server"; -import BaseError from "../error/BaseError"; - -export default function handleCatchApi(e: unknown): NextResponse { - if (e instanceof BaseError) { - return NextResponse.json({ - code: e.errorCode, - message: e.message, - formErrors: e.formErrors - }, {status: e.statusCode}); - } - if (e instanceof Error) { - return NextResponse.json({ - code: "GENERAL_ERROR", - message: e.message, - }, {status: 500}); - } - - return NextResponse.json({ - code: "GENERAL_ERROR", - message: "Unexpected", - }, { status: 500 }); -} diff --git a/src/core/utils/jsonToFormData.ts b/src/core/utils/jsonToFormData.ts deleted file mode 100644 index 0a34ac0..0000000 --- a/src/core/utils/jsonToFormData.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Converts a JSON object to FormData. - * - * @param json - The JSON object to be converted into FormData. The object can - * include nested objects and arrays. Nested objects are flattened according - * to the FormData encoding conventions, with keys indicating the path to each - * value and arrays being treated with indices. - * @returns A FormData object containing the keys and values from the input JSON. - * Each key in the JSON object is represented in the FormData, with its corresponding - * value. Nested objects and arrays are handled by appending square brackets to the key - * names to indicate the structure in the FormData. - */ -export default function jsonToFormData(json: Record): FormData { - const formData = new FormData(); - Object.keys(json).forEach((key) => { - const value = json[key]; - if (Array.isArray(value)) { - // Handle array values by appending each item with an index - value.forEach((item, index) => { - formData.append(`${key}[${index}]`, item); - }); - } else if (typeof value === "object" && value !== null) { - // Handle nested objects by appending each sub-key - Object.keys(value).forEach((subKey) => { - formData.append(`${key}[${subKey}]`, value[subKey]); - }); - } else { - // Handle simple types (strings, numbers, etc.) - formData.append(key, value); - } - }); - return formData; -} diff --git a/src/core/utils/onlyAllowFollowingContentType.ts b/src/core/utils/onlyAllowFollowingContentType.ts deleted file mode 100644 index 6ec94d5..0000000 --- a/src/core/utils/onlyAllowFollowingContentType.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { headers } from "next/headers"; -import BaseError from "../error/BaseError"; -import ContentType from "@/types/ContentType"; - -/** - * Ensures that the current request's content type is one of the allowed types. - * This function is intended to be used in Next.js API routes to validate request content types. - * - * @param contentTypes - A single content type string or an array of allowed content type strings. - * @throws {BaseError} Throws a BaseError if the current request's content type is not in the allowed content types. - */ -export default function onlyAllowFollowingContentType( - contentTypes: ContentType & (string | {}) | ContentType[] | (string | {})[] -) { - // Retrieve the current request's content type and ignore any parameters. - const currentContentType = headers().get("Content-Type")?.split(';')[0].trim(); - - // Normalize the input parameter to an array to simplify the inclusion check. - const allowedContentTypes = Array.isArray(contentTypes) - ? contentTypes - : [contentTypes]; - - // Check if the current content type is not among the allowed ones and throw an error if so. - if (!allowedContentTypes.includes(currentContentType ?? "")) { - throw new BaseError({ - errorCode: "UNSUPPORTED_CONTENT_TYPE", - message: - "This content type is not supported. Please use one of the supported content types instead.", - statusCode: 400, - }); - } -} diff --git a/src/db/index.ts b/src/db/index.ts deleted file mode 100644 index 96fbfb0..0000000 --- a/src/db/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { PrismaClient } from '@prisma/client' - -const prismaClientSingleton = () => { - return new PrismaClient() -} - -declare global { - var prisma: undefined | ReturnType -} - -// const db = globalThis.prisma ?? prismaClientSingleton() - -export default prisma - -if (process.env.NODE_ENV !== 'production') globalThis.prisma = prisma \ No newline at end of file diff --git a/src/modules/auth/actions/createUserAction.ts b/src/modules/auth/actions/createUserAction.ts deleted file mode 100644 index 4b4d2a7..0000000 --- a/src/modules/auth/actions/createUserAction.ts +++ /dev/null @@ -1,26 +0,0 @@ -"use server"; -import { cookies } from "next/headers"; -import { redirect } from "next/navigation"; -import createUser from "../services/createUser"; -import ServerResponseAction from "@/modules/dashboard/types/ServerResponseAction"; -import handleCatch from "@/modules/dashboard/utils/handleCatch"; -import { CreateUserSchema } from "../formSchemas/CreateUserFormSchema"; - -/** - * Creates a new user in the system. - * - * @param formData - The form data containing user details. - * @returns An object indicating the result of the operation. - */ -export default async function createUserAction(formData: CreateUserSchema): Promise { - //TODO: Add Throttling - //TODO: Add validation check if the user is already logged in - - try { - const result = await createUser(formData); - cookies().set("token", result.token); - redirect("/dashboard"); - } catch (e) { - return handleCatch(e) - } -} diff --git a/src/modules/auth/actions/getMyDetailAction.ts b/src/modules/auth/actions/getMyDetailAction.ts deleted file mode 100644 index d9306de..0000000 --- a/src/modules/auth/actions/getMyDetailAction.ts +++ /dev/null @@ -1,47 +0,0 @@ -"use server"; - -import getMyDetail from "../services/getMyDetail"; -import AuthError from "../error/AuthError"; -import ServerResponseAction from "@/modules/dashboard/types/ServerResponseAction"; -import handleCatch from "@/modules/dashboard/utils/handleCatch"; -import "server-only"; -import { cookies } from "next/headers"; - -/** - * Asynchronously retrieves the authenticated user's details from a server-side context in a Next.js application. - * This function uses a JWT token obtained from cookies to authenticate the user and fetch their details. - * If the authentication fails due to an invalid JWT token, or if any other error occurs, the function handles these errors gracefully. - * - * @deprecated - * @returns A promise that resolves to a `ServerResponseAction` object. This object includes a `success` flag indicating the operation's outcome, the user's details in the `data` field if successful, or an error object in the `error` field if an error occurs. - * @throws an unhandled error if an unexpected error occurs during the function execution. - */ -export default async function getMyDetailAction(): Promise>>> { - try { - const token = cookies().get("token"); - - // Return null if token is not present - if (!token) throw new AuthError({errorCode: "INVALID_JWT_TOKEN"}); - - // Attempt to fetch and return the user's details. - const userDetails = await getMyDetail(token.value); - return { - success: true, - data: userDetails, - }; - } catch (e: unknown) { - // Check if the error is an instance of AuthError and handle it. - if (e instanceof AuthError && e.errorCode === "INVALID_JWT_TOKEN") { - return { - success: false, - error: { - errorCode: "UNAUTHENTICATED", - message: "You are not authenticated", - }, - dashboardError: true - }; - } - // Handle other types of errors. - return handleCatch(e); - } -} diff --git a/src/modules/auth/actions/guestOnly.ts b/src/modules/auth/actions/guestOnly.ts deleted file mode 100644 index a3ce170..0000000 --- a/src/modules/auth/actions/guestOnly.ts +++ /dev/null @@ -1,20 +0,0 @@ -"use server"; - -import { redirect } from "next/navigation"; -import getCurrentUser from "../services/getCurrentUser"; - -/** - * Enforces a guest-only access policy by redirecting authenticated users to the dashboard. - * This function asynchronously checks if the user is authenticated by attempting to retrieve user details. - * If the user is authenticated, they are redirected to the dashboard page. - * - * @returns A promise that resolves when the operation completes. The function itself does not return a value. - */ -export default async function guestOnly(): Promise { - const user = await getCurrentUser(); - - // If an authenticated user is detected, redirect them to the dashboard. - if (user) { - redirect("/dashboard"); - } -} diff --git a/src/modules/auth/actions/logoutAction.ts b/src/modules/auth/actions/logoutAction.ts deleted file mode 100644 index 0ac96f6..0000000 --- a/src/modules/auth/actions/logoutAction.ts +++ /dev/null @@ -1,18 +0,0 @@ -"use server"; - -import { revalidatePath } from "next/cache"; -import { cookies } from "next/headers"; -import { redirect } from "next/navigation"; -import "server-only"; - -/** - * Handles user logout by deleting the authentication token and redirecting to the login page. - * This function is intended to be used on the server side. - * - * @returns A promise that resolves when the logout process is complete. - */ -export default async function logout() { - cookies().delete("token"); - revalidatePath("/dashboard/login"); - redirect("/dashboard/login"); -} diff --git a/src/modules/auth/actions/nonAdminRegisterAction.ts b/src/modules/auth/actions/nonAdminRegisterAction.ts deleted file mode 100644 index df7d0a2..0000000 --- a/src/modules/auth/actions/nonAdminRegisterAction.ts +++ /dev/null @@ -1,27 +0,0 @@ -"use server"; -import { cookies } from "next/headers"; -import { redirect } from "next/navigation"; -import ServerResponseAction from "@/modules/dashboard/types/ServerResponseAction"; -import handleCatch from "@/modules/dashboard/utils/handleCatch"; -import nonAdminRegisterFormType from "../types/NonAdminRegisterFormType"; -import nonAdminRegister from "../services/nonAdminRegister"; - -/** - * Creates a new user in the system. - * - * @param formData - The form data containing user details. - * @returns An object indicating the result of the operation. - */ -export default async function nonAdminRegisterAction( - formData: nonAdminRegisterFormType -): Promise { - //TODO: Add Throttling - - try { - const result = await nonAdminRegister(formData); - cookies().set("token", result.token); - redirect("/dashboard"); - } catch (e) { - return handleCatch(e); - } -} diff --git a/src/modules/auth/actions/signInAction.ts b/src/modules/auth/actions/signInAction.ts deleted file mode 100644 index 3a11733..0000000 --- a/src/modules/auth/actions/signInAction.ts +++ /dev/null @@ -1,70 +0,0 @@ -"use server"; -import { cookies } from "next/headers"; -import { redirect } from "next/navigation"; -import AuthError from "../error/AuthError"; -import signIn from "../services/signIn"; - -/** - * Asynchronously handles the sign-in process for a user by validating their credentials against the database. - * Upon successful validation, the user is redirected to the dashboard, and a JWT token is set as a cookie. - * If validation fails, a custom `AuthError` is thrown, and detailed error information is provided to the caller. - * - * Note: Future enhancements should include throttling to prevent brute force attacks and a check to prevent - * sign-in attempts if the user is already logged in. - * - * @param prevState - The previous state of the application. Currently not utilized but may be used for future enhancements. - * @param rawFormData - The raw form data obtained from the sign-in form, containing the user's email and password. - * @returns A promise that, upon successful authentication, resolves to a redirection to the dashboard. If authentication fails, - * it resolves to an object containing error details. - * @throws {AuthError} - Throws a custom `AuthError` with specific error codes for different stages of the authentication failure. - */ -export default async function signInAction(prevState: any, rawFormData: FormData) { - //TODO: Add Throttling - //TODO: Add validation check if the user is already logged in - try { - // Extract email and password from the raw form data. - const formData = { - email: rawFormData.get("email") as string, - password: rawFormData.get("password") as string, - }; - - // Attempt to sign in with the provided credentials. - const result = await signIn(formData) - - // Set the JWT token in cookies upon successful sign-in. - cookies().set("token", result.token); - - // Redirect to the dashboard after successful sign-in. - redirect("/dashboard"); - } catch (e: unknown) { - // Custom error handling for authentication errors - if (e instanceof AuthError) { - // Specific error handling for known authentication errors - switch (e.errorCode) { - case "EMAIL_NOT_FOUND": - case "INVALID_CREDENTIALS": - return { - errors: { - message: - "Email/Password combination is incorrect. Please try again.", - }, - }; - default: - // Handle other types of authentication errors - return { - errors: { - message: e.message, - }, - }; - } - } - - // Generic error handling for unexpected server errors - return { - errors: { - message: - "An unexpected error occurred on the server. Please try again or contact the administrator.", - }, - }; - } -} diff --git a/src/modules/auth/authConfig.ts b/src/modules/auth/authConfig.ts deleted file mode 100644 index ddc99f0..0000000 --- a/src/modules/auth/authConfig.ts +++ /dev/null @@ -1,5 +0,0 @@ -const authConfig = { - saltRounds: 10, -}; - -export default authConfig; diff --git a/src/modules/auth/contexts/AuthContext.tsx b/src/modules/auth/contexts/AuthContext.tsx deleted file mode 100644 index 3a681e2..0000000 --- a/src/modules/auth/contexts/AuthContext.tsx +++ /dev/null @@ -1,63 +0,0 @@ -// Directive to enforce client-side operation in a Next.js application. -"use client"; - -// Importing React functionalities and required components. -import React, { ReactElement, ReactNode, createContext, useContext } from "react"; -import SidebarMenu from "@/modules/dashboard/types/SidebarMenu"; - -// Defining the structure for user data within the authentication context. -interface UserData { - id: string, - name: string, - email: string, - photoProfile: string | null, - sidebarMenus: SidebarMenu[] -} - -// State structure for the authentication context. -interface AuthContextState { - user: UserData | null; - // fetchUserData: () => void; - // logout: () => void; -} - -// Props type definition for the AuthContextProvider component. -interface Props { - children: ReactNode; - userData: UserData | null; -} - -// Creating the authentication context with an undefined initial value. -const AuthContext = createContext(undefined); - -/** - * Provides an authentication context to wrap around components that require authentication data. - * This component initializes user data state, fetches user data upon component mount, and provides - * a logout function to clear the user data. - * - * @param {Props} props - Component props containing children to be rendered within the provider. - * @returns {ReactElement} A provider component wrapping children with access to authentication context. - */ -export const AuthContextProvider = ({ children, userData }: Props): ReactElement => { - - // Providing authentication state and functions to the context consumers. - return ( - - {children} - - ); -}; - -/** - * Custom hook to consume the authentication context. This hook ensures the context is used within a provider. - * - * @returns {AuthContextState} The authentication context state including user data and auth functions. - * @throws {Error} Throws an error if the hook is used outside of an AuthContextProvider. - */ -export const useAuth = (): AuthContextState => { - const context = useContext(AuthContext); - if (!context) { - throw new Error("useAuth must be used within an AuthContextProvider"); - } - return context; -}; diff --git a/src/modules/auth/error/AuthError.ts b/src/modules/auth/error/AuthError.ts deleted file mode 100644 index 1d4b585..0000000 --- a/src/modules/auth/error/AuthError.ts +++ /dev/null @@ -1,31 +0,0 @@ -import BaseError from "@/core/error/BaseError"; - -export const AuthErrorCodes = [ - "EMAIL_NOT_FOUND", - "EMPTY_USER_HASH", - "INVALID_CREDENTIALS", - "INVALID_JWT_TOKEN", - "JWT_SECRET_EMPTY", - "USER_ALREADY_EXISTS", - "ALREADY_LOGGED_IN" -] as const; - -interface AuthErrorOptions { - message?: string; - errorCode: (typeof AuthErrorCodes)[number] | (string & {}); - statusCode?: number; -} - -export default class AuthError extends BaseError { - errorCode: (typeof AuthErrorCodes)[number] | (string & {}); - - constructor(options: AuthErrorOptions) { - super({ - errorCode: options.errorCode, - message: options.message, - statusCode: options.statusCode, - }); - - this.errorCode = options.errorCode; - } -} diff --git a/src/modules/auth/formSchemas/CreateUserFormSchema.ts b/src/modules/auth/formSchemas/CreateUserFormSchema.ts deleted file mode 100644 index e3f44bb..0000000 --- a/src/modules/auth/formSchemas/CreateUserFormSchema.ts +++ /dev/null @@ -1,23 +0,0 @@ -import {z} from "zod" - -/** - * Interface for the schema of a new user. - */ -export interface CreateUserSchema { - name: string; - email: string; - password: string; - passwordConfirmation: string; -} - -export const createUserSchema = z - .object({ - name: z.string(), - email: z.string().email(), - password: z.string().min(6), - passwordConfirmation: z.string().optional(), - }) - .refine((data) => data.password === data.passwordConfirmation, { - message: "Password confirmation must match the password", - path: ["passwordConfirmation"], - }); \ No newline at end of file diff --git a/src/modules/auth/formSchemas/signInSchema.ts b/src/modules/auth/formSchemas/signInSchema.ts deleted file mode 100644 index c129677..0000000 --- a/src/modules/auth/formSchemas/signInSchema.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { z } from "zod"; - -const signInSchema = z.object({ - email: z.string().email(), - password: z.string().min(1), -}); - -export default signInSchema; \ No newline at end of file diff --git a/src/modules/auth/services/createUser.ts b/src/modules/auth/services/createUser.ts deleted file mode 100644 index d335465..0000000 --- a/src/modules/auth/services/createUser.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - CreateUserSchema, - createUserSchema, -} from "../formSchemas/CreateUserFormSchema"; -import mapObjectToFirstValue from "@/utils/mapObjectToFirstValue"; -import db from "@/core/db"; -import AuthError from "../error/AuthError"; -import hashPassword from "../utils/hashPassword"; -import { createJwtToken } from "../utils/createJwtToken"; -import BaseError from "@/core/error/BaseError"; - -/** - * Creates a new user in the database after validating the input data. - * It throws errors if the input data is invalid or if the user already exists. - * On successful creation, it returns a token for the created user. - * - * @param userData - The user data to create a new user. Must conform to CreateUserSchema. - * @returns An object containing the JWT token for the newly created user. - * @throws If the input validation fails. - * @throws If the user already exists in the database. - */ -export default async function createUser(userData: CreateUserSchema) { - const validatedFields = createUserSchema.safeParse(userData); - - //Validate form input - if (!validatedFields.success) { - throw new BaseError({ - errorCode: "INVALID_FORM_DATA", - formErrors: mapObjectToFirstValue( - validatedFields.error.flatten().fieldErrors - ), - statusCode: 422, - }); - } - - //Check email exists - if ( - await db.user.findFirst({ - where: { email: validatedFields.data.email }, - }) - ) { - throw new AuthError({ - errorCode: "USER_ALREADY_EXISTS", - message: "This email already exists", - statusCode: 422, - }); - } - - //Create user - const user = await db.user.create({ - data: { - name: validatedFields.data.name, - email: validatedFields.data.email, - passwordHash: await hashPassword(validatedFields.data.password), - }, - }); - - //Set token - const token = createJwtToken({ id: user.id }); - - return { - token, - user: { - name: user.name, - email: user.email, - profilePhotoUrl: user.photoProfile, - }, - }; -} diff --git a/src/modules/auth/services/getCurrentUser.ts b/src/modules/auth/services/getCurrentUser.ts deleted file mode 100644 index 67e3769..0000000 --- a/src/modules/auth/services/getCurrentUser.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { cookies } from "next/headers"; -import "server-only"; -import getUserFromToken from "../utils/getUserFromToken"; - -export default async function getCurrentUser() { - const token = cookies().get("token")?.value; - - if (!token) return null; - - const userData = await getUserFromToken(token); - - return userData; -} diff --git a/src/modules/auth/services/getMyDetail.ts b/src/modules/auth/services/getMyDetail.ts deleted file mode 100644 index e5d6a5e..0000000 --- a/src/modules/auth/services/getMyDetail.ts +++ /dev/null @@ -1,32 +0,0 @@ -import getUserFromToken from "../utils/getUserFromToken"; -import AuthError from "../error/AuthError"; - -/** - * Retrieves the details of the currently authenticated user based on the JWT token. - * If the token is not present or the user cannot be found, it returns null. - * Otherwise, it returns the user's name, email, and photo URL. - * - * Deprecated. use getCurrentUser() instead (see getCurrentUser.ts) - * - * @deprecated - * @returns An object containing the user's name, email, and photo URL, or null if the user cannot be authenticated. - */ -export default async function getMyDetail(token?: string) { - if (!token) - throw new AuthError({ - errorCode: "INVALID_JWT_TOKEN", - message: "You are not authenticated", - }); - - const user = await getUserFromToken(token); - - // Return null if user is not found - if (!user) return null; - - // Return user details - return { - name: user.name ?? "", - email: user.email ?? "", - photoUrl: user.photoProfile ?? null, - }; -} diff --git a/src/modules/auth/services/nonAdminRegister.ts b/src/modules/auth/services/nonAdminRegister.ts deleted file mode 100644 index dd07164..0000000 --- a/src/modules/auth/services/nonAdminRegister.ts +++ /dev/null @@ -1,38 +0,0 @@ -import unauthorized from "@/modules/dashboard/utils/unauthorized"; -import checkPermission from "../utils/checkPermission"; -import nonAdminRegisterFormType from "../types/NonAdminRegisterFormType"; -import db from "@/core/db"; -import AuthError from "../error/AuthError"; -import hashPassword from "../utils/hashPassword"; -import "server-only"; -import { createJwtToken } from "../utils/createJwtToken"; - -export default async function nonAdminRegister(data: nonAdminRegisterFormType) { - if (!(await checkPermission("guest-only"))) unauthorized(); - - const existingUser = await db.user.findFirst({ - where: { - email: data.email, - }, - }); - - if (existingUser) - throw new AuthError({ - errorCode: "USER_ALREADY_EXISTS", - message: - 'This email has been registered before. If you forgot your password, you can click "Forgot Password"', - statusCode: 401, - }); - - const user = await db.user.create({ - data: { - email: data.email, - name: data.name, - passwordHash: await hashPassword(data.password), - }, - }); - - const token = createJwtToken({id: user.id}) - - return {user, token }; -} diff --git a/src/modules/auth/services/signIn.ts b/src/modules/auth/services/signIn.ts deleted file mode 100644 index 7492e09..0000000 --- a/src/modules/auth/services/signIn.ts +++ /dev/null @@ -1,54 +0,0 @@ -import "server-only"; -import SignInFormData from "../types/SignInFormData"; -import db from "@/core/db"; -import AuthError from "../error/AuthError"; -import comparePassword from "../utils/comparePassword"; -import { createJwtToken } from "../utils/createJwtToken"; - -/** - * Authenticates a user with email and password credentials. - * - * This function looks up the user in the database by email. If the user exists and the password matches - * the hashed password in the database, a JWT token is created and returned. If any step of this process fails, - * an `AuthError` with a specific error code and message is thrown. - * - * @param rawCredential - Contains the email and password provided by the user. - * @returns An object containing a JWT token if authentication is successful. - * @throws {AuthError} - Throws an `AuthError` with an appropriate error code and message for various failure scenarios. - */ -export default async function signIn(rawCredential: SignInFormData) { - const user = await db.user.findUnique({ - where: { email: rawCredential.email }, - }); - - if (!user) - throw new AuthError({ - errorCode: "EMAIL_NOT_FOUND", - message: "Email or Password does not match", - }); - - //TODO: Add handle for empty password hash - // Ensure there is a password hash to compare against. - if (!user.passwordHash) - throw new AuthError({ - errorCode: "EMPTY_USER_HASH", - message: "Something wrong. Please contact your administrator", - }); - - // Compare the provided password with the stored hash. - const isMatch = await comparePassword( - rawCredential.password, - user.passwordHash - ); - - // Create a JWT token upon successful authentication. - if (!isMatch) - throw new AuthError({ - errorCode: "INVALID_CREDENTIALS", - message: "Email or Password does not match", - }); - - const token = createJwtToken({ id: user.id }); - - return { token, user: { name: user.name, email: user.email, profilePhotoUrl: user.photoProfile} }; -} diff --git a/src/modules/auth/types/NonAdminRegisterFormType.d.ts b/src/modules/auth/types/NonAdminRegisterFormType.d.ts deleted file mode 100644 index 06e9230..0000000 --- a/src/modules/auth/types/NonAdminRegisterFormType.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default interface nonAdminRegisterFormType { - name: string, - email: string, - password: string, -} \ No newline at end of file diff --git a/src/modules/auth/types/SignInFormData.d.ts b/src/modules/auth/types/SignInFormData.d.ts deleted file mode 100644 index 95ae8a2..0000000 --- a/src/modules/auth/types/SignInFormData.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Defines the structure for sign-in form data. - * - * This interface is utilized to type-check the data received from the sign-in form, ensuring that it contains - * both an `email` and a `password` field of type `string`. The `email` field represents the user's email address, - * and the `password` field represents the user's password. Both fields are required for the sign-in process. - */ -export default interface SignInFormData { - /** - * The user's email address. - * Must be a valid email format. - */ - email: string; - - /** - * The user's password. - * There are no specific constraints defined here for the password's format or strength, but it is expected - * to comply with the application's password policy. - */ - password: string; -} diff --git a/src/modules/auth/types/UserClaims.d.ts b/src/modules/auth/types/UserClaims.d.ts deleted file mode 100644 index 7d3e21a..0000000 --- a/src/modules/auth/types/UserClaims.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { User } from "@prisma/client"; - -type UserClaims = { - id: User["id"]; -}; - -export default UserClaims; diff --git a/src/modules/auth/utils/cachedGetUserFromToken.ts b/src/modules/auth/utils/cachedGetUserFromToken.ts deleted file mode 100644 index cb2c7cb..0000000 --- a/src/modules/auth/utils/cachedGetUserFromToken.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { cache } from "react"; -import getUserFromToken from "./getUserFromToken"; - -const cachedGetUserFromToken = cache(getUserFromToken); - -export default cachedGetUserFromToken; diff --git a/src/modules/auth/utils/checkMultiplePermissions.ts b/src/modules/auth/utils/checkMultiplePermissions.ts deleted file mode 100644 index 620fff0..0000000 --- a/src/modules/auth/utils/checkMultiplePermissions.ts +++ /dev/null @@ -1,39 +0,0 @@ -import checkPermission from "./checkPermission"; -import getCurrentUser from "./getCurrentUser"; -import { PermissionCode } from "@/modules/permission/data/initialPermissions"; - -/** - * Checks multiple permissions for the current user and returns an object indicating - * whether each permission is granted. - * - * - * @param permissions - An object with keys as permission names and values as the required roles/permissions. - * @returns An object with keys as permission names and boolean values indicating whether the permission is granted. - */ -async function checkMultiplePermissions< - T extends Record< - string, - | "guest-only" - | "authenticated-only" - | "*" - | PermissionCode - > ->(permissions: T): Promise<{ [K in keyof T]: boolean }> { - const permissionResults: Partial<{ [K in keyof T]: boolean }> = {}; - const currentUser = await getCurrentUser(); - - for (const permissionKey in permissions) { - if (permissions.hasOwnProperty(permissionKey)) { - const requiredPermission = permissions[permissionKey]; - const isPermissionGranted = await checkPermission( - requiredPermission, - currentUser - ); - permissionResults[permissionKey] = isPermissionGranted; - } - } - - return permissionResults as { [K in keyof T]: boolean }; -} - -export default checkMultiplePermissions; diff --git a/src/modules/auth/utils/checkPermission.ts b/src/modules/auth/utils/checkPermission.ts deleted file mode 100644 index f0723d0..0000000 --- a/src/modules/auth/utils/checkPermission.ts +++ /dev/null @@ -1,50 +0,0 @@ -import getCurrentUser from "./getCurrentUser"; -import "server-only"; -import getUserPermissions from "./getUserPermissions"; -import { PermissionCode } from "@/modules/permission/data/initialPermissions"; -import AuthError from "../error/AuthError"; - -/** - * Deprecated. Use dashboard service instead - * Checks if the current user has the specified permissions. - * - * @param permission - The specific permission to check. If it's "guest-only", the function returns true if the user is not authenticated. If it's "authenticated-only", it returns true if the user is authenticated. For other permissions, it checks against the user's roles and direct permissions. - * @param currentUser - Optional. The current user object. If not provided, the function retrieves the current user. - * @returns true if the user has the required permission, otherwise false. - */ -export default async function checkPermission( - permission: PermissionCode, - currentUser?: Awaited> -): Promise { - try { - // Allow if no specific permission is required. - if (permission === "*") return true; - - // Retrieve current user if not provided. - const user = currentUser ?? (await getCurrentUser()); - - // Handle non-authenticated users. - if (!user) { - return permission === "guest-only"; - } - - // Allow authenticated users if the permission is 'authenticated-only'. - if (permission === "authenticated-only") { - return true; - } - - // Short-circuit for super-admin role to allow all permissions. - if (user.roles.some((role) => role.code === "super-admin")) return true; - - // Aggregate all role codes and direct permissions into a set for efficient lookup. - const permissions = await getUserPermissions(); - - // Check if the user has the required permission. - return permissions.includes(permission); - } catch (e) { - if (e instanceof AuthError && e.errorCode === "INVALID_JWT_TOKEN") { - return false; - } - throw e; - } -} diff --git a/src/modules/auth/utils/comparePassword.ts b/src/modules/auth/utils/comparePassword.ts deleted file mode 100644 index 218192e..0000000 --- a/src/modules/auth/utils/comparePassword.ts +++ /dev/null @@ -1,17 +0,0 @@ -import bcrypt from "bcrypt"; - -/** - * Compares a plain text password with a hashed password. - * - * @param password - The plain text password to compare. - * @param hash - The hashed password to compare against. - * @returns True if the passwords match, false otherwise. - */ -async function comparePassword( - password: string, - hash: string -): Promise { - return bcrypt.compare(password, hash); -} - -export default comparePassword; diff --git a/src/modules/auth/utils/createJwtToken.ts b/src/modules/auth/utils/createJwtToken.ts deleted file mode 100644 index abb1656..0000000 --- a/src/modules/auth/utils/createJwtToken.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { SignOptions } from "jsonwebtoken"; -import UserClaims from "../types/UserClaims"; -import AuthError from "../error/AuthError"; -import jwt from "jsonwebtoken"; - -/** - * Creates a JWT token based on user claims. - * - * @param userClaims - The user claims to encode in the JWT. - * @param options - Optional signing options. - * @returns The generated JWT token. - */ -export function createJwtToken( - userClaims: UserClaims, - options?: SignOptions -): string { - const secret = process.env.JWT_SECRET; - if (!secret) throw new AuthError({ errorCode: "JWT_SECRET_EMPTY" }); - return jwt.sign(userClaims, secret, options); -} diff --git a/src/modules/auth/utils/decodeJwtToken.ts b/src/modules/auth/utils/decodeJwtToken.ts deleted file mode 100644 index f2b3883..0000000 --- a/src/modules/auth/utils/decodeJwtToken.ts +++ /dev/null @@ -1,21 +0,0 @@ -import jwt, { JwtPayload } from "jsonwebtoken"; -import AuthError from "../error/AuthError"; - -/** - * Decodes a JWT token and retrieves the payload. - * - * @param token - The JWT token to decode. - * @returns The decoded payload. - */ -function decodeJwtToken(token: string): JwtPayload | string { - const secret = process.env.JWT_SECRET; - if (!secret) throw new AuthError({ errorCode: "JWT_SECRET_NOT_EMPTY" }); - - try { - return jwt.verify(token, secret) as JwtPayload; - } catch (error) { - throw new AuthError({ errorCode: "INVALID_JWT_TOKEN" }); - } -} - -export default decodeJwtToken; diff --git a/src/modules/auth/utils/getCurrentUser.ts b/src/modules/auth/utils/getCurrentUser.ts deleted file mode 100644 index 3824f8f..0000000 --- a/src/modules/auth/utils/getCurrentUser.ts +++ /dev/null @@ -1,28 +0,0 @@ -import "server-only" -import getUserFromToken from "./getUserFromToken" -import { cookies, headers } from "next/headers" -import getTokenFromHeaders from "./getTokenFromHeaders" - -/** - * Retrieves the current user based on the JWT token stored in cookies. - * This function is intended to run on the server side in a Next.js application. - * It reads the JWT token from the cookies, decodes it to get the user ID, - * and then fetches the corresponding user data from the database. - * - * @returns The current user's data if the user is authenticated and found in the database, otherwise null. - */ -const getCurrentUser = async () => { - // Retrieve the token from cookies - const token = cookies().get("token")?.value ?? getTokenFromHeaders(headers()); - - // If no token is found, return null (no current user) - if(!token) return null; - - // Use the token to get the user from the database - const user = await getUserFromToken(token); - - // Return the user if found, otherwise return null - return user ? user : null; -} - -export default getCurrentUser; diff --git a/src/modules/auth/utils/getTokenFromHeaders.ts b/src/modules/auth/utils/getTokenFromHeaders.ts deleted file mode 100644 index 51cf8bc..0000000 --- a/src/modules/auth/utils/getTokenFromHeaders.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default function getTokenFromHeaders(headers: Headers) { - const authorizationHeader = headers.get('authorization'); - if (authorizationHeader) { - const parts = authorizationHeader.split(' '); - if (parts.length === 2 && parts[0] === 'Bearer') { - return parts[1]; - } - } - return null; -} diff --git a/src/modules/auth/utils/getUserFromToken.ts b/src/modules/auth/utils/getUserFromToken.ts deleted file mode 100644 index 837eb61..0000000 --- a/src/modules/auth/utils/getUserFromToken.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { cache } from "react"; -import decodeJwtToken from "./decodeJwtToken"; -import prisma from "@/core/db"; -import "server-only"; - -/** - * Retrieves user data from the database based on the provided JWT token. - * - * This function decodes the JWT token to extract the user ID, and then queries the database using Prisma - * to fetch the user's details, including the profile photo, roles, and direct permissions. - * - * @param token - The JWT token containing the user's ID. - * @returns The user's data if the user exists, or null if no user is found. - * Throws an error if the token is invalid or the database query fails. - */ -const getUserFromToken = cache(async (token: string) => { - // Decode the JWT token to extract the user ID - const decodedToken = decodeJwtToken(token) as { id: string; iat: number }; - - // Fetch the user from the database - const user = await prisma.user.findFirst({ - include: { - roles: { - include: { - permissions: true - } - }, - directPermissions: true, - }, - where: { - id: decodedToken.id, - }, - }); - - return user; -}); - -export default getUserFromToken; diff --git a/src/modules/auth/utils/getUserPermissions.ts b/src/modules/auth/utils/getUserPermissions.ts deleted file mode 100644 index b72986b..0000000 --- a/src/modules/auth/utils/getUserPermissions.ts +++ /dev/null @@ -1,27 +0,0 @@ -import "server-only"; -import getCurrentUser from "./getCurrentUser"; -import db from "@/core/db"; -import getUserRoles from "./getUserRoles"; -import { PermissionCode } from "@/modules/permission/data/initialPermissions"; - -export default async function getUserPermissions(): Promise { - const user = await getCurrentUser(); - - if (!user) return []; - - //Retrieve all permissions if the user is super admin - if ((await getUserRoles()).includes("super-admin")) { - return (await db.permission.findMany()).map( - (permission) => permission.code - ) as PermissionCode[]; - } - - const permissions = new Set([ - ...user.roles.flatMap((role) => - role.permissions.map((permission) => permission.code) - ), - ...user.directPermissions.map((dp) => dp.code), - ] as PermissionCode[]); - - return Array.from(permissions); -} diff --git a/src/modules/auth/utils/getUserRoles.ts b/src/modules/auth/utils/getUserRoles.ts deleted file mode 100644 index 4ce4191..0000000 --- a/src/modules/auth/utils/getUserRoles.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { RoleCode } from "@/modules/role/data/initialRoles"; -import getCurrentUser from "./getCurrentUser"; - -export default async function getUserRoles(): Promise { - const user = await getCurrentUser(); - - if (!user) return []; - - const roles = user?.roles.map((role) => role.code); - - return roles as RoleCode[]; -} diff --git a/src/modules/auth/utils/hashPassword.ts b/src/modules/auth/utils/hashPassword.ts deleted file mode 100644 index 3323eb6..0000000 --- a/src/modules/auth/utils/hashPassword.ts +++ /dev/null @@ -1,14 +0,0 @@ -import bcrypt from "bcrypt"; -import authConfig from "../authConfig"; - -/** - * Hashes a plain text password using bcrypt. - * - * @param password - The plain text password to hash. - * @returns The hashed password. - */ -export async function hashPassword(password: string): Promise { - return bcrypt.hash(password, authConfig.saltRounds); -} - -export default hashPassword; diff --git a/src/modules/dashboard/actions/getSidebarMenusAction.ts b/src/modules/dashboard/actions/getSidebarMenusAction.ts deleted file mode 100644 index ff4f3b3..0000000 --- a/src/modules/dashboard/actions/getSidebarMenusAction.ts +++ /dev/null @@ -1,22 +0,0 @@ -"use server"; -import "server-only"; -import SidebarMenu from "../types/SidebarMenu"; -import ServerResponseAction from "../types/ServerResponseAction"; -import handleCatch from "../utils/handleCatch"; -import getSidebarMenus from "../services/getSidebarMenus"; - -export default async function getSidebarMenusAction(): Promise< - ServerResponseAction -> { - try { - - const filteredMenus = await getSidebarMenus(); - - return { - success: true, - data: filteredMenus, - }; - } catch (e) { - return handleCatch(e); - } -} diff --git a/src/modules/dashboard/actions/getUserMenus.ts b/src/modules/dashboard/actions/getUserMenus.ts deleted file mode 100644 index d31e6ee..0000000 --- a/src/modules/dashboard/actions/getUserMenus.ts +++ /dev/null @@ -1,20 +0,0 @@ -//TODO: Change into server action -import { TbLogout } from "react-icons/tb"; -import { UserMenuItem } from "../types/UserMenuItem"; - -// This function retrieves the list of user menu items for use in the application's header. -const userMenuItems: UserMenuItem[] = [ - // { - // label: "Account Settings", - // icon: TbSettings, - // }, - { - label: "Logout", - icon: TbLogout, - color: "red", - href: "/dashboard/logout", - }, -]; - -const getUserMenus = () => userMenuItems; -export default getUserMenus; diff --git a/src/modules/dashboard/components/AppNavbar.tsx b/src/modules/dashboard/components/AppNavbar.tsx deleted file mode 100644 index b67e036..0000000 --- a/src/modules/dashboard/components/AppNavbar.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from "react"; -import { AppShell, ScrollArea } from "@mantine/core"; - -import MenuItem from "./SidebarMenuItem"; -import { useAuth } from "@/modules/auth/contexts/AuthContext"; - -/** - * `AppNavbar` is a React functional component that renders the application's navigation bar. - * It utilizes data from `allMenu` to create a list of menu items displayed in a scrollable area. - * - * @returns A React element representing the application's navigation bar. - */ -export default function AppNavbar() { - - const {user} = useAuth(); - - return ( - - - { - user?.sidebarMenus.map((menu, i) => ( - - )) ?? null} - - - ); -} diff --git a/src/modules/dashboard/components/DashboardLayout.tsx b/src/modules/dashboard/components/DashboardLayout.tsx deleted file mode 100644 index b4acfd4..0000000 --- a/src/modules/dashboard/components/DashboardLayout.tsx +++ /dev/null @@ -1,55 +0,0 @@ -"use client"; -import React from "react"; -import { AppShell } from "@mantine/core"; -import { useDisclosure } from "@mantine/hooks"; - -import AppHeader from "./AppHeader"; -import AppNavbar from "./AppNavbar"; -import { usePathname } from "next/navigation"; - -interface Props { - children: React.ReactNode; - isLoggedIn: boolean -} - -/** - * `DashboardLayout` is a React functional component that provides a layout structure - * for the dashboard, including a header, navigation bar, and main content area. - * - * @param props - The component props. - * @param props.children - The child components to be rendered inside the layout. - * @returns A React element representing the dashboard layout. - */ -export default function DashboardLayout(props: Props) { - - - const pathname = usePathname(); - - console.log(pathname) - // State and toggle function for handling the disclosure of the navigation bar - const [openNavbar, { toggle }] = useDisclosure(false); - - const withAppShell = props.isLoggedIn; - - return withAppShell ? ( - - {/* Header */} - - - {/* Navbar */} - - - - {props.children} - - - ) : props.children; -} diff --git a/src/modules/dashboard/components/UserMenuItem.tsx b/src/modules/dashboard/components/UserMenuItem.tsx deleted file mode 100644 index 26f5487..0000000 --- a/src/modules/dashboard/components/UserMenuItem.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Menu, rem } from "@mantine/core"; -import React from "react"; -import { UserMenuItem as UserMenuItemType } from "../types/UserMenuItem"; - -interface Props { - item: UserMenuItemType; -} - -export default function UserMenuItem({ item }: Props) { - return ( - - } - href={item.href} - > - {item.label} - - ); -} diff --git a/src/modules/dashboard/components/styles/sidebarChildMenu.module.css b/src/modules/dashboard/components/styles/sidebarChildMenu.module.css deleted file mode 100644 index 43fe7a7..0000000 --- a/src/modules/dashboard/components/styles/sidebarChildMenu.module.css +++ /dev/null @@ -1,16 +0,0 @@ -.link { - font-weight: 500; - display: block; - text-decoration: none; - padding: var(--mantine-spacing-xs) var(--mantine-spacing-md); - padding-left: var(--mantine-spacing-md); - margin-left: var(--mantine-spacing-xl); - font-size: var(--mantine-font-size-sm); - color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-0)); - border-left: 1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); - - @mixin hover { - background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-7)); - color: light-dark(var(--mantine-color-black), var(--mantine-color-dark-0)); - } - } \ No newline at end of file diff --git a/src/modules/dashboard/components/styles/sidebarMenuItem.module.css b/src/modules/dashboard/components/styles/sidebarMenuItem.module.css deleted file mode 100644 index aab6b80..0000000 --- a/src/modules/dashboard/components/styles/sidebarMenuItem.module.css +++ /dev/null @@ -1,17 +0,0 @@ -.control { - font-weight: 500; - display: block; - width: 100%; - padding: var(--mantine-spacing-xs) var(--mantine-spacing-md); - color: var(--mantine-color-text); - font-size: var(--mantine-font-size-sm); - - @mixin hover { - background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-7)); - color: light-dark(var(--mantine-color-black), var(--mantine-color-dark-0)); - } - } - - .chevron { - transition: transform 200ms ease; - } \ No newline at end of file diff --git a/src/modules/dashboard/dashboard.config.ts b/src/modules/dashboard/dashboard.config.ts deleted file mode 100644 index 5e1fad0..0000000 --- a/src/modules/dashboard/dashboard.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -const dashboardConfig = { - routesWithoutAppShell : [ - "/login", - "/register", - ], - baseRoute: "/dashboard" -} as const; - -export default dashboardConfig; diff --git a/src/modules/dashboard/data/sidebarMenus.ts b/src/modules/dashboard/data/sidebarMenus.ts deleted file mode 100644 index 998a6c2..0000000 --- a/src/modules/dashboard/data/sidebarMenus.ts +++ /dev/null @@ -1,30 +0,0 @@ -import SidebarMenu from "../types/SidebarMenu"; - -const sidebarMenus: SidebarMenu[] = [ - { - label: "Dashboard", - icon: "TbLayoutDashboard", - allowedPermissions: ["*"], - link: "/", - }, - { - label: "Users", - icon: "TbUsers", - color: "grape", - children: [ - { - label: "Users", - link: "/users", - allowedPermissions: ["users.readAll"], - }, - { label: "Roles", link: "/roles", allowedRoles: ["super-admin"] }, - { - label: "Permissions", - link: "/permissions", - allowedRoles: ["super-admin"], - }, - ], - }, -]; - -export default sidebarMenus; diff --git a/src/modules/dashboard/errors/DashboardError.ts b/src/modules/dashboard/errors/DashboardError.ts deleted file mode 100644 index c269fdc..0000000 --- a/src/modules/dashboard/errors/DashboardError.ts +++ /dev/null @@ -1,48 +0,0 @@ -import BaseError from "@/core/error/BaseError"; - -export const DashboardErrorCodes = [ - "EMAIL_NOT_FOUND", - "EMPTY_USER_HASH", - "INVALID_CREDENTIALS", - "INVALID_JWT_TOKEN", - "JWT_SECRET_EMPTY", - "USER_ALREADY_EXISTS", - "INVALID_FORM_DATA" -] as const; - -interface DashboardErrorOptions { - message?: string; - errorCode: (typeof DashboardErrorCodes)[number] | (string & {}); - formErrors?: Record - statusCode?: number; -} - -export default class DashboardError extends BaseError { - public readonly errorCode: DashboardErrorOptions['errorCode']; - public readonly formErrors?: DashboardErrorOptions['formErrors'] - - constructor(options: DashboardErrorOptions) { - super({ - errorCode: options.errorCode, - message: options.message, - statusCode: options.statusCode, - }); - - this.errorCode = options.errorCode; - } - - /** - * Returns a structured error response object. - */ - getErrorReponseObject(){ - return { - success: false, - dashboardError: true, - error: { - message: `${this.message}`, - errorCode: this.errorCode, - errors: this.formErrors ?? undefined - } - } as const; - } -} diff --git a/src/modules/dashboard/services/getSidebarMenus.ts b/src/modules/dashboard/services/getSidebarMenus.ts deleted file mode 100644 index c0f23d7..0000000 --- a/src/modules/dashboard/services/getSidebarMenus.ts +++ /dev/null @@ -1,55 +0,0 @@ -import "server-only"; -import SidebarMenu from "../types/SidebarMenu"; -import getUserRoles from "@/modules/auth/utils/getUserRoles"; -import getUserPermissions from "@/modules/auth/utils/getUserPermissions"; -import sidebarMenus from "../data/sidebarMenus"; - -export default async function getSidebarMenus() { - const filteredMenus: SidebarMenu[] = []; - - const roles = await getUserRoles(); - const permissions = await getUserPermissions(); - - for (let menu of sidebarMenus) { - //if has children - if (menu.children) { - const currentMenuChildren: SidebarMenu["children"] = []; - for (let menuChild of menu.children) { - if ( - menuChild.allowedPermissions?.some((perm) => - permissions?.includes(perm) - ) || - menuChild.allowedRoles?.some((role) => - roles?.includes(role) - ) || - menuChild.allowedPermissions?.includes("*") || - menuChild.allowedRoles?.includes("*") || - roles.includes("super-admin") - ) - currentMenuChildren.push(menuChild); - } - - if (currentMenuChildren.length > 0) { - filteredMenus.push({ - ...menu, - children: currentMenuChildren, - }); - } - } - //if does not have any children - else { - if ( - menu.allowedPermissions?.some((perm) => - permissions?.includes(perm) - ) || - menu.allowedRoles?.some((role) => roles?.includes(role)) || - menu.allowedPermissions?.includes("*") || - menu.allowedRoles?.includes("*") - ) { - filteredMenus.push(menu); - } - } - } - - return filteredMenus; -} diff --git a/src/modules/dashboard/types/CrudPermissions.d.ts b/src/modules/dashboard/types/CrudPermissions.d.ts deleted file mode 100644 index bc4c2fc..0000000 --- a/src/modules/dashboard/types/CrudPermissions.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -type CrudPermissions = { - create: boolean, - read: boolean, - update: boolean, - delete: boolean -} - -export default CrudPermissions; diff --git a/src/modules/dashboard/types/ServerResponseAction.d.ts b/src/modules/dashboard/types/ServerResponseAction.d.ts deleted file mode 100644 index 913d779..0000000 --- a/src/modules/dashboard/types/ServerResponseAction.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -export type ErrorResponse = { - success: false; - dashboardError?: boolean; - error?: { - message?: string; - errorCode: string; - errors?: { [k: string]: string }; - }; - message?: string; -}; - -export type SuccessResponse = T extends undefined - ? { success: true; message?: string } - : { - success: true; - message?: string; - data: T; - }; - -type ServerResponseAction = ErrorResponse | SuccessResponse; - -export default ServerResponseAction; diff --git a/src/modules/dashboard/types/SidebarMenu.d.ts b/src/modules/dashboard/types/SidebarMenu.d.ts deleted file mode 100644 index 35d3ed9..0000000 --- a/src/modules/dashboard/types/SidebarMenu.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { PermissionCode } from "@/modules/permission/data/initialPermissions"; -import { RoleCode } from "@/modules/role/data/initialRoles"; - -export default interface SidebarMenu { - label: string; - icon: React.FC | string; - children?: { - label: string; - link: string; - allowedPermissions?: PermissionCode[]; - allowedRoles?: RoleCode[]; - }[]; - link?: string; - color?: ThemeIconProps["color"]; - allowedPermissions?: PermissionCode[]; - allowedRoles?: RoleCode[]; -} diff --git a/src/modules/dashboard/types/UserMenuItem.d.ts b/src/modules/dashboard/types/UserMenuItem.d.ts deleted file mode 100644 index b6fc6c8..0000000 --- a/src/modules/dashboard/types/UserMenuItem.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface UserMenuItem { - label: string; - icon: React.FC; - color?: ThemeIconProps["color"]; - href?: string; -} diff --git a/src/modules/dashboard/utils/handleCatch.ts b/src/modules/dashboard/utils/handleCatch.ts deleted file mode 100644 index 277c48d..0000000 --- a/src/modules/dashboard/utils/handleCatch.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Prisma } from "@prisma/client"; -import DashboardError from "../errors/DashboardError"; -import "server-only" - -/** - * Handles exceptions and converts them into a structured error response. - * @param e The caught error or exception. - */ -const handleCatch = (e: unknown) => { - console.error(e) - if (e instanceof DashboardError) { - return e.getErrorReponseObject(); - } - if (e instanceof Prisma.PrismaClientKnownRequestError) { - //Not found - if (e.code === "P2025") { - const error = new DashboardError({ - errorCode: "NOT_FOUND", - message: - "The requested data could not be located. It may have been deleted or relocated. Please verify the information or try a different request.", - }); - return error.getErrorReponseObject(); - } - } - if (e instanceof Error) { - return { - success: false, - dashboardError: false, - message: e.message, - } as const; - } else { - return { - success: false, - dashboardError: false, - message: "Unkown error", - } as const; - } -}; - -export default handleCatch; diff --git a/src/modules/dashboard/utils/notFound.ts b/src/modules/dashboard/utils/notFound.ts deleted file mode 100644 index 1819010..0000000 --- a/src/modules/dashboard/utils/notFound.ts +++ /dev/null @@ -1,17 +0,0 @@ -import BaseError from "@/core/error/BaseError"; - -/** - * Throws a 'NOT_FOUND' DashboardError with a custom or default message. - * @param message Optional custom message for the error. - */ -const notFound = ({ message }: { message?: string }) => { - throw new BaseError({ - errorCode: "NOT_FOUND", - message: - message ?? - "The requested data could not be located. It may have been deleted or relocated. Please verify the information or try a different request.", - statusCode: 404 - }); -}; - -export default notFound; diff --git a/src/modules/dashboard/utils/unauthorized.ts b/src/modules/dashboard/utils/unauthorized.ts deleted file mode 100644 index d806aef..0000000 --- a/src/modules/dashboard/utils/unauthorized.ts +++ /dev/null @@ -1,13 +0,0 @@ -import DashboardError from "../errors/DashboardError"; - -/** - * Throws a 'UNAUTHORIZED' DashboardError. - */ -const unauthorized = () => { - throw new DashboardError({ - errorCode: "UNAUTHORIZED", - message: "You are unauthorized to do this action", - }); -}; - -export default unauthorized; diff --git a/src/modules/dashboard/utils/withServerAction.ts b/src/modules/dashboard/utils/withServerAction.ts deleted file mode 100644 index 52d1550..0000000 --- a/src/modules/dashboard/utils/withServerAction.ts +++ /dev/null @@ -1,36 +0,0 @@ -import ClientError from "@/core/error/ClientError"; -import ServerResponseAction from "../types/ServerResponseAction"; - -/** - * A higher-order function that wraps an async function and provides structured error handling. - * If the wrapped function returns a successful response, it's returned directly. - * If an error occurs, it throws a DashboardError for dashboard-related errors or a generic Error otherwise. - * - * @param asyncFunction - The async function to wrap. - * @param args - The arguments to pass to the async function. - * @returns The successful response from the async function. - * @throws DashboardError for dashboard-related errors or Error for other errors. - */ -async function withServerAction( - asyncFunction: (...args: Args) => Promise>, - ...args: Args -){ - const result = await asyncFunction(...args); - if (result.success === true) { - return result; - } else { - if (result.dashboardError && result.error) { - const errorDetails = result.error; - throw new ClientError({ - message: errorDetails.message, - errorCode: errorDetails.errorCode, - formErrors: errorDetails.errors, - }); - } else { - // Handle non-dashboard errors - throw new Error(result.message ?? "Unknown error occurred."); - } - } -} - -export default withServerAction; diff --git a/src/modules/permission/actions/deletePermissionAction.ts b/src/modules/permission/actions/deletePermissionAction.ts deleted file mode 100644 index fe03a23..0000000 --- a/src/modules/permission/actions/deletePermissionAction.ts +++ /dev/null @@ -1,26 +0,0 @@ -"use server"; - -import ServerResponseAction from "@/modules/dashboard/types/ServerResponseAction"; -import handleCatch from "@/modules/dashboard/utils/handleCatch"; -import unauthorized from "@/modules/dashboard/utils/unauthorized"; -import { revalidatePath } from "next/cache"; -import deletePermission from "../services/deletePermission"; -import checkPermission from "@/modules/auth/utils/checkPermission"; - -export default async function deletePermissionAction( - id: string -): Promise { - try { - if (!(await checkPermission("permissions.delete"))) unauthorized(); - - await deletePermission(id); - revalidatePath("."); - - return { - success: true, - message: "The permission has been deleted successfully", - }; - } catch (e: unknown) { - return handleCatch(e); - } -} diff --git a/src/modules/permission/actions/getAllPermissionsAction.ts b/src/modules/permission/actions/getAllPermissionsAction.ts deleted file mode 100644 index 7a26886..0000000 --- a/src/modules/permission/actions/getAllPermissionsAction.ts +++ /dev/null @@ -1,34 +0,0 @@ -"use server"; -import ServerResponseAction from "@/modules/dashboard/types/ServerResponseAction"; -import handleCatch from "@/modules/dashboard/utils/handleCatch"; -import unauthorized from "@/modules/dashboard/utils/unauthorized"; -import Permission from "../types/Permission"; -import getAllPermissions from "../services/getAllPermissions"; -import checkPermission from "@/modules/auth/utils/checkPermission"; - -/** - * Retrieves all permissions along with the count of associated permissions and users. - * Authorization check is performed for the operation. - * - * @returns An array of permission objects each including details and counts of related permissions and users. - */ -export default async function getAllPermissionsAction(): Promise< - ServerResponseAction -> { - // Authorization check - if (!(await checkPermission("permissions.readAll"))) { - unauthorized(); - } - - try { - // Fetch permissions from the database - const permissionsData = await getAllPermissions(); - - return { - success: true, - data: permissionsData, - }; - } catch (error) { - return handleCatch(error); - } -} diff --git a/src/modules/permission/actions/getPermissionByIdAction.ts b/src/modules/permission/actions/getPermissionByIdAction.ts deleted file mode 100644 index 7e19dfa..0000000 --- a/src/modules/permission/actions/getPermissionByIdAction.ts +++ /dev/null @@ -1,32 +0,0 @@ -"use server"; - -import checkPermission from "@/modules/auth/utils/checkPermission"; -import ServerResponseAction from "@/modules/dashboard/types/ServerResponseAction"; -import handleCatch from "@/modules/dashboard/utils/handleCatch"; -import unauthorized from "@/modules/dashboard/utils/unauthorized"; -import getPermissionById from "../services/getPermissionById"; - -interface Permission { - id: string; - code: string; - name: string; - description: string; - isActive: boolean; -} - -export default async function getPermissionByIdAction( - id: string -): Promise> { - try { - if (!(await checkPermission("permissions.read"))) unauthorized(); - - const permission = await getPermissionById(id); - - return { - success: true, - data: permission, - } as const; - } catch (e) { - return handleCatch(e); - } -} diff --git a/src/modules/permission/actions/upsertPermissionAction.ts b/src/modules/permission/actions/upsertPermissionAction.ts deleted file mode 100644 index 645e72a..0000000 --- a/src/modules/permission/actions/upsertPermissionAction.ts +++ /dev/null @@ -1,48 +0,0 @@ -"use server"; - -import { PermissionFormData } from "../formSchemas/PermissionFormData"; -import { revalidatePath } from "next/cache"; -import ServerResponseAction from "@/modules/dashboard/types/ServerResponseAction"; -import unauthorized from "@/modules/dashboard/utils/unauthorized"; -import handleCatch from "@/modules/dashboard/utils/handleCatch"; -import checkPermission from "@/modules/auth/utils/checkPermission"; -import upsertPermission from "../services/upsertPermission"; - -/** - * Upserts a permission based on the provided PermissionFormData. - * If the permission already exists (determined by `id`), it updates the permission; otherwise, it creates a new permission. - * Authorization checks are performed based on whether it's a create or update operation. - * - * @param data - The data for creating or updating the permission. - * @returns An object containing the success status, message, and any errors. - */ -export default async function upsertPermissionAction( - data: PermissionFormData -): Promise { - try { - const isInsert = !data.id; - - // Authorization check - const permissionType = isInsert - ? "permissions.create" - : "permissions.update"; - if (!(await checkPermission(permissionType))) { - unauthorized(); - } - - const result = await upsertPermission(data); - - // Revalidate the cache - revalidatePath("."); - - // Return success message - return { - success: true, - message: `Permission ${result.name} has been successfully ${ - isInsert ? "created" : "updated" - }.`, - }; - } catch (error) { - return handleCatch(error); - } -} diff --git a/src/modules/permission/data/initialPermissions.ts b/src/modules/permission/data/initialPermissions.ts deleted file mode 100644 index 9ca350e..0000000 --- a/src/modules/permission/data/initialPermissions.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { Permission } from "@prisma/client"; - -const permissionData = [ - // Permission group - { - code: "permissions.create", - name: "Create permission", - description: "Allows creating a single permission", - isActive: true, - }, - { - code: "permissions.read", - name: "Read permission", - description: "Allows reading a single permission", - isActive: true, - }, - { - code: "permissions.readAll", - name: "Read all permissions", - description: "Allows reading all permissions", - isActive: true, - }, - { - code: "permissions.update", - name: "Update permission", - description: "Allows updating a permission", - isActive: true, - }, - { - code: "permissions.delete", - name: "Delete permission", - description: "Allows deleting a permission", - isActive: true, - }, - // Role group - { - code: "roles.create", - name: "Create role", - description: "Allows creating a single role", - isActive: true, - }, - { - code: "roles.read", - name: "Read role", - description: "Allows reading a single role", - isActive: true, - }, - { - code: "roles.readAll", - name: "Read all roles", - description: "Allows reading all roles", - isActive: true, - }, - { - code: "roles.update", - name: "Update role", - description: "Allows updating a role", - isActive: true, - }, - { - code: "roles.delete", - name: "Delete role", - description: "Allows deleting a role", - isActive: true, - }, - // User group - { - code: "users.create", - name: "Create user", - description: "Allows creating a user", - isActive: true, - }, - { - code: "users.read", - name: "Read user", - description: "Allows reading a single user", - isActive: true, - }, - { - code: "users.readAll", - name: "Read all users", - description: "Allows reading all users", - isActive: true, - }, - { - code: "users.update", - name: "Update user", - description: "Allows updating a user", - isActive: true, - }, - { - code: "users.delete", - name: "Delete user", - description: "Allows deleting a user", - isActive: true, - }, - - //Promos - { - code: "promos.readAll", - name: "Read all promos", - }, -] as const; - -export type SpecificPermissionCode = (typeof permissionData)[number]["code"]; - -export type PermissionCode = - | SpecificPermissionCode - | "*" - | "authenticated-only" - | "guest-only"; - -const exportedPermissionData = permissionData as unknown as Omit< - Permission, - "id" ->[]; - -export default exportedPermissionData; diff --git a/src/modules/permission/formSchemas/PermissionFormData.ts b/src/modules/permission/formSchemas/PermissionFormData.ts deleted file mode 100644 index 2e7941b..0000000 --- a/src/modules/permission/formSchemas/PermissionFormData.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { z } from "zod" - -export interface PermissionFormData { - id: string; - name: string; - code: string; - description: string; - isActive: boolean; -} - -const permissionFormDataSchema = z.object({ - id: z.string().nullable(), - name: z.string().min(1), - code: z.string().min(1), - description: z.string(), - isActive: z.boolean(), -}) - -export default permissionFormDataSchema; diff --git a/src/modules/permission/modals/PermissionDeleteModal.tsx b/src/modules/permission/modals/PermissionDeleteModal.tsx deleted file mode 100644 index 1508751..0000000 --- a/src/modules/permission/modals/PermissionDeleteModal.tsx +++ /dev/null @@ -1,100 +0,0 @@ -"use client"; -import React, { useState } from "react"; -import { - Button, - Flex, - Modal, - Text, - Alert, -} from "@mantine/core"; -import { showNotification } from "@/utils/notifications"; -import withServerAction from "@/modules/dashboard/utils/withServerAction"; -import deletePermissionAction from "../actions/deletePermissionAction"; -import ClientError from "@/core/error/ClientError"; - -export interface DeleteModalProps { - data?: { - id: string; - name: string; - }; - onClose: () => void; -} - -export default function DeleteModal(props: DeleteModalProps) { - const [isSubmitting, setSubmitting] = useState(false); - const [errorMessage, setErrorMessage] = useState(""); - - /** - * Closes the modal. It won't close if a submission is in progress. - */ - const closeModal = () => { - if (isSubmitting) return; - setErrorMessage("") - props.onClose(); - }; - - const confirmAction = () => { - if (!props.data?.id) return; - setSubmitting(true); - - withServerAction(deletePermissionAction, props.data!.id) - .then((response) => { - showNotification( - response.message ?? "Permission deleted successfully" - ); - setSubmitting(false); - props.onClose() - }) - .catch((e) => { - if (e instanceof ClientError){ - setErrorMessage(`ERROR: ${e.message} (${e.errorCode})`) - } - else if (e instanceof Error) { - setErrorMessage(`ERROR: ${e.message}`) - } else { - setErrorMessage(`Unkown error is occured. Please contact administrator`) - } - }) - .finally(() => { - setSubmitting(false) - }); - }; - - return ( - - - Are you sure you want to delete permission{" "} - - {props.data?.name} - - ? This action is irreversible. - - - {errorMessage && {errorMessage}} - {/* Buttons */} - - - - - - ); -} \ No newline at end of file diff --git a/src/modules/permission/modals/PermissionFormModal.tsx b/src/modules/permission/modals/PermissionFormModal.tsx deleted file mode 100644 index b4ec01a..0000000 --- a/src/modules/permission/modals/PermissionFormModal.tsx +++ /dev/null @@ -1,211 +0,0 @@ -/* eslint-disable react-hooks/exhaustive-deps */ -import { showNotification } from "@/utils/notifications"; -import { - Flex, - Modal, - Stack, - TextInput, - Textarea, - Button, - ScrollArea, - Checkbox, - Skeleton, - Alert, -} from "@mantine/core"; -import { useForm, zodResolver } from "@mantine/form"; -import { useRouter } from "next/navigation"; -import React, { useEffect, useState } from "react"; -import { TbDeviceFloppy } from "react-icons/tb"; -import permissionFormDataSchema, { PermissionFormData } from "../formSchemas/PermissionFormData"; -import getPermissionByIdAction from "../actions/getPermissionByIdAction"; -import withServerAction from "@/modules/dashboard/utils/withServerAction"; -import upsertPermissionAction from "../actions/upsertPermissionAction"; -import ClientError from "@/core/error/ClientError"; - -export interface ModalProps { - title: string; - readonly?: boolean; - id?: string; - opened: boolean; - onClose?: () => void; -} - -/** - * A component for rendering a modal with a form to create or edit a permission. - * - * @param props - The props for the component. - * @returns The rendered element. - */ -export default function FormModal(props: ModalProps) { - const router = useRouter(); - const [isSubmitting, setSubmitting] = useState(false); - const [isFetching, setFetching] = useState(false); - const [errorMessage, setErrorMessage] = useState(""); - - const form = useForm({ - initialValues: { - code: "", - description: "", - id: "", - isActive: false, - name: "", - }, - validate: zodResolver(permissionFormDataSchema), - validateInputOnChange: false, - onValuesChange: (values) => { - console.log(values); - }, - }); - - /** - * Fetches permission data by ID and populates the form if the modal is opened and an ID is provided. - */ - useEffect(() => { - if (!props.opened || !props.id) { - return; - } - - setFetching(true); - withServerAction(getPermissionByIdAction, props.id) - .then((response) => { - if (response.success) { - const data = response.data; - form.setValues({ - code: data.code, - description: data.description, - id: data.id, - isActive: data.isActive, - name: data.name, - }); - } - }) - .catch((e) => { - //TODO: Handle error - console.log(e); - }) - .finally(() => { - setFetching(false); - }); - }, [props.opened, props.id]); - - const closeModal = () => { - form.reset() - props.onClose ? props.onClose() : router.replace("?"); - }; - - const handleSubmit = (values: PermissionFormData) => { - setSubmitting(true); - withServerAction(upsertPermissionAction, values) - .then((response) => { - showNotification(response.message!, "success"); - closeModal(); - }) - .catch((e) => { - if (e instanceof ClientError) { - if (e.errorCode === "INVALID_FORM_DATA") { - form.setErrors(e.formErrors ?? {}); - } else { - setErrorMessage(`ERROR: ${e.message} (${e.errorCode})`); - } - } else if (e instanceof Error) { - setErrorMessage(`ERROR: ${e.message}`); - } else { - setErrorMessage( - `Unkown error is occured. Please contact administrator` - ); - } - }) - .finally(() => { - setSubmitting(false); - }); - }; - - return ( - -
- - {errorMessage && {errorMessage}} - {/* ID */} - {form.values.id ? ( - - ) : ( -
- )} - - {/* Code */} - - - - - {/* Name */} - - - - - {/* Description */} - -