From c5bc58f938860220671870b21b1db2c414a9bb91 Mon Sep 17 00:00:00 2001 From: Jessy Date: Tue, 28 Mar 2023 23:16:26 +0200 Subject: [PATCH 01/16] Refacto: Set up skeleton of clean architecture (directories, files, ...) --- .gitignore | 38 +------------- package.json | 49 +++--------------- .env.dist => packages/apps/old-app/.env.dist | 0 .../apps/old-app/.eslintrc.json | 0 packages/apps/old-app/.gitignore | 36 +++++++++++++ README.md => packages/apps/old-app/README.md | 0 .../apps/old-app/jest.config.js | 0 .../apps/old-app/next.config.js | 0 .../apps/old-app/package-lock.json | 0 packages/apps/old-app/package.json | 45 ++++++++++++++++ .../apps/old-app/public}/favicon.ico | Bin .../apps/old-app/public}/fonts/zanna.otf | Bin .../apps/old-app/public}/next.svg | 0 .../apps/old-app/public}/thirteen.svg | 0 .../apps/old-app/public}/vercel.svg | 0 .../apps/old-app/src}/components/AppBar.tsx | 0 .../apps/old-app/src}/components/Login.tsx | 0 .../apps/old-app/src}/components/Register.tsx | 0 .../components/ReservationSlotsSchedule.tsx | 0 .../old-app/src}/components/SearchInput.tsx | 0 .../src}/components/ServiceCardItem.tsx | 0 .../old-app/src}/components/ShopCardItem.tsx | 0 .../src}/components/backoffice/HourModal.tsx | 0 .../components/backoffice/ServiceModal.tsx | 0 .../src}/components/backoffice/ShopModal.tsx | 0 .../src}/components/hours/HourItem.tsx | 0 .../src}/components/hours/ShopHours.tsx | 0 .../apps/old-app/src}/config/axios.ts | 0 .../apps/old-app/src}/config/dayjs.ts | 0 .../src}/helpers/localstorage.helper.ts | 0 .../src}/helpers/reservation.helper.ts | 0 .../old-app/src}/helpers/reservation.spec.ts | 0 .../apps/old-app/src}/models/hour.model.ts | 0 .../old-app/src}/models/reservation.model.ts | 0 .../apps/old-app/src}/models/service.model.ts | 0 .../apps/old-app/src}/models/shop.model.ts | 0 .../apps/old-app/src}/models/user.model.ts | 1 + .../apps/old-app/src}/pages/_app.tsx | 0 .../src}/pages/admin/dashboard/index.tsx | 0 .../admin/dashboard/shop/[shopId]/index.tsx | 0 .../apps/old-app/src}/pages/index.tsx | 0 .../apps/old-app/src}/pages/search/index.tsx | 0 .../old-app/src}/pages/shops/[id]/index.tsx | 0 .../src}/pages/shops/[id]/reservation.tsx | 0 .../pages/users/my-reservations/index.tsx | 0 .../old-app/src}/services/auth.service.ts | 0 .../old-app/src}/services/hour.service.ts | 0 .../src}/services/reservation.service.ts | 0 .../old-app/src}/services/service.service.ts | 0 .../old-app/src}/services/shop.service.ts | 0 .../old-app/src}/services/users.service.ts | 0 .../old-app/src}/store/reservation.store.ts | 0 .../apps/old-app/src}/store/user.store.ts | 0 .../apps/old-app/src}/styles/globals.css | 0 .../apps/old-app/src}/utils/format.utils.ts | 0 .../apps/old-app/tsconfig.json | 2 +- packages/core/package.json | 12 +++++ pnpm-workspace.yaml | 0 58 files changed, 105 insertions(+), 78 deletions(-) rename .env.dist => packages/apps/old-app/.env.dist (100%) rename .eslintrc.json => packages/apps/old-app/.eslintrc.json (100%) create mode 100644 packages/apps/old-app/.gitignore rename README.md => packages/apps/old-app/README.md (100%) rename jest.config.js => packages/apps/old-app/jest.config.js (100%) rename next.config.js => packages/apps/old-app/next.config.js (100%) rename package-lock.json => packages/apps/old-app/package-lock.json (100%) create mode 100644 packages/apps/old-app/package.json rename {public => packages/apps/old-app/public}/favicon.ico (100%) rename {public => packages/apps/old-app/public}/fonts/zanna.otf (100%) rename {public => packages/apps/old-app/public}/next.svg (100%) rename {public => packages/apps/old-app/public}/thirteen.svg (100%) rename {public => packages/apps/old-app/public}/vercel.svg (100%) rename {src => packages/apps/old-app/src}/components/AppBar.tsx (100%) rename {src => packages/apps/old-app/src}/components/Login.tsx (100%) rename {src => packages/apps/old-app/src}/components/Register.tsx (100%) rename {src => packages/apps/old-app/src}/components/ReservationSlotsSchedule.tsx (100%) rename {src => packages/apps/old-app/src}/components/SearchInput.tsx (100%) rename {src => packages/apps/old-app/src}/components/ServiceCardItem.tsx (100%) rename {src => packages/apps/old-app/src}/components/ShopCardItem.tsx (100%) rename {src => packages/apps/old-app/src}/components/backoffice/HourModal.tsx (100%) rename {src => packages/apps/old-app/src}/components/backoffice/ServiceModal.tsx (100%) rename {src => packages/apps/old-app/src}/components/backoffice/ShopModal.tsx (100%) rename {src => packages/apps/old-app/src}/components/hours/HourItem.tsx (100%) rename {src => packages/apps/old-app/src}/components/hours/ShopHours.tsx (100%) rename {src => packages/apps/old-app/src}/config/axios.ts (100%) rename {src => packages/apps/old-app/src}/config/dayjs.ts (100%) rename {src => packages/apps/old-app/src}/helpers/localstorage.helper.ts (100%) rename {src => packages/apps/old-app/src}/helpers/reservation.helper.ts (100%) rename {src => packages/apps/old-app/src}/helpers/reservation.spec.ts (100%) rename {src => packages/apps/old-app/src}/models/hour.model.ts (100%) rename {src => packages/apps/old-app/src}/models/reservation.model.ts (100%) rename {src => packages/apps/old-app/src}/models/service.model.ts (100%) rename {src => packages/apps/old-app/src}/models/shop.model.ts (100%) rename {src => packages/apps/old-app/src}/models/user.model.ts (99%) rename {src => packages/apps/old-app/src}/pages/_app.tsx (100%) rename {src => packages/apps/old-app/src}/pages/admin/dashboard/index.tsx (100%) rename {src => packages/apps/old-app/src}/pages/admin/dashboard/shop/[shopId]/index.tsx (100%) rename {src => packages/apps/old-app/src}/pages/index.tsx (100%) rename {src => packages/apps/old-app/src}/pages/search/index.tsx (100%) rename {src => packages/apps/old-app/src}/pages/shops/[id]/index.tsx (100%) rename {src => packages/apps/old-app/src}/pages/shops/[id]/reservation.tsx (100%) rename {src => packages/apps/old-app/src}/pages/users/my-reservations/index.tsx (100%) rename {src => packages/apps/old-app/src}/services/auth.service.ts (100%) rename {src => packages/apps/old-app/src}/services/hour.service.ts (100%) rename {src => packages/apps/old-app/src}/services/reservation.service.ts (100%) rename {src => packages/apps/old-app/src}/services/service.service.ts (100%) rename {src => packages/apps/old-app/src}/services/shop.service.ts (100%) rename {src => packages/apps/old-app/src}/services/users.service.ts (100%) rename {src => packages/apps/old-app/src}/store/reservation.store.ts (100%) rename {src => packages/apps/old-app/src}/store/user.store.ts (100%) rename {src => packages/apps/old-app/src}/styles/globals.css (100%) rename {src => packages/apps/old-app/src}/utils/format.utils.ts (100%) rename tsconfig.json => packages/apps/old-app/tsconfig.json (86%) create mode 100644 packages/core/package.json create mode 100644 pnpm-workspace.yaml diff --git a/.gitignore b/.gitignore index 65eb910..12ac647 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,2 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts +node_modules/ +.DS_Store \ No newline at end of file diff --git a/package.json b/package.json index aee13fa..4384a53 100644 --- a/package.json +++ b/package.json @@ -1,45 +1,12 @@ { - "name": "planity-app", - "version": "0.1.0", - "private": true, + "name": "clean-app", + "version": "1.0.0", + "description": "", + "main": "index.js", "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "test": "jest" + "test": "echo \"Error: no test specified\" && exit 1" }, - "dependencies": { - "@emotion/react": "^11.10.5", - "@emotion/styled": "^11.10.5", - "@hookform/resolvers": "^2.9.11", - "@mui/icons-material": "^5.11.0", - "@mui/material": "^5.11.7", - "@mui/x-date-pickers": "^5.0.20", - "@next/font": "13.1.6", - "axios": "^1.3.0", - "dayjs": "^1.11.7", - "eslint": "8.33.0", - "eslint-config-next": "13.1.6", - "next": "13.1.6", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-hook-form": "^7.43.3", - "react-query": "^3.39.3", - "yup": "^1.0.2", - "zod": "^3.20.6", - "zustand": "^4.3.3" - }, - "devDependencies": { - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^13.4.0", - "@types/jest": "^29.4.0", - "@types/node": "18.11.18", - "@types/react": "18.0.27", - "@types/react-dom": "18.0.10", - "jest": "^29.4.2", - "jest-environment-jsdom": "^29.4.2", - "ts-jest": "^29.0.5", - "typescript": "4.9.5" - } + "keywords": [], + "author": "", + "license": "ISC" } diff --git a/.env.dist b/packages/apps/old-app/.env.dist similarity index 100% rename from .env.dist rename to packages/apps/old-app/.env.dist diff --git a/.eslintrc.json b/packages/apps/old-app/.eslintrc.json similarity index 100% rename from .eslintrc.json rename to packages/apps/old-app/.eslintrc.json diff --git a/packages/apps/old-app/.gitignore b/packages/apps/old-app/.gitignore new file mode 100644 index 0000000..65eb910 --- /dev/null +++ b/packages/apps/old-app/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/packages/apps/old-app/README.md similarity index 100% rename from README.md rename to packages/apps/old-app/README.md diff --git a/jest.config.js b/packages/apps/old-app/jest.config.js similarity index 100% rename from jest.config.js rename to packages/apps/old-app/jest.config.js diff --git a/next.config.js b/packages/apps/old-app/next.config.js similarity index 100% rename from next.config.js rename to packages/apps/old-app/next.config.js diff --git a/package-lock.json b/packages/apps/old-app/package-lock.json similarity index 100% rename from package-lock.json rename to packages/apps/old-app/package-lock.json diff --git a/packages/apps/old-app/package.json b/packages/apps/old-app/package.json new file mode 100644 index 0000000..aee13fa --- /dev/null +++ b/packages/apps/old-app/package.json @@ -0,0 +1,45 @@ +{ + "name": "planity-app", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "test": "jest" + }, + "dependencies": { + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@hookform/resolvers": "^2.9.11", + "@mui/icons-material": "^5.11.0", + "@mui/material": "^5.11.7", + "@mui/x-date-pickers": "^5.0.20", + "@next/font": "13.1.6", + "axios": "^1.3.0", + "dayjs": "^1.11.7", + "eslint": "8.33.0", + "eslint-config-next": "13.1.6", + "next": "13.1.6", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.43.3", + "react-query": "^3.39.3", + "yup": "^1.0.2", + "zod": "^3.20.6", + "zustand": "^4.3.3" + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@types/jest": "^29.4.0", + "@types/node": "18.11.18", + "@types/react": "18.0.27", + "@types/react-dom": "18.0.10", + "jest": "^29.4.2", + "jest-environment-jsdom": "^29.4.2", + "ts-jest": "^29.0.5", + "typescript": "4.9.5" + } +} diff --git a/public/favicon.ico b/packages/apps/old-app/public/favicon.ico similarity index 100% rename from public/favicon.ico rename to packages/apps/old-app/public/favicon.ico diff --git a/public/fonts/zanna.otf b/packages/apps/old-app/public/fonts/zanna.otf similarity index 100% rename from public/fonts/zanna.otf rename to packages/apps/old-app/public/fonts/zanna.otf diff --git a/public/next.svg b/packages/apps/old-app/public/next.svg similarity index 100% rename from public/next.svg rename to packages/apps/old-app/public/next.svg diff --git a/public/thirteen.svg b/packages/apps/old-app/public/thirteen.svg similarity index 100% rename from public/thirteen.svg rename to packages/apps/old-app/public/thirteen.svg diff --git a/public/vercel.svg b/packages/apps/old-app/public/vercel.svg similarity index 100% rename from public/vercel.svg rename to packages/apps/old-app/public/vercel.svg diff --git a/src/components/AppBar.tsx b/packages/apps/old-app/src/components/AppBar.tsx similarity index 100% rename from src/components/AppBar.tsx rename to packages/apps/old-app/src/components/AppBar.tsx diff --git a/src/components/Login.tsx b/packages/apps/old-app/src/components/Login.tsx similarity index 100% rename from src/components/Login.tsx rename to packages/apps/old-app/src/components/Login.tsx diff --git a/src/components/Register.tsx b/packages/apps/old-app/src/components/Register.tsx similarity index 100% rename from src/components/Register.tsx rename to packages/apps/old-app/src/components/Register.tsx diff --git a/src/components/ReservationSlotsSchedule.tsx b/packages/apps/old-app/src/components/ReservationSlotsSchedule.tsx similarity index 100% rename from src/components/ReservationSlotsSchedule.tsx rename to packages/apps/old-app/src/components/ReservationSlotsSchedule.tsx diff --git a/src/components/SearchInput.tsx b/packages/apps/old-app/src/components/SearchInput.tsx similarity index 100% rename from src/components/SearchInput.tsx rename to packages/apps/old-app/src/components/SearchInput.tsx diff --git a/src/components/ServiceCardItem.tsx b/packages/apps/old-app/src/components/ServiceCardItem.tsx similarity index 100% rename from src/components/ServiceCardItem.tsx rename to packages/apps/old-app/src/components/ServiceCardItem.tsx diff --git a/src/components/ShopCardItem.tsx b/packages/apps/old-app/src/components/ShopCardItem.tsx similarity index 100% rename from src/components/ShopCardItem.tsx rename to packages/apps/old-app/src/components/ShopCardItem.tsx diff --git a/src/components/backoffice/HourModal.tsx b/packages/apps/old-app/src/components/backoffice/HourModal.tsx similarity index 100% rename from src/components/backoffice/HourModal.tsx rename to packages/apps/old-app/src/components/backoffice/HourModal.tsx diff --git a/src/components/backoffice/ServiceModal.tsx b/packages/apps/old-app/src/components/backoffice/ServiceModal.tsx similarity index 100% rename from src/components/backoffice/ServiceModal.tsx rename to packages/apps/old-app/src/components/backoffice/ServiceModal.tsx diff --git a/src/components/backoffice/ShopModal.tsx b/packages/apps/old-app/src/components/backoffice/ShopModal.tsx similarity index 100% rename from src/components/backoffice/ShopModal.tsx rename to packages/apps/old-app/src/components/backoffice/ShopModal.tsx diff --git a/src/components/hours/HourItem.tsx b/packages/apps/old-app/src/components/hours/HourItem.tsx similarity index 100% rename from src/components/hours/HourItem.tsx rename to packages/apps/old-app/src/components/hours/HourItem.tsx diff --git a/src/components/hours/ShopHours.tsx b/packages/apps/old-app/src/components/hours/ShopHours.tsx similarity index 100% rename from src/components/hours/ShopHours.tsx rename to packages/apps/old-app/src/components/hours/ShopHours.tsx diff --git a/src/config/axios.ts b/packages/apps/old-app/src/config/axios.ts similarity index 100% rename from src/config/axios.ts rename to packages/apps/old-app/src/config/axios.ts diff --git a/src/config/dayjs.ts b/packages/apps/old-app/src/config/dayjs.ts similarity index 100% rename from src/config/dayjs.ts rename to packages/apps/old-app/src/config/dayjs.ts diff --git a/src/helpers/localstorage.helper.ts b/packages/apps/old-app/src/helpers/localstorage.helper.ts similarity index 100% rename from src/helpers/localstorage.helper.ts rename to packages/apps/old-app/src/helpers/localstorage.helper.ts diff --git a/src/helpers/reservation.helper.ts b/packages/apps/old-app/src/helpers/reservation.helper.ts similarity index 100% rename from src/helpers/reservation.helper.ts rename to packages/apps/old-app/src/helpers/reservation.helper.ts diff --git a/src/helpers/reservation.spec.ts b/packages/apps/old-app/src/helpers/reservation.spec.ts similarity index 100% rename from src/helpers/reservation.spec.ts rename to packages/apps/old-app/src/helpers/reservation.spec.ts diff --git a/src/models/hour.model.ts b/packages/apps/old-app/src/models/hour.model.ts similarity index 100% rename from src/models/hour.model.ts rename to packages/apps/old-app/src/models/hour.model.ts diff --git a/src/models/reservation.model.ts b/packages/apps/old-app/src/models/reservation.model.ts similarity index 100% rename from src/models/reservation.model.ts rename to packages/apps/old-app/src/models/reservation.model.ts diff --git a/src/models/service.model.ts b/packages/apps/old-app/src/models/service.model.ts similarity index 100% rename from src/models/service.model.ts rename to packages/apps/old-app/src/models/service.model.ts diff --git a/src/models/shop.model.ts b/packages/apps/old-app/src/models/shop.model.ts similarity index 100% rename from src/models/shop.model.ts rename to packages/apps/old-app/src/models/shop.model.ts diff --git a/src/models/user.model.ts b/packages/apps/old-app/src/models/user.model.ts similarity index 99% rename from src/models/user.model.ts rename to packages/apps/old-app/src/models/user.model.ts index 4f4839c..6e25df3 100644 --- a/src/models/user.model.ts +++ b/packages/apps/old-app/src/models/user.model.ts @@ -6,3 +6,4 @@ export type User = { role: "admin" | "customer" | "owner"; isEmailVerified: boolean; }; + \ No newline at end of file diff --git a/src/pages/_app.tsx b/packages/apps/old-app/src/pages/_app.tsx similarity index 100% rename from src/pages/_app.tsx rename to packages/apps/old-app/src/pages/_app.tsx diff --git a/src/pages/admin/dashboard/index.tsx b/packages/apps/old-app/src/pages/admin/dashboard/index.tsx similarity index 100% rename from src/pages/admin/dashboard/index.tsx rename to packages/apps/old-app/src/pages/admin/dashboard/index.tsx diff --git a/src/pages/admin/dashboard/shop/[shopId]/index.tsx b/packages/apps/old-app/src/pages/admin/dashboard/shop/[shopId]/index.tsx similarity index 100% rename from src/pages/admin/dashboard/shop/[shopId]/index.tsx rename to packages/apps/old-app/src/pages/admin/dashboard/shop/[shopId]/index.tsx diff --git a/src/pages/index.tsx b/packages/apps/old-app/src/pages/index.tsx similarity index 100% rename from src/pages/index.tsx rename to packages/apps/old-app/src/pages/index.tsx diff --git a/src/pages/search/index.tsx b/packages/apps/old-app/src/pages/search/index.tsx similarity index 100% rename from src/pages/search/index.tsx rename to packages/apps/old-app/src/pages/search/index.tsx diff --git a/src/pages/shops/[id]/index.tsx b/packages/apps/old-app/src/pages/shops/[id]/index.tsx similarity index 100% rename from src/pages/shops/[id]/index.tsx rename to packages/apps/old-app/src/pages/shops/[id]/index.tsx diff --git a/src/pages/shops/[id]/reservation.tsx b/packages/apps/old-app/src/pages/shops/[id]/reservation.tsx similarity index 100% rename from src/pages/shops/[id]/reservation.tsx rename to packages/apps/old-app/src/pages/shops/[id]/reservation.tsx diff --git a/src/pages/users/my-reservations/index.tsx b/packages/apps/old-app/src/pages/users/my-reservations/index.tsx similarity index 100% rename from src/pages/users/my-reservations/index.tsx rename to packages/apps/old-app/src/pages/users/my-reservations/index.tsx diff --git a/src/services/auth.service.ts b/packages/apps/old-app/src/services/auth.service.ts similarity index 100% rename from src/services/auth.service.ts rename to packages/apps/old-app/src/services/auth.service.ts diff --git a/src/services/hour.service.ts b/packages/apps/old-app/src/services/hour.service.ts similarity index 100% rename from src/services/hour.service.ts rename to packages/apps/old-app/src/services/hour.service.ts diff --git a/src/services/reservation.service.ts b/packages/apps/old-app/src/services/reservation.service.ts similarity index 100% rename from src/services/reservation.service.ts rename to packages/apps/old-app/src/services/reservation.service.ts diff --git a/src/services/service.service.ts b/packages/apps/old-app/src/services/service.service.ts similarity index 100% rename from src/services/service.service.ts rename to packages/apps/old-app/src/services/service.service.ts diff --git a/src/services/shop.service.ts b/packages/apps/old-app/src/services/shop.service.ts similarity index 100% rename from src/services/shop.service.ts rename to packages/apps/old-app/src/services/shop.service.ts diff --git a/src/services/users.service.ts b/packages/apps/old-app/src/services/users.service.ts similarity index 100% rename from src/services/users.service.ts rename to packages/apps/old-app/src/services/users.service.ts diff --git a/src/store/reservation.store.ts b/packages/apps/old-app/src/store/reservation.store.ts similarity index 100% rename from src/store/reservation.store.ts rename to packages/apps/old-app/src/store/reservation.store.ts diff --git a/src/store/user.store.ts b/packages/apps/old-app/src/store/user.store.ts similarity index 100% rename from src/store/user.store.ts rename to packages/apps/old-app/src/store/user.store.ts diff --git a/src/styles/globals.css b/packages/apps/old-app/src/styles/globals.css similarity index 100% rename from src/styles/globals.css rename to packages/apps/old-app/src/styles/globals.css diff --git a/src/utils/format.utils.ts b/packages/apps/old-app/src/utils/format.utils.ts similarity index 100% rename from src/utils/format.utils.ts rename to packages/apps/old-app/src/utils/format.utils.ts diff --git a/tsconfig.json b/packages/apps/old-app/tsconfig.json similarity index 86% rename from tsconfig.json rename to packages/apps/old-app/tsconfig.json index 35be691..6f0f437 100644 --- a/tsconfig.json +++ b/packages/apps/old-app/tsconfig.json @@ -20,6 +20,6 @@ "@/*": ["./src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "src/pages/styles.css"], + "include": ["old-app/next-env.d.ts", "**/*.ts", "**/*.tsx", "src/pages/styles.css"], "exclude": ["node_modules"] } diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000..0458dc7 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,12 @@ +{ + "name": "core", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..e69de29 From 5d3be5563d4dc7e9b1af9de0cdee4b7573917419 Mon Sep 17 00:00:00 2001 From: Jessy Date: Tue, 28 Mar 2023 23:23:24 +0200 Subject: [PATCH 02/16] Feat: Create new app --- packages/apps/planigo/.gitignore | 34 ++ packages/apps/planigo/README.md | 34 ++ packages/apps/planigo/next-env.d.ts | 2 + packages/apps/planigo/package-lock.json | 477 +++++++++++++++++++ packages/apps/planigo/package.json | 19 + packages/apps/planigo/pages/_app.tsx | 7 + packages/apps/planigo/pages/api/hello.ts | 10 + packages/apps/planigo/pages/index.tsx | 69 +++ packages/apps/planigo/public/favicon.ico | Bin 0 -> 15086 bytes packages/apps/planigo/public/vercel.svg | 4 + packages/apps/planigo/styles/Home.module.css | 121 +++++ packages/apps/planigo/styles/globals.css | 16 + packages/apps/planigo/tsconfig.json | 19 + 13 files changed, 812 insertions(+) create mode 100644 packages/apps/planigo/.gitignore create mode 100644 packages/apps/planigo/README.md create mode 100644 packages/apps/planigo/next-env.d.ts create mode 100644 packages/apps/planigo/package-lock.json create mode 100644 packages/apps/planigo/package.json create mode 100644 packages/apps/planigo/pages/_app.tsx create mode 100644 packages/apps/planigo/pages/api/hello.ts create mode 100644 packages/apps/planigo/pages/index.tsx create mode 100644 packages/apps/planigo/public/favicon.ico create mode 100644 packages/apps/planigo/public/vercel.svg create mode 100644 packages/apps/planigo/styles/Home.module.css create mode 100644 packages/apps/planigo/styles/globals.css create mode 100644 packages/apps/planigo/tsconfig.json diff --git a/packages/apps/planigo/.gitignore b/packages/apps/planigo/.gitignore new file mode 100644 index 0000000..1437c53 --- /dev/null +++ b/packages/apps/planigo/.gitignore @@ -0,0 +1,34 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel diff --git a/packages/apps/planigo/README.md b/packages/apps/planigo/README.md new file mode 100644 index 0000000..b12f3e3 --- /dev/null +++ b/packages/apps/planigo/README.md @@ -0,0 +1,34 @@ +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). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [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. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +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. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/packages/apps/planigo/next-env.d.ts b/packages/apps/planigo/next-env.d.ts new file mode 100644 index 0000000..7b7aa2c --- /dev/null +++ b/packages/apps/planigo/next-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/packages/apps/planigo/package-lock.json b/packages/apps/planigo/package-lock.json new file mode 100644 index 0000000..1f788a9 --- /dev/null +++ b/packages/apps/planigo/package-lock.json @@ -0,0 +1,477 @@ +{ + "name": "planigo", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "planigo", + "version": "0.1.0", + "dependencies": { + "next": "13.2.4", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@types/react": "18.0.30", + "typescript": "5.0.2" + } + }, + "node_modules/@next/env": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.4.tgz", + "integrity": "sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==" + }, + "node_modules/@next/swc-android-arm-eabi": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz", + "integrity": "sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-android-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz", + "integrity": "sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz", + "integrity": "sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz", + "integrity": "sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-freebsd-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz", + "integrity": "sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm-gnueabihf": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz", + "integrity": "sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz", + "integrity": "sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz", + "integrity": "sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz", + "integrity": "sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz", + "integrity": "sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz", + "integrity": "sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz", + "integrity": "sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz", + "integrity": "sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", + "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.0.30", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.30.tgz", + "integrity": "sha512-AnME2cHDH11Pxt/yYX6r0w448BfTwQOLEhQEjCdwB7QskEI7EKtxhGUsExTQe/MsY3D9D5rMtu62WRocw9A8FA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001472", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001472.tgz", + "integrity": "sha512-xWC/0+hHHQgj3/vrKYY0AAzeIUgr7L9wlELIcAvZdDUHlhL/kNxMdnQLOSOQfP8R51ZzPhmHdyMkI0MMpmxCfg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.2.4.tgz", + "integrity": "sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==", + "dependencies": { + "@next/env": "13.2.4", + "@swc/helpers": "0.4.14", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=14.6.0" + }, + "optionalDependencies": { + "@next/swc-android-arm-eabi": "13.2.4", + "@next/swc-android-arm64": "13.2.4", + "@next/swc-darwin-arm64": "13.2.4", + "@next/swc-darwin-x64": "13.2.4", + "@next/swc-freebsd-x64": "13.2.4", + "@next/swc-linux-arm-gnueabihf": "13.2.4", + "@next/swc-linux-arm64-gnu": "13.2.4", + "@next/swc-linux-arm64-musl": "13.2.4", + "@next/swc-linux-x64-gnu": "13.2.4", + "@next/swc-linux-x64-musl": "13.2.4", + "@next/swc-win32-arm64-msvc": "13.2.4", + "@next/swc-win32-ia32-msvc": "13.2.4", + "@next/swc-win32-x64-msvc": "13.2.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.0", + "fibers": ">= 3.1.0", + "node-sass": "^6.0.0 || ^7.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + } + } +} diff --git a/packages/apps/planigo/package.json b/packages/apps/planigo/package.json new file mode 100644 index 0000000..6ce5309 --- /dev/null +++ b/packages/apps/planigo/package.json @@ -0,0 +1,19 @@ +{ + "name": "planigo", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "next": "13.2.4", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@types/react": "18.0.30", + "typescript": "5.0.2" + } +} diff --git a/packages/apps/planigo/pages/_app.tsx b/packages/apps/planigo/pages/_app.tsx new file mode 100644 index 0000000..945e892 --- /dev/null +++ b/packages/apps/planigo/pages/_app.tsx @@ -0,0 +1,7 @@ +import '../styles/globals.css' +import type { AppProps } from 'next/app' + +function MyApp({ Component, pageProps }: AppProps) { + return +} +export default MyApp diff --git a/packages/apps/planigo/pages/api/hello.ts b/packages/apps/planigo/pages/api/hello.ts new file mode 100644 index 0000000..3d66af9 --- /dev/null +++ b/packages/apps/planigo/pages/api/hello.ts @@ -0,0 +1,10 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import type { NextApiRequest, NextApiResponse } from 'next' + +type Data = { + name: string +} + +export default (req: NextApiRequest, res: NextApiResponse) => { + res.status(200).json({ name: 'John Doe' }) +} diff --git a/packages/apps/planigo/pages/index.tsx b/packages/apps/planigo/pages/index.tsx new file mode 100644 index 0000000..08145bb --- /dev/null +++ b/packages/apps/planigo/pages/index.tsx @@ -0,0 +1,69 @@ +import Head from 'next/head' +import Image from 'next/image' +import styles from '../styles/Home.module.css' + +export default function Home() { + return ( + + ) +} diff --git a/packages/apps/planigo/public/favicon.ico b/packages/apps/planigo/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4965832f2c9b0605eaa189b7c7fb11124d24e48a GIT binary patch literal 15086 zcmeHOOH5Q(7(R0cc?bh2AT>N@1PWL!LLfZKyG5c!MTHoP7_p!sBz0k$?pjS;^lmgJ zU6^i~bWuZYHL)9$wuvEKm~qo~(5=Lvx5&Hv;?X#m}i|`yaGY4gX+&b>tew;gcnRQA1kp zBbm04SRuuE{Hn+&1wk%&g;?wja_Is#1gKoFlI7f`Gt}X*-nsMO30b_J@)EFNhzd1QM zdH&qFb9PVqQOx@clvc#KAu}^GrN`q5oP(8>m4UOcp`k&xwzkTio*p?kI4BPtIwX%B zJN69cGsm=x90<;Wmh-bs>43F}ro$}Of@8)4KHndLiR$nW?*{Rl72JPUqRr3ta6e#A z%DTEbi9N}+xPtd1juj8;(CJt3r9NOgb>KTuK|z7!JB_KsFW3(pBN4oh&M&}Nb$Ee2 z$-arA6a)CdsPj`M#1DS>fqj#KF%0q?w50GN4YbmMZIoF{e1yTR=4ablqXHBB2!`wM z1M1ke9+<);|AI;f=2^F1;G6Wfpql?1d5D4rMr?#f(=hkoH)U`6Gb)#xDLjoKjp)1;Js@2Iy5yk zMXUqj+gyk1i0yLjWS|3sM2-1ECc;MAz<4t0P53%7se$$+5Ex`L5TQO_MMXXi04UDIU+3*7Ez&X|mj9cFYBXqM{M;mw_ zpw>azP*qjMyNSD4hh)XZt$gqf8f?eRSFX8VQ4Y+H3jAtvyTrXr`qHAD6`m;aYmH2zOhJC~_*AuT} zvUxC38|JYN94i(05R)dVKgUQF$}#cxV7xZ4FULqFCNX*Forhgp*yr6;DsIk=ub0Hv zpk2L{9Q&|uI^b<6@i(Y+iSxeO_n**4nRLc`P!3ld5jL=nZRw6;DEJ*1z6Pvg+eW|$lnnjO zjd|8>6l{i~UxI244CGn2kK@cJ|#ecwgSyt&HKA2)z zrOO{op^o*- + + \ No newline at end of file diff --git a/packages/apps/planigo/styles/Home.module.css b/packages/apps/planigo/styles/Home.module.css new file mode 100644 index 0000000..35454bb --- /dev/null +++ b/packages/apps/planigo/styles/Home.module.css @@ -0,0 +1,121 @@ +.container { + min-height: 100vh; + padding: 0 0.5rem; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 100vh; +} + +.main { + padding: 5rem 0; + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.footer { + width: 100%; + height: 100px; + border-top: 1px solid #eaeaea; + display: flex; + justify-content: center; + align-items: center; +} + +.footer a { + display: flex; + justify-content: center; + align-items: center; + flex-grow: 1; +} + +.title a { + color: #0070f3; + text-decoration: none; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; +} + +.title, +.description { + text-align: center; +} + +.description { + line-height: 1.5; + font-size: 1.5rem; +} + +.code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Courier New, monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 800px; + margin-top: 3rem; +} + +.card { + margin: 1rem; + padding: 1.5rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + transition: color 0.15s ease, border-color 0.15s ease; + width: 45%; +} + +.card:hover, +.card:focus, +.card:active { + color: #0070f3; + border-color: #0070f3; +} + +.card h2 { + margin: 0 0 1rem 0; + font-size: 1.5rem; +} + +.card p { + margin: 0; + font-size: 1.25rem; + line-height: 1.5; +} + +.logo { + height: 1em; + margin-left: 0.5rem; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} diff --git a/packages/apps/planigo/styles/globals.css b/packages/apps/planigo/styles/globals.css new file mode 100644 index 0000000..e5e2dcc --- /dev/null +++ b/packages/apps/planigo/styles/globals.css @@ -0,0 +1,16 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} diff --git a/packages/apps/planigo/tsconfig.json b/packages/apps/planigo/tsconfig.json new file mode 100644 index 0000000..4fa631c --- /dev/null +++ b/packages/apps/planigo/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} From 31fc456e022f3154d9fe0f5d65c827c3d949224f Mon Sep 17 00:00:00 2001 From: Jessy Date: Tue, 28 Mar 2023 23:23:24 +0200 Subject: [PATCH 03/16] Feat: CLEAN --- packages/apps/planigo/.gitignore | 34 ++++++ packages/apps/planigo/README.md | 34 ++++++ packages/apps/planigo/next-env.d.ts | 2 + packages/apps/planigo/package.json | 19 +++ packages/apps/planigo/pages/_app.tsx | 7 ++ packages/apps/planigo/pages/index.tsx | 69 +++++++++++ packages/apps/planigo/public/favicon.ico | Bin 0 -> 15086 bytes packages/apps/planigo/public/vercel.svg | 4 + packages/apps/planigo/styles/Home.module.css | 121 +++++++++++++++++++ packages/apps/planigo/styles/globals.css | 16 +++ packages/apps/planigo/tsconfig.json | 19 +++ 11 files changed, 325 insertions(+) create mode 100644 packages/apps/planigo/.gitignore create mode 100644 packages/apps/planigo/README.md create mode 100644 packages/apps/planigo/next-env.d.ts create mode 100644 packages/apps/planigo/package.json create mode 100644 packages/apps/planigo/pages/_app.tsx create mode 100644 packages/apps/planigo/pages/index.tsx create mode 100644 packages/apps/planigo/public/favicon.ico create mode 100644 packages/apps/planigo/public/vercel.svg create mode 100644 packages/apps/planigo/styles/Home.module.css create mode 100644 packages/apps/planigo/styles/globals.css create mode 100644 packages/apps/planigo/tsconfig.json diff --git a/packages/apps/planigo/.gitignore b/packages/apps/planigo/.gitignore new file mode 100644 index 0000000..1437c53 --- /dev/null +++ b/packages/apps/planigo/.gitignore @@ -0,0 +1,34 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel diff --git a/packages/apps/planigo/README.md b/packages/apps/planigo/README.md new file mode 100644 index 0000000..b12f3e3 --- /dev/null +++ b/packages/apps/planigo/README.md @@ -0,0 +1,34 @@ +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). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [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. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +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. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/packages/apps/planigo/next-env.d.ts b/packages/apps/planigo/next-env.d.ts new file mode 100644 index 0000000..7b7aa2c --- /dev/null +++ b/packages/apps/planigo/next-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/packages/apps/planigo/package.json b/packages/apps/planigo/package.json new file mode 100644 index 0000000..6ce5309 --- /dev/null +++ b/packages/apps/planigo/package.json @@ -0,0 +1,19 @@ +{ + "name": "planigo", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "next": "13.2.4", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@types/react": "18.0.30", + "typescript": "5.0.2" + } +} diff --git a/packages/apps/planigo/pages/_app.tsx b/packages/apps/planigo/pages/_app.tsx new file mode 100644 index 0000000..945e892 --- /dev/null +++ b/packages/apps/planigo/pages/_app.tsx @@ -0,0 +1,7 @@ +import '../styles/globals.css' +import type { AppProps } from 'next/app' + +function MyApp({ Component, pageProps }: AppProps) { + return +} +export default MyApp diff --git a/packages/apps/planigo/pages/index.tsx b/packages/apps/planigo/pages/index.tsx new file mode 100644 index 0000000..08145bb --- /dev/null +++ b/packages/apps/planigo/pages/index.tsx @@ -0,0 +1,69 @@ +import Head from 'next/head' +import Image from 'next/image' +import styles from '../styles/Home.module.css' + +export default function Home() { + return ( + + ) +} diff --git a/packages/apps/planigo/public/favicon.ico b/packages/apps/planigo/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4965832f2c9b0605eaa189b7c7fb11124d24e48a GIT binary patch literal 15086 zcmeHOOH5Q(7(R0cc?bh2AT>N@1PWL!LLfZKyG5c!MTHoP7_p!sBz0k$?pjS;^lmgJ zU6^i~bWuZYHL)9$wuvEKm~qo~(5=Lvx5&Hv;?X#m}i|`yaGY4gX+&b>tew;gcnRQA1kp zBbm04SRuuE{Hn+&1wk%&g;?wja_Is#1gKoFlI7f`Gt}X*-nsMO30b_J@)EFNhzd1QM zdH&qFb9PVqQOx@clvc#KAu}^GrN`q5oP(8>m4UOcp`k&xwzkTio*p?kI4BPtIwX%B zJN69cGsm=x90<;Wmh-bs>43F}ro$}Of@8)4KHndLiR$nW?*{Rl72JPUqRr3ta6e#A z%DTEbi9N}+xPtd1juj8;(CJt3r9NOgb>KTuK|z7!JB_KsFW3(pBN4oh&M&}Nb$Ee2 z$-arA6a)CdsPj`M#1DS>fqj#KF%0q?w50GN4YbmMZIoF{e1yTR=4ablqXHBB2!`wM z1M1ke9+<);|AI;f=2^F1;G6Wfpql?1d5D4rMr?#f(=hkoH)U`6Gb)#xDLjoKjp)1;Js@2Iy5yk zMXUqj+gyk1i0yLjWS|3sM2-1ECc;MAz<4t0P53%7se$$+5Ex`L5TQO_MMXXi04UDIU+3*7Ez&X|mj9cFYBXqM{M;mw_ zpw>azP*qjMyNSD4hh)XZt$gqf8f?eRSFX8VQ4Y+H3jAtvyTrXr`qHAD6`m;aYmH2zOhJC~_*AuT} zvUxC38|JYN94i(05R)dVKgUQF$}#cxV7xZ4FULqFCNX*Forhgp*yr6;DsIk=ub0Hv zpk2L{9Q&|uI^b<6@i(Y+iSxeO_n**4nRLc`P!3ld5jL=nZRw6;DEJ*1z6Pvg+eW|$lnnjO zjd|8>6l{i~UxI244CGn2kK@cJ|#ecwgSyt&HKA2)z zrOO{op^o*- + + \ No newline at end of file diff --git a/packages/apps/planigo/styles/Home.module.css b/packages/apps/planigo/styles/Home.module.css new file mode 100644 index 0000000..35454bb --- /dev/null +++ b/packages/apps/planigo/styles/Home.module.css @@ -0,0 +1,121 @@ +.container { + min-height: 100vh; + padding: 0 0.5rem; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 100vh; +} + +.main { + padding: 5rem 0; + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.footer { + width: 100%; + height: 100px; + border-top: 1px solid #eaeaea; + display: flex; + justify-content: center; + align-items: center; +} + +.footer a { + display: flex; + justify-content: center; + align-items: center; + flex-grow: 1; +} + +.title a { + color: #0070f3; + text-decoration: none; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; +} + +.title, +.description { + text-align: center; +} + +.description { + line-height: 1.5; + font-size: 1.5rem; +} + +.code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Courier New, monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 800px; + margin-top: 3rem; +} + +.card { + margin: 1rem; + padding: 1.5rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + transition: color 0.15s ease, border-color 0.15s ease; + width: 45%; +} + +.card:hover, +.card:focus, +.card:active { + color: #0070f3; + border-color: #0070f3; +} + +.card h2 { + margin: 0 0 1rem 0; + font-size: 1.5rem; +} + +.card p { + margin: 0; + font-size: 1.25rem; + line-height: 1.5; +} + +.logo { + height: 1em; + margin-left: 0.5rem; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} diff --git a/packages/apps/planigo/styles/globals.css b/packages/apps/planigo/styles/globals.css new file mode 100644 index 0000000..e5e2dcc --- /dev/null +++ b/packages/apps/planigo/styles/globals.css @@ -0,0 +1,16 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} diff --git a/packages/apps/planigo/tsconfig.json b/packages/apps/planigo/tsconfig.json new file mode 100644 index 0000000..4fa631c --- /dev/null +++ b/packages/apps/planigo/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve" + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} From d082c08ecd6f4035ec8bc20f3c2c40180bc3dba2 Mon Sep 17 00:00:00 2001 From: Jessy Date: Wed, 12 Apr 2023 23:32:29 +0200 Subject: [PATCH 04/16] refacto: Step 1 - Core Domain : Set up and define Bounded context, models --- packages/core/jest.config.ts | 195 ++++++++++++++++++ packages/core/package.json | 22 +- .../core/src/auth/domain/models/User.model.ts | 8 + .../domain/models/Reservation.model.ts | 12 ++ .../src/shopping/domain/models/Shop.model.ts | 14 ++ packages/core/tsconfig.json | 10 + 6 files changed, 256 insertions(+), 5 deletions(-) create mode 100644 packages/core/jest.config.ts create mode 100644 packages/core/src/auth/domain/models/User.model.ts create mode 100644 packages/core/src/reservation/domain/models/Reservation.model.ts create mode 100644 packages/core/src/shopping/domain/models/Shop.model.ts create mode 100644 packages/core/tsconfig.json diff --git a/packages/core/jest.config.ts b/packages/core/jest.config.ts new file mode 100644 index 0000000..ab88780 --- /dev/null +++ b/packages/core/jest.config.ts @@ -0,0 +1,195 @@ +/* + * For a detailed explanation regarding each configuration property and type check, visit: + * https://jestjs.io/docs/configuration + */ + +export default { + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + // bail: 0, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/private/var/folders/hy/gb8hs06n6_77wc6mbf48mnv40000gp/T/jest_dy", + + // Automatically clear mock calls, instances, contexts and results before every test + // clearMocks: false, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: undefined, + + // The directory where Jest should output its coverage files + // coverageDirectory: undefined, + + // An array of regexp pattern strings used to skip coverage collection + // coveragePathIgnorePatterns: [ + // "/node_modules/" + // ], + + // Indicates which provider should be used to instrument code for coverage + coverageProvider: "v8", + + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], + + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: undefined, + + // A path to a custom dependency extractor + // dependencyExtractor: undefined, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // The default configuration for fake timers + // fakeTimers: { + // "enableGlobally": false + // }, + + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: undefined, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: undefined, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "mjs", + // "cjs", + // "jsx", + // "ts", + // "tsx", + // "json", + // "node" + // ], + + // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", + + // A preset that is used as a base for Jest's configuration + preset: "ts-jest", + + // Run tests from one or more projects + // projects: undefined, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state before every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: undefined, + + // Automatically restore mock state and implementation before every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + // rootDir: undefined, + + // A list of paths to directories that Jest should use to search for files in + // roots: [ + // "" + // ], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + // setupFiles: [], + + // A list of paths to modules that run some code to configure or set up the testing framework before each test + // setupFilesAfterEnv: [], + + // The number of seconds after which a test is considered as slow and reported as such in the results. + // slowTestThreshold: 5, + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + // testEnvironment: "jest-environment-node", + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + // testMatch: [ + // "**/__tests__/**/*.[jt]s?(x)", + // "**/?(*.)+(spec|test).[tj]s?(x)" + // ], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + // testPathIgnorePatterns: [ + // "/node_modules/" + // ], + + // The regexp pattern or array of patterns that Jest uses to detect test files + // testRegex: [], + + // This option allows the use of a custom results processor + // testResultsProcessor: undefined, + + // This option allows use of a custom test runner + // testRunner: "jest-circus/runner", + + // A map from regular expressions to paths to transformers + // transform: undefined, + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/", + // "\\.pnp\\.[^\\/]+$" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + // verbose: undefined, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +}; diff --git a/packages/core/package.json b/packages/core/package.json index 0458dc7..77005da 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,12 +1,24 @@ { - "name": "core", + "name": "@planigo/core", + "private": true, "version": "1.0.0", "description": "", - "main": "index.js", + "type": "module", + "main": "./src/index.js", + "types": "./src/index.d.ts", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "jest" }, "keywords": [], "author": "", - "license": "ISC" -} + "license": "ISC", + "devDependencies": { + "@jest/globals": "^29.5.0", + "@types/jest": "^29.5.0", + "@types/node": "^18.15.11", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "typescript": "^5.0.3" + } +} \ No newline at end of file diff --git a/packages/core/src/auth/domain/models/User.model.ts b/packages/core/src/auth/domain/models/User.model.ts new file mode 100644 index 0000000..26d647d --- /dev/null +++ b/packages/core/src/auth/domain/models/User.model.ts @@ -0,0 +1,8 @@ +export type User = { + id: string; + firstname: string; + lastname: string; + email: string; + role: "admin" | "customer" | "owner"; + isEmailVerified: boolean; +}; \ No newline at end of file diff --git a/packages/core/src/reservation/domain/models/Reservation.model.ts b/packages/core/src/reservation/domain/models/Reservation.model.ts new file mode 100644 index 0000000..9cb19fd --- /dev/null +++ b/packages/core/src/reservation/domain/models/Reservation.model.ts @@ -0,0 +1,12 @@ +export type Reservation = { + date: string; + slots: Slot[]; +}; + +export type Slot = { + reservationId: string; + start: string; + end: string; + duration: number; + isAvailable: boolean; +}; \ No newline at end of file diff --git a/packages/core/src/shopping/domain/models/Shop.model.ts b/packages/core/src/shopping/domain/models/Shop.model.ts new file mode 100644 index 0000000..a563b1f --- /dev/null +++ b/packages/core/src/shopping/domain/models/Shop.model.ts @@ -0,0 +1,14 @@ +export type Shop = { + id: string + name: string + description: string + owner_id: string + category_id: string +} + +// VALUE OBJECT +export type ShopCategory = { + id: string + slug: string + name: string +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 0000000..d131c2f --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "module": "ES6", + "outDir": "./lib" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "src/**/*.spec.ts"] +} From ea55ba74fc4940af9cb0c57d6769fa852a2ca9c4 Mon Sep 17 00:00:00 2001 From: Jessy Date: Wed, 12 Apr 2023 23:35:26 +0200 Subject: [PATCH 05/16] refacto: Step 2 - Core Usecase : Define ports, and usecases --- .../src/shopping/domain/ports/ShoppingService.port.ts | 5 +++++ .../src/shopping/usecases/GetShopCategories.spec.ts | 10 ++++++++++ .../src/shopping/usecases/GetShopCategories.usecase.ts | 8 ++++++++ 3 files changed, 23 insertions(+) create mode 100644 packages/core/src/shopping/domain/ports/ShoppingService.port.ts create mode 100644 packages/core/src/shopping/usecases/GetShopCategories.spec.ts create mode 100644 packages/core/src/shopping/usecases/GetShopCategories.usecase.ts diff --git a/packages/core/src/shopping/domain/ports/ShoppingService.port.ts b/packages/core/src/shopping/domain/ports/ShoppingService.port.ts new file mode 100644 index 0000000..0f90f1f --- /dev/null +++ b/packages/core/src/shopping/domain/ports/ShoppingService.port.ts @@ -0,0 +1,5 @@ +import { ShopCategory } from "../models/Shop.model"; + +export interface ShoppingServicePort { + getShopCategories: () => Promise +} \ No newline at end of file diff --git a/packages/core/src/shopping/usecases/GetShopCategories.spec.ts b/packages/core/src/shopping/usecases/GetShopCategories.spec.ts new file mode 100644 index 0000000..368d7ac --- /dev/null +++ b/packages/core/src/shopping/usecases/GetShopCategories.spec.ts @@ -0,0 +1,10 @@ +import { describe, expect, it } from '@jest/globals'; +import { GetShopCategories } from "./GetShopCategories.usecase" + +// describe("Get Shop categories", () => { +// it("if there is no shop category, it should return an empty array", () => { +// const result = [] +// // const shopCategories = GetShopCategories.execute() +// expect(shopCategories).toBe(result) +// }) +// }) \ No newline at end of file diff --git a/packages/core/src/shopping/usecases/GetShopCategories.usecase.ts b/packages/core/src/shopping/usecases/GetShopCategories.usecase.ts new file mode 100644 index 0000000..c42fd60 --- /dev/null +++ b/packages/core/src/shopping/usecases/GetShopCategories.usecase.ts @@ -0,0 +1,8 @@ +import { ShopCategory } from "../domain/models/Shop.model"; +import { ShoppingServicePort } from "../domain/ports/ShoppingService.port"; + +export class GetShopCategories { + static async execute(shoppingService: ShoppingServicePort): Promise { + return shoppingService.getShopCategories() + } +} \ No newline at end of file From 7e3f49396be3a0a5ff30c03e0dd17421769cc6fb Mon Sep 17 00:00:00 2001 From: Jessy Date: Wed, 12 Apr 2023 23:37:47 +0200 Subject: [PATCH 06/16] refacto: Step 3 - Adapters : Set up concrete implementation of ports --- packages/adapters/package.json | 26 + .../adapters/src/ShoppingService.adapter.ts | 13 + packages/adapters/src/ShoppingService.spec.ts | 0 packages/adapters/src/config/axios.ts | 9 + packages/adapters/tsconfig.json | 11 + pnpm-lock.yaml | 3401 +++++++++++++++++ pnpm-workspace.yaml | 4 + 7 files changed, 3464 insertions(+) create mode 100644 packages/adapters/package.json create mode 100644 packages/adapters/src/ShoppingService.adapter.ts create mode 100644 packages/adapters/src/ShoppingService.spec.ts create mode 100644 packages/adapters/src/config/axios.ts create mode 100644 packages/adapters/tsconfig.json create mode 100644 pnpm-lock.yaml diff --git a/packages/adapters/package.json b/packages/adapters/package.json new file mode 100644 index 0000000..5ebae20 --- /dev/null +++ b/packages/adapters/package.json @@ -0,0 +1,26 @@ +{ + "name": "@planigo/adapters", + "private": true, + "version": "1.0.0", + "description": "", + "type": "module", + "main": "./src/index.js", + "types": "./src/index.d.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@jest/globals": "^29.5.0", + "@types/jest": "^29.5.0", + "ts-jest": "^29.0.5", + "jest": "^29.5.0", + "typescript": "^5.0.2" + }, + "dependencies": { + "axios": "^1.3.5", + "@planigo/core": "workspace:^1.0.0" + } +} \ No newline at end of file diff --git a/packages/adapters/src/ShoppingService.adapter.ts b/packages/adapters/src/ShoppingService.adapter.ts new file mode 100644 index 0000000..2d1ecf8 --- /dev/null +++ b/packages/adapters/src/ShoppingService.adapter.ts @@ -0,0 +1,13 @@ +import { axiosInstance } from "./config/axios"; +import { ShopCategory } from "@planigo/core/src/shopping/domain/models/Shop.model"; +import { ShoppingServicePort } from "@planigo/core/src/shopping/domain/ports/ShoppingService.port"; + +export function useShoppingService(): ShoppingServicePort { + const getShopCategories = async (): Promise => { + const response = await axiosInstance.get(`/categories`) + return response.data + } + return { + getShopCategories + } +} \ No newline at end of file diff --git a/packages/adapters/src/ShoppingService.spec.ts b/packages/adapters/src/ShoppingService.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/adapters/src/config/axios.ts b/packages/adapters/src/config/axios.ts new file mode 100644 index 0000000..b4c3e1f --- /dev/null +++ b/packages/adapters/src/config/axios.ts @@ -0,0 +1,9 @@ +import axios from "axios"; + +export const axiosInstance = axios.create({ + baseURL: "http://127.0.0.1:8080/api", + timeout: 5000, + // headers: { + // Authorization: getToken() ? `Bearer ${getToken()}` : "", + // }, +}); diff --git a/packages/adapters/tsconfig.json b/packages/adapters/tsconfig.json new file mode 100644 index 0000000..1b6447a --- /dev/null +++ b/packages/adapters/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "allowImportingTsExtensions": true, + "compilerOptions": { + "baseUrl": ".", + "module": "ES6", + "outDir": "./lib" + }, + "include": [], + "exclude": ["src/**/*", "node_modules", "src/**/*.spec.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..e17f955 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3401 @@ +lockfileVersion: 5.4 + +importers: + + .: + specifiers: {} + + packages/adapters: + specifiers: + '@jest/globals': ^29.5.0 + '@planigo/core': workspace:^1.0.0 + '@types/jest': ^29.5.0 + axios: ^1.3.5 + jest: ^29.5.0 + ts-jest: ^29.0.5 + typescript: ^5.0.2 + dependencies: + '@planigo/core': link:../core + axios: 1.3.5 + devDependencies: + '@jest/globals': 29.5.0 + '@types/jest': 29.5.0 + jest: 29.5.0 + ts-jest: 29.1.0_ntm4xngu7em45lqojwsg6ufzc4 + typescript: 5.0.3 + + packages/apps/planigo: + specifiers: + '@emotion/react': ^11.10.6 + '@emotion/styled': ^11.10.6 + '@mui/material': ^5.11.16 + '@planigo/adapters': workspace:^1.0.0 + '@planigo/core': workspace:^1.0.0 + '@types/react': 18.0.30 + next: 13.2.4 + react: 18.2.0 + react-dom: 18.2.0 + react-query: ^3.39.3 + typescript: 5.0.2 + dependencies: + '@emotion/react': 11.10.6_2thlp7g7odiqm7dwhn3rlhxaa4 + '@emotion/styled': 11.10.6_cfcdhdr57xmqdzhb6aq4iia5f4 + '@mui/material': 5.11.16_quat5witkhq3gbgscvy3yo7r7a + '@planigo/adapters': link:../../adapters + '@planigo/core': link:../../core + next: 13.2.4_biqbaboplfbrettd7655fr4n2y + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-query: 3.39.3_biqbaboplfbrettd7655fr4n2y + devDependencies: + '@types/react': 18.0.30 + typescript: 5.0.2 + + packages/core: + specifiers: + '@jest/globals': ^29.5.0 + '@types/jest': ^29.5.0 + '@types/node': ^18.15.11 + jest: ^29.5.0 + ts-jest: ^29.1.0 + ts-node: ^10.9.1 + typescript: ^5.0.3 + devDependencies: + '@jest/globals': 29.5.0 + '@types/jest': 29.5.0 + '@types/node': 18.15.11 + jest: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + ts-jest: 29.1.0_ntm4xngu7em45lqojwsg6ufzc4 + ts-node: 10.9.1_pj3xut33gta66wns5w7rs6cilm + typescript: 5.0.3 + +packages: + + /@ampproject/remapping/2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@babel/code-frame/7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + + /@babel/compat-data/7.21.4: + resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.21.4: + resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/helper-compilation-targets': 7.21.4_@babel+core@7.21.4 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.4 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.21.4: + resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets/7.21.4_@babel+core@7.21.4: + resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.4 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name/7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.4 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + dev: true + + /@babel/helper-module-imports/7.21.4: + resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + + /@babel/helper-module-transforms/7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.21.4 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils/7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option/7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser/7.21.4: + resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.4 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.4: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.4: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.4: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.4: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.4: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-jsx/7.21.4_@babel+core@7.21.4: + resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.4: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.4: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.4: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.4: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.4: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.4: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.4: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-typescript/7.21.4_@babel+core@7.21.4: + resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/runtime/7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: false + + /@babel/template/7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 + dev: true + + /@babel/traverse/7.21.4: + resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.21.4: + resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + 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.10.6: + resolution: {integrity: sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==} + dependencies: + '@babel/helper-module-imports': 7.21.4 + '@babel/runtime': 7.21.0 + '@emotion/hash': 0.9.0 + '@emotion/memoize': 0.8.0 + '@emotion/serialize': 1.1.1 + 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.1.3 + dev: false + + /@emotion/cache/11.10.7: + resolution: {integrity: sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ==} + dependencies: + '@emotion/memoize': 0.8.0 + '@emotion/sheet': 1.2.1 + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + stylis: 4.1.3 + dev: false + + /@emotion/hash/0.9.0: + resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} + dev: false + + /@emotion/is-prop-valid/1.2.0: + resolution: {integrity: sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==} + dependencies: + '@emotion/memoize': 0.8.0 + dev: false + + /@emotion/memoize/0.8.0: + resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} + dev: false + + /@emotion/react/11.10.6_2thlp7g7odiqm7dwhn3rlhxaa4: + resolution: {integrity: sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/babel-plugin': 11.10.6 + '@emotion/cache': 11.10.7 + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0 + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + '@types/react': 18.0.30 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize/1.1.1: + resolution: {integrity: sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==} + dependencies: + '@emotion/hash': 0.9.0 + '@emotion/memoize': 0.8.0 + '@emotion/unitless': 0.8.0 + '@emotion/utils': 1.2.0 + csstype: 3.1.2 + dev: false + + /@emotion/sheet/1.2.1: + resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==} + dev: false + + /@emotion/styled/11.10.6_cfcdhdr57xmqdzhb6aq4iia5f4: + resolution: {integrity: sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/babel-plugin': 11.10.6 + '@emotion/is-prop-valid': 1.2.0 + '@emotion/react': 11.10.6_2thlp7g7odiqm7dwhn3rlhxaa4 + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0 + '@emotion/utils': 1.2.0 + '@types/react': 18.0.30 + react: 18.2.0 + dev: false + + /@emotion/unitless/0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks/1.0.0_react@18.2.0: + resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils/1.2.0: + resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==} + dev: false + + /@emotion/weak-memoize/0.3.0: + resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} + dev: false + + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console/29.5.0: + resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + chalk: 4.1.2 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + slash: 3.0.0 + dev: true + + /@jest/core/29.5.0: + resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.5.0 + '@jest/reporters': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.5.0_@types+node@18.15.11 + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-resolve-dependencies: 29.5.0 + jest-runner: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + jest-watcher: 29.5.0 + micromatch: 4.0.5 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/core/29.5.0_ts-node@10.9.1: + resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.5.0 + '@jest/reporters': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.5.0 + jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-resolve-dependencies: 29.5.0 + jest-runner: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + jest-watcher: 29.5.0 + micromatch: 4.0.5 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/environment/29.5.0: + resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + jest-mock: 29.5.0 + dev: true + + /@jest/expect-utils/29.5.0: + resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + dev: true + + /@jest/expect/29.5.0: + resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.5.0 + jest-snapshot: 29.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers/29.5.0: + resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@sinonjs/fake-timers': 10.0.2 + '@types/node': 18.15.11 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 + jest-util: 29.5.0 + dev: true + + /@jest/globals/29.5.0: + resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/types': 29.5.0 + jest-mock: 29.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters/29.5.0: + resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 18.15.11 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + jest-worker: 29.5.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas/29.4.3: + resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.25.24 + dev: true + + /@jest/source-map/29.4.3: + resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result/29.5.0: + resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.5.0 + '@jest/types': 29.5.0 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + + /@jest/test-sequencer/29.5.0: + resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.5.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + slash: 3.0.0 + dev: true + + /@jest/transform/29.5.0: + resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.21.4 + '@jest/types': 29.5.0 + '@jridgewell/trace-mapping': 0.3.18 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + jest-regex-util: 29.4.3 + jest-util: 29.5.0 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types/29.5.0: + resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.15.11 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + 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.18 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@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/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec/1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping/0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@mui/base/5.0.0-alpha.124_4qaawyptjkcgzqorucvhm3koke: + resolution: {integrity: sha512-I6M+FrjRCybQCr8I8JTu6L2MkUobSQFgNIpOJyDNKL5zq/73LvZIQXvsKumAzthVGvI1PYaarM9vGDrDYbumKA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/is-prop-valid': 1.2.0 + '@mui/types': 7.2.3_@types+react@18.0.30 + '@mui/utils': 5.11.13_react@18.2.0 + '@popperjs/core': 2.11.7 + '@types/react': 18.0.30 + clsx: 1.2.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-is: 18.2.0 + dev: false + + /@mui/core-downloads-tracker/5.11.16: + resolution: {integrity: sha512-GxRfZ/HquQ/1nUc9qQVGReP6oOMS8/3QjPJ+23a7TMrxl2wjlmXrMNn7tRa30vZcGcDgEG+J0aseefUN0AoawQ==} + dev: false + + /@mui/material/5.11.16_quat5witkhq3gbgscvy3yo7r7a: + resolution: {integrity: sha512-++glQqbZ3rMzOWB77yOvqRG+k8+scYTUKVWZpWff+GWsf6L10g9L2wgRhhAS8bDLuxCbXZlPNbSZowXDDw6z6Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/react': 11.10.6_2thlp7g7odiqm7dwhn3rlhxaa4 + '@emotion/styled': 11.10.6_cfcdhdr57xmqdzhb6aq4iia5f4 + '@mui/base': 5.0.0-alpha.124_4qaawyptjkcgzqorucvhm3koke + '@mui/core-downloads-tracker': 5.11.16 + '@mui/system': 5.11.16_42hzwjss4leimendqmlox2jjey + '@mui/types': 7.2.3_@types+react@18.0.30 + '@mui/utils': 5.11.13_react@18.2.0 + '@types/react': 18.0.30 + '@types/react-transition-group': 4.4.5 + clsx: 1.2.1 + csstype: 3.1.2 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-is: 18.2.0 + react-transition-group: 4.4.5_biqbaboplfbrettd7655fr4n2y + dev: false + + /@mui/private-theming/5.11.13_2thlp7g7odiqm7dwhn3rlhxaa4: + resolution: {integrity: sha512-PJnYNKzW5LIx3R+Zsp6WZVPs6w5sEKJ7mgLNnUXuYB1zo5aX71FVLtV7geyPXRcaN2tsoRNK7h444ED0t7cIjA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@mui/utils': 5.11.13_react@18.2.0 + '@types/react': 18.0.30 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/styled-engine/5.11.16_xqp3pgpqjlfxxa3zxu4zoc4fba: + resolution: {integrity: sha512-8dJRR/LqtGGaZN21p1vU9euwrKERlgtQIWyuzBKZ8/cuSlW5rIzlp46liP+Uh0+7d9NcHU0H4hBMoPt3ax64PA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/cache': 11.10.7 + '@emotion/react': 11.10.6_2thlp7g7odiqm7dwhn3rlhxaa4 + '@emotion/styled': 11.10.6_cfcdhdr57xmqdzhb6aq4iia5f4 + csstype: 3.1.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/system/5.11.16_42hzwjss4leimendqmlox2jjey: + resolution: {integrity: sha512-JY7CNm7ik2Gr4kQpz1+C9N/f4ET3QjVBo/iaHcmlSOgjdxnOzFbv+vCdb1DMzBGew+UbqckppZpZwbgbrBE2Rw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/react': 11.10.6_2thlp7g7odiqm7dwhn3rlhxaa4 + '@emotion/styled': 11.10.6_cfcdhdr57xmqdzhb6aq4iia5f4 + '@mui/private-theming': 5.11.13_2thlp7g7odiqm7dwhn3rlhxaa4 + '@mui/styled-engine': 5.11.16_xqp3pgpqjlfxxa3zxu4zoc4fba + '@mui/types': 7.2.3_@types+react@18.0.30 + '@mui/utils': 5.11.13_react@18.2.0 + '@types/react': 18.0.30 + clsx: 1.2.1 + csstype: 3.1.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/types/7.2.3_@types+react@18.0.30: + resolution: {integrity: sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==} + peerDependencies: + '@types/react': '*' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.30 + dev: false + + /@mui/utils/5.11.13_react@18.2.0: + resolution: {integrity: sha512-5ltA58MM9euOuUcnvwFJqpLdEugc9XFsRR8Gt4zZNb31XzMfSKJPR4eumulyhsOTK1rWf7K4D63NKFPfX0AxqA==} + engines: {node: '>=12.0.0'} + peerDependencies: + react: ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@types/prop-types': 15.7.5 + '@types/react-is': 17.0.3 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 18.2.0 + dev: false + + /@next/env/13.2.4: + resolution: {integrity: sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==} + dev: false + + /@next/swc-android-arm-eabi/13.2.4: + resolution: {integrity: sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@next/swc-android-arm64/13.2.4: + resolution: {integrity: sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-arm64/13.2.4: + resolution: {integrity: sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64/13.2.4: + resolution: {integrity: sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-freebsd-x64/13.2.4: + resolution: {integrity: sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm-gnueabihf/13.2.4: + resolution: {integrity: sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu/13.2.4: + resolution: {integrity: sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl/13.2.4: + resolution: {integrity: sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu/13.2.4: + resolution: {integrity: sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl/13.2.4: + resolution: {integrity: sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc/13.2.4: + resolution: {integrity: sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc/13.2.4: + resolution: {integrity: sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc/13.2.4: + resolution: {integrity: sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@popperjs/core/2.11.7: + resolution: {integrity: sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==} + dev: false + + /@sinclair/typebox/0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: true + + /@sinonjs/commons/2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers/10.0.2: + resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} + dependencies: + '@sinonjs/commons': 2.0.0 + dev: true + + /@swc/helpers/0.4.14: + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + dependencies: + tslib: 2.5.0 + dev: false + + /@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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/babel__core/7.20.0: + resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} + dependencies: + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.18.3 + dev: true + + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.21.4 + dev: true + + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 + dev: true + + /@types/babel__traverse/7.18.3: + resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} + dependencies: + '@babel/types': 7.21.4 + dev: true + + /@types/graceful-fs/4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 18.15.11 + dev: true + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/jest/29.5.0: + resolution: {integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==} + dependencies: + expect: 29.5.0 + pretty-format: 29.5.0 + dev: true + + /@types/node/18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + dev: true + + /@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false + + /@types/prettier/2.7.2: + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + dev: true + + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + + /@types/react-is/17.0.3: + resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==} + dependencies: + '@types/react': 18.0.30 + dev: false + + /@types/react-transition-group/4.4.5: + resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==} + dependencies: + '@types/react': 18.0.30 + dev: false + + /@types/react/18.0.30: + resolution: {integrity: sha512-AnME2cHDH11Pxt/yYX6r0w448BfTwQOLEhQEjCdwB7QskEI7EKtxhGUsExTQe/MsY3D9D5rMtu62WRocw9A8FA==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + + /@types/scheduler/0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs/17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + 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==} + engines: {node: '>=8'} + 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/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /axios/1.3.5: + resolution: {integrity: sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /babel-jest/29.5.0_@babel+core@7.21.4: + resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.21.4 + '@jest/transform': 29.5.0 + '@types/babel__core': 7.20.0 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.5.0_@babel+core@7.21.4 + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.20.2 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist/29.5.0: + resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.4 + '@types/babel__core': 7.20.0 + '@types/babel__traverse': 7.18.3 + dev: true + + /babel-plugin-macros/3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.21.0 + cosmiconfig: 7.1.0 + resolve: 1.22.2 + dev: false + + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.4: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.4 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.4 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.4 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.4 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.4 + dev: true + + /babel-preset-jest/29.5.0_@babel+core@7.21.4: + resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /big-integer/1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: false + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /broadcast-channel/3.7.0: + resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} + dependencies: + '@babel/runtime': 7.21.0 + detect-node: 2.1.0 + js-sha3: 0.8.0 + microseconds: 0.2.0 + nano-time: 1.0.0 + oblivious-set: 1.0.0 + rimraf: 3.0.2 + unload: 2.2.0 + dev: false + + /browserslist/4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001474 + electron-to-chromium: 1.4.355 + node-releases: 2.0.10 + update-browserslist-db: 1.0.10_browserslist@4.21.5 + dev: true + + /bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite/1.0.30001474: + resolution: {integrity: sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==} + + /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/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /ci-info/3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + + /client-only/0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /cliui/8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clsx/1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /collect-v8-coverage/1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: true + + /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 + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + /convert-source-map/2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cosmiconfig/7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + 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==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csstype/3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /dedent/0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deepmerge/4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /detect-node/2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: false + + /diff-sequences/29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dom-helpers/5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.21.0 + csstype: 3.1.2 + dev: false + + /electron-to-chromium/1.4.355: + resolution: {integrity: sha512-056hxzEE4l667YeOccgjhRr5fTiwZ6EIJ4FpzGps4k3YcS8iAhiaBYUBrv5E2LDQJsussscv9EEUwAYKnv+ZKg==} + dev: true + + /emittery/0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /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/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: false + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + 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 + + /exit/0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect/29.5.0: + resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.5.0 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fb-watchman/2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + 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 + + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + 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 + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + 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'} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hoist-non-react-statics/3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: false + + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument/5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.21.4 + '@babel/parser': 7.21.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports/3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jest-changed-files/29.5.0: + resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + + /jest-circus/29.5.0: + resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.5.0 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + p-limit: 3.1.0 + pretty-format: 29.5.0 + pure-rand: 6.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli/29.5.0: + resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + prompts: 2.4.2 + yargs: 17.7.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-cli/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + jest-util: 29.5.0 + jest-validate: 29.5.0 + prompts: 2.4.2 + yargs: 17.7.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-config/29.5.0: + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.4 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + babel-jest: 29.5.0_@babel+core@7.21.4 + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config/29.5.0_@types+node@18.15.11: + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.4 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + babel-jest: 29.5.0_@babel+core@7.21.4 + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.4 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + babel-jest: 29.5.0_@babel+core@7.21.4 + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1_pj3xut33gta66wns5w7rs6cilm + transitivePeerDependencies: + - supports-color + dev: true + + /jest-diff/29.5.0: + resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + + /jest-docblock/29.4.3: + resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each/29.5.0: + resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + chalk: 4.1.2 + jest-get-type: 29.4.3 + jest-util: 29.5.0 + pretty-format: 29.5.0 + dev: true + + /jest-environment-node/29.5.0: + resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + jest-mock: 29.5.0 + jest-util: 29.5.0 + dev: true + + /jest-get-type/29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map/29.5.0: + resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/graceful-fs': 4.1.6 + '@types/node': 18.15.11 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.4.3 + jest-util: 29.5.0 + jest-worker: 29.5.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-leak-detector/29.5.0: + resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + + /jest-matcher-utils/29.5.0: + resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.5.0 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + + /jest-message-util/29.5.0: + resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.21.4 + '@jest/types': 29.5.0 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.5.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock/29.5.0: + resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + jest-util: 29.5.0 + dev: true + + /jest-pnp-resolver/1.2.3_jest-resolve@29.5.0: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.5.0 + dev: true + + /jest-regex-util/29.4.3: + resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies/29.5.0: + resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.4.3 + jest-snapshot: 29.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve/29.5.0: + resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + jest-pnp-resolver: 1.2.3_jest-resolve@29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + resolve: 1.22.2 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner/29.5.0: + resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.5.0 + '@jest/environment': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.4.3 + jest-environment-node: 29.5.0 + jest-haste-map: 29.5.0 + jest-leak-detector: 29.5.0 + jest-message-util: 29.5.0 + jest-resolve: 29.5.0 + jest-runtime: 29.5.0 + jest-util: 29.5.0 + jest-watcher: 29.5.0 + jest-worker: 29.5.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime/29.5.0: + resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/globals': 29.5.0 + '@jest/source-map': 29.4.3 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot/29.5.0: + resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/plugin-syntax-jsx': 7.21.4_@babel+core@7.21.4 + '@babel/plugin-syntax-typescript': 7.21.4_@babel+core@7.21.4 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 + '@jest/expect-utils': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/babel__traverse': 7.18.3 + '@types/prettier': 2.7.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.4 + chalk: 4.1.2 + expect: 29.5.0 + graceful-fs: 4.2.11 + jest-diff: 29.5.0 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + natural-compare: 1.4.0 + pretty-format: 29.5.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util/29.5.0: + resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate/29.5.0: + resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.4.3 + leven: 3.1.0 + pretty-format: 29.5.0 + dev: true + + /jest-watcher/29.5.0: + resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.11 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.5.0 + string-length: 4.0.2 + dev: true + + /jest-worker/29.5.0: + resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 18.15.11 + jest-util: 29.5.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest/29.5.0: + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0 + '@jest/types': 29.5.0 + import-local: 3.1.0 + jest-cli: 29.5.0 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest/29.5.0_rrli7kzx2akox3oq6aahu3rvje: + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/types': 29.5.0 + import-local: 3.1.0 + jest-cli: 29.5.0_rrli7kzx2akox3oq6aahu3rvje + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /js-sha3/0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: false + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /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 + + /lodash.memoize/4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /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 + dev: true + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /match-sorter/6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + dependencies: + '@babel/runtime': 7.21.0 + remove-accents: 0.4.2 + dev: false + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /microseconds/0.2.0: + resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} + dev: false + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nano-time/1.0.0: + resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} + dependencies: + big-integer: 1.6.51 + dev: false + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /next/13.2.4_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==} + engines: {node: '>=14.6.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.4.0 + fibers: '>= 3.1.0' + node-sass: ^6.0.0 || ^7.0.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.2.4 + '@swc/helpers': 0.4.14 + caniuse-lite: 1.0.30001474 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + styled-jsx: 5.1.1_react@18.2.0 + optionalDependencies: + '@next/swc-android-arm-eabi': 13.2.4 + '@next/swc-android-arm64': 13.2.4 + '@next/swc-darwin-arm64': 13.2.4 + '@next/swc-darwin-x64': 13.2.4 + '@next/swc-freebsd-x64': 13.2.4 + '@next/swc-linux-arm-gnueabihf': 13.2.4 + '@next/swc-linux-arm64-gnu': 13.2.4 + '@next/swc-linux-arm64-musl': 13.2.4 + '@next/swc-linux-x64-gnu': 13.2.4 + '@next/swc-linux-x64-musl': 13.2.4 + '@next/swc-win32-arm64-msvc': 13.2.4 + '@next/swc-win32-ia32-msvc': 13.2.4 + '@next/swc-win32-x64-msvc': 13.2.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /node-int64/0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases/2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + 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 + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /oblivious-set/1.0.0: + resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} + dev: false + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + 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 + + /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-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: false + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.21.4 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /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==} + engines: {node: '>=0.10.0'} + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /postcss/8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /pretty-format/29.5.0: + resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types/15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /pure-rand/6.0.1: + resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} + dev: true + + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-is/16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /react-is/18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + /react-query/3.39.3_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.21.0 + broadcast-channel: 3.7.0 + match-sorter: 6.3.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /react-transition-group/4.4.5_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.21.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /remove-accents/0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + dev: false + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: false + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve.exports/2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + + /resolve/1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + 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 + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + 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==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-support/0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + 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 + + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + 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 + dev: false + + /stylis/4.1.3: + resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} + dev: false + + /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-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + 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 + + /ts-jest/29.1.0_ntm4xngu7em45lqojwsg6ufzc4: + resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0 + jest-util: 29.5.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.8 + typescript: 5.0.3 + yargs-parser: 21.1.1 + dev: true + + /ts-node/10.9.1_pj3xut33gta66wns5w7rs6cilm: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.15.11 + acorn: 8.8.2 + 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.0.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: false + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /typescript/5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /typescript/5.0.3: + resolution: {integrity: sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /unload/2.2.0: + resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} + dependencies: + '@babel/runtime': 7.21.0 + detect-node: 2.1.0 + dev: false + + /update-browserslist-db/1.0.10_browserslist@4.21.5: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-to-istanbul/9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic/4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs/17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /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 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e69de29..77ac114 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +packages: + - "packages/core/**" + - "packages/adapters/**" + - "packages/apps/planigo/**" From 95e6f93347c0151755c93244820f3467daba239f Mon Sep 17 00:00:00 2001 From: Jessy Date: Wed, 12 Apr 2023 23:40:43 +0200 Subject: [PATCH 07/16] refacto: Step 4 - Infra Apps : consumation of internal layers (Adapter and Core) in framewoek --- packages/apps/planigo/next-env.d.ts | 5 +- packages/apps/planigo/next.config.js | 6 + packages/apps/planigo/package.json | 8 +- packages/apps/planigo/pages/_app.tsx | 8 +- packages/apps/planigo/pages/index.tsx | 217 +++++++++++++----- .../apps/planigo/services/Shopping.service.ts | 22 ++ packages/apps/planigo/tsconfig.json | 5 +- 7 files changed, 207 insertions(+), 64 deletions(-) create mode 100644 packages/apps/planigo/next.config.js create mode 100644 packages/apps/planigo/services/Shopping.service.ts diff --git a/packages/apps/planigo/next-env.d.ts b/packages/apps/planigo/next-env.d.ts index 7b7aa2c..4f11a03 100644 --- a/packages/apps/planigo/next-env.d.ts +++ b/packages/apps/planigo/next-env.d.ts @@ -1,2 +1,5 @@ /// -/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/packages/apps/planigo/next.config.js b/packages/apps/planigo/next.config.js new file mode 100644 index 0000000..5786109 --- /dev/null +++ b/packages/apps/planigo/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +} + +module.exports = nextConfig diff --git a/packages/apps/planigo/package.json b/packages/apps/planigo/package.json index 6ce5309..a1b2edc 100644 --- a/packages/apps/planigo/package.json +++ b/packages/apps/planigo/package.json @@ -8,9 +8,15 @@ "start": "next start" }, "dependencies": { + "@emotion/react": "^11.10.6", + "@emotion/styled": "^11.10.6", + "@mui/material": "^5.11.16", "next": "13.2.4", "react": "18.2.0", - "react-dom": "18.2.0" + "react-dom": "18.2.0", + "react-query": "^3.39.3", + "@planigo/core": "workspace:^1.0.0", + "@planigo/adapters": "workspace:^1.0.0" }, "devDependencies": { "@types/react": "18.0.30", diff --git a/packages/apps/planigo/pages/_app.tsx b/packages/apps/planigo/pages/_app.tsx index 945e892..0001a6b 100644 --- a/packages/apps/planigo/pages/_app.tsx +++ b/packages/apps/planigo/pages/_app.tsx @@ -1,7 +1,13 @@ import '../styles/globals.css' import type { AppProps } from 'next/app' +import { QueryClient, QueryClientProvider } from "react-query"; + + +const queryClient = new QueryClient(); function MyApp({ Component, pageProps }: AppProps) { - return + return + + } export default MyApp diff --git a/packages/apps/planigo/pages/index.tsx b/packages/apps/planigo/pages/index.tsx index 08145bb..edc4a8b 100644 --- a/packages/apps/planigo/pages/index.tsx +++ b/packages/apps/planigo/pages/index.tsx @@ -1,69 +1,168 @@ -import Head from 'next/head' -import Image from 'next/image' -import styles from '../styles/Home.module.css' +import { useState } from "react"; +import Link from "next/link"; +import Head from "next/head"; +import { + Button, + Autocomplete, + TextField, + Box, + Typography, +} from "@mui/material"; +import { formLabelClasses } from "@mui/material"; +import { shoppingService } from "../services/Shopping.service"; export default function Home() { - return ( -
- - Create Next App - - - + const [shopCategory, setshopCategory] = useState("barber"); -
-

- Welcome to Next.js! -

+ const { isLoading, data: categories = [] } = shoppingService().useGetShopsCategoriesQuery(); -

- Get started by editing{' '} - pages/index.js -

+ const categoriesOptions = categories.map((category) => ({ + label: category.name, + value: category.slug, + })); - -
- - -
- ) + option.label} + isOptionEqualToValue={(option, newValue) => { + return option.value === newValue.value; + }} + sx={{ + width: 300, + "& .MuiOutlinedInput-root .MuiOutlinedInput-notchedOutline": { + border: "none", + }, + }} + renderInput={(params) => ( + + )} + onChange={(event, value) => onCategoryChange(value?.value || "")} + /> + + + + + + + + + + ); } + diff --git a/packages/apps/planigo/services/Shopping.service.ts b/packages/apps/planigo/services/Shopping.service.ts new file mode 100644 index 0000000..1b3b56c --- /dev/null +++ b/packages/apps/planigo/services/Shopping.service.ts @@ -0,0 +1,22 @@ +import { useQuery } from "react-query"; +import type { ShoppingServicePort } from "@planigo/core/lib/shopping/domain/ports/ShoppingService.port"; +import { GetShopCategories } from "@planigo/core/lib/shopping/usecases/GetShopCategories.usecase" +import { useShoppingService } from '@planigo/adapters/lib/ShoppingService.adapter' + +export const shoppingService = () => { + const shoppingAdapter: ShoppingServicePort = useShoppingService() + + const useGetShopsCategoriesQuery = () => { + return useQuery({ + queryKey: "shopCategories", + queryFn: async () => { + return GetShopCategories.execute(shoppingAdapter) + }, + }); + } + + + return { + useGetShopsCategoriesQuery + } +} \ No newline at end of file diff --git a/packages/apps/planigo/tsconfig.json b/packages/apps/planigo/tsconfig.json index 4fa631c..82df025 100644 --- a/packages/apps/planigo/tsconfig.json +++ b/packages/apps/planigo/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "ES6", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, @@ -12,7 +12,8 @@ "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve" + "jsx": "preserve", + "incremental": true }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "exclude": ["node_modules"] From f786cda58693f09eaa4d3afaec98ba25ae7d20d7 Mon Sep 17 00:00:00 2001 From: Jessy Date: Wed, 12 Apr 2023 23:41:47 +0200 Subject: [PATCH 08/16] feat : set up base config ts --- .gitignore | 1 + tsconfig.base.json | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 tsconfig.base.json diff --git a/.gitignore b/.gitignore index 12ac647..4716cf6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ +lib/ .DS_Store \ No newline at end of file diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..387d8bf --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "target": "es2016", + "moduleResolution": "node", + "esModuleInterop": true, + "declaration": true + } +} \ No newline at end of file From f2b70ca34287b9e38a6496020b011020458961bd Mon Sep 17 00:00:00 2001 From: Jessy Date: Fri, 14 Apr 2023 08:22:40 +0200 Subject: [PATCH 09/16] refacto App : create src folder and remove useless code --- packages/apps/planigo/package-lock.json | 477 ------------------ packages/apps/planigo/pages/_app.tsx | 13 - packages/apps/planigo/pages/api/hello.ts | 10 - packages/apps/planigo/pages/index.tsx | 168 ------ .../apps/planigo/services/Shopping.service.ts | 22 - packages/apps/planigo/src/styles/globals.css | 143 ++++++ packages/apps/planigo/styles/Home.module.css | 121 ----- packages/apps/planigo/styles/globals.css | 16 - 8 files changed, 143 insertions(+), 827 deletions(-) delete mode 100644 packages/apps/planigo/package-lock.json delete mode 100644 packages/apps/planigo/pages/_app.tsx delete mode 100644 packages/apps/planigo/pages/api/hello.ts delete mode 100644 packages/apps/planigo/pages/index.tsx delete mode 100644 packages/apps/planigo/services/Shopping.service.ts create mode 100644 packages/apps/planigo/src/styles/globals.css delete mode 100644 packages/apps/planigo/styles/Home.module.css delete mode 100644 packages/apps/planigo/styles/globals.css diff --git a/packages/apps/planigo/package-lock.json b/packages/apps/planigo/package-lock.json deleted file mode 100644 index 1f788a9..0000000 --- a/packages/apps/planigo/package-lock.json +++ /dev/null @@ -1,477 +0,0 @@ -{ - "name": "planigo", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "planigo", - "version": "0.1.0", - "dependencies": { - "next": "13.2.4", - "react": "18.2.0", - "react-dom": "18.2.0" - }, - "devDependencies": { - "@types/react": "18.0.30", - "typescript": "5.0.2" - } - }, - "node_modules/@next/env": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.4.tgz", - "integrity": "sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==" - }, - "node_modules/@next/swc-android-arm-eabi": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz", - "integrity": "sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-android-arm64": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz", - "integrity": "sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz", - "integrity": "sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz", - "integrity": "sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-freebsd-x64": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz", - "integrity": "sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm-gnueabihf": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz", - "integrity": "sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz", - "integrity": "sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz", - "integrity": "sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz", - "integrity": "sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz", - "integrity": "sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz", - "integrity": "sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz", - "integrity": "sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz", - "integrity": "sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@swc/helpers": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", - "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.0.30", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.30.tgz", - "integrity": "sha512-AnME2cHDH11Pxt/yYX6r0w448BfTwQOLEhQEjCdwB7QskEI7EKtxhGUsExTQe/MsY3D9D5rMtu62WRocw9A8FA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001472", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001472.tgz", - "integrity": "sha512-xWC/0+hHHQgj3/vrKYY0AAzeIUgr7L9wlELIcAvZdDUHlhL/kNxMdnQLOSOQfP8R51ZzPhmHdyMkI0MMpmxCfg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/next": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/next/-/next-13.2.4.tgz", - "integrity": "sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==", - "dependencies": { - "@next/env": "13.2.4", - "@swc/helpers": "0.4.14", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=14.6.0" - }, - "optionalDependencies": { - "@next/swc-android-arm-eabi": "13.2.4", - "@next/swc-android-arm64": "13.2.4", - "@next/swc-darwin-arm64": "13.2.4", - "@next/swc-darwin-x64": "13.2.4", - "@next/swc-freebsd-x64": "13.2.4", - "@next/swc-linux-arm-gnueabihf": "13.2.4", - "@next/swc-linux-arm64-gnu": "13.2.4", - "@next/swc-linux-arm64-musl": "13.2.4", - "@next/swc-linux-x64-gnu": "13.2.4", - "@next/swc-linux-x64-musl": "13.2.4", - "@next/swc-win32-arm64-msvc": "13.2.4", - "@next/swc-win32-ia32-msvc": "13.2.4", - "@next/swc-win32-x64-msvc": "13.2.4" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.4.0", - "fibers": ">= 3.1.0", - "node-sass": "^6.0.0 || ^7.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - } - } -} diff --git a/packages/apps/planigo/pages/_app.tsx b/packages/apps/planigo/pages/_app.tsx deleted file mode 100644 index 0001a6b..0000000 --- a/packages/apps/planigo/pages/_app.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import '../styles/globals.css' -import type { AppProps } from 'next/app' -import { QueryClient, QueryClientProvider } from "react-query"; - - -const queryClient = new QueryClient(); - -function MyApp({ Component, pageProps }: AppProps) { - return - - -} -export default MyApp diff --git a/packages/apps/planigo/pages/api/hello.ts b/packages/apps/planigo/pages/api/hello.ts deleted file mode 100644 index 3d66af9..0000000 --- a/packages/apps/planigo/pages/api/hello.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from 'next' - -type Data = { - name: string -} - -export default (req: NextApiRequest, res: NextApiResponse) => { - res.status(200).json({ name: 'John Doe' }) -} diff --git a/packages/apps/planigo/pages/index.tsx b/packages/apps/planigo/pages/index.tsx deleted file mode 100644 index edc4a8b..0000000 --- a/packages/apps/planigo/pages/index.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { useState } from "react"; -import Link from "next/link"; -import Head from "next/head"; -import { - Button, - Autocomplete, - TextField, - Box, - Typography, -} from "@mui/material"; -import { formLabelClasses } from "@mui/material"; -import { shoppingService } from "../services/Shopping.service"; - -export default function Home() { - const [shopCategory, setshopCategory] = useState("barber"); - - const { isLoading, data: categories = [] } = shoppingService().useGetShopsCategoriesQuery(); - - const categoriesOptions = categories.map((category) => ({ - label: category.name, - value: category.slug, - })); - - const onCategoryChange = (value: string) => { - if (!value) return; - setshopCategory(value); - }; - - return ( - <> - - Planigo V2 - - - - - - - - - - Réservez ce que vous voulez où vous que vous soyez - - - option.label} - isOptionEqualToValue={(option, newValue) => { - return option.value === newValue.value; - }} - sx={{ - width: 300, - "& .MuiOutlinedInput-root .MuiOutlinedInput-notchedOutline": { - border: "none", - }, - }} - renderInput={(params) => ( - - )} - onChange={(event, value) => onCategoryChange(value?.value || "")} - /> - - - - - - - - - - ); -} - diff --git a/packages/apps/planigo/services/Shopping.service.ts b/packages/apps/planigo/services/Shopping.service.ts deleted file mode 100644 index 1b3b56c..0000000 --- a/packages/apps/planigo/services/Shopping.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { useQuery } from "react-query"; -import type { ShoppingServicePort } from "@planigo/core/lib/shopping/domain/ports/ShoppingService.port"; -import { GetShopCategories } from "@planigo/core/lib/shopping/usecases/GetShopCategories.usecase" -import { useShoppingService } from '@planigo/adapters/lib/ShoppingService.adapter' - -export const shoppingService = () => { - const shoppingAdapter: ShoppingServicePort = useShoppingService() - - const useGetShopsCategoriesQuery = () => { - return useQuery({ - queryKey: "shopCategories", - queryFn: async () => { - return GetShopCategories.execute(shoppingAdapter) - }, - }); - } - - - return { - useGetShopsCategoriesQuery - } -} \ No newline at end of file diff --git a/packages/apps/planigo/src/styles/globals.css b/packages/apps/planigo/src/styles/globals.css new file mode 100644 index 0000000..1a9729d --- /dev/null +++ b/packages/apps/planigo/src/styles/globals.css @@ -0,0 +1,143 @@ +@font-face { + font-family: 'zanna'; + src: url('/fonts/zanna.otf'); + } + + :root { + --max-width: 1100px; + --border-radius: 12px; + --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', + 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', + 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; + + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; + + --primary-glow: conic-gradient( + from 180deg at 50% 50%, + #16abff33 0deg, + #0885ff33 55deg, + #54d6ff33 120deg, + #0071ff33 160deg, + transparent 360deg + ); + --secondary-glow: radial-gradient( + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); + + --tile-start-rgb: 239, 245, 249; + --tile-end-rgb: 228, 232, 233; + --tile-border: conic-gradient( + #00000080, + #00000040, + #00000030, + #00000020, + #00000010, + #00000010, + #00000080 + ); + + --callout-rgb: 238, 240, 241; + --callout-border-rgb: 172, 175, 176; + --card-rgb: 180, 185, 188; + --card-border-rgb: 131, 134, 135; + } + + /* @media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + + --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); + --secondary-glow: linear-gradient( + to bottom right, + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0.3) + ); + + --tile-start-rgb: 2, 13, 46; + --tile-end-rgb: 2, 5, 19; + --tile-border: conic-gradient( + #ffffff80, + #ffffff40, + #ffffff30, + #ffffff20, + #ffffff10, + #ffffff10, + #ffffff80 + ); + + --callout-rgb: 20, 20, 20; + --callout-border-rgb: 108, 108, 108; + --card-rgb: 100, 100, 100; + --card-border-rgb: 200, 200, 200; + } + } */ + + * { + box-sizing: border-box; + padding: 0; + margin: 0; + } + + html, + body { + max-width: 100vw; + overflow-x: hidden; + } + + body { + color: rgb(var(--foreground-rgb)); + /* background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); */ + } + + a { + color: inherit; + text-decoration: none; + } + /* + @media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } + } */ + + #log-in-container h1{ + text-align: center; + margin: 30px; + } + + #log-in-container form{ + margin: 30px auto; + width: 300px; + background-color: white; + box-shadow: 10px 10px 20px 0px rgba(0,0,0,0.5); + padding: 10px; + border-radius: 10px; + } + + .log-in-input{ + margin: 10px 0px; + } + + .error-message { + color: red; + font-weight: bold; + background-color: #ffcccc; + width: fit-content; + border-radius: 10px; + padding: 10px; + } + + #log-in-button-submit { + margin-top: 10px; + } \ No newline at end of file diff --git a/packages/apps/planigo/styles/Home.module.css b/packages/apps/planigo/styles/Home.module.css deleted file mode 100644 index 35454bb..0000000 --- a/packages/apps/planigo/styles/Home.module.css +++ /dev/null @@ -1,121 +0,0 @@ -.container { - min-height: 100vh; - padding: 0 0.5rem; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - height: 100vh; -} - -.main { - padding: 5rem 0; - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.footer { - width: 100%; - height: 100px; - border-top: 1px solid #eaeaea; - display: flex; - justify-content: center; - align-items: center; -} - -.footer a { - display: flex; - justify-content: center; - align-items: center; - flex-grow: 1; -} - -.title a { - color: #0070f3; - text-decoration: none; -} - -.title a:hover, -.title a:focus, -.title a:active { - text-decoration: underline; -} - -.title { - margin: 0; - line-height: 1.15; - font-size: 4rem; -} - -.title, -.description { - text-align: center; -} - -.description { - line-height: 1.5; - font-size: 1.5rem; -} - -.code { - background: #fafafa; - border-radius: 5px; - padding: 0.75rem; - font-size: 1.1rem; - font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, - Bitstream Vera Sans Mono, Courier New, monospace; -} - -.grid { - display: flex; - align-items: center; - justify-content: center; - flex-wrap: wrap; - max-width: 800px; - margin-top: 3rem; -} - -.card { - margin: 1rem; - padding: 1.5rem; - text-align: left; - color: inherit; - text-decoration: none; - border: 1px solid #eaeaea; - border-radius: 10px; - transition: color 0.15s ease, border-color 0.15s ease; - width: 45%; -} - -.card:hover, -.card:focus, -.card:active { - color: #0070f3; - border-color: #0070f3; -} - -.card h2 { - margin: 0 0 1rem 0; - font-size: 1.5rem; -} - -.card p { - margin: 0; - font-size: 1.25rem; - line-height: 1.5; -} - -.logo { - height: 1em; - margin-left: 0.5rem; -} - -@media (max-width: 600px) { - .grid { - width: 100%; - flex-direction: column; - } -} diff --git a/packages/apps/planigo/styles/globals.css b/packages/apps/planigo/styles/globals.css deleted file mode 100644 index e5e2dcc..0000000 --- a/packages/apps/planigo/styles/globals.css +++ /dev/null @@ -1,16 +0,0 @@ -html, -body { - padding: 0; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; -} - -a { - color: inherit; - text-decoration: none; -} - -* { - box-sizing: border-box; -} From 8fad0774d871bc6c724cf48beb1ec8046cee5684 Mon Sep 17 00:00:00 2001 From: Jessy Date: Sat, 15 Apr 2023 02:36:22 +0200 Subject: [PATCH 10/16] feat: Get shop by category business logic --- packages/adapters/src/ShoppingService.adapter.ts | 9 +++++++-- packages/adapters/tsconfig.json | 4 ++-- .../src/shopping/domain/ports/ShoppingService.port.ts | 3 ++- .../src/shopping/usecases/GetShopsByCategory.spec.ts | 0 .../src/shopping/usecases/GetShopsByCategory.usecase.ts | 8 ++++++++ 5 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 packages/core/src/shopping/usecases/GetShopsByCategory.spec.ts create mode 100644 packages/core/src/shopping/usecases/GetShopsByCategory.usecase.ts diff --git a/packages/adapters/src/ShoppingService.adapter.ts b/packages/adapters/src/ShoppingService.adapter.ts index 2d1ecf8..01864aa 100644 --- a/packages/adapters/src/ShoppingService.adapter.ts +++ b/packages/adapters/src/ShoppingService.adapter.ts @@ -1,5 +1,5 @@ import { axiosInstance } from "./config/axios"; -import { ShopCategory } from "@planigo/core/src/shopping/domain/models/Shop.model"; +import type { Shop, ShopCategory } from "@planigo/core/src/shopping/domain/models/Shop.model"; import { ShoppingServicePort } from "@planigo/core/src/shopping/domain/ports/ShoppingService.port"; export function useShoppingService(): ShoppingServicePort { @@ -7,7 +7,12 @@ export function useShoppingService(): ShoppingServicePort { const response = await axiosInstance.get(`/categories`) return response.data } + const getShopsFilteredByCategory = async (category: string): Promise => { + const response = await axiosInstance.get(`/shops/category/${category}`) + return response.data + } return { - getShopCategories + getShopCategories, + getShopsFilteredByCategory } } \ No newline at end of file diff --git a/packages/adapters/tsconfig.json b/packages/adapters/tsconfig.json index 1b6447a..fd69e6d 100644 --- a/packages/adapters/tsconfig.json +++ b/packages/adapters/tsconfig.json @@ -6,6 +6,6 @@ "module": "ES6", "outDir": "./lib" }, - "include": [], - "exclude": ["src/**/*", "node_modules", "src/**/*.spec.ts"] + "include": ["src/**/*"], + "exclude": ["node_modules", "src/**/*.spec.ts"] } diff --git a/packages/core/src/shopping/domain/ports/ShoppingService.port.ts b/packages/core/src/shopping/domain/ports/ShoppingService.port.ts index 0f90f1f..c369bbe 100644 --- a/packages/core/src/shopping/domain/ports/ShoppingService.port.ts +++ b/packages/core/src/shopping/domain/ports/ShoppingService.port.ts @@ -1,5 +1,6 @@ -import { ShopCategory } from "../models/Shop.model"; +import type { Shop, ShopCategory } from "../models/Shop.model"; export interface ShoppingServicePort { getShopCategories: () => Promise + getShopsFilteredByCategory: (category: string) => Promise } \ No newline at end of file diff --git a/packages/core/src/shopping/usecases/GetShopsByCategory.spec.ts b/packages/core/src/shopping/usecases/GetShopsByCategory.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/src/shopping/usecases/GetShopsByCategory.usecase.ts b/packages/core/src/shopping/usecases/GetShopsByCategory.usecase.ts new file mode 100644 index 0000000..3bbfb66 --- /dev/null +++ b/packages/core/src/shopping/usecases/GetShopsByCategory.usecase.ts @@ -0,0 +1,8 @@ +import { Shop } from "../domain/models/Shop.model"; +import { ShoppingServicePort } from "../domain/ports/ShoppingService.port"; + +export class GetShopsByCategory { + static async execute(shoppingService: ShoppingServicePort, category: string): Promise { + return shoppingService.getShopsFilteredByCategory(category) + } +} \ No newline at end of file From 501e665162ac6b6fe2a5eb76187d9d655d3e5a80 Mon Sep 17 00:00:00 2001 From: Jessy Date: Sat, 15 Apr 2023 02:38:31 +0200 Subject: [PATCH 11/16] feat: consumation of GetShopsByCategory usecase in v2 app --- .../planigo/src/components/ShopCardItem.tsx | 47 +++++ packages/apps/planigo/src/pages/_app.tsx | 14 ++ packages/apps/planigo/src/pages/index.tsx | 167 ++++++++++++++++++ .../apps/planigo/src/pages/search/index.tsx | 41 +++++ .../planigo/src/services/Shopping.service.ts | 34 ++++ 5 files changed, 303 insertions(+) create mode 100644 packages/apps/planigo/src/components/ShopCardItem.tsx create mode 100644 packages/apps/planigo/src/pages/_app.tsx create mode 100644 packages/apps/planigo/src/pages/index.tsx create mode 100644 packages/apps/planigo/src/pages/search/index.tsx create mode 100644 packages/apps/planigo/src/services/Shopping.service.ts diff --git a/packages/apps/planigo/src/components/ShopCardItem.tsx b/packages/apps/planigo/src/components/ShopCardItem.tsx new file mode 100644 index 0000000..9506879 --- /dev/null +++ b/packages/apps/planigo/src/components/ShopCardItem.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import { + Button, + Card, + CardMedia, + CardContent, + Typography, + CardActions, +} from "@mui/material"; +import Link from "next/link"; +import { Shop } from "@planigo/core/lib/shopping/domain/models/Shop.model"; + +type ShopCardProps = { + shop: Shop; +}; + +const ShopCardItem = ({ shop }: ShopCardProps) => { + return ( + + + + + {shop.name} + + + {shop.description} + + + + + + + + + ); +}; + +export default ShopCardItem; diff --git a/packages/apps/planigo/src/pages/_app.tsx b/packages/apps/planigo/src/pages/_app.tsx new file mode 100644 index 0000000..a786081 --- /dev/null +++ b/packages/apps/planigo/src/pages/_app.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import '../styles/globals.css' +import type { AppProps } from 'next/app' +import { QueryClient, QueryClientProvider } from "react-query"; + + +const queryClient = new QueryClient(); + +function MyApp({ Component, pageProps }: AppProps) { + return + + +} +export default MyApp diff --git a/packages/apps/planigo/src/pages/index.tsx b/packages/apps/planigo/src/pages/index.tsx new file mode 100644 index 0000000..1ed2e8b --- /dev/null +++ b/packages/apps/planigo/src/pages/index.tsx @@ -0,0 +1,167 @@ +import React, { useState } from "react"; +import Link from "next/link"; +import Head from "next/head"; +import { + Button, + Autocomplete, + TextField, + Box, + Typography, +} from "@mui/material"; +import { formLabelClasses } from "@mui/material"; +import { shoppingService } from "../services/Shopping.service"; + +export default function Home() { + const [shopCategory, setshopCategory] = useState(""); + const { isLoading, data: categories = [] } = shoppingService().useGetShopsCategoriesQuery(); + + const categoriesOptions = categories.map((category) => ({ + label: category.name, + value: category.slug, + })); + + const onCategoryChange = (value: string) => { + if (!value) return; + setshopCategory(value); + }; + + return ( + <> + + Planigo V2 + + + + + + + + + + Réservez ce que vous voulez où vous que vous soyez + + + option.label} + isOptionEqualToValue={(option, newValue) => { + return option.value === newValue.value; + }} + sx={{ + width: 300, + "& .MuiOutlinedInput-root .MuiOutlinedInput-notchedOutline": { + border: "none", + }, + }} + renderInput={(params) => ( + + )} + onChange={(event, value) => onCategoryChange(value?.value || "")} + /> + + + + + + + + + + ); +} + diff --git a/packages/apps/planigo/src/pages/search/index.tsx b/packages/apps/planigo/src/pages/search/index.tsx new file mode 100644 index 0000000..567f500 --- /dev/null +++ b/packages/apps/planigo/src/pages/search/index.tsx @@ -0,0 +1,41 @@ +import { useRouter } from 'next/router' +import { Box, CircularProgress } from "@mui/material"; +import { shoppingService } from "../../services/Shopping.service"; +import { Shop } from "@planigo/core/lib/shopping/domain/models/Shop.model"; +import ShopCardItem from "../../components/ShopCardItem"; + +const SearchResultPage = () => { + const router = useRouter() + const shopCategory: string = (router.query.category as string) || "" + const { isLoading, data: shopsByCategory } = shoppingService().useGetShopsByCategoryQuery(shopCategory); + + return ( + + {isLoading + ? + : shopsByCategory ? ( + shopsByCategory.map((shop: Shop) => ( + + )) + ) : ( +

Pas de Boutique

+ ) + } +
+ ); +}; + +export default SearchResultPage; diff --git a/packages/apps/planigo/src/services/Shopping.service.ts b/packages/apps/planigo/src/services/Shopping.service.ts new file mode 100644 index 0000000..249c059 --- /dev/null +++ b/packages/apps/planigo/src/services/Shopping.service.ts @@ -0,0 +1,34 @@ +import { useQuery } from "react-query"; +import type { Shop, ShopCategory } from "@planigo/core/lib/shopping/domain/models/Shop.model"; +import type { ShoppingServicePort } from "@planigo/core/lib/shopping/domain/ports/ShoppingService.port" +import { GetShopCategories } from "@planigo/core/lib/shopping/usecases/GetShopCategories.usecase" +import { GetShopsByCategory } from "@planigo/core/lib/shopping/usecases/GetShopsByCategory.usecase" +import { useShoppingService } from '@planigo/adapters/lib/ShoppingService.adapter' + +export const shoppingService = () => { + const shoppingAdapter: ShoppingServicePort = useShoppingService() + + const useGetShopsCategoriesQuery = () => { + return useQuery({ + queryKey: "shopCategories", + queryFn: async (): Promise => { + return GetShopCategories.execute(shoppingAdapter) + }, + }); + } + + const useGetShopsByCategoryQuery = (category: string) => { + return useQuery({ + queryKey: ["shopsByCategory", category], + queryFn: async (): Promise => { + return GetShopsByCategory.execute(shoppingAdapter, category) + }, + }); + } + + + return { + useGetShopsCategoriesQuery, + useGetShopsByCategoryQuery + } +} \ No newline at end of file From c42ba8a7c716ff48651c023c91d9f7cac00ffe0c Mon Sep 17 00:00:00 2001 From: Jessy Date: Sat, 15 Apr 2023 11:01:57 +0200 Subject: [PATCH 12/16] feat: all usecases, impl and consummation about shop infos (services, hours, details) --- .../adapters/src/ShoppingService.adapter.ts | 19 +++++++- packages/apps/planigo/public/fonts/zanna.otf | Bin 0 -> 27480 bytes .../planigo/src/pages/shops/[id]/index.tsx | 45 ++++++++++++++++++ .../src/shopping/domain/models/Hour.model.ts | 7 +++ .../shopping/domain/models/Service.model.ts | 8 ++++ .../src/shopping/domain/models/Shop.model.ts | 2 +- .../domain/ports/ShoppingService.port.ts | 5 ++ .../shopping/usecases/GetShopById.usecase.ts | 8 ++++ .../shopping/usecases/GetShopHours.usecase.ts | 8 ++++ .../usecases/GetShopServices.usecase.ts | 8 ++++ 10 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 packages/apps/planigo/public/fonts/zanna.otf create mode 100644 packages/apps/planigo/src/pages/shops/[id]/index.tsx create mode 100644 packages/core/src/shopping/domain/models/Hour.model.ts create mode 100644 packages/core/src/shopping/domain/models/Service.model.ts create mode 100644 packages/core/src/shopping/usecases/GetShopById.usecase.ts create mode 100644 packages/core/src/shopping/usecases/GetShopHours.usecase.ts create mode 100644 packages/core/src/shopping/usecases/GetShopServices.usecase.ts diff --git a/packages/adapters/src/ShoppingService.adapter.ts b/packages/adapters/src/ShoppingService.adapter.ts index 01864aa..91aa2ef 100644 --- a/packages/adapters/src/ShoppingService.adapter.ts +++ b/packages/adapters/src/ShoppingService.adapter.ts @@ -1,3 +1,4 @@ +import { Service } from "@planigo/core/src/shopping/domain/models/Service.model"; import { axiosInstance } from "./config/axios"; import type { Shop, ShopCategory } from "@planigo/core/src/shopping/domain/models/Shop.model"; import { ShoppingServicePort } from "@planigo/core/src/shopping/domain/ports/ShoppingService.port"; @@ -11,8 +12,24 @@ export function useShoppingService(): ShoppingServicePort { const response = await axiosInstance.get(`/shops/category/${category}`) return response.data } + const getShopById = async (shopId: string): Promise => { + const response = await axiosInstance.get(`/shops/${shopId}`) + return response.data + } + + const getShopServices = async (shopId: string): Promise => { + const response = await axiosInstance.get(`/services/shop/${shopId}`) + return response.data + } + const getShopHours = async (shopId: string) => { + const response = await axiosInstance.get(`/hours/shop/${shopId}`) + return response.data + } return { getShopCategories, - getShopsFilteredByCategory + getShopsFilteredByCategory, + getShopById, + getShopServices, + getShopHours } } \ No newline at end of file diff --git a/packages/apps/planigo/public/fonts/zanna.otf b/packages/apps/planigo/public/fonts/zanna.otf new file mode 100644 index 0000000000000000000000000000000000000000..2a7bac40e6ed1c95ba289bca13679edbc1971d09 GIT binary patch literal 27480 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 literal 0 HcmV?d00001 diff --git a/packages/apps/planigo/src/pages/shops/[id]/index.tsx b/packages/apps/planigo/src/pages/shops/[id]/index.tsx new file mode 100644 index 0000000..cdd04bf --- /dev/null +++ b/packages/apps/planigo/src/pages/shops/[id]/index.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import { GetServerSideProps } from "next/types"; +import { Shop } from "@planigo/core/lib/shopping/domain/models/Shop.model"; +import { Service } from "@planigo/core/lib/shopping/domain/models/Service.model"; +import { GetShopById } from "@planigo/core/lib/shopping/usecases/GetShopById.usecase"; +import { GetShopServices } from "@planigo/core/lib/shopping/usecases/GetShopServices.usecase" +import { GetShopHours } from "@planigo/core/lib/shopping/usecases/GetShopHours.usecase" +import { Hour } from "@planigo/core/lib/shopping/domain/models/Hour.model"; +import { useShoppingService } from "@planigo/adapters/lib/ShoppingService.adapter"; + +type ShopDetailsPageArgs = { + shop: Shop; + shopServices: Service[]; + shopHours: Hour[]; + // nextReservations: Reservation[]; +}; + +export const getServerSideProps: GetServerSideProps = async ({ query }) => { + const shopId = (query.id as string) || ""; + const shoppingService = useShoppingService() + const shop: Shop = await GetShopById.execute(shoppingService, { shopId }); + const shopServices: Service[] = await GetShopServices.execute(shoppingService, { shopId }); + const shopHours: Hour[] = await GetShopHours.execute(shoppingService, { shopId }); + // const nextReservations = await getNextReservationSlots(shopId); + console.log(shop) + console.log(shopServices) + console.log(shopHours) + return { + props: { + shop, + shopServices, + shopHours, + // nextReservations, + }, + }; +}; + + +const ShopDetailsPage = () => { + return ( +
index
+ ) +} + +export default ShopDetailsPage \ No newline at end of file diff --git a/packages/core/src/shopping/domain/models/Hour.model.ts b/packages/core/src/shopping/domain/models/Hour.model.ts new file mode 100644 index 0000000..a202ac3 --- /dev/null +++ b/packages/core/src/shopping/domain/models/Hour.model.ts @@ -0,0 +1,7 @@ +export type Hour = { + id: string + day: number + start: string + end: string + shop_id: string +} \ No newline at end of file diff --git a/packages/core/src/shopping/domain/models/Service.model.ts b/packages/core/src/shopping/domain/models/Service.model.ts new file mode 100644 index 0000000..a2f16c7 --- /dev/null +++ b/packages/core/src/shopping/domain/models/Service.model.ts @@ -0,0 +1,8 @@ +export type Service = { + id: string + name: string + description: string + price: number + duration: number + shop_id: string +} diff --git a/packages/core/src/shopping/domain/models/Shop.model.ts b/packages/core/src/shopping/domain/models/Shop.model.ts index a563b1f..e8bdcfe 100644 --- a/packages/core/src/shopping/domain/models/Shop.model.ts +++ b/packages/core/src/shopping/domain/models/Shop.model.ts @@ -6,7 +6,7 @@ export type Shop = { category_id: string } -// VALUE OBJECT +// VALUE OBJECT ??? export type ShopCategory = { id: string slug: string diff --git a/packages/core/src/shopping/domain/ports/ShoppingService.port.ts b/packages/core/src/shopping/domain/ports/ShoppingService.port.ts index c369bbe..30a7827 100644 --- a/packages/core/src/shopping/domain/ports/ShoppingService.port.ts +++ b/packages/core/src/shopping/domain/ports/ShoppingService.port.ts @@ -1,6 +1,11 @@ +import type { Hour } from "../models/Hour.model"; +import type { Service } from "../models/Service.model"; import type { Shop, ShopCategory } from "../models/Shop.model"; export interface ShoppingServicePort { getShopCategories: () => Promise + getShopById: (shopId: string) => Promise + getShopServices: (shopId: string) => Promise + getShopHours: (shopId: string) => Promise getShopsFilteredByCategory: (category: string) => Promise } \ No newline at end of file diff --git a/packages/core/src/shopping/usecases/GetShopById.usecase.ts b/packages/core/src/shopping/usecases/GetShopById.usecase.ts new file mode 100644 index 0000000..a28a502 --- /dev/null +++ b/packages/core/src/shopping/usecases/GetShopById.usecase.ts @@ -0,0 +1,8 @@ +import type { Shop } from "../domain/models/Shop.model"; +import type { ShoppingServicePort } from "../domain/ports/ShoppingService.port"; + +export class GetShopById { + static async execute(shoppingService: ShoppingServicePort, payload: { shopId: string }): Promise { + return shoppingService.getShopById(payload.shopId) + } +} \ No newline at end of file diff --git a/packages/core/src/shopping/usecases/GetShopHours.usecase.ts b/packages/core/src/shopping/usecases/GetShopHours.usecase.ts new file mode 100644 index 0000000..a0eab41 --- /dev/null +++ b/packages/core/src/shopping/usecases/GetShopHours.usecase.ts @@ -0,0 +1,8 @@ +import type { Hour } from "../domain/models/Hour.model"; +import type { ShoppingServicePort } from "../domain/ports/ShoppingService.port"; + +export class GetShopHours { + static async execute(shoppingService: ShoppingServicePort, payload: { shopId: string }): Promise { + return shoppingService.getShopHours(payload.shopId) + } +} \ No newline at end of file diff --git a/packages/core/src/shopping/usecases/GetShopServices.usecase.ts b/packages/core/src/shopping/usecases/GetShopServices.usecase.ts new file mode 100644 index 0000000..f18ecc4 --- /dev/null +++ b/packages/core/src/shopping/usecases/GetShopServices.usecase.ts @@ -0,0 +1,8 @@ +import type { Service } from "../domain/models/Service.model"; +import type { ShoppingServicePort } from "../domain/ports/ShoppingService.port"; + +export class GetShopServices { + static async execute(shoppingService: ShoppingServicePort, payload: { shopId: string }): Promise { + return shoppingService.getShopServices(payload.shopId) + } +} \ No newline at end of file From 0935931242161510d16a7a173c89e28ee959096d Mon Sep 17 00:00:00 2001 From: Jessy Date: Sat, 15 Apr 2023 16:00:01 +0200 Subject: [PATCH 13/16] feat: Get next reservation usecase --- .../src/ReservationService.adapter.ts | 13 +++ packages/apps/planigo/src/config/dayjs.ts | 19 ++++ .../planigo/src/pages/shops/[id]/index.tsx | 87 +++++++++++++++++-- .../domain/ports/ReservationService.port.ts | 5 ++ .../usecases/GetNextReservations.usecase.ts | 8 ++ 5 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 packages/adapters/src/ReservationService.adapter.ts create mode 100644 packages/apps/planigo/src/config/dayjs.ts create mode 100644 packages/core/src/reservation/domain/ports/ReservationService.port.ts create mode 100644 packages/core/src/reservation/usecases/GetNextReservations.usecase.ts diff --git a/packages/adapters/src/ReservationService.adapter.ts b/packages/adapters/src/ReservationService.adapter.ts new file mode 100644 index 0000000..0db7d0a --- /dev/null +++ b/packages/adapters/src/ReservationService.adapter.ts @@ -0,0 +1,13 @@ +import { Reservation } from "@planigo/core/lib/reservation/domain/models/Reservation.model" +import { ReservationServicePort } from "@planigo/core/lib/reservation/domain/ports/ReservationService.port" +import { axiosInstance } from "./config/axios" + +export function useReservationService(): ReservationServicePort { + const getNextReservationsSlots = async (shopId: string): Promise => { + const response = await axiosInstance.get(`/reservation/slots/${shopId}`) + return response.data + } + return { + getNextReservationsSlots + } +} \ No newline at end of file diff --git a/packages/apps/planigo/src/config/dayjs.ts b/packages/apps/planigo/src/config/dayjs.ts new file mode 100644 index 0000000..2d20d63 --- /dev/null +++ b/packages/apps/planigo/src/config/dayjs.ts @@ -0,0 +1,19 @@ +import dayjs from 'dayjs' +import 'dayjs/locale/fr' +import localeData from 'dayjs/plugin/localeData' + +export const LOCALE = 'fr' + +dayjs.locale(LOCALE) +dayjs.extend(localeData) + +export const weekdays: string[] = dayjs.weekdays(true) + +export const RESERVATION_DATE_FORMAT = "dddd D MMMM YYYY [à] HH:mm" +export const TEXTUAL_DATE_FORMAT = "dddd D MMMM" +export const HOUR_MINUTES_FORMAT = 'HH:mm' +export const FULL_HOUR_FORMAT = 'HH:mm:ss' + +export const getWeekday = (dayNumber: number): string => { + return weekdays[dayNumber - 1] +} \ No newline at end of file diff --git a/packages/apps/planigo/src/pages/shops/[id]/index.tsx b/packages/apps/planigo/src/pages/shops/[id]/index.tsx index cdd04bf..d068ce4 100644 --- a/packages/apps/planigo/src/pages/shops/[id]/index.tsx +++ b/packages/apps/planigo/src/pages/shops/[id]/index.tsx @@ -7,39 +7,110 @@ import { GetShopServices } from "@planigo/core/lib/shopping/usecases/GetShopServ import { GetShopHours } from "@planigo/core/lib/shopping/usecases/GetShopHours.usecase" import { Hour } from "@planigo/core/lib/shopping/domain/models/Hour.model"; import { useShoppingService } from "@planigo/adapters/lib/ShoppingService.adapter"; +import { useReservationService } from "@planigo/adapters/lib/ReservationService.adapter" +import { GetNextReservations } from "@planigo/core/lib/reservation/usecases/GetNextReservations.usecase" +import { Reservation } from "@planigo/core/lib/reservation/domain/models/Reservation.model"; +import { Box } from "@mui/material"; +import dayjs from "dayjs"; +import ShopHours from "../../../components/hour/ShopHours"; +import ServiceCardItem from "../../../components/service/ServiceCardItem"; +import { RESERVATION_DATE_FORMAT } from "../../../config/dayjs"; type ShopDetailsPageArgs = { shop: Shop; shopServices: Service[]; shopHours: Hour[]; - // nextReservations: Reservation[]; + nextShopReservations: Reservation[]; }; export const getServerSideProps: GetServerSideProps = async ({ query }) => { const shopId = (query.id as string) || ""; const shoppingService = useShoppingService() + const reservationService = useReservationService() const shop: Shop = await GetShopById.execute(shoppingService, { shopId }); const shopServices: Service[] = await GetShopServices.execute(shoppingService, { shopId }); const shopHours: Hour[] = await GetShopHours.execute(shoppingService, { shopId }); - // const nextReservations = await getNextReservationSlots(shopId); + const nextShopReservations = await GetNextReservations.execute(reservationService, { shopId }); + console.log(shop) console.log(shopServices) console.log(shopHours) + console.log(nextShopReservations) + return { props: { shop, shopServices, shopHours, - // nextReservations, + nextShopReservations, }, }; }; -const ShopDetailsPage = () => { +const ShopDetailsPage = ({ + shop, + shopServices, + shopHours, + nextShopReservations, +}: ShopDetailsPageArgs) => { + // const setNextAvailableReservation = useReservationStore( + // (state) => state.setNextAvailableReservation + // ); + // const setNextAvailableSlot = useReservationStore( + // (state) => state.setNextAvailableSlot + // ); + + // const nextReservation = getNextAvailableReservation(nextReservations); + // if (!nextReservation) { + // throw Error("should have reservation"); + // } + + // const nextAvailableSlot = getNextAvailableSlot(nextReservation.slots); + // if (!nextAvailableSlot) { + // throw Error("should have slot"); + // } + + // setNextAvailableReservation(nextReservation); + // setNextAvailableSlot(nextAvailableSlot); + return ( -
index
- ) -} + +

