diff --git a/.eslintignore b/.eslintignore
index 9c8ee55..30b7744 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,5 +1,6 @@
node_modules/
coverage/
.idea/
+.next/
.vscode/
build/
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..bb606fc
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,84 @@
+const {resolve} = require("node:path");
+
+const project = resolve(__dirname, "tsconfig.json");
+
+module.exports = {
+ root: true,
+ plugins: ["prettier", "import"],
+ extends: [
+ require.resolve("@vercel/style-guide/eslint/typescript"),
+ require.resolve("@vercel/style-guide/eslint/react"),
+ require.resolve("@vercel/style-guide/eslint/next"),
+ "plugin:prettier/recommended",
+ ],
+ parserOptions: {
+ ecmaVersion: "latest",
+ project,
+ },
+ settings: {
+ "import/resolver": {
+ typescript: {
+ project,
+ },
+ },
+ },
+ rules: {
+ "prettier/prettier": [
+ "warn",
+ {
+ printWidth: 100,
+ trailingComma: "all",
+ tabWidth: 2,
+ semi: true,
+ singleQuote: false,
+ bracketSpacing: false,
+ arrowParens: "always",
+ endOfLine: "auto",
+ },
+ ],
+ "import/order": [
+ "warn",
+ {
+ groups: ["type", "builtin", "object", "external", "internal", "parent", "sibling", "index"],
+ pathGroups: [
+ {
+ pattern: "~/**",
+ group: "external",
+ position: "after",
+ },
+ ],
+ "newlines-between": "always",
+ },
+ ],
+ "padding-line-between-statements": [
+ "warn",
+ {blankLine: "always", prev: "*", next: ["return", "export"]},
+ {blankLine: "always", prev: ["const", "let", "var"], next: "*"},
+ {blankLine: "any", prev: ["const", "let", "var"], next: ["const", "let", "var"]},
+ ],
+ "no-console": "warn",
+ "react/prop-types": "off",
+ "react/jsx-uses-react": "off",
+ "react/react-in-jsx-scope": "off",
+ "react/self-closing-comp": "warn",
+ "react/jsx-sort-props": [
+ "warn",
+ {
+ callbacksLast: true,
+ shorthandFirst: true,
+ noSortAlphabetically: false,
+ reservedFirst: true,
+ },
+ ],
+ "@typescript-eslint/no-non-null-assertion": "off",
+ "@typescript-eslint/explicit-function-return-type": "off",
+ "@typescript-eslint/no-unused-vars": [
+ "warn",
+ {
+ args: "after-used",
+ ignoreRestSiblings: false,
+ argsIgnorePattern: "^_.*?$",
+ },
+ ],
+ },
+};
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index f2f6ae7..0000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "env": {
- "browser": false,
- "es2021": true,
- "node": true
- },
- "extends": [
- "plugin:prettier/recommended",
- "next",
- "next/core-web-vitals"
- ],
- "plugins": ["react", "prettier", "import", "@typescript-eslint"],
- "parser": "@typescript-eslint/parser",
- "parserOptions": {
- "ecmaFeatures": {
- "jsx": true
- },
- "ecmaVersion": 12,
- "sourceType": "module"
- },
- "settings": {
- "react": {
- "version": "detect"
- }
- },
- "rules": {
- "no-console": "warn",
- "react/prop-types": "off",
- "react/jsx-uses-react": "off",
- "react/react-in-jsx-scope": "off",
- "prettier/prettier": [
- "warn",
- {
- "printWidth": 100,
- "trailingComma": "all",
- "tabWidth": 2,
- "semi": true,
- "singleQuote": false,
- "bracketSpacing": false,
- "arrowParens": "always",
- "endOfLine":"auto"
- }
- ],
- "@typescript-eslint/no-unused-vars": [
- "warn",
- {
- "args": "after-used",
- "ignoreRestSiblings": false,
- "argsIgnorePattern": "^_.*?$"
- }
- ],
- "import/order": ["warn", {
- "groups": ["type", "builtin", "object", "external", "internal", "parent", "sibling", "index"],
- "pathGroups": [{
- "pattern": "~/**",
- "group": "external",
- "position": "after"
- }, {
- "pattern": "@/**",
- "group": "external",
- "position": "after"
- }],
- "newlines-between": "always"
- }],
- "react/self-closing-comp": "warn",
- "react/jsx-sort-props": [
- "warn",
- {
- "callbacksLast": true,
- "shorthandFirst": true,
- "noSortAlphabetically": false,
- "reservedFirst": true
- }
- ],
- "padding-line-between-statements": [
- "warn",
- {"blankLine": "always", "prev": "*", "next": "return"},
- {"blankLine": "always", "prev": ["const", "let", "var", "function"], "next": "*"},
- {"blankLine": "any", "prev": ["const", "let", "var"], "next": ["const", "let", "var"]}
- ]
- }
-}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..448434d
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,28 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Next.js: debug server-side",
+ "type": "node-terminal",
+ "request": "launch",
+ "command": "pnpm dev"
+ },
+ {
+ "name": "Next.js: debug client-side",
+ "type": "chrome",
+ "request": "launch",
+ "url": "http://localhost:3000"
+ },
+ {
+ "name": "Next.js: debug full stack",
+ "type": "node-terminal",
+ "request": "launch",
+ "command": "pnpm dev",
+ "serverReadyAction": {
+ "pattern": "started server on .+, url: (https?://.+)",
+ "uriFormat": "%s",
+ "action": "debugWithChrome"
+ }
+ }
+ ]
+}
diff --git a/next-env.d.ts b/next-env.d.ts
index 4f11a03..fd36f94 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,5 +1,6 @@
///
///
+///
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/package.json b/package.json
index 6b910c4..1caee31 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,8 @@
"clsx": "^1.2.1",
"framer-motion": "^9.0.2",
"lucide-react": "^0.189.0",
- "next": "^13.1.6",
+ "next": "13.3.3-canary.1",
+ "next-themes": "^0.2.1",
"papaparse": "^5.3.2",
"react": "18.2.0",
"react-dom": "18.2.0",
@@ -27,6 +28,7 @@
"tailwindcss-animate": "^1.0.5"
},
"devDependencies": {
+ "@next/eslint-plugin-next": "13.3.3-canary.1",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@types/jest": "^29.4.0",
@@ -36,6 +38,7 @@
"@types/react-dom": "^18.0.10",
"@typescript-eslint/eslint-plugin": "^5.51.0",
"@typescript-eslint/parser": "^5.51.0",
+ "@vercel/style-guide": "^4.0.2",
"autoprefixer": "^10.4.13",
"cypress": "^12.5.1",
"eslint": "^8.34.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8a92f83..074ce8c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -29,8 +29,11 @@ dependencies:
specifier: ^0.189.0
version: 0.189.0(react@18.2.0)
next:
- specifier: ^13.1.6
- version: 13.1.6(@babel/core@7.20.12)(react-dom@18.2.0)(react@18.2.0)
+ specifier: 13.3.3-canary.1
+ version: 13.3.3-canary.1(@babel/core@7.20.12)(react-dom@18.2.0)(react@18.2.0)
+ next-themes:
+ specifier: ^0.2.1
+ version: 0.2.1(next@13.3.3-canary.1)(react-dom@18.2.0)(react@18.2.0)
papaparse:
specifier: ^5.3.2
version: 5.3.2
@@ -48,6 +51,9 @@ dependencies:
version: 1.0.5(tailwindcss@3.2.6)
devDependencies:
+ '@next/eslint-plugin-next':
+ specifier: 13.3.3-canary.1
+ version: 13.3.3-canary.1
'@testing-library/jest-dom':
specifier: ^5.16.5
version: 5.16.5
@@ -75,6 +81,9 @@ devDependencies:
'@typescript-eslint/parser':
specifier: ^5.51.0
version: 5.51.0(eslint@8.34.0)(typescript@4.9.5)
+ '@vercel/style-guide':
+ specifier: ^4.0.2
+ version: 4.0.2(@next/eslint-plugin-next@13.3.3-canary.1)(eslint@8.34.0)(jest@29.4.2)(prettier@2.8.4)(typescript@4.9.5)
autoprefixer:
specifier: ^10.4.13
version: 10.4.13(postcss@8.4.21)
@@ -92,7 +101,7 @@ devDependencies:
version: 2.12.1(eslint@8.34.0)
eslint-plugin-import:
specifier: ^2.27.5
- version: 2.27.5(@typescript-eslint/parser@5.51.0)(eslint@8.34.0)
+ version: 2.27.5(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.34.0)
eslint-plugin-prettier:
specifier: ^4.2.1
version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.34.0)(prettier@2.8.4)
@@ -169,6 +178,20 @@ packages:
transitivePeerDependencies:
- supports-color
+ /@babel/eslint-parser@7.21.3(@babel/core@7.20.12)(eslint@8.34.0):
+ resolution: {integrity: sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==}
+ engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
+ peerDependencies:
+ '@babel/core': '>=7.11.0'
+ eslint: ^7.5.0 || ^8.0.0
+ dependencies:
+ '@babel/core': 7.20.12
+ '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
+ eslint: 8.34.0
+ eslint-visitor-keys: 2.1.0
+ semver: 6.3.0
+ dev: true
+
/@babel/generator@7.20.14:
resolution: {integrity: sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==}
engines: {node: '>=6.9.0'}
@@ -1704,6 +1727,16 @@ packages:
resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==}
dev: false
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.34.0):
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ dependencies:
+ eslint: 8.34.0
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
/@eslint/eslintrc@1.4.1:
resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -2012,6 +2045,19 @@ packages:
'@jridgewell/resolve-uri': 3.1.0
'@jridgewell/sourcemap-codec': 1.4.14
+ /@microsoft/tsdoc-config@0.16.2:
+ resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==}
+ dependencies:
+ '@microsoft/tsdoc': 0.14.2
+ ajv: 6.12.6
+ jju: 1.4.0
+ resolve: 1.19.0
+ dev: true
+
+ /@microsoft/tsdoc@0.14.2:
+ resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==}
+ dev: true
+
/@motionone/animation@10.15.1:
resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==}
dependencies:
@@ -2059,30 +2105,18 @@ packages:
tslib: 2.5.0
dev: false
- /@next/env@13.1.6:
- resolution: {integrity: sha512-s+W9Fdqh5MFk6ECrbnVmmAOwxKQuhGMT7xXHrkYIBMBcTiOqNWhv5KbJIboKR5STXxNXl32hllnvKaffzFaWQg==}
- dev: false
-
- /@next/swc-android-arm-eabi@13.1.6:
- resolution: {integrity: sha512-F3/6Z8LH/pGlPzR1AcjPFxx35mPqjE5xZcf+IL+KgbW9tMkp7CYi1y7qKrEWU7W4AumxX/8OINnDQWLiwLasLQ==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [android]
- requiresBuild: true
+ /@next/env@13.3.3-canary.1:
+ resolution: {integrity: sha512-bds/Fb78aLcJEuAoKycSzEsaQKr5Yk0mqyVB81B9/EYUsX+7KxsGXswjBeK3aJojk4AMmr4sUE2m4kCBzRh77A==}
dev: false
- optional: true
- /@next/swc-android-arm64@13.1.6:
- resolution: {integrity: sha512-cMwQjnB8vrYkWyK/H0Rf2c2pKIH4RGjpKUDvbjVAit6SbwPDpmaijLio0LWFV3/tOnY6kvzbL62lndVA0mkYpw==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: false
- optional: true
+ /@next/eslint-plugin-next@13.3.3-canary.1:
+ resolution: {integrity: sha512-AXrHdqFVUrCTZbq0P2gtao31eC5VMBHW1xun+kxlTBS8Qf8Mg60Ml8jVaVY3vr4aFVGRj4sgkYF5xL4aMGlbEA==}
+ dependencies:
+ glob: 7.1.7
+ dev: true
- /@next/swc-darwin-arm64@13.1.6:
- resolution: {integrity: sha512-KKRQH4DDE4kONXCvFMNBZGDb499Hs+xcFAwvj+rfSUssIDrZOlyfJNy55rH5t2Qxed1e4K80KEJgsxKQN1/fyw==}
+ /@next/swc-darwin-arm64@13.3.3-canary.1:
+ resolution: {integrity: sha512-KIzllv5XbvzinDWlHsBKRAHSPqT6tgQAEOnDcSDvUIzHpXfVCnXtUHI0ajAPKlgQvQ/kjaIMHxaIDNU6iEXxZg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
@@ -2090,8 +2124,8 @@ packages:
dev: false
optional: true
- /@next/swc-darwin-x64@13.1.6:
- resolution: {integrity: sha512-/uOky5PaZDoaU99ohjtNcDTJ6ks/gZ5ykTQDvNZDjIoCxFe3+t06bxsTPY6tAO6uEAw5f6vVFX5H5KLwhrkZCA==}
+ /@next/swc-darwin-x64@13.3.3-canary.1:
+ resolution: {integrity: sha512-e72gdOViNSdvyfct9wbLOoYplUyGcfV99g3+hLVY8ttr8neOS3D0n6EsDbA5zWIXYMU3WsnmpoOMfwbVYhBj3A==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
@@ -2099,26 +2133,8 @@ packages:
dev: false
optional: true
- /@next/swc-freebsd-x64@13.1.6:
- resolution: {integrity: sha512-qaEALZeV7to6weSXk3Br80wtFQ7cFTpos/q+m9XVRFggu+8Ib895XhMWdJBzew6aaOcMvYR6KQ6JmHA2/eMzWw==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [freebsd]
- requiresBuild: true
- dev: false
- optional: true
-
- /@next/swc-linux-arm-gnueabihf@13.1.6:
- resolution: {integrity: sha512-OybkbC58A1wJ+JrJSOjGDvZzrVEQA4sprJejGqMwiZyLqhr9Eo8FXF0y6HL+m1CPCpPhXEHz/2xKoYsl16kNqw==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
-
- /@next/swc-linux-arm64-gnu@13.1.6:
- resolution: {integrity: sha512-yCH+yDr7/4FDuWv6+GiYrPI9kcTAO3y48UmaIbrKy8ZJpi7RehJe3vIBRUmLrLaNDH3rY1rwoHi471NvR5J5NQ==}
+ /@next/swc-linux-arm64-gnu@13.3.3-canary.1:
+ resolution: {integrity: sha512-jUnJCbdY97BgZQslg2sDhmCrllWRci9y8qUcAly29kIpQGbFVNYslcFOTOMcQAfOax2VwBp+lDLzPwnc9fiXmw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@@ -2126,8 +2142,8 @@ packages:
dev: false
optional: true
- /@next/swc-linux-arm64-musl@13.1.6:
- resolution: {integrity: sha512-ECagB8LGX25P9Mrmlc7Q/TQBb9rGScxHbv/kLqqIWs2fIXy6Y/EiBBiM72NTwuXUFCNrWR4sjUPSooVBJJ3ESQ==}
+ /@next/swc-linux-arm64-musl@13.3.3-canary.1:
+ resolution: {integrity: sha512-IOm38wd6qyZhrZT9uoRcLgkUiHuF1ga14AuRyiJ+67yvC6LK12r4KtQsVIXttOmf3xawAODou/EFMUGjij+ibA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
@@ -2135,8 +2151,8 @@ packages:
dev: false
optional: true
- /@next/swc-linux-x64-gnu@13.1.6:
- resolution: {integrity: sha512-GT5w2mruk90V/I5g6ScuueE7fqj/d8Bui2qxdw6lFxmuTgMeol5rnzAv4uAoVQgClOUO/MULilzlODg9Ib3Y4Q==}
+ /@next/swc-linux-x64-gnu@13.3.3-canary.1:
+ resolution: {integrity: sha512-D0BWzBocUdW2IiFwujZ0zABQ0lhLND1Uz9hQz1PIRibTVIf6GM1le/bRWpsIkGeyN4i62dd1Yi92ZulAPJDWuw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@@ -2144,8 +2160,8 @@ packages:
dev: false
optional: true
- /@next/swc-linux-x64-musl@13.1.6:
- resolution: {integrity: sha512-keFD6KvwOPzmat4TCnlnuxJCQepPN+8j3Nw876FtULxo8005Y9Ghcl7ACcR8GoiKoddAq8gxNBrpjoxjQRHeAQ==}
+ /@next/swc-linux-x64-musl@13.3.3-canary.1:
+ resolution: {integrity: sha512-UH2A0v4m+n5o08Xg2QbBR6AnE5aJgnbJMAbIs/hLXl+b+R6m1QyS5YStConrIIqHCAwbJCINdkk1rVk2QSr2kQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
@@ -2153,8 +2169,8 @@ packages:
dev: false
optional: true
- /@next/swc-win32-arm64-msvc@13.1.6:
- resolution: {integrity: sha512-OwertslIiGQluFvHyRDzBCIB07qJjqabAmINlXUYt7/sY7Q7QPE8xVi5beBxX/rxTGPIbtyIe3faBE6Z2KywhQ==}
+ /@next/swc-win32-arm64-msvc@13.3.3-canary.1:
+ resolution: {integrity: sha512-qrgY/WgPv6fIH5HWdQNmHSMBbu7Vtr2yhPatZSRVeKGL97q1pxHYYAT1r9U8Od+q3SiThngjuUz0jnvoz00d9g==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
@@ -2162,8 +2178,8 @@ packages:
dev: false
optional: true
- /@next/swc-win32-ia32-msvc@13.1.6:
- resolution: {integrity: sha512-g8zowiuP8FxUR9zslPmlju7qYbs2XBtTLVSxVikPtUDQedhcls39uKYLvOOd1JZg0ehyhopobRoH1q+MHlIN/w==}
+ /@next/swc-win32-ia32-msvc@13.3.3-canary.1:
+ resolution: {integrity: sha512-Ngo8+0wsIMugmjCcTiqlIKL6kT4ZxWVQZXBO2hiDF4No5BrGS+y6gbaFeEN/egn4TpznC6vI7neLyIN5FRxVYw==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
@@ -2171,8 +2187,8 @@ packages:
dev: false
optional: true
- /@next/swc-win32-x64-msvc@13.1.6:
- resolution: {integrity: sha512-Ls2OL9hi3YlJKGNdKv8k3X/lLgc3VmLG3a/DeTkAd+lAituJp8ZHmRmm9f9SL84fT3CotlzcgbdaCDfFwFA6bA==}
+ /@next/swc-win32-x64-msvc@13.3.3-canary.1:
+ resolution: {integrity: sha512-DIAcMiPAhnhDnQz/M2DHKUnT2AGUs4TCVMpynuaSuHoogqbxqSN6snk+Pi+B9zCD5gQAZl6np7bCou52X+h3Nw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -2180,6 +2196,12 @@ packages:
dev: false
optional: true
+ /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1:
+ resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
+ dependencies:
+ eslint-scope: 5.1.1
+ dev: true
+
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -2198,10 +2220,26 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0
+ /@pkgr/utils@2.3.1:
+ resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ dependencies:
+ cross-spawn: 7.0.3
+ is-glob: 4.0.3
+ open: 8.4.2
+ picocolors: 1.0.0
+ tiny-glob: 0.2.9
+ tslib: 2.5.0
+ dev: true
+
/@popperjs/core@2.11.6:
resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==}
dev: false
+ /@rushstack/eslint-patch@1.2.0:
+ resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
+ dev: true
+
/@sideway/address@4.1.4:
resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==}
dependencies:
@@ -2232,8 +2270,8 @@ packages:
'@sinonjs/commons': 2.0.0
dev: true
- /@swc/helpers@0.4.14:
- resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
+ /@swc/helpers@0.5.1:
+ resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==}
dependencies:
tslib: 2.5.0
dev: false
@@ -2369,6 +2407,10 @@ packages:
resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==}
dev: true
+ /@types/normalize-package-data@2.4.1:
+ resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
+ dev: true
+
/@types/papaparse@5.3.7:
resolution: {integrity: sha512-f2HKmlnPdCvS0WI33WtCs5GD7X1cxzzS/aduaxSu3I7TbhWlENjSPs6z5TaB9K0J+BH1jbmqTaM+ja5puis4wg==}
dependencies:
@@ -2498,6 +2540,14 @@ packages:
'@typescript-eslint/visitor-keys': 5.51.0
dev: true
+ /@typescript-eslint/scope-manager@5.59.1:
+ resolution: {integrity: sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.59.1
+ '@typescript-eslint/visitor-keys': 5.59.1
+ dev: true
+
/@typescript-eslint/type-utils@5.51.0(eslint@8.34.0)(typescript@4.9.5):
resolution: {integrity: sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -2523,6 +2573,11 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
+ /@typescript-eslint/types@5.59.1:
+ resolution: {integrity: sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
/@typescript-eslint/typescript-estree@5.51.0(typescript@4.9.5):
resolution: {integrity: sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -2544,6 +2599,27 @@ packages:
- supports-color
dev: true
+ /@typescript-eslint/typescript-estree@5.59.1(typescript@4.9.5):
+ resolution: {integrity: sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.59.1
+ '@typescript-eslint/visitor-keys': 5.59.1
+ debug: 4.3.4(supports-color@8.1.1)
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.3.8
+ tsutils: 3.21.0(typescript@4.9.5)
+ typescript: 4.9.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@typescript-eslint/utils@5.51.0(eslint@8.34.0)(typescript@4.9.5):
resolution: {integrity: sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -2564,6 +2640,26 @@ packages:
- typescript
dev: true
+ /@typescript-eslint/utils@5.59.1(eslint@8.34.0)(typescript@4.9.5):
+ resolution: {integrity: sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.34.0)
+ '@types/json-schema': 7.0.11
+ '@types/semver': 7.3.13
+ '@typescript-eslint/scope-manager': 5.59.1
+ '@typescript-eslint/types': 5.59.1
+ '@typescript-eslint/typescript-estree': 5.59.1(typescript@4.9.5)
+ eslint: 8.34.0
+ eslint-scope: 5.1.1
+ semver: 7.3.8
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
/@typescript-eslint/visitor-keys@5.51.0:
resolution: {integrity: sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -2572,6 +2668,62 @@ packages:
eslint-visitor-keys: 3.3.0
dev: true
+ /@typescript-eslint/visitor-keys@5.59.1:
+ resolution: {integrity: sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.59.1
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /@vercel/style-guide@4.0.2(@next/eslint-plugin-next@13.3.3-canary.1)(eslint@8.34.0)(jest@29.4.2)(prettier@2.8.4)(typescript@4.9.5):
+ resolution: {integrity: sha512-FroL+oOePzhw7n/I+f7zr4WNroGHT/+2TlW6WH9+CVSjMNsEyu7Qstj2mI5gWIBjT1Y2ZImKPppCzI2cIYmNZw==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ '@next/eslint-plugin-next': ^12.3.0
+ eslint: ^8.24.0
+ prettier: ^2.7.0
+ typescript: ^4.8.0
+ peerDependenciesMeta:
+ '@next/eslint-plugin-next':
+ optional: true
+ eslint:
+ optional: true
+ prettier:
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@babel/core': 7.20.12
+ '@babel/eslint-parser': 7.21.3(@babel/core@7.20.12)(eslint@8.34.0)
+ '@next/eslint-plugin-next': 13.3.3-canary.1
+ '@rushstack/eslint-patch': 1.2.0
+ '@typescript-eslint/eslint-plugin': 5.51.0(@typescript-eslint/parser@5.51.0)(eslint@8.34.0)(typescript@4.9.5)
+ '@typescript-eslint/parser': 5.51.0(eslint@8.34.0)(typescript@4.9.5)
+ eslint: 8.34.0
+ eslint-config-prettier: 8.6.0(eslint@8.34.0)
+ eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.27.5)
+ eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.51.0)(eslint-plugin-import@2.27.5)(eslint@8.34.0)
+ eslint-plugin-eslint-comments: 3.2.0(eslint@8.34.0)
+ eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.34.0)
+ eslint-plugin-jest: 27.2.1(@typescript-eslint/eslint-plugin@5.51.0)(eslint@8.34.0)(jest@29.4.2)(typescript@4.9.5)
+ eslint-plugin-jsx-a11y: 6.7.1(eslint@8.34.0)
+ eslint-plugin-playwright: 0.11.2(eslint-plugin-jest@27.2.1)(eslint@8.34.0)
+ eslint-plugin-react: 7.32.2(eslint@8.34.0)
+ eslint-plugin-react-hooks: 4.6.0(eslint@8.34.0)
+ eslint-plugin-testing-library: 5.10.3(eslint@8.34.0)(typescript@4.9.5)
+ eslint-plugin-tsdoc: 0.2.17
+ eslint-plugin-unicorn: 43.0.2(eslint@8.34.0)
+ prettier: 2.8.4
+ prettier-plugin-packagejson: 2.4.3(prettier@2.8.4)
+ typescript: 4.9.5
+ transitivePeerDependencies:
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - jest
+ - supports-color
+ dev: true
+
/@zag-js/element-size@0.3.0:
resolution: {integrity: sha512-5/hEI+0c6ZNCx6KHlOS5/WeHsd6+I7gk7Y/b/zATp4Rp3tHirs/tu1frq+iy5BmfaG9hbQtfHfUJTjOcI5jnoQ==}
dev: false
@@ -2764,6 +2916,10 @@ packages:
engines: {node: '>=0.8'}
dev: true
+ /ast-types-flow@0.0.7:
+ resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
+ dev: true
+
/astral-regex@2.0.0:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
@@ -2810,6 +2966,11 @@ packages:
resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
dev: true
+ /axe-core@4.7.0:
+ resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==}
+ engines: {node: '>=4'}
+ dev: true
+
/axios@0.27.2:
resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
dependencies:
@@ -2829,6 +2990,12 @@ packages:
- debug
dev: false
+ /axobject-query@3.1.1:
+ resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==}
+ dependencies:
+ deep-equal: 2.2.0
+ dev: true
+
/babel-jest@29.4.2(@babel/core@7.20.12):
resolution: {integrity: sha512-vcghSqhtowXPG84posYkkkzcZsdayFkubUgbE3/1tuGbX7AQtwCkkNA/wIbB0BMjuCPoqTkiDyKN7Ty7d3uwNQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -2987,6 +3154,18 @@ packages:
ieee754: 1.2.1
dev: true
+ /builtin-modules@3.3.0:
+ resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+ dependencies:
+ streamsearch: 1.1.0
+ dev: false
+
/cachedir@2.3.0:
resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==}
engines: {node: '>=6'}
@@ -3093,6 +3272,13 @@ packages:
typescript: 4.9.5
dev: false
+ /clean-regexp@1.0.0:
+ resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
+ engines: {node: '>=4'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
/clean-stack@2.2.0:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
@@ -3304,6 +3490,10 @@ packages:
yauzl: 2.10.0
dev: true
+ /damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+ dev: true
+
/dashdash@1.14.1:
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
engines: {node: '>=0.10'}
@@ -3374,6 +3564,11 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+ dev: true
+
/define-properties@1.2.0:
resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
engines: {node: '>= 0.4'}
@@ -3389,11 +3584,21 @@ packages:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
+ /detect-indent@7.0.1:
+ resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==}
+ engines: {node: '>=12.20'}
+ dev: true
+
/detect-newline@3.1.0:
resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
engines: {node: '>=8'}
dev: true
+ /detect-newline@4.0.0:
+ resolution: {integrity: sha512-1aXUEPdfGdzVPFpzGJJNgq9o81bGg1s09uxTWsqBlo9PI332uyJRQq13+LK/UN4JfxJbFdCXonUFQ9R/p7yCtw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
/detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
dev: false
@@ -3462,12 +3667,24 @@ packages:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
dev: true
+ /emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: true
+
/end-of-stream@1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
dependencies:
once: 1.4.0
dev: true
+ /enhanced-resolve@5.13.0:
+ resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ graceful-fs: 4.2.10
+ tapable: 2.2.1
+ dev: true
+
/enquirer@2.3.6:
resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
engines: {node: '>=8.6'}
@@ -3583,6 +3800,15 @@ packages:
eslint: 8.34.0
dev: true
+ /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.27.5):
+ resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==}
+ engines: {node: '>= 4'}
+ peerDependencies:
+ eslint-plugin-import: '>=1.4.0'
+ dependencies:
+ eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.34.0)
+ dev: true
+
/eslint-import-resolver-node@0.3.7:
resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==}
dependencies:
@@ -3593,7 +3819,31 @@ packages:
- supports-color
dev: true
- /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-node@0.3.7)(eslint@8.34.0):
+ /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.51.0)(eslint-plugin-import@2.27.5)(eslint@8.34.0):
+ resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ dependencies:
+ debug: 4.3.4(supports-color@8.1.1)
+ enhanced-resolve: 5.13.0
+ eslint: 8.34.0
+ eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.34.0)
+ eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.34.0)
+ get-tsconfig: 4.5.0
+ globby: 13.1.4
+ is-core-module: 2.11.0
+ is-glob: 4.0.3
+ synckit: 0.8.5
+ transitivePeerDependencies:
+ - '@typescript-eslint/parser'
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.34.0):
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
engines: {node: '>=4'}
peerDependencies:
@@ -3618,6 +3868,7 @@ packages:
debug: 3.2.7(supports-color@8.1.1)
eslint: 8.34.0
eslint-import-resolver-node: 0.3.7
+ eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.51.0)(eslint-plugin-import@2.27.5)(eslint@8.34.0)
transitivePeerDependencies:
- supports-color
dev: true
@@ -3631,7 +3882,18 @@ packages:
globals: 11.12.0
dev: true
- /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.51.0)(eslint@8.34.0):
+ /eslint-plugin-eslint-comments@3.2.0(eslint@8.34.0):
+ resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==}
+ engines: {node: '>=6.5.0'}
+ peerDependencies:
+ eslint: '>=4.19.1'
+ dependencies:
+ escape-string-regexp: 1.0.5
+ eslint: 8.34.0
+ ignore: 5.2.4
+ dev: true
+
+ /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.34.0):
resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==}
engines: {node: '>=4'}
peerDependencies:
@@ -3649,7 +3911,7 @@ packages:
doctrine: 2.1.0
eslint: 8.34.0
eslint-import-resolver-node: 0.3.7
- eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-node@0.3.7)(eslint@8.34.0)
+ eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.51.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.34.0)
has: 1.0.3
is-core-module: 2.11.0
is-glob: 4.0.3
@@ -3664,6 +3926,66 @@ packages:
- supports-color
dev: true
+ /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.51.0)(eslint@8.34.0)(jest@29.4.2)(typescript@4.9.5):
+ resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': ^5.0.0
+ eslint: ^7.0.0 || ^8.0.0
+ jest: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/eslint-plugin':
+ optional: true
+ jest:
+ optional: true
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 5.51.0(@typescript-eslint/parser@5.51.0)(eslint@8.34.0)(typescript@4.9.5)
+ '@typescript-eslint/utils': 5.51.0(eslint@8.34.0)(typescript@4.9.5)
+ eslint: 8.34.0
+ jest: 29.4.2(@types/node@18.13.0)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /eslint-plugin-jsx-a11y@6.7.1(eslint@8.34.0):
+ resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ dependencies:
+ '@babel/runtime': 7.20.13
+ aria-query: 5.1.3
+ array-includes: 3.1.6
+ array.prototype.flatmap: 1.3.1
+ ast-types-flow: 0.0.7
+ axe-core: 4.7.0
+ axobject-query: 3.1.1
+ damerau-levenshtein: 1.0.8
+ emoji-regex: 9.2.2
+ eslint: 8.34.0
+ has: 1.0.3
+ jsx-ast-utils: 3.3.3
+ language-tags: 1.0.5
+ minimatch: 3.1.2
+ object.entries: 1.1.6
+ object.fromentries: 2.0.6
+ semver: 6.3.0
+ dev: true
+
+ /eslint-plugin-playwright@0.11.2(eslint-plugin-jest@27.2.1)(eslint@8.34.0):
+ resolution: {integrity: sha512-uRLRLk7uTzc8NE6t4wBU8dijQwHvC66R/h7xwdM779jsJjMUtSmeaB8ayRkkpfwi+UU5BEfwvDANwmE+ccMVDw==}
+ peerDependencies:
+ eslint: '>=7'
+ eslint-plugin-jest: '>=24'
+ peerDependenciesMeta:
+ eslint-plugin-jest:
+ optional: true
+ dependencies:
+ eslint: 8.34.0
+ eslint-plugin-jest: 27.2.1(@typescript-eslint/eslint-plugin@5.51.0)(eslint@8.34.0)(jest@29.4.2)(typescript@4.9.5)
+ dev: true
+
/eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.6.0)(eslint@8.34.0)(prettier@2.8.4):
resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
engines: {node: '>=12.0.0'}
@@ -3714,6 +4036,49 @@ packages:
string.prototype.matchall: 4.0.8
dev: true
+ /eslint-plugin-testing-library@5.10.3(eslint@8.34.0)(typescript@4.9.5):
+ resolution: {integrity: sha512-0yhsKFsjHLud5PM+f2dWr9K3rqYzMy4cSHs3lcmFYMa1CdSzRvHGgXvsFarBjZ41gU8jhTdMIkg8jHLxGJqLqw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'}
+ peerDependencies:
+ eslint: ^7.5.0 || ^8.0.0
+ dependencies:
+ '@typescript-eslint/utils': 5.59.1(eslint@8.34.0)(typescript@4.9.5)
+ eslint: 8.34.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /eslint-plugin-tsdoc@0.2.17:
+ resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==}
+ dependencies:
+ '@microsoft/tsdoc': 0.14.2
+ '@microsoft/tsdoc-config': 0.16.2
+ dev: true
+
+ /eslint-plugin-unicorn@43.0.2(eslint@8.34.0):
+ resolution: {integrity: sha512-DtqZ5mf/GMlfWoz1abIjq5jZfaFuHzGBZYIeuJfEoKKGWRHr2JiJR+ea+BF7Wx2N1PPRoT/2fwgiK1NnmNE3Hg==}
+ engines: {node: '>=14.18'}
+ peerDependencies:
+ eslint: '>=8.18.0'
+ dependencies:
+ '@babel/helper-validator-identifier': 7.19.1
+ ci-info: 3.7.1
+ clean-regexp: 1.0.0
+ eslint: 8.34.0
+ eslint-utils: 3.0.0(eslint@8.34.0)
+ esquery: 1.4.0
+ indent-string: 4.0.0
+ is-builtin-module: 3.2.1
+ lodash: 4.17.21
+ pluralize: 8.0.0
+ read-pkg-up: 7.0.1
+ regexp-tree: 0.1.27
+ safe-regex: 2.1.1
+ semver: 7.3.8
+ strip-indent: 3.0.0
+ dev: true
+
/eslint-scope@5.1.1:
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
engines: {node: '>=8.0.0'}
@@ -4170,6 +4535,10 @@ packages:
get-intrinsic: 1.2.0
dev: true
+ /get-tsconfig@4.5.0:
+ resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==}
+ dev: true
+
/getos@3.2.1:
resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
dependencies:
@@ -4182,6 +4551,10 @@ packages:
assert-plus: 1.0.0
dev: true
+ /git-hooks-list@3.1.0:
+ resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==}
+ dev: true
+
/glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@@ -4194,6 +4567,17 @@ packages:
dependencies:
is-glob: 4.0.3
+ /glob@7.1.7:
+ resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
/glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
dependencies:
@@ -4230,6 +4614,10 @@ packages:
define-properties: 1.2.0
dev: true
+ /globalyzer@0.1.0:
+ resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
+ dev: true
+
/globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'}
@@ -4242,6 +4630,21 @@ packages:
slash: 3.0.0
dev: true
+ /globby@13.1.4:
+ resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ dir-glob: 3.0.1
+ fast-glob: 3.2.12
+ ignore: 5.2.4
+ merge2: 1.4.1
+ slash: 4.0.0
+ dev: true
+
+ /globrex@0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+ dev: true
+
/gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
dependencies:
@@ -4307,6 +4710,10 @@ packages:
react-is: 16.13.1
dev: false
+ /hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ dev: true
+
/html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
dev: true
@@ -4435,6 +4842,13 @@ packages:
has-tostringtag: 1.0.0
dev: true
+ /is-builtin-module@3.2.1:
+ resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
+ engines: {node: '>=6'}
+ dependencies:
+ builtin-modules: 3.3.0
+ dev: true
+
/is-callable@1.2.7:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
@@ -4459,6 +4873,12 @@ packages:
has-tostringtag: 1.0.0
dev: true
+ /is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dev: true
+
/is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
@@ -4512,6 +4932,11 @@ packages:
engines: {node: '>=8'}
dev: true
+ /is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+ dev: true
+
/is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
@@ -4586,6 +5011,13 @@ packages:
get-intrinsic: 1.2.0
dev: true
+ /is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ dev: true
+
/isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
dev: true
@@ -5054,6 +5486,10 @@ packages:
- ts-node
dev: true
+ /jju@1.4.0:
+ resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
+ dev: true
+
/joi@17.7.1:
resolution: {integrity: sha512-teoLhIvWE298R6AeJywcjR4sX2hHjB3/xJX4qPjg+gTg+c0mzUDsziYlqPmLomq9gVsfaMcgPaGc7VxtD/9StA==}
dependencies:
@@ -5157,6 +5593,16 @@ packages:
engines: {node: '>=6'}
dev: true
+ /language-subtag-registry@0.3.22:
+ resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
+ dev: true
+
+ /language-tags@1.0.5:
+ resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
+ dependencies:
+ language-subtag-registry: 0.3.22
+ dev: true
+
/lazy-ass@1.6.0:
resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
engines: {node: '> 0.8'}
@@ -5366,17 +5812,32 @@ packages:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
dev: true
- /next@13.1.6(@babel/core@7.20.12)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-hHlbhKPj9pW+Cymvfzc15lvhaOZ54l+8sXDXJWm3OBNBzgrVj6hwGPmqqsXg40xO1Leq+kXpllzRPuncpC0Phw==}
- engines: {node: '>=14.6.0'}
+ /next-themes@0.2.1(next@13.3.3-canary.1)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==}
+ peerDependencies:
+ next: '*'
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ next: 13.3.3-canary.1(@babel/core@7.20.12)(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /next@13.3.3-canary.1(@babel/core@7.20.12)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-EFkQCJ3HKBITj37CHP70/+iAR2j+gluqv3FyTZcw10oWhCSHwdF38rYevufMLLlw3mByyvEAkikjgJTJPX4tgw==}
+ engines: {node: '>=16.8.0'}
hasBin: true
peerDependencies:
+ '@opentelemetry/api': ^1.1.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:
@@ -5384,27 +5845,24 @@ packages:
sass:
optional: true
dependencies:
- '@next/env': 13.1.6
- '@swc/helpers': 0.4.14
+ '@next/env': 13.3.3-canary.1
+ '@swc/helpers': 0.5.1
+ busboy: 1.6.0
caniuse-lite: 1.0.30001451
postcss: 8.4.14
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
styled-jsx: 5.1.1(@babel/core@7.20.12)(react@18.2.0)
optionalDependencies:
- '@next/swc-android-arm-eabi': 13.1.6
- '@next/swc-android-arm64': 13.1.6
- '@next/swc-darwin-arm64': 13.1.6
- '@next/swc-darwin-x64': 13.1.6
- '@next/swc-freebsd-x64': 13.1.6
- '@next/swc-linux-arm-gnueabihf': 13.1.6
- '@next/swc-linux-arm64-gnu': 13.1.6
- '@next/swc-linux-arm64-musl': 13.1.6
- '@next/swc-linux-x64-gnu': 13.1.6
- '@next/swc-linux-x64-musl': 13.1.6
- '@next/swc-win32-arm64-msvc': 13.1.6
- '@next/swc-win32-ia32-msvc': 13.1.6
- '@next/swc-win32-x64-msvc': 13.1.6
+ '@next/swc-darwin-arm64': 13.3.3-canary.1
+ '@next/swc-darwin-x64': 13.3.3-canary.1
+ '@next/swc-linux-arm64-gnu': 13.3.3-canary.1
+ '@next/swc-linux-arm64-musl': 13.3.3-canary.1
+ '@next/swc-linux-x64-gnu': 13.3.3-canary.1
+ '@next/swc-linux-x64-musl': 13.3.3-canary.1
+ '@next/swc-win32-arm64-msvc': 13.3.3-canary.1
+ '@next/swc-win32-ia32-msvc': 13.3.3-canary.1
+ '@next/swc-win32-x64-msvc': 13.3.3-canary.1
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
@@ -5417,6 +5875,15 @@ packages:
/node-releases@2.0.10:
resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
+ /normalize-package-data@2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.1
+ semver: 5.7.1
+ validate-npm-package-license: 3.0.4
+ dev: true
+
/normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -5515,6 +5982,15 @@ packages:
mimic-fn: 2.1.0
dev: true
+ /open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+ dev: true
+
/optionator@0.9.1:
resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
engines: {node: '>= 0.8.0'}
@@ -5643,6 +6119,11 @@ packages:
find-up: 4.1.0
dev: true
+ /pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+ dev: true
+
/postcss-import@14.1.0(postcss@8.4.21):
resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
engines: {node: '>=10.0.0'}
@@ -5727,6 +6208,19 @@ packages:
fast-diff: 1.2.0
dev: true
+ /prettier-plugin-packagejson@2.4.3(prettier@2.8.4):
+ resolution: {integrity: sha512-kPeeviJiwy0BgOSk7No8NmzzXfW4R9FYWni6ziA5zc1kGVVrKnBzMZdu2TUhI+I7h8/5Htt3vARYOk7KKJTTNQ==}
+ peerDependencies:
+ prettier: '>= 1.16.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+ dependencies:
+ prettier: 2.8.4
+ sort-package-json: 2.4.1
+ synckit: 0.8.5
+ dev: true
+
/prettier@2.8.4:
resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==}
engines: {node: '>=10.13.0'}
@@ -5924,6 +6418,25 @@ packages:
dependencies:
pify: 2.3.0
+ /read-pkg-up@7.0.1:
+ resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ read-pkg: 5.2.0
+ type-fest: 0.8.1
+ dev: true
+
+ /read-pkg@5.2.0:
+ resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/normalize-package-data': 2.4.1
+ normalize-package-data: 2.5.0
+ parse-json: 5.2.0
+ type-fest: 0.6.0
+ dev: true
+
/readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -5941,6 +6454,11 @@ packages:
/regenerator-runtime@0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+ /regexp-tree@0.1.27:
+ resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+ hasBin: true
+ dev: true
+
/regexp.prototype.flags@1.4.3:
resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
engines: {node: '>= 0.4'}
@@ -5987,6 +6505,13 @@ packages:
engines: {node: '>=10'}
dev: true
+ /resolve@1.19.0:
+ resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==}
+ dependencies:
+ is-core-module: 2.11.0
+ path-parse: 1.0.7
+ dev: true
+
/resolve@1.22.1:
resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
hasBin: true
@@ -6050,6 +6575,12 @@ packages:
is-regex: 1.1.4
dev: true
+ /safe-regex@2.1.1:
+ resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==}
+ dependencies:
+ regexp-tree: 0.1.27
+ dev: true
+
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
@@ -6059,6 +6590,11 @@ packages:
dependencies:
loose-envify: 1.4.0
+ /semver@5.7.1:
+ resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
+ hasBin: true
+ dev: true
+
/semver@6.3.0:
resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
hasBin: true
@@ -6104,6 +6640,11 @@ packages:
engines: {node: '>=8'}
dev: true
+ /slash@4.0.0:
+ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
+ engines: {node: '>=12'}
+ dev: true
+
/slice-ansi@3.0.0:
resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
engines: {node: '>=8'}
@@ -6122,6 +6663,22 @@ packages:
is-fullwidth-code-point: 3.0.0
dev: true
+ /sort-object-keys@1.1.3:
+ resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==}
+ dev: true
+
+ /sort-package-json@2.4.1:
+ resolution: {integrity: sha512-Nd3rgLBJcZ4iw7tpuOhwBupG6SvUDU0Fy1cZGAMorA2JmDUb+29Dg5phJK9gapa2Ak9d15w/RuMl/viwX+nKwQ==}
+ hasBin: true
+ dependencies:
+ detect-indent: 7.0.1
+ detect-newline: 4.0.0
+ git-hooks-list: 3.1.0
+ globby: 13.1.4
+ is-plain-obj: 4.1.0
+ sort-object-keys: 1.1.3
+ dev: true
+
/source-map-js@1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'}
@@ -6143,6 +6700,28 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.13
+ dev: true
+
+ /spdx-exceptions@2.3.0:
+ resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
+ dev: true
+
+ /spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.3.0
+ spdx-license-ids: 3.0.13
+ dev: true
+
+ /spdx-license-ids@3.0.13:
+ resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
+ dev: true
+
/sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
dev: true
@@ -6177,6 +6756,11 @@ packages:
internal-slot: 1.0.5
dev: true
+ /streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+ dev: false
+
/string-length@4.0.2:
resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
engines: {node: '>=10'}
@@ -6302,6 +6886,14 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
+ /synckit@0.8.5:
+ resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ dependencies:
+ '@pkgr/utils': 2.3.1
+ tslib: 2.5.0
+ dev: true
+
/tailwind-merge@1.12.0:
resolution: {integrity: sha512-Y17eDp7FtN1+JJ4OY0Bqv9OA41O+MS8c1Iyr3T6JFLnOgLg3EvcyMKZAnQ8AGyvB5Nxm3t9Xb5Mhe139m8QT/g==}
dev: false
@@ -6347,6 +6939,11 @@ packages:
transitivePeerDependencies:
- ts-node
+ /tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
/test-exclude@6.0.0:
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
engines: {node: '>=8'}
@@ -6368,6 +6965,13 @@ packages:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
dev: true
+ /tiny-glob@0.2.9:
+ resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
+ dependencies:
+ globalyzer: 0.1.0
+ globrex: 0.1.2
+ dev: true
+
/tiny-invariant@1.3.1:
resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==}
dev: false
@@ -6501,6 +7105,16 @@ packages:
engines: {node: '>=10'}
dev: true
+ /type-fest@0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-fest@0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+ dev: true
+
/typed-array-length@1.0.4:
resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
dependencies:
@@ -6597,6 +7211,13 @@ packages:
convert-source-map: 1.9.0
dev: true
+ /validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+ dev: true
+
/verror@1.10.0:
resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
engines: {'0': node >=0.6.0}
diff --git a/src/app/globals.css b/src/app/globals.css
index 8fec662..4345975 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,75 +1,75 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
-
+
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 47.4% 11.2%;
-
+
--muted: 210 40% 96.1%;
--muted-foreground: 215.4 16.3% 46.9%;
-
+
--popover: 0 0% 100%;
--popover-foreground: 222.2 47.4% 11.2%;
-
+
--card: 0 0% 100%;
--card-foreground: 222.2 47.4% 11.2%;
-
+
--border: 214.3 31.8% 91.4%;
--input: 214.3 31.8% 91.4%;
-
+
--primary: 222.2 47.4% 11.2%;
--primary-foreground: 210 40% 98%;
-
+
--secondary: 210 40% 96.1%;
--secondary-foreground: 222.2 47.4% 11.2%;
-
+
--accent: 210 40% 96.1%;
--accent-foreground: 222.2 47.4% 11.2%;
-
+
--destructive: 0 100% 50%;
--destructive-foreground: 210 40% 98%;
-
+
--ring: 215 20.2% 65.1%;
-
+
--radius: 0.5rem;
}
-
+
.dark {
--background: 224 71% 4%;
--foreground: 213 31% 91%;
-
+
--muted: 223 47% 11%;
--muted-foreground: 215.4 16.3% 56.9%;
-
+
--popover: 224 71% 4%;
--popover-foreground: 215 20.2% 65.1%;
-
+
--card: 0 0% 100%;
--card-foreground: 222.2 47.4% 11.2%;
-
+
--border: 216 34% 17%;
--input: 216 34% 17%;
-
+
--primary: 210 40% 98%;
--primary-foreground: 222.2 47.4% 1.2%;
-
+
--secondary: 222.2 47.4% 11.2%;
--secondary-foreground: 210 40% 98%;
-
+
--accent: 216 34% 17%;
--accent-foreground: 210 40% 98%;
-
+
--destructive: 0 63% 31%;
--destructive-foreground: 210 40% 98%;
-
+
--ring: 216 34% 17%;
-
+
--radius: 0.5rem;
}
}
-
+
@layer base {
* {
@apply border-border;
@@ -78,4 +78,4 @@
@apply bg-background text-foreground;
font-feature-settings: "rlig" 1, "calt" 1;
}
-}
\ No newline at end of file
+}
diff --git a/src/app/head.tsx b/src/app/head.tsx
deleted file mode 100644
index 41a7f2e..0000000
--- a/src/app/head.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-export default function Head() {
- return (
- <>
-
Mi tienda online - Almacency
-
-
-
-
- >
- )
-}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index b334962..8a7c4ad 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,22 +1,25 @@
+import type {Metadata} from "next";
+
import api from "~/store/api";
import StoreHeader from "~/store/components/StoreHeader";
+
import Providers from "./providers";
-import "../globals.css"
+import "../globals.css";
-type Props = {
- children: React.ReactNode
-}
+export const metadata: Metadata = {
+ title: "Tiency",
+};
-const App = async ({children}: Props) => {
- const store = await api.fetch()
+const App = async ({children}: {children: React.ReactNode}) => {
+ const store = await api.fetch();
return (
-
+
-
+
{children}
@@ -25,7 +28,7 @@ const App = async ({children}: Props) => {
{/* Inicio de copyright - Cambiar el contenido de los mismos viola el contenido de los terminos de licencia */}
© Copyright {new Date().getFullYear()}. Hecho con ♥ para la comunidad, por{" "}
-
+
goncy
.
diff --git a/src/app/mocks/[mock]/page.tsx b/src/app/mocks/[mock]/page.tsx
index 7c0a0bb..dc484c0 100644
--- a/src/app/mocks/[mock]/page.tsx
+++ b/src/app/mocks/[mock]/page.tsx
@@ -1,15 +1,15 @@
-import productApi from "../../../product/api";
-import cartApi from "../../../cart/api";
-import StoreScreen from "../../../product/screens/Store";
-import CartProvider from "../../../cart/context";
+import productApi from "~/product/api";
+import cartApi from "~/cart/api";
+import StoreScreen from "~/product/screens/Store";
+import CartProvider from "~/cart/context";
-type Props = {
+const IndexMockRoute = async ({
+ params: {mock},
+}: {
params: {
- mock: string
- }
-}
-
-const IndexMockRoute = async ({params: {mock}}) => {
+ mock: string;
+ };
+}) => {
const products = await productApi.mock.list(mock);
const fields = await cartApi.mock.list(mock);
diff --git a/src/app/providers.tsx b/src/app/providers.tsx
index a4d77fb..f3943d7 100644
--- a/src/app/providers.tsx
+++ b/src/app/providers.tsx
@@ -1,15 +1,14 @@
-"use client"
+"use client";
-import { ChakraProvider } from "@chakra-ui/react";
-import theme from "../theme";
-
-type Props = {
- children: React.ReactNode
-}
+import {ChakraProvider} from "@chakra-ui/react";
+import {ThemeProvider as NextThemesProvider} from "next-themes";
-export default function Providers({children}: Props) {
+import theme from "../theme";
+export default function Providers({children}: {children: React.ReactNode}) {
return (
- {children}
+
+ {children}
+
);
}
diff --git a/src/globals.css b/src/globals.css
index b5c61c9..33947de 100644
--- a/src/globals.css
+++ b/src/globals.css
@@ -1,3 +1,82 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 47.4% 11.2%;
+
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 47.4% 11.2%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 47.4% 11.2%;
+
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+
+ --primary: 222.2 47.4% 11.2%;
+ --primary-foreground: 210 40% 98%;
+
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+
+ --destructive: 0 100% 50%;
+ --destructive-foreground: 210 40% 98%;
+
+ --ring: 215 20.2% 65.1%;
+
+ --radius: 0.5rem;
+ }
+
+ .dark {
+ --background: 224 71% 4%;
+ --foreground: 213 31% 91%;
+
+ --muted: 223 47% 11%;
+ --muted-foreground: 215.4 16.3% 56.9%;
+
+ --popover: 224 71% 4%;
+ --popover-foreground: 215 20.2% 65.1%;
+
+ --card: 224 71% 4%;
+ --card-foreground: 213 31% 91%;
+
+ --border: 216 34% 17%;
+ --input: 216 34% 17%;
+
+ --primary: 210 40% 98%;
+ --primary-foreground: 222.2 47.4% 1.2%;
+
+ --secondary: 222.2 47.4% 11.2%;
+ --secondary-foreground: 210 40% 98%;
+
+ --accent: 216 34% 17%;
+ --accent-foreground: 210 40% 98%;
+
+ --destructive: 0 63% 31%;
+ --destructive-foreground: 210 40% 98%;
+
+ --ring: 216 34% 17%;
+
+ --radius: 0.5rem;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+
+ body {
+ @apply bg-background text-foreground;
+ font-feature-settings: "rlig" 1, "calt" 1;
+ }
+}
diff --git a/src/modules/cart/api.ts b/src/modules/cart/api.ts
index 4c27bdf..c64ed3e 100644
--- a/src/modules/cart/api.ts
+++ b/src/modules/cart/api.ts
@@ -1,8 +1,8 @@
+import type {Field as IField, RadioField, TextField} from "./types";
+
import axios from "axios";
import Papa from "papaparse";
-import {Field as IField, RadioField, TextField} from "./types";
-
interface RawField {
title: string;
type: "radio" | "text";
@@ -38,7 +38,7 @@ function normalize(data: RawField[]): IField[] {
export default {
list: async (): Promise => {
return axios
- .get(process.env.FIELDS_CSV, {
+ .get(process.env.FIELDS_CSV!, {
responseType: "blob",
})
.then(
@@ -58,6 +58,8 @@ export default {
},
mock: {
list: (mock: string): Promise =>
- import(`./mocks/${mock}.json`).then((result) => normalize(result.default as RawField[])),
+ import(`./mocks/${mock}.json`).then((result: {default: RawField[]}) =>
+ normalize(result.default),
+ ),
},
};
diff --git a/src/modules/cart/components/CartDrawer/CartDrawer.tsx b/src/modules/cart/components/CartDrawer/CartDrawer.tsx
index 36842df..066ceba 100644
--- a/src/modules/cart/components/CartDrawer/CartDrawer.tsx
+++ b/src/modules/cart/components/CartDrawer/CartDrawer.tsx
@@ -1,3 +1,6 @@
+import type {DrawerProps} from "@chakra-ui/react";
+import type {CartItem, Field} from "../../types";
+
import React from "react";
import {
Text,
@@ -7,7 +10,6 @@ import {
DrawerContent,
DrawerHeader,
DrawerOverlay,
- DrawerProps,
Stack,
IconButton,
DrawerFooter,
@@ -19,16 +21,16 @@ import {
import {ChevronLeftIcon} from "@chakra-ui/icons";
import {useCart} from "../../context";
-import {CartItem, Field} from "../../types";
import Details from "./Details";
import Fields from "./Fields";
-interface Props extends Omit {
- fields: Field[];
-}
-
-const CartDrawer: React.FC = ({onClose, isOpen, fields, ...props}) => {
+function CartDrawer({
+ onClose,
+ isOpen,
+ fields,
+ ...props
+}: Omit & {fields?: Field[]}) {
const [{total, message, cart, checkout}, {removeItem, updateItem, updateField}] = useCart();
const [currentStep, setCurrentStep] = React.useState<"details" | "fields">("details");
@@ -81,12 +83,12 @@ const CartDrawer: React.FC = ({onClose, isOpen, fields, ...props}) => {
{currentStep === "details" && }
- {currentStep === "fields" && (
+ {fields && currentStep === "fields" ? (
- )}
+ ) : null}
- {fields && currentStep === "details" && (
+ {fields && currentStep === "details" ? (
= ({onClose, isOpen, fields, ...props}) => {
Continuar
- )}
+ ) : null}
{(currentStep === "fields" || !fields) && (
);
-};
+}
export default Details;
diff --git a/src/modules/cart/components/CartDrawer/Fields.tsx b/src/modules/cart/components/CartDrawer/Fields.tsx
index 2de5c35..4dcf209 100644
--- a/src/modules/cart/components/CartDrawer/Fields.tsx
+++ b/src/modules/cart/components/CartDrawer/Fields.tsx
@@ -1,28 +1,27 @@
-import {Stack, Text, Input, InputProps, Alert, RadioGroup, Radio} from "@chakra-ui/react";
-import React from "react";
+import type {InputProps} from "@chakra-ui/react";
+import type {Checkout, Field} from "../../types";
-import {Checkout, Field} from "../../types";
+import {Stack, Text, Input, Alert, RadioGroup, Radio} from "@chakra-ui/react";
-interface Props {
- fields: Field[];
- checkout: Checkout;
- onChange: (id: string, value: string) => void;
-}
-
-interface FieldProps extends Omit {
- value: string;
+function TextField({
+ value,
+ onChange,
+ ...props
+}: Omit & {
onChange: (value: string) => void;
-}
-
-const TextField: React.FC = ({value, onChange, ...props}) => {
+}) {
return onChange(e.target.value)} {...props} />;
-};
+}
-const RadioField: React.FC<{
+function RadioField({
+ value,
+ onChange,
+ options,
+}: {
options: string[];
onChange: (value: string) => void;
value: string;
-}> = ({value, onChange, options}) => {
+}) {
return (
@@ -34,9 +33,17 @@ const RadioField: React.FC<{
);
-};
+}
-const Fields: React.FC = ({fields, checkout, onChange}) => {
+function Fields({
+ fields,
+ checkout,
+ onChange,
+}: {
+ fields: Field[];
+ checkout: Checkout;
+ onChange: (id: string, value: string) => void;
+}) {
return (
{fields.map((field) => (
@@ -57,12 +64,12 @@ const Fields: React.FC = ({fields, checkout, onChange}) => {
onChange={(value: string) => onChange(field.title, value)}
/>
)}
- {field.note && {field.note}}
+ {field.note ? {field.note} : null}
))}
);
-};
+}
export default Fields;
diff --git a/src/modules/cart/components/CartItemDrawer.tsx b/src/modules/cart/components/CartItemDrawer.tsx
index 16a9ea5..5c68daa 100644
--- a/src/modules/cart/components/CartItemDrawer.tsx
+++ b/src/modules/cart/components/CartItemDrawer.tsx
@@ -1,4 +1,5 @@
import type {CartItem} from "../types";
+import type {DrawerProps} from "@chakra-ui/react";
import React from "react";
import {
@@ -12,39 +13,43 @@ import {
Divider,
Button,
DrawerFooter,
- DrawerProps,
Text,
Image,
RadioGroup,
Radio,
} from "@chakra-ui/react";
+import type {Option} from "~/product/types";
+
import {parseCurrency} from "@/utils/currency";
-import {Option} from "~/product/types";
+
import {getCartItemPrice} from "../utils";
-interface Props extends Omit {
+function CartItemDrawer({
+ item,
+ onClose,
+ onSubmit,
+ ...props
+}: DrawerProps & {
item: CartItem;
onClose: VoidFunction;
onSubmit: (item: CartItem) => void;
-}
-
-const CartItemDrawer: React.FC = ({item, onClose, onSubmit, ...props}) => {
+}) {
const [formData, setFormData] = React.useState(() => ({...item, options: {}}));
const total = React.useMemo(() => parseCurrency(getCartItemPrice(formData)), [formData]);
const options = React.useMemo(
- () => Object.entries(item.options).map(([title, options]) => ({title, options})),
+ () => Object.entries(item.options!).map(([title, _options]) => ({title, options: _options})),
[item],
);
const isValid = React.useMemo(
- () => options.length === Object.keys(formData.options).length,
+ () => options.length === Object.keys(formData.options!).length,
[formData, options],
);
function handleSelectOption(option: Option) {
- setFormData((formData) => ({
- ...formData,
- options: {...formData.options, [option.category]: [option]},
+ setFormData((_formData) => ({
+ ..._formData,
+ options: {..._formData.options, [option.category]: [option]},
}));
}
@@ -138,6 +143,6 @@ const CartItemDrawer: React.FC = ({item, onClose, onSubmit, ...props}) =>
);
-};
+}
export default CartItemDrawer;
diff --git a/src/modules/cart/context.tsx b/src/modules/cart/context.tsx
index 60e207b..d7fba22 100644
--- a/src/modules/cart/context.tsx
+++ b/src/modules/cart/context.tsx
@@ -1,10 +1,11 @@
-"use client"
+"use client";
-import * as React from "react";
+import type {Cart, CartItem, Checkout, Field} from "./types";
+
+import {useState, useMemo, useCallback, useContext, createContext} from "react";
import {parseCurrency} from "@/utils/currency";
-import {Cart, CartItem, Checkout, Field} from "./types";
import {getCartMessage, getCartTotal} from "./utils";
interface Context {
@@ -23,24 +24,19 @@ interface Context {
};
}
-interface Props {
- fields: Field[];
- children: React.ReactNode;
-}
-
-const CartContext = React.createContext({} as Context);
+const CartContext = createContext({} as Context);
-const CartProvider: React.FC = (props) => {
- const [checkout, setCheckout] = React.useState(() => new Map());
- const [cart, setCart] = React.useState(() => new Map());
- const total = React.useMemo(() => parseCurrency(getCartTotal(cart)), [cart]);
- const quantity = React.useMemo(
+function CartProvider(props: {fields: Field[]; children: React.ReactNode}) {
+ const [checkout, setCheckout] = useState(() => new Map());
+ const [cart, setCart] = useState(() => new Map());
+ const total = useMemo(() => parseCurrency(getCartTotal(cart)), [cart]);
+ const quantity = useMemo(
() => Array.from(cart.values()).reduce((acc, item) => acc + item.quantity, 0),
[cart],
);
- const message = React.useMemo(() => getCartMessage(cart, checkout), [cart, checkout]);
+ const message = useMemo(() => getCartMessage(cart, checkout), [cart, checkout]);
- const addItem = React.useCallback(
+ const addItem = useCallback(
(id: symbol, value: CartItem) => {
cart.set(id, value);
@@ -49,7 +45,7 @@ const CartProvider: React.FC = (props) => {
[cart],
);
- const removeItem = React.useCallback(
+ const removeItem = useCallback(
(id: symbol) => {
cart.delete(id);
@@ -58,7 +54,7 @@ const CartProvider: React.FC = (props) => {
[cart],
);
- const updateItem = React.useCallback(
+ const updateItem = useCallback(
(id: symbol, value: CartItem) => {
cart.set(id, value);
@@ -67,7 +63,7 @@ const CartProvider: React.FC = (props) => {
[cart],
);
- const updateField = React.useCallback(
+ const updateField = useCallback(
(id: string, value: string) => {
checkout.set(id, value);
@@ -76,20 +72,20 @@ const CartProvider: React.FC = (props) => {
[checkout],
);
- const state = React.useMemo(
+ const state = useMemo(
() => ({checkout, cart, total, quantity, message}),
[checkout, cart, total, quantity, message],
);
- const actions = React.useMemo(
+ const actions = useMemo(
() => ({updateItem, updateField, addItem, removeItem}),
[updateItem, updateField, addItem, removeItem],
);
return {props.children};
-};
+}
export function useCart(): [Context["state"], Context["actions"]] {
- const {state, actions} = React.useContext(CartContext);
+ const {state, actions} = useContext(CartContext);
return [state, actions];
}
diff --git a/src/modules/cart/types.ts b/src/modules/cart/types.ts
index d6a7062..66065ca 100644
--- a/src/modules/cart/types.ts
+++ b/src/modules/cart/types.ts
@@ -1,4 +1,4 @@
-import {Product} from "../product/types";
+import type {Product} from "~/product/types";
export interface CartItem extends Product {
quantity: number;
@@ -21,5 +21,7 @@ export interface TextField {
}
export type Field = RadioField | TextField;
+
export type Cart = Map;
+
export type Checkout = Map;
diff --git a/src/modules/cart/utils.ts b/src/modules/cart/utils.ts
index ac03bed..02c4fd1 100644
--- a/src/modules/cart/utils.ts
+++ b/src/modules/cart/utils.ts
@@ -1,10 +1,10 @@
-import {parseCurrency} from "@/utils/currency";
+import type {Cart, CartItem, Checkout} from "./types";
-import {Cart, CartItem, Checkout} from "./types";
+import {parseCurrency} from "@/utils/currency";
export function getCartItemPrice(item: CartItem): number {
const optionsPrice = item.options
- ? Object.values(item.options).reduce((price, option) => price + option?.[0]?.price, 0)
+ ? Object.values(item.options).reduce((price, option) => price + option[0]?.price, 0)
: 0;
return (optionsPrice + item.price) * item.quantity;
@@ -15,8 +15,11 @@ export function getCartTotal(cart: Cart): number {
}
export function getCartItemOptionsSummary(options: CartItem["options"]): string {
- return Object.entries(options)
- .reduce((options, [category, option]) => options.concat(`${category}: ${option[0].title}`), [])
+ return Object.entries(options!)
+ .reduce(
+ (_options, [category, option]) => _options.concat(`${category}: ${option[0].title}`),
+ [],
+ )
.join(", ");
}
diff --git a/src/modules/product/api.ts b/src/modules/product/api.ts
index c88e137..66d45c6 100644
--- a/src/modules/product/api.ts
+++ b/src/modules/product/api.ts
@@ -1,8 +1,8 @@
+import type {Option as IOption, Product as IProduct} from "./types";
+
import axios from "axios";
import Papa from "papaparse";
-import {Option as IOption, Product as IProduct} from "./types";
-
interface RawOption extends IOption {
type: "option";
}
@@ -36,11 +36,11 @@ class Product implements IProduct {
}
addOption(option: RawOption) {
- if (!this.options[option.category]) {
- this.options[option.category] = [];
+ if (!this.options![option.category]) {
+ this.options![option.category] = [];
}
- this.options[option.category].push({
+ this.options![option.category].push({
id: option.id,
title: option.title,
category: option.category,
@@ -61,7 +61,7 @@ class Product implements IProduct {
price: Number(this.price),
};
- if (Object.keys(product.options).length === 0) {
+ if (Object.keys(product.options!).length === 0) {
delete product.options;
}
@@ -78,13 +78,13 @@ function normalize(data: (RawProduct | RawOption)[]) {
}
if (item.type === "product") {
- const product = products.get(item.id);
+ const product = products.get(item.id)!;
product.set(item);
} else if (item.type === "option") {
const product = products.get(item.id);
- product.addOption(item);
+ product!.addOption(item);
}
}
@@ -98,7 +98,7 @@ function normalize(data: (RawProduct | RawOption)[]) {
export default {
list: async (): Promise => {
return axios
- .get(process.env.PRODUCTS_CSV, {
+ .get(process.env.PRODUCTS_CSV!, {
responseType: "blob",
})
.then(
@@ -118,8 +118,8 @@ export default {
},
mock: {
list: (mock: string): Promise =>
- import(`./mocks/${mock}.json`).then((result) =>
- normalize(result.default as (RawProduct | RawOption)[]),
+ import(`./mocks/${mock}.json`).then((result: {default: (RawProduct | RawOption)[]}) =>
+ normalize(result.default),
),
},
};
diff --git a/src/modules/product/screens/Store.tsx b/src/modules/product/screens/Store.tsx
index e6d5c2c..7f668dd 100644
--- a/src/modules/product/screens/Store.tsx
+++ b/src/modules/product/screens/Store.tsx
@@ -1,22 +1,19 @@
-"use client"
+"use client";
-import { useState } from "react";
+import type {Product} from "../types";
+
+import {useState} from "react";
import {Button, Flex, Grid, Stack, Text} from "@chakra-ui/react";
-import type {Product} from "../types";
-import type {Field} from "../../cart/types";
-import ProductCard from "../components/ProductCard";
-import CartDrawer from "../../cart/components/CartDrawer/CartDrawer";
-import {useCart} from "../../cart/context";
+import type {Field} from "~/cart/types";
+import CartDrawer from "~/cart/components/CartDrawer/CartDrawer";
+import {useCart} from "~/cart/context";
-interface Props {
- products: Product[];
- fields: Field[];
-}
+import ProductCard from "../components/ProductCard";
-const StoreScreen: React.FC = ({products, fields}) => {
+function StoreScreen({products, fields}: {products: Product[]; fields: Field[]}) {
const [{total, quantity}, {addItem}] = useCart();
- const [isCartOpen, toggleCart] = useState(false);
+ const [isCartOpen, setIsCartOpen] = useState(false);
return (
<>
@@ -33,7 +30,7 @@ const StoreScreen: React.FC = ({products, fields}) => {
addItem(Symbol(), {...product, quantity: 1})}
+ onAdd={(_product: Product) => addItem(Symbol(), {..._product, quantity: 1})}
/>
))}
@@ -50,7 +47,7 @@ const StoreScreen: React.FC = ({products, fields}) => {
data-testid="show-cart"
size="lg"
width={{base: "100%", sm: "fit-content"}}
- onClick={() => toggleCart(true)}
+ onClick={() => setIsCartOpen(true)}
>
@@ -77,9 +74,9 @@ const StoreScreen: React.FC = ({products, fields}) => {
)}
- toggleCart(false)} />
+ setIsCartOpen(false)} />
>
);
-};
+}
export default StoreScreen;
diff --git a/src/modules/store/api.ts b/src/modules/store/api.ts
index e40cc3b..4f21a2f 100644
--- a/src/modules/store/api.ts
+++ b/src/modules/store/api.ts
@@ -1,12 +1,12 @@
+import type {Store as IStore} from "./types";
+
import axios from "axios";
import Papa from "papaparse";
-import {Store as IStore} from "./types";
-
export default {
fetch: async (): Promise => {
return axios
- .get(process.env.STORE_CSV, {
+ .get(process.env.STORE_CSV!, {
responseType: "blob",
})
.then(
@@ -24,6 +24,6 @@ export default {
},
mock: {
fetch: (mock: string): Promise =>
- import(`./mocks/${mock}.json`).then((result) => result.default as Promise),
+ import(`./mocks/${mock}.json`).then((result: {default: IStore}) => result.default),
},
};
diff --git a/src/modules/store/components/StoreHeader.tsx b/src/modules/store/components/StoreHeader.tsx
index 0367369..7d300c0 100644
--- a/src/modules/store/components/StoreHeader.tsx
+++ b/src/modules/store/components/StoreHeader.tsx
@@ -1,14 +1,10 @@
-"use client"
-
-import {Stack, Link, Heading, Flex, Box, Image, Text} from "@chakra-ui/react";
+"use client";
import type {Store} from "../types";
-type Props = {
- store: Store;
-};
+import {Stack, Link, Heading, Flex, Box, Image, Text} from "@chakra-ui/react";
-export default function StoreHeader({store}: Props) {
+export default function StoreHeader({store}: {store: Store}) {
return (
@@ -39,7 +35,7 @@ export default function StoreHeader({store}: Props) {
- {store.instagram && (
+ {store.instagram ? (
-
+
- )}
- {store.whatsapp && (
+ ) : null}
+ {store.whatsapp ? (
-
+
- )}
+ ) : null}
diff --git a/src/pages/api/revalidate.ts b/src/pages/api/revalidate.ts
index 822a018..a881fb3 100644
--- a/src/pages/api/revalidate.ts
+++ b/src/pages/api/revalidate.ts
@@ -1,8 +1,8 @@
-import {NextApiRequest, NextApiResponse} from "next";
+import type {NextApiRequest, NextApiResponse} from "next";
-export default async function handler(req: NextApiRequest, res: NextApiResponse): Promise {
+export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.headers["x-secret"] === process.env.REVALIDATE_SECRET) {
- await res.unstable_revalidate("/");
+ await res.revalidate("/");
return res.json({revalidate: true});
}
diff --git a/src/theme.ts b/src/theme.ts
index 5fa028f..a18f3cd 100644
--- a/src/theme.ts
+++ b/src/theme.ts
@@ -2,7 +2,7 @@ import {extendTheme, theme} from "@chakra-ui/react";
export default extendTheme({
colors: {
- primary: theme.colors[process.env.NEXT_PUBLIC_COLOR || "teal"],
+ primary: theme.colors[process.env.NEXT_PUBLIC_COLOR as keyof typeof theme.colors],
},
components: {
Radio: {
diff --git a/tsconfig.json b/tsconfig.json
index c9ac9b1..0217fbe 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -14,6 +14,7 @@
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
+ "strictNullChecks": true,
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",