{shop.name}

+
+

{shop.description}

+
+

Choix des prestations

+ + {shopServices.map((service) => ( + + ))} + +

Les horaires

+ +
+ ); +}; -export default ShopDetailsPage \ No newline at end of file +export default ShopDetailsPage; \ No newline at end of file diff --git a/packages/core/src/reservation/domain/ports/ReservationService.port.ts b/packages/core/src/reservation/domain/ports/ReservationService.port.ts new file mode 100644 index 0000000..2bd4dd4 --- /dev/null +++ b/packages/core/src/reservation/domain/ports/ReservationService.port.ts @@ -0,0 +1,5 @@ +import type { Reservation } from "../models/Reservation.model"; + +export interface ReservationServicePort { + getNextReservationsSlots: (shopId: string) => Promise +} \ No newline at end of file diff --git a/packages/core/src/reservation/usecases/GetNextReservations.usecase.ts b/packages/core/src/reservation/usecases/GetNextReservations.usecase.ts new file mode 100644 index 0000000..5398124 --- /dev/null +++ b/packages/core/src/reservation/usecases/GetNextReservations.usecase.ts @@ -0,0 +1,8 @@ +import type { Reservation } from "../domain/models/Reservation.model"; +import type { ReservationServicePort } from "../domain/ports/ReservationService.port"; + +export class GetNextReservations { + static async execute(reservationService: ReservationServicePort, payload: { shopId: string }): Promise { + return reservationService.getNextReservationsSlots(payload.shopId) + } +} \ No newline at end of file From 5ce480995d36007d20ae9d76217a37ee62dc5fc0 Mon Sep 17 00:00:00 2001 From: Jessy Date: Sat, 15 Apr 2023 16:01:07 +0200 Subject: [PATCH 14/16] feat : Apps - Shop details page --- .../planigo/src/components/hour/HourItem.tsx | 21 +++++ .../planigo/src/components/hour/ShopHours.tsx | 35 ++++++++ .../components/service/ServiceCardItem.tsx | 80 +++++++++++++++++++ .../components/{ => shop}/ShopCardItem.tsx | 0 .../apps/planigo/src/pages/search/index.tsx | 2 +- .../src/pages/shops/[id]/reservation.tsx | 0 6 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 packages/apps/planigo/src/components/hour/HourItem.tsx create mode 100644 packages/apps/planigo/src/components/hour/ShopHours.tsx create mode 100644 packages/apps/planigo/src/components/service/ServiceCardItem.tsx rename packages/apps/planigo/src/components/{ => shop}/ShopCardItem.tsx (100%) create mode 100644 packages/apps/planigo/src/pages/shops/[id]/reservation.tsx diff --git a/packages/apps/planigo/src/components/hour/HourItem.tsx b/packages/apps/planigo/src/components/hour/HourItem.tsx new file mode 100644 index 0000000..ec3a4e3 --- /dev/null +++ b/packages/apps/planigo/src/components/hour/HourItem.tsx @@ -0,0 +1,21 @@ +import { Box } from '@mui/material' +import React from 'react' + +type HourItemProps = { + day: string + start: string + end: string +} + +const HourItem = ({ day, start, end }: HourItemProps) => { + return ( + + {day} + + {start} - {end} + + + ) +} + +export default HourItem \ No newline at end of file diff --git a/packages/apps/planigo/src/components/hour/ShopHours.tsx b/packages/apps/planigo/src/components/hour/ShopHours.tsx new file mode 100644 index 0000000..e9a2c35 --- /dev/null +++ b/packages/apps/planigo/src/components/hour/ShopHours.tsx @@ -0,0 +1,35 @@ +import React from 'react' + +import { Hour } from '@planigo/core/lib/shopping/domain/models/Hour.model' +import { Paper } from '@mui/material' + +import HourItem from './HourItem' +import { weekdays } from '../../config/dayjs' + +type ShopHoursProps = { + hours: Hour[] +} + +const ShopHours = ({ hours }: ShopHoursProps) => { + + return ( +
+ + {hours.map(hour => + + )} + +
+ ) +} + +export default ShopHours \ No newline at end of file diff --git a/packages/apps/planigo/src/components/service/ServiceCardItem.tsx b/packages/apps/planigo/src/components/service/ServiceCardItem.tsx new file mode 100644 index 0000000..7c112d9 --- /dev/null +++ b/packages/apps/planigo/src/components/service/ServiceCardItem.tsx @@ -0,0 +1,80 @@ +import Link from "next/link"; +import dynamic from "next/dynamic"; + +import { + Button, + Card, + CardActions, + CardContent, + Paper, + Tooltip, + Typography, +} from "@mui/material"; +import AccessTimeOutlinedIcon from "@mui/icons-material/AccessTimeOutlined"; +// import { useUserStore } from "@/store/user.store"; +import { Service } from "@planigo/core/lib/shopping/domain/models/Service.model"; + +type ServiceCardProps = { + shopId: string; + service: Service; + nextAvailableReservationSlot: string; +}; + +export const ServiceCardItem = ({ + shopId, + service, + nextAvailableReservationSlot, +}: ServiceCardProps) => { + // const currentUser = useUserStore((state) => state.currentUser); + let tooltipTitle = "Vous devez être connecté pour réserver un créneau"; + + // if (currentUser) { + // tooltipTitle = ""; + // } + + return ( + + + + {service.name} + + {service.description} + + {new Intl.NumberFormat("fr", { + style: "currency", + currency: "EUR", + }).format(service.price)} + + + {service.duration} min + + + Prochaine dispo le : {nextAvailableReservationSlot} + + + + + + {/* */} + + + + + ); +}; + +export default dynamic(() => Promise.resolve(ServiceCardItem), { + ssr: false, +}); diff --git a/packages/apps/planigo/src/components/ShopCardItem.tsx b/packages/apps/planigo/src/components/shop/ShopCardItem.tsx similarity index 100% rename from packages/apps/planigo/src/components/ShopCardItem.tsx rename to packages/apps/planigo/src/components/shop/ShopCardItem.tsx diff --git a/packages/apps/planigo/src/pages/search/index.tsx b/packages/apps/planigo/src/pages/search/index.tsx index 567f500..675fb06 100644 --- a/packages/apps/planigo/src/pages/search/index.tsx +++ b/packages/apps/planigo/src/pages/search/index.tsx @@ -2,7 +2,7 @@ import { useRouter } from 'next/router' import { Box, CircularProgress } from "@mui/material"; import { shoppingService } from "../../services/Shopping.service"; import { Shop } from "@planigo/core/lib/shopping/domain/models/Shop.model"; -import ShopCardItem from "../../components/ShopCardItem"; +import ShopCardItem from "../../components/shop/ShopCardItem"; const SearchResultPage = () => { const router = useRouter() diff --git a/packages/apps/planigo/src/pages/shops/[id]/reservation.tsx b/packages/apps/planigo/src/pages/shops/[id]/reservation.tsx new file mode 100644 index 0000000..e69de29 From 1a8e392a1b3317b2e040868d69ed12076f910167 Mon Sep 17 00:00:00 2001 From: Jessy Date: Sun, 16 Apr 2023 12:39:54 +0200 Subject: [PATCH 15/16] feat: Complete login usecase --- packages/adapters/src/AuthService.adapter.ts | 16 ++ packages/apps/planigo/package.json | 13 +- .../apps/planigo/src/components/AppBar.tsx | 174 ++++++++++++++++ .../apps/planigo/src/components/Login.tsx | 106 ++++++++++ .../components/service/ServiceCardItem.tsx | 16 +- packages/apps/planigo/src/pages/_app.tsx | 3 + .../apps/planigo/src/services/Auth.service.ts | 29 +++ packages/apps/planigo/src/store/user.store.ts | 24 +++ .../src/auth/domain/ports/AuthService.port.ts | 6 + .../src/auth/usecases/Login/Login.usecase.ts | 10 + .../src/auth/usecases/Login/LoginInput.ts | 4 + .../src/auth/usecases/Login/LoginOutput.ts | 6 + pnpm-lock.yaml | 191 ++++++++++++++++++ 13 files changed, 587 insertions(+), 11 deletions(-) create mode 100644 packages/adapters/src/AuthService.adapter.ts create mode 100644 packages/apps/planigo/src/components/AppBar.tsx create mode 100644 packages/apps/planigo/src/components/Login.tsx create mode 100644 packages/apps/planigo/src/services/Auth.service.ts create mode 100644 packages/apps/planigo/src/store/user.store.ts create mode 100644 packages/core/src/auth/domain/ports/AuthService.port.ts create mode 100644 packages/core/src/auth/usecases/Login/Login.usecase.ts create mode 100644 packages/core/src/auth/usecases/Login/LoginInput.ts create mode 100644 packages/core/src/auth/usecases/Login/LoginOutput.ts diff --git a/packages/adapters/src/AuthService.adapter.ts b/packages/adapters/src/AuthService.adapter.ts new file mode 100644 index 0000000..5eabd99 --- /dev/null +++ b/packages/adapters/src/AuthService.adapter.ts @@ -0,0 +1,16 @@ +import { axiosInstance } from "./config/axios"; +import { AuthServicePort } from "@planigo/core/lib/auth/domain/ports/AuthService.port" +import type { LoginOutput } from "@planigo/core/lib/auth/usecases/Login/LoginOutput" +import type { LoginInput } from "@planigo/core/lib/auth/usecases/Login/LoginInput" + + +export function useAuthService(): AuthServicePort { + const login = async (loginInput: LoginInput): Promise => { + const response = await axiosInstance.post("/auth/login", loginInput) + return response.data + } + + return { + login + } +} \ No newline at end of file diff --git a/packages/apps/planigo/package.json b/packages/apps/planigo/package.json index a1b2edc..1e2f8ed 100644 --- a/packages/apps/planigo/package.json +++ b/packages/apps/planigo/package.json @@ -10,16 +10,23 @@ "dependencies": { "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", + "@hookform/resolvers": "^3.1.0", + "@mui/icons-material": "^5.11.0", "@mui/material": "^5.11.16", + "@mui/x-date-pickers": "^5.0.20", + "@planigo/adapters": "workspace:^1.0.0", + "@planigo/core": "workspace:^1.0.0", + "dayjs": "^1.11.7", "next": "13.2.4", "react": "18.2.0", "react-dom": "18.2.0", + "react-hook-form": "^7.43.9", "react-query": "^3.39.3", - "@planigo/core": "workspace:^1.0.0", - "@planigo/adapters": "workspace:^1.0.0" + "zod": "^3.21.4", + "zustand": "^4.3.7" }, "devDependencies": { "@types/react": "18.0.30", "typescript": "5.0.2" } -} +} \ No newline at end of file diff --git a/packages/apps/planigo/src/components/AppBar.tsx b/packages/apps/planigo/src/components/AppBar.tsx new file mode 100644 index 0000000..8de11c5 --- /dev/null +++ b/packages/apps/planigo/src/components/AppBar.tsx @@ -0,0 +1,174 @@ +import AppBar from "@mui/material/AppBar"; +import Box from "@mui/material/Box"; +import Toolbar from "@mui/material/Toolbar"; +import Typography from "@mui/material/Typography"; +import Container from "@mui/material/Container"; +import Link from "next/link"; +import { useUserStore } from "../store/user.store"; +// import { removeToken } from "@/helpers/localstorage.helper"; +import { Router, useRouter } from "next/router"; +import { useState } from "react"; +import { Modal, Snackbar } from "@mui/material"; +import Login from "./Login"; +//import Register from "./Register"; + +const settings = [ + { + label: "Backoffice", + path: "/admin/dashboard", + role: "owner", + }, + { + label: "Mes réservations", + path: "/users/my-reservations", + }, + { + label: "Déconnexion", + path: "/", + onClick: () => { + useUserStore.getState().setCurrentUser(null); + // removeToken(); + }, + }, +]; + +function ResponsiveAppBar() { + const router = useRouter(); + const [isModalOpen, setIsModalOpen] = useState(false); + const [snackbarOpen, setSnackbarOpen] = useState(false); + const [modalContent, setModalContent] = useState(); + const currentUser = useUserStore((state) => state.currentUser); + + const textColor = + router.pathname === "/" + ? { + color: "white", + "&:hover": { + color: "#E6E6E6", + }, + } + : { + color: "black", + "&:hover": { + color: "#2D2E2E", + }, + }; + + return ( + + + + + + PLANIGO + + + + {currentUser ? ( + settings.map((setting, index) => { + if (setting.role && setting.role !== currentUser.role) { + return null; + } + return ( + { + setting.onClick?.(); + }} + > + + {setting.label} + + + ); + }) + ) : ( + <> + { + setIsModalOpen((prev) => !prev); + setModalContent( + setIsModalOpen(false)} /> + ); + }} + > + + Se connecter + + + { + setIsModalOpen((prev) => !prev); + // setModalContent( + // setIsModalOpen(false)} + // openSnackbar={() => setSnackbarOpen(true)} + // /> + // ); + }} + > + + S'enregister + + + + )} + + + setIsModalOpen(false)}> + + {modalContent} + + + setSnackbarOpen(false)} + message="🎉 Votre inscription a bien été prise en compte, veuillez vous connecter." + /> + + + ); +} + +export default ResponsiveAppBar; diff --git a/packages/apps/planigo/src/components/Login.tsx b/packages/apps/planigo/src/components/Login.tsx new file mode 100644 index 0000000..e234233 --- /dev/null +++ b/packages/apps/planigo/src/components/Login.tsx @@ -0,0 +1,106 @@ +import { z } from "zod"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { TextField, Button, Box, CircularProgress, Alert, Container } from "@mui/material"; +import { useUserStore } from "../store/user.store"; +import { Poppins } from "next/font/google"; +import { authService } from "../services/Auth.service"; + +const poppins = Poppins({ weight: "400", subsets: ["latin"] }); + +const schema = z.object({ + email: z + .string() + .email({ message: "Le format de l'adresse mail doit être valide" }), + password: z + .string() + .min(4, "Le mot de passe doit contenir au moins 4 caractères"), +}); + +export type FormLoginSchemaType = z.infer; + +const Login = ({ closeModal }: { closeModal: () => void }) => { + const setCurrentUser = useUserStore((state) => state.setCurrentUser); + + const { + mutate: login, + isLoading, + isError, + } = authService().useLoginMutation((user) => { + closeModal(); + setCurrentUser(user); + }); + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(schema), + }); + + const onSubmit = (data: FormLoginSchemaType) => { + login(data); + }; + + return ( + +

Connexion

+
+ + {isError && ( + + La combinaison n'est pas correcte + + )} + + + + +
+
+ ); +}; + +export default Login; diff --git a/packages/apps/planigo/src/components/service/ServiceCardItem.tsx b/packages/apps/planigo/src/components/service/ServiceCardItem.tsx index 7c112d9..71eb2aa 100644 --- a/packages/apps/planigo/src/components/service/ServiceCardItem.tsx +++ b/packages/apps/planigo/src/components/service/ServiceCardItem.tsx @@ -6,13 +6,13 @@ import { Card, CardActions, CardContent, - Paper, Tooltip, Typography, } from "@mui/material"; import AccessTimeOutlinedIcon from "@mui/icons-material/AccessTimeOutlined"; -// import { useUserStore } from "@/store/user.store"; + import { Service } from "@planigo/core/lib/shopping/domain/models/Service.model"; +import { useUserStore } from "../../store/user.store"; type ServiceCardProps = { shopId: string; @@ -25,12 +25,12 @@ export const ServiceCardItem = ({ service, nextAvailableReservationSlot, }: ServiceCardProps) => { - // const currentUser = useUserStore((state) => state.currentUser); + const currentUser = useUserStore((state) => state.currentUser); let tooltipTitle = "Vous devez être connecté pour réserver un créneau"; - // if (currentUser) { - // tooltipTitle = ""; - // } + if (currentUser) { + tooltipTitle = ""; + } return ( @@ -61,13 +61,13 @@ export const ServiceCardItem = ({ - {/* */} + diff --git a/packages/apps/planigo/src/pages/_app.tsx b/packages/apps/planigo/src/pages/_app.tsx index a786081..98ca538 100644 --- a/packages/apps/planigo/src/pages/_app.tsx +++ b/packages/apps/planigo/src/pages/_app.tsx @@ -2,12 +2,15 @@ import React from 'react'; import '../styles/globals.css' import type { AppProps } from 'next/app' import { QueryClient, QueryClientProvider } from "react-query"; +import dynamic from 'next/dynamic'; +const AppBar = dynamic(() => import("../components/AppBar"), { ssr: false }); const queryClient = new QueryClient(); function MyApp({ Component, pageProps }: AppProps) { return + } diff --git a/packages/apps/planigo/src/services/Auth.service.ts b/packages/apps/planigo/src/services/Auth.service.ts new file mode 100644 index 0000000..8dcc35a --- /dev/null +++ b/packages/apps/planigo/src/services/Auth.service.ts @@ -0,0 +1,29 @@ +import type { User } from "@planigo/core/lib/auth/domain/models/User.model"; +import type { AuthServicePort } from "@planigo/core/lib/auth/domain/ports/AuthService.port" +import { useAuthService } from "@planigo/adapters/lib/AuthService.adapter" +import { useMutation } from "react-query"; +import { FormLoginSchemaType } from "../components/Login"; + + +export const authService = () => { + const authService: AuthServicePort = useAuthService() + + const useLoginMutation = (onSuccess: (user: User) => void) => + useMutation({ + mutationKey: "login", + mutationFn: async (creds: FormLoginSchemaType) => { + const response = await authService.login(creds) + + // setToken(response.access_token); + + return response; + }, + onSuccess({ user }) { + onSuccess(user); + }, + }); + + return { + useLoginMutation + } +} \ No newline at end of file diff --git a/packages/apps/planigo/src/store/user.store.ts b/packages/apps/planigo/src/store/user.store.ts new file mode 100644 index 0000000..b2ed1bc --- /dev/null +++ b/packages/apps/planigo/src/store/user.store.ts @@ -0,0 +1,24 @@ +import { User } from "@planigo/core/lib/auth/domain/models/User.model" +import { create } from "zustand"; +import { persist, devtools } from "zustand/middleware"; + +interface UserStore { + currentUser: User | null; + setCurrentUser: (user: User | null) => void; +} + +export const useUserStore = create()( + devtools( + persist( + (set) => ({ + currentUser: null, + setCurrentUser: (user: User | null) => { + set({ currentUser: user }); + }, + }), + { + name: "user-store", + } + ) + ) +); diff --git a/packages/core/src/auth/domain/ports/AuthService.port.ts b/packages/core/src/auth/domain/ports/AuthService.port.ts new file mode 100644 index 0000000..cd7bbac --- /dev/null +++ b/packages/core/src/auth/domain/ports/AuthService.port.ts @@ -0,0 +1,6 @@ +import { LoginInput } from "../../usecases/Login/LoginInput"; +import { LoginOutput } from "../../usecases/Login/LoginOutput"; + +export interface AuthServicePort { + login: (loginInput: LoginInput) => Promise +} \ No newline at end of file diff --git a/packages/core/src/auth/usecases/Login/Login.usecase.ts b/packages/core/src/auth/usecases/Login/Login.usecase.ts new file mode 100644 index 0000000..d314e92 --- /dev/null +++ b/packages/core/src/auth/usecases/Login/Login.usecase.ts @@ -0,0 +1,10 @@ +import { AuthServicePort } from "../../domain/ports/AuthService.port" +import { LoginInput } from "./LoginInput" +import { LoginOutput } from "./LoginOutput" + +export class Login { + static async execute(authService: AuthServicePort, payload: LoginInput): Promise { + const { email, password } = payload + return authService.login({ email, password }) + } +} \ No newline at end of file diff --git a/packages/core/src/auth/usecases/Login/LoginInput.ts b/packages/core/src/auth/usecases/Login/LoginInput.ts new file mode 100644 index 0000000..ab0cea8 --- /dev/null +++ b/packages/core/src/auth/usecases/Login/LoginInput.ts @@ -0,0 +1,4 @@ +export type LoginInput = { + email: string + password: string +} diff --git a/packages/core/src/auth/usecases/Login/LoginOutput.ts b/packages/core/src/auth/usecases/Login/LoginOutput.ts new file mode 100644 index 0000000..5b66383 --- /dev/null +++ b/packages/core/src/auth/usecases/Login/LoginOutput.ts @@ -0,0 +1,6 @@ +import { User } from "../../domain/models/User.model" + +export type LoginOutput = { + access_token: string + user: User +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e17f955..d6232fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,25 +28,41 @@ importers: specifiers: '@emotion/react': ^11.10.6 '@emotion/styled': ^11.10.6 + '@hookform/resolvers': ^3.1.0 + '@mui/icons-material': ^5.11.0 '@mui/material': ^5.11.16 + '@mui/x-date-pickers': ^5.0.20 + '@next/font': ^13.3.0 '@planigo/adapters': workspace:^1.0.0 '@planigo/core': workspace:^1.0.0 '@types/react': 18.0.30 + dayjs: ^1.11.7 next: 13.2.4 react: 18.2.0 react-dom: 18.2.0 + react-hook-form: ^7.43.9 react-query: ^3.39.3 typescript: 5.0.2 + zod: ^3.21.4 + zustand: ^4.3.7 dependencies: '@emotion/react': 11.10.6_2thlp7g7odiqm7dwhn3rlhxaa4 '@emotion/styled': 11.10.6_cfcdhdr57xmqdzhb6aq4iia5f4 + '@hookform/resolvers': 3.1.0_react-hook-form@7.43.9 + '@mui/icons-material': 5.11.16_erxbvppvw6koktnm4x3xkodjkq '@mui/material': 5.11.16_quat5witkhq3gbgscvy3yo7r7a + '@mui/x-date-pickers': 5.0.20_elwfccghdl2z7vyfxz6orcyspa + '@next/font': 13.3.0 '@planigo/adapters': link:../../adapters '@planigo/core': link:../../core + dayjs: 1.11.7 next: 13.2.4_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 + react-hook-form: 7.43.9_react@18.2.0 react-query: 3.39.3_biqbaboplfbrettd7655fr4n2y + zod: 3.21.4 + zustand: 4.3.7_react@18.2.0 devDependencies: '@types/react': 18.0.30 typescript: 5.0.2 @@ -420,6 +436,55 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@date-io/core/2.16.0: + resolution: {integrity: sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==} + dev: false + + /@date-io/date-fns/2.16.0: + resolution: {integrity: sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA==} + peerDependencies: + date-fns: ^2.0.0 + peerDependenciesMeta: + date-fns: + optional: true + dependencies: + '@date-io/core': 2.16.0 + dev: false + + /@date-io/dayjs/2.16.0_dayjs@1.11.7: + resolution: {integrity: sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw==} + peerDependencies: + dayjs: ^1.8.17 + peerDependenciesMeta: + dayjs: + optional: true + dependencies: + '@date-io/core': 2.16.0 + dayjs: 1.11.7 + dev: false + + /@date-io/luxon/2.16.1: + resolution: {integrity: sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ==} + peerDependencies: + luxon: ^1.21.3 || ^2.x || ^3.x + peerDependenciesMeta: + luxon: + optional: true + dependencies: + '@date-io/core': 2.16.0 + dev: false + + /@date-io/moment/2.16.1: + resolution: {integrity: sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ==} + peerDependencies: + moment: ^2.24.0 + peerDependenciesMeta: + moment: + optional: true + dependencies: + '@date-io/core': 2.16.0 + dev: false + /@emotion/babel-plugin/11.10.6: resolution: {integrity: sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==} dependencies: @@ -536,6 +601,14 @@ packages: resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} dev: false + /@hookform/resolvers/3.1.0_react-hook-form@7.43.9: + resolution: {integrity: sha512-z0A8K+Nxq+f83Whm/ajlwE6VtQlp/yPHZnXw7XWVPIGm1Vx0QV8KThU3BpbBRfAZ7/dYqCKKBNnQh85BkmBKkA==} + peerDependencies: + react-hook-form: ^7.0.0 + dependencies: + react-hook-form: 7.43.9_react@18.2.0 + dev: false + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -881,6 +954,23 @@ packages: resolution: {integrity: sha512-GxRfZ/HquQ/1nUc9qQVGReP6oOMS8/3QjPJ+23a7TMrxl2wjlmXrMNn7tRa30vZcGcDgEG+J0aseefUN0AoawQ==} dev: false + /@mui/icons-material/5.11.16_erxbvppvw6koktnm4x3xkodjkq: + resolution: {integrity: sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@mui/material': 5.11.16_quat5witkhq3gbgscvy3yo7r7a + '@types/react': 18.0.30 + react: 18.2.0 + dev: false + /@mui/material/5.11.16_quat5witkhq3gbgscvy3yo7r7a: resolution: {integrity: sha512-++glQqbZ3rMzOWB77yOvqRG+k8+scYTUKVWZpWff+GWsf6L10g9L2wgRhhAS8bDLuxCbXZlPNbSZowXDDw6z6Q==} engines: {node: '>=12.0.0'} @@ -1011,10 +1101,62 @@ packages: react-is: 18.2.0 dev: false + /@mui/x-date-pickers/5.0.20_elwfccghdl2z7vyfxz6orcyspa: + resolution: {integrity: sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.9.0 + '@emotion/styled': ^11.8.1 + '@mui/material': ^5.4.1 + '@mui/system': ^5.4.1 + date-fns: ^2.25.0 + dayjs: ^1.10.7 + luxon: ^1.28.0 || ^2.0.0 || ^3.0.0 + moment: ^2.29.1 + react: ^17.0.2 || ^18.0.0 + react-dom: ^17.0.2 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@date-io/core': 2.16.0 + '@date-io/date-fns': 2.16.0 + '@date-io/dayjs': 2.16.0_dayjs@1.11.7 + '@date-io/luxon': 2.16.1 + '@date-io/moment': 2.16.1 + '@emotion/react': 11.10.6_2thlp7g7odiqm7dwhn3rlhxaa4 + '@emotion/styled': 11.10.6_cfcdhdr57xmqdzhb6aq4iia5f4 + '@mui/material': 5.11.16_quat5witkhq3gbgscvy3yo7r7a + '@mui/utils': 5.11.13_react@18.2.0 + '@types/react-transition-group': 4.4.5 + clsx: 1.2.1 + dayjs: 1.11.7 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-transition-group: 4.4.5_biqbaboplfbrettd7655fr4n2y + rifm: 0.12.1_react@18.2.0 + dev: false + /@next/env/13.2.4: resolution: {integrity: sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==} dev: false + /@next/font/13.3.0: + resolution: {integrity: sha512-xUv7VRUA2Zr6n/KJDILyv7/zGy9xKUsyQURaQqYr7lVxn0REScazwyZQzhSm+DnJoUyo+9DcFs2J3WsZXHUvQw==} + dev: false + /@next/swc-android-arm-eabi/13.2.4: resolution: {integrity: sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==} engines: {node: '>= 10'} @@ -1636,6 +1778,10 @@ packages: /csstype/3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /dayjs/1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + dev: false + /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2917,6 +3063,15 @@ packages: scheduler: 0.23.0 dev: false + /react-hook-form/7.43.9_react@18.2.0: + resolution: {integrity: sha512-AUDN3Pz2NSeoxQ7Hs6OhQhDr6gtF9YRuutGDwPQqhSUAHJSgGl2VeY3qN19MG0SucpjgDiuMJ4iC5T5uB+eaNQ==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + dependencies: + react: 18.2.0 + dev: false + /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false @@ -3007,6 +3162,14 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + /rifm/0.12.1_react@18.2.0: + resolution: {integrity: sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==} + peerDependencies: + react: '>=16.8' + dependencies: + react: 18.2.0 + dev: false + /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -3307,6 +3470,14 @@ packages: picocolors: 1.0.0 dev: true + /use-sync-external-store/1.2.0_react@18.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true @@ -3399,3 +3570,23 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /zod/3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false + + /zustand/4.3.7_react@18.2.0: + resolution: {integrity: sha512-dY8ERwB9Nd21ellgkBZFhudER8KVlelZm8388B5nDAXhO/+FZDhYMuRnqDgu5SYyRgz/iaf8RKnbUs/cHfOGlQ==} + engines: {node: '>=12.7.0'} + peerDependencies: + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + immer: + optional: true + react: + optional: true + dependencies: + react: 18.2.0 + use-sync-external-store: 1.2.0_react@18.2.0 + dev: false From 0a82f81b3ef7ffa0e99cda6d0a6500cb96830b2d Mon Sep 17 00:00:00 2001 From: Jessy Date: Mon, 17 Apr 2023 21:41:45 +0200 Subject: [PATCH 16/16] feat: Complete Register usecase --- packages/adapters/src/AuthService.adapter.ts | 10 +- packages/adapters/src/storage/Localstorage.ts | 23 +++ .../apps/planigo/src/components/AppBar.tsx | 19 +-- .../apps/planigo/src/components/Register.tsx | 155 ++++++++++++++++++ .../planigo/src/pages/shops/[id]/index.tsx | 16 +- .../apps/planigo/src/services/Auth.service.ts | 22 ++- .../src/auth/domain/ports/AuthService.port.ts | 2 + .../auth/domain/ports/TokenService.port.ts | 5 + .../src/auth/usecases/Login/Login.usecase.ts | 3 +- .../usecases/Register/Register.usecase.ts | 19 +++ 10 files changed, 247 insertions(+), 27 deletions(-) create mode 100644 packages/adapters/src/storage/Localstorage.ts create mode 100644 packages/apps/planigo/src/components/Register.tsx create mode 100644 packages/core/src/auth/domain/ports/TokenService.port.ts create mode 100644 packages/core/src/auth/usecases/Register/Register.usecase.ts diff --git a/packages/adapters/src/AuthService.adapter.ts b/packages/adapters/src/AuthService.adapter.ts index 5eabd99..33b235c 100644 --- a/packages/adapters/src/AuthService.adapter.ts +++ b/packages/adapters/src/AuthService.adapter.ts @@ -2,7 +2,7 @@ import { axiosInstance } from "./config/axios"; import { AuthServicePort } from "@planigo/core/lib/auth/domain/ports/AuthService.port" import type { LoginOutput } from "@planigo/core/lib/auth/usecases/Login/LoginOutput" import type { LoginInput } from "@planigo/core/lib/auth/usecases/Login/LoginInput" - +import type { RegisterInput, RegisterOutput } from "@planigo/core/lib/auth/usecases/Register/Register.usecase" export function useAuthService(): AuthServicePort { const login = async (loginInput: LoginInput): Promise => { @@ -10,7 +10,13 @@ export function useAuthService(): AuthServicePort { return response.data } + const register = async (registerInput: RegisterInput): Promise => { + const response = await axiosInstance.post("/users/customer", registerInput) + return response.data + } + return { - login + login, + register } } \ No newline at end of file diff --git a/packages/adapters/src/storage/Localstorage.ts b/packages/adapters/src/storage/Localstorage.ts new file mode 100644 index 0000000..30ac3d7 --- /dev/null +++ b/packages/adapters/src/storage/Localstorage.ts @@ -0,0 +1,23 @@ +import { TokenServicePort } from "@planigo/core/lib/auth/domain/ports/TokenService.port" + +const tokenKey: string = "token_planigo"; + +export const useLocalStorage = (): TokenServicePort => { + const getToken = (): string | null => { + return typeof window !== undefined ? localStorage.getItem(tokenKey) : null; + } + + const setToken = (token: string): void => { + localStorage.setItem(tokenKey, token); + } + + const removeToken = (): void => { + localStorage.removeItem(tokenKey); + } + + return { + getToken, + setToken, + removeToken + } +} \ No newline at end of file diff --git a/packages/apps/planigo/src/components/AppBar.tsx b/packages/apps/planigo/src/components/AppBar.tsx index 8de11c5..3071fda 100644 --- a/packages/apps/planigo/src/components/AppBar.tsx +++ b/packages/apps/planigo/src/components/AppBar.tsx @@ -5,12 +5,12 @@ import Typography from "@mui/material/Typography"; import Container from "@mui/material/Container"; import Link from "next/link"; import { useUserStore } from "../store/user.store"; -// import { removeToken } from "@/helpers/localstorage.helper"; import { Router, useRouter } from "next/router"; import { useState } from "react"; import { Modal, Snackbar } from "@mui/material"; import Login from "./Login"; -//import Register from "./Register"; +import { useLocalStorage } from "@planigo/adapters/lib/storage/Localstorage"; +import Register from "./Register"; const settings = [ { @@ -27,7 +27,7 @@ const settings = [ path: "/", onClick: () => { useUserStore.getState().setCurrentUser(null); - // removeToken(); + useLocalStorage().removeToken() }, }, ]; @@ -38,7 +38,6 @@ function ResponsiveAppBar() { const [snackbarOpen, setSnackbarOpen] = useState(false); const [modalContent, setModalContent] = useState(); const currentUser = useUserStore((state) => state.currentUser); - const textColor = router.pathname === "/" ? { @@ -129,12 +128,12 @@ function ResponsiveAppBar() { href="#" onClick={() => { setIsModalOpen((prev) => !prev); - // setModalContent( - // setIsModalOpen(false)} - // openSnackbar={() => setSnackbarOpen(true)} - // /> - // ); + setModalContent( + setIsModalOpen(false)} + openSnackbar={() => setSnackbarOpen(true)} + /> + ); }} > diff --git a/packages/apps/planigo/src/components/Register.tsx b/packages/apps/planigo/src/components/Register.tsx new file mode 100644 index 0000000..0159828 --- /dev/null +++ b/packages/apps/planigo/src/components/Register.tsx @@ -0,0 +1,155 @@ +import { useForm } from "react-hook-form"; +import { z } from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + TextField, + Button, + Container, + Box, + Alert, + CircularProgress, +} from "@mui/material"; +import { authService } from "../services/Auth.service"; +import { Poppins } from "next/font/google"; + +const poppins = Poppins({ weight: "400", subsets: ["latin"] }); + +const schema = z + .object({ + firstName: z.string(), + lastName: z.string(), + email: z.string().email({ + message: "Le format de l'adresse mail doit être valide", + }), + password: z + .string() + .min(4, "Le mot de passe doit contenir au moins 4 caractères"), + confirmPassword: z.string(), + }) + .superRefine(({ confirmPassword, password }, ctx) => { + if (confirmPassword !== password) { + ctx.addIssue({ + code: "custom", + message: "Les mots de passe ne correspondent pas", + path: ["confirmPassword"], + }); + } + }); + +export type FormRegisterSchemaType = z.infer; + +const Register = ({ + closeModal, + openSnackbar, +}: { + closeModal: () => void; + openSnackbar: () => void; +}) => { + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(schema), + }); + + const { + mutate: registerCustomer, + isError, + isLoading, + } = authService().useRegisterCustomerMutation({ + onSuccess: () => { + openSnackbar(); + closeModal(); + }, + }); + + const onSubmit = (data: FormRegisterSchemaType) => { + registerCustomer(data); + }; + + return ( + +

Inscription

+
+ + {isError && ( + L'email est déjà utilisée + )} + + + + + + + +
+
+ ); +}; + +export default Register; diff --git a/packages/apps/planigo/src/pages/shops/[id]/index.tsx b/packages/apps/planigo/src/pages/shops/[id]/index.tsx index d068ce4..4c4388f 100644 --- a/packages/apps/planigo/src/pages/shops/[id]/index.tsx +++ b/packages/apps/planigo/src/pages/shops/[id]/index.tsx @@ -32,11 +32,6 @@ export const getServerSideProps: GetServerSideProps = async ({ query }) => { const shopHours: Hour[] = await GetShopHours.execute(shoppingService, { shopId }); const nextShopReservations = await GetNextReservations.execute(reservationService, { shopId }); - console.log(shop) - console.log(shopServices) - console.log(shopHours) - console.log(nextShopReservations) - return { props: { shop, @@ -94,17 +89,18 @@ const ShopDetailsPage = ({ }} > {shopServices.map((service) => ( - {service.id}

+ // + // /> ))}

Les horaires

diff --git a/packages/apps/planigo/src/services/Auth.service.ts b/packages/apps/planigo/src/services/Auth.service.ts index 8dcc35a..b986fb7 100644 --- a/packages/apps/planigo/src/services/Auth.service.ts +++ b/packages/apps/planigo/src/services/Auth.service.ts @@ -1,8 +1,10 @@ import type { User } from "@planigo/core/lib/auth/domain/models/User.model"; import type { AuthServicePort } from "@planigo/core/lib/auth/domain/ports/AuthService.port" import { useAuthService } from "@planigo/adapters/lib/AuthService.adapter" +import { useLocalStorage } from "@planigo/adapters/lib/storage/Localstorage" import { useMutation } from "react-query"; import { FormLoginSchemaType } from "../components/Login"; +import { FormRegisterSchemaType } from "../components/Register"; export const authService = () => { @@ -13,8 +15,7 @@ export const authService = () => { mutationKey: "login", mutationFn: async (creds: FormLoginSchemaType) => { const response = await authService.login(creds) - - // setToken(response.access_token); + useLocalStorage().setToken(response.access_token) return response; }, @@ -23,7 +24,22 @@ export const authService = () => { }, }); + const useRegisterCustomerMutation = ({ + onSuccess, + }: { + onSuccess: () => void; + }) => + useMutation({ + mutationFn: async (userPayload: FormRegisterSchemaType) => { + const { firstName: firstname, lastName: lastname, email, password } = userPayload + const { data } = await authService.register({ firstname, lastname, email, password }) + return data; + }, + onSuccess, + }); + return { - useLoginMutation + useLoginMutation, + useRegisterCustomerMutation } } \ No newline at end of file diff --git a/packages/core/src/auth/domain/ports/AuthService.port.ts b/packages/core/src/auth/domain/ports/AuthService.port.ts index cd7bbac..ac1b929 100644 --- a/packages/core/src/auth/domain/ports/AuthService.port.ts +++ b/packages/core/src/auth/domain/ports/AuthService.port.ts @@ -1,6 +1,8 @@ +import { RegisterInput, RegisterOutput } from "../../usecases/Register/Register.usecase"; import { LoginInput } from "../../usecases/Login/LoginInput"; import { LoginOutput } from "../../usecases/Login/LoginOutput"; export interface AuthServicePort { login: (loginInput: LoginInput) => Promise + register: (registerInput: RegisterInput) => Promise } \ No newline at end of file diff --git a/packages/core/src/auth/domain/ports/TokenService.port.ts b/packages/core/src/auth/domain/ports/TokenService.port.ts new file mode 100644 index 0000000..c3a6e8a --- /dev/null +++ b/packages/core/src/auth/domain/ports/TokenService.port.ts @@ -0,0 +1,5 @@ +export interface TokenServicePort { + getToken: () => string | null + setToken: (token: string) => void + removeToken: () => void +} \ No newline at end of file diff --git a/packages/core/src/auth/usecases/Login/Login.usecase.ts b/packages/core/src/auth/usecases/Login/Login.usecase.ts index d314e92..a6c59b4 100644 --- a/packages/core/src/auth/usecases/Login/Login.usecase.ts +++ b/packages/core/src/auth/usecases/Login/Login.usecase.ts @@ -4,7 +4,6 @@ import { LoginOutput } from "./LoginOutput" export class Login { static async execute(authService: AuthServicePort, payload: LoginInput): Promise { - const { email, password } = payload - return authService.login({ email, password }) + return authService.login(payload) } } \ No newline at end of file diff --git a/packages/core/src/auth/usecases/Register/Register.usecase.ts b/packages/core/src/auth/usecases/Register/Register.usecase.ts new file mode 100644 index 0000000..6b09e35 --- /dev/null +++ b/packages/core/src/auth/usecases/Register/Register.usecase.ts @@ -0,0 +1,19 @@ +import { User } from "../../domain/models/User.model" +import { AuthServicePort } from "../../domain/ports/AuthService.port" + +export type RegisterInput = { + firstname: string + lastname: string + email: string + password: string +} + +export type RegisterOutput = { + user: User +} + +export class Register { + static async execute(authService: AuthServicePort, payload: RegisterInput): Promise { + return authService.register(payload) + } +} \ No newline at end of file