From f06256d97e777f1ffe60ad02e3af812ab1c7751b Mon Sep 17 00:00:00 2001 From: MeowcaTheoRange Date: Sun, 24 Sep 2023 19:32:20 -0500 Subject: [PATCH] Optimize for Vercel, do some changes, entire site --- package-lock.json | 877 ++++++++++ package.json | 2 + src/components/Ads/Ads.tsx | 17 +- src/components/Box/Box.module.css | 4 + src/components/Box/Box.tsx | 6 +- src/components/Box/types.tsx | 17 +- src/components/Nav/Nav.module.css | 2 + src/components/Nav/Nav.tsx | 32 +- .../cards/ClanCard/ClanCard.module.css | 8 +- src/components/cards/ClanCard/ClanCard.tsx | 26 +- .../cards/ClanCard/ClanSkeleton.tsx | 15 +- .../cards/FlairCard/FlairCard.module.css | 4 + src/components/cards/FlairCard/FlairCard.tsx | 27 +- .../cards/SignCard/SignCard.module.css | 11 + .../cards/SignCard/SignSkeleton.tsx | 12 +- src/components/cards/TrollCard/TrollCard.tsx | 104 +- .../cards/TrollCard/TrollSkeleton.tsx | 35 +- .../form/ErrorHandler/ErrorHandler.tsx | 49 + src/components/form/template/.prettierrc | 18 + src/components/form/template/clan.tsx | 730 +++++++++ src/components/form/template/troll.tsx | 1453 +++++++++++++++++ src/components/template/credits.tsx | 90 + .../template/not-signed-in-clan.tsx | 18 + src/components/template/not-signed-in.tsx | 24 + src/components/template/too-signed-in.tsx | 18 + src/lib/db/mongodb.ts | 2 + src/lib/trollcall/api/clan.ts | 13 +- src/lib/trollcall/api/troll.ts | 13 +- src/lib/trollcall/convert/clan.ts | 7 + src/lib/trollcall/convert/troll.ts | 23 +- src/pages/_app.tsx | 112 +- src/pages/add/clan/index.tsx | 36 + src/pages/add/troll/index.tsx | 39 + src/pages/api/clan/.../[[...page]]/index.ts | 15 +- src/pages/api/clan/[clan]/index.ts | 13 +- src/pages/api/clan/index.ts | 19 +- src/pages/api/convert/index.ts | 143 ++ src/pages/api/test/signin/index.ts | 46 + src/pages/api/troll/.../[[...page]]/index.ts | 13 +- .../api/troll/[clan]/.../[[...page]]/index.ts | 13 +- src/pages/api/troll/[clan]/[troll]/index.ts | 1 + src/pages/clan/[clan]/index.tsx | 61 +- src/pages/clan/s/index.tsx | 76 + src/pages/edit/clan/[clan]/index.tsx | 65 + src/pages/edit/troll/[clan]/[troll]/index.tsx | 77 + src/pages/help/credits/index.tsx | 76 +- src/pages/hiveswap/aspects/[name]/index.tsx | 4 +- src/pages/hiveswap/aspects/index.tsx | 2 +- src/pages/hiveswap/colors/[name]/index.tsx | 4 +- src/pages/hiveswap/colors/index.tsx | 2 +- src/pages/hiveswap/index.tsx | 4 +- src/pages/hiveswap/sway/[name]/index.tsx | 4 +- src/pages/hiveswap/sway/index.tsx | 2 +- src/pages/hiveswap/truesigns/[name]/index.tsx | 4 +- src/pages/hiveswap/truesigns/index.tsx | 2 +- src/pages/index.tsx | 40 +- src/pages/manage/index.module.css | 9 + src/pages/manage/index.tsx | 145 ++ src/pages/test/index.tsx | 99 +- .../troll/[clan]/[troll]/gallery/index.tsx | 15 + src/pages/troll/[clan]/[troll]/index.tsx | 125 +- .../troll/[clan]/[troll]/quirk/index.tsx | 15 + src/pages/troll/s/[clan]/index.tsx | 110 ++ src/pages/troll/s/index.tsx | 76 + src/styles/_app.css | 2 + src/styles/global.module.css | 42 +- src/styles/global_form.module.css | 152 ++ src/styles/global_skeleton.module.css | 271 ++- src/types/client/clan.ts | 9 +- src/types/client/quirks.ts | 8 +- src/types/client/troll.ts | 132 +- src/types/generics.ts | 9 +- src/utility/language.ts | 67 +- src/utility/react/Themer.tsx | 12 +- 74 files changed, 5243 insertions(+), 585 deletions(-) create mode 100644 src/components/form/ErrorHandler/ErrorHandler.tsx create mode 100644 src/components/form/template/.prettierrc create mode 100644 src/components/form/template/clan.tsx create mode 100644 src/components/form/template/troll.tsx create mode 100644 src/components/template/credits.tsx create mode 100644 src/components/template/not-signed-in-clan.tsx create mode 100644 src/components/template/not-signed-in.tsx create mode 100644 src/components/template/too-signed-in.tsx create mode 100644 src/pages/add/clan/index.tsx create mode 100644 src/pages/add/troll/index.tsx create mode 100644 src/pages/api/convert/index.ts create mode 100644 src/pages/api/test/signin/index.ts create mode 100644 src/pages/clan/s/index.tsx create mode 100644 src/pages/edit/clan/[clan]/index.tsx create mode 100644 src/pages/edit/troll/[clan]/[troll]/index.tsx create mode 100644 src/pages/manage/index.module.css create mode 100644 src/pages/manage/index.tsx create mode 100644 src/pages/troll/[clan]/[troll]/gallery/index.tsx create mode 100644 src/pages/troll/[clan]/[troll]/quirk/index.tsx create mode 100644 src/pages/troll/s/[clan]/index.tsx create mode 100644 src/pages/troll/s/index.tsx create mode 100644 src/styles/global_form.module.css diff --git a/package-lock.json b/package-lock.json index 3c3e234..4d3e033 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "crypto-js": "^4.1.1", "dotenv": "^16.3.0", "express": "^4.18.2", + "formik": "^2.4.4", "lodash": "^4.17.21", "mongodb": "^5.6.0", "nanoid": "^3.3.6", @@ -35,11 +36,21 @@ "@types/lodash": "^4.14.195", "@types/node": "^20.3.1", "concurrently": "^8.2.0", + "eslint": "^8.49.0", "nodemon": "^2.0.22", "tsc-alias": "^1.8.6", "typescript": "^5.1.3" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@babel/runtime": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", @@ -52,6 +63,141 @@ "node": ">=6.9.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -443,6 +589,27 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -475,6 +642,22 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -542,6 +725,12 @@ "node": ">=14.0.0" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -666,6 +855,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001508", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", @@ -919,6 +1117,20 @@ "node": ">= 0.6" } }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/crypto-js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", @@ -954,6 +1166,20 @@ "ms": "^2.1.1" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -996,6 +1222,18 @@ "node": ">=8" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dotenv": { "version": "16.3.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.0.tgz", @@ -1039,6 +1277,194 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1138,6 +1564,12 @@ "node": ">= 0.8" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -1154,6 +1586,18 @@ "node": ">=8.6.0" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -1163,6 +1607,18 @@ "reusify": "^1.0.4" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1205,6 +1661,65 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/formik": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.4.tgz", + "integrity": "sha512-MV99upag7fCC3JfsI60WcxhymwNZnJUcMcnGuoz6mDf78SUfBbKjmfcA9LzHx4lEmjzmOflhP7oqz+ZQv5eStg==", + "funding": [ + { + "type": "individual", + "url": "https://opencollective.com/formik" + } + ], + "dependencies": { + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1345,6 +1860,33 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, + "node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -1370,6 +1912,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1417,6 +1965,14 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -1491,6 +2047,31 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1568,11 +2149,56 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "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/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -1584,11 +2210,59 @@ "node": ">=6" } }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -1849,6 +2523,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2069,6 +2749,65 @@ "wrappy": "1" } }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2077,6 +2816,15 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2085,6 +2833,15 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -2148,6 +2905,15 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/property-expr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", @@ -2264,6 +3030,16 @@ "react": "^18.2.0" } }, + "node_modules/react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -2304,6 +3080,15 @@ "node": ">=0.10.0" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -2473,6 +3258,27 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/shell-quote": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", @@ -2631,6 +3437,18 @@ "node": ">=4" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -2684,11 +3502,22 @@ "node": ">=10" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/tiny-case": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2781,6 +3610,18 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -2831,6 +3672,15 @@ "node": ">= 0.8" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2884,6 +3734,21 @@ "node": ">=12" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -2955,6 +3820,18 @@ "node": ">=12" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yup": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/yup/-/yup-1.2.0.tgz", diff --git a/package.json b/package.json index c516b66..2238852 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "@types/lodash": "^4.14.195", "@types/node": "^20.3.1", "concurrently": "^8.2.0", + "eslint": "^8.49.0", "nodemon": "^2.0.22", "tsc-alias": "^1.8.6", "typescript": "^5.1.3" @@ -34,6 +35,7 @@ "crypto-js": "^4.1.1", "dotenv": "^16.3.0", "express": "^4.18.2", + "formik": "^2.4.4", "lodash": "^4.17.21", "mongodb": "^5.6.0", "nanoid": "^3.3.6", diff --git a/src/components/Ads/Ads.tsx b/src/components/Ads/Ads.tsx index 490f7df..22934e9 100644 --- a/src/components/Ads/Ads.tsx +++ b/src/components/Ads/Ads.tsx @@ -1,28 +1,31 @@ import globals from "@/styles/global.module.css"; import Link from "next/link"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import styles from "./Ads.module.css"; export default function Ads() { const [hide, setHide] = useState(false); const [adService, setAdService] = useState(0); + const int = useRef(); useEffect(() => { setHide(window.localStorage.getItem("hideAds") === "true"); setAdService(Math.random()); - setInterval(() => setAdService(Math.random()), 60000); + clearInterval(int.current); + int.current = setInterval(() => setAdService(Math.random()), 60000); }, []); + // Fix "partitioned storage access" on Firefox return !hide ? (
{adService < 0.2 ? ( ) : adService < 0.4 ? ( ) : adService < 0.8 ? ( )}
diff --git a/src/components/Box/Box.module.css b/src/components/Box/Box.module.css index 13e4c52..b546c4b 100644 --- a/src/components/Box/Box.module.css +++ b/src/components/Box/Box.module.css @@ -23,6 +23,10 @@ max-width: 100%; } +.Box.ltr { + direction: ltr; +} + .Box .innerContent { padding: 6px 4px; display: inline-flex; diff --git a/src/components/Box/Box.tsx b/src/components/Box/Box.tsx index 7c3c318..3100faa 100644 --- a/src/components/Box/Box.tsx +++ b/src/components/Box/Box.tsx @@ -29,7 +29,11 @@ export default function Box({ ) as React.CSSProperties; return (
diff --git a/src/components/Box/types.tsx b/src/components/Box/types.tsx index 79b6cd5..327fcfd 100644 --- a/src/components/Box/types.tsx +++ b/src/components/Box/types.tsx @@ -1,12 +1,13 @@ import { Color3 } from "@/types/assist/color"; export type BoxConfig = { - title?: { - text: string; - link?: string; - small?: boolean; - }; - theme?: Color3; - nfw?: boolean; - class?: string; + title?: { + text: string; + link?: string; + small?: boolean; + }; + theme?: Color3; + nfw?: boolean; + ltr?: boolean; + class?: string; }; diff --git a/src/components/Nav/Nav.module.css b/src/components/Nav/Nav.module.css index 92b19e1..9e3bc61 100644 --- a/src/components/Nav/Nav.module.css +++ b/src/components/Nav/Nav.module.css @@ -27,6 +27,7 @@ text-align: center; width: 100%; gap: 16px; + flex: 2 1; } .Nav .right { @@ -37,6 +38,7 @@ text-align: center; width: 100%; gap: 16px; + flex: 0.5 1; } .Nav .titlePath { diff --git a/src/components/Nav/Nav.tsx b/src/components/Nav/Nav.tsx index 8c46bce..7bfbb3f 100644 --- a/src/components/Nav/Nav.tsx +++ b/src/components/Nav/Nav.tsx @@ -23,6 +23,7 @@ export default function Nav(elementProps: AnyObject) { href="/" > TrollCall + r4 Beta @@ -30,10 +31,18 @@ export default function Nav(elementProps: AnyObject) { className={globals.link} href="/" > - TC + TC Beta
+ + + bug_report + + logout @@ -90,7 +99,24 @@ export default function Nav(elementProps: AnyObject) { ) : ( - <> + <> + + + group_add + + + + + login + + + )}
diff --git a/src/components/cards/ClanCard/ClanCard.module.css b/src/components/cards/ClanCard/ClanCard.module.css index 9bb0230..150ab97 100644 --- a/src/components/cards/ClanCard/ClanCard.module.css +++ b/src/components/cards/ClanCard/ClanCard.module.css @@ -28,9 +28,9 @@ .ClanCard .horizontal { display: grid; grid-template-columns: auto auto; - justify-content: center; + justify-content: start; gap: 16px; - padding: 8px; + padding: 8px 8px; box-sizing: border-box; } @@ -58,12 +58,12 @@ display: flex; flex-direction: column; gap: 4px; - overflow: hidden; + /* overflow: hidden; */ width: 100%; } .ClanCard .horizontal .horizontalRight > * { width: 100%; text-overflow: ellipsis; - overflow: hidden; + /* overflow: hidden; */ } diff --git a/src/components/cards/ClanCard/ClanCard.tsx b/src/components/cards/ClanCard/ClanCard.tsx index f9e49bc..4f70070 100644 --- a/src/components/cards/ClanCard/ClanCard.tsx +++ b/src/components/cards/ClanCard/ClanCard.tsx @@ -61,11 +61,13 @@ export default function ClanCard({ {clan.displayName ?? clan.name}

-
- {clan.flairs.map(flair => ( - - ))} -
+ +
+ {clan.flairs?.map(flair => ( + + ))} +
+

group @@ -93,10 +95,16 @@ export default function ClanCard({

-

- description - {clan.description} -

+ 0}> +

+ + description + + + {clan.description} + +

+
diff --git a/src/components/cards/ClanCard/ClanSkeleton.tsx b/src/components/cards/ClanCard/ClanSkeleton.tsx index 8cf6092..469b0f6 100644 --- a/src/components/cards/ClanCard/ClanSkeleton.tsx +++ b/src/components/cards/ClanCard/ClanSkeleton.tsx @@ -14,29 +14,22 @@ export default function ClanSkeleton() {
-

- fjfjfjf fjf fjfjfjfjfjfj fj fj fjfjfj -

+

Epic Megagames

group - jjffjf j f fjfjfjfjjjjff jffff + Tim Sweeney (88/12)

link - https://fjfjfjfjfjfjfjfjfjfjf.fjf/fjfjfjfj + https://trollcall.xyz/

description - - ffffffffffffffffffjjjfjf fj j jjffjf - jfjfjfjfjfjjfffjffjjjjfjfjffjfjj ffjfjf fj j fj - fjfjjfjfj jjffjjjfjfjfjfjfjjfj fj fj jf jf jf jf - fjjfjffjfjfj fjffjf fjfj - + Tim Sweeney

diff --git a/src/components/cards/FlairCard/FlairCard.module.css b/src/components/cards/FlairCard/FlairCard.module.css index 988a65e..5833f9a 100644 --- a/src/components/cards/FlairCard/FlairCard.module.css +++ b/src/components/cards/FlairCard/FlairCard.module.css @@ -1,3 +1,7 @@ +.FlairLink { + text-decoration: none; +} + .FlairCard { background-color: var(--pri-bg); color: var(--pri-fg); diff --git a/src/components/cards/FlairCard/FlairCard.tsx b/src/components/cards/FlairCard/FlairCard.tsx index 1174573..61fccac 100644 --- a/src/components/cards/FlairCard/FlairCard.tsx +++ b/src/components/cards/FlairCard/FlairCard.tsx @@ -1,7 +1,9 @@ /* eslint-disable @next/next/no-img-element */ import { Color3 } from "@/types/assist/color"; import { ClientFlair } from "@/types/flair"; +import { ConditionalParent } from "@/utility/react/Conditional"; import { ThemeModeContext } from "@/utility/react/Themer"; +import Link from "next/link"; import { useContext } from "react"; import styles from "./FlairCard.module.css"; @@ -20,12 +22,25 @@ export default function FlairCard({ flair }: { flair: ClientFlair }) { } ) as React.CSSProperties; return ( -
( + + {children} + + )} > - {flair.name} -
+
+ {flair.name} +
+ ); } diff --git a/src/components/cards/SignCard/SignCard.module.css b/src/components/cards/SignCard/SignCard.module.css index 54bf4fb..726fd2a 100644 --- a/src/components/cards/SignCard/SignCard.module.css +++ b/src/components/cards/SignCard/SignCard.module.css @@ -31,3 +31,14 @@ drop-shadow(1px -1px 0 currentcolor) drop-shadow(-1px 1px 0 currentcolor); } +.SignCard.Skeleton .topImagePlaceholder { + font-family: "Renogare", "Poppins", "Space Grotesk", "Fira Code", + "Courier New", monospace; + font-size: 52px; + width: 52px; + color: var(--pri-bg); + filter: drop-shadow(1px 1px 0 var(--pri-fg)) + drop-shadow(-1px -1px 0 var(--pri-fg)) + drop-shadow(1px -1px 0 var(--pri-fg)) + drop-shadow(-1px 1px 0 var(--pri-fg)); +} diff --git a/src/components/cards/SignCard/SignSkeleton.tsx b/src/components/cards/SignCard/SignSkeleton.tsx index 19a5814..83d3a34 100644 --- a/src/components/cards/SignCard/SignSkeleton.tsx +++ b/src/components/cards/SignCard/SignSkeleton.tsx @@ -12,18 +12,12 @@ export default function SignSkeleton() { }} >
- + λ
-

jjjjfjfjffjfjjffj

+

half-life

- jjjfjfj - + - jjjfjfj + born.

diff --git a/src/components/cards/TrollCard/TrollCard.tsx b/src/components/cards/TrollCard/TrollCard.tsx index 93e2866..8868a26 100644 --- a/src/components/cards/TrollCard/TrollCard.tsx +++ b/src/components/cards/TrollCard/TrollCard.tsx @@ -82,46 +82,69 @@ export default function TrollCard({

({troll.pronunciation.join(" ")})

-

- Also known as {troll.username} online. -

-
- {troll.flairs.map(flair => ( - - ))} -
+ +

+ Also known as {troll.username} online. +

+
+ +
+ {troll.flairs?.map(flair => ( + + ))} +
+

-

- - - {troll.class?.name} of{" "} - {troll.trueSign?.aspect.name} - - - - - {troll.gender} - - - - {PronounGrouper(troll.pronouns)} - -

+ +

+ + + {troll.class?.name} of{" "} + {troll.trueSign?.aspect.name} + + - + + + + {troll.gender} + + + + - + + + + {troll.species} + + +

+

- {AgeConverter(troll.age, true)} + {AgeConverter(troll.age)} old - {HeightConverter(troll.height)} - - - - - {troll.species} - - + - + + {PronounGrouper(troll.pronouns)} +

{" "} -
+
    {troll.facts?.map((fact, index) => (
  • {" "} -
    +
    - +

    @@ -179,10 +209,12 @@ export default function TrollCard({ format_quote - {parseQuirk( - randomQuote, - troll.quirks["default"] - )} + {troll.quirks != null + ? parseQuirk( + randomQuote, + troll.quirks["default"] + ) + : randomQuote}

    diff --git a/src/components/cards/TrollCard/TrollSkeleton.tsx b/src/components/cards/TrollCard/TrollSkeleton.tsx index 7a61e02..fc497f3 100644 --- a/src/components/cards/TrollCard/TrollSkeleton.tsx +++ b/src/components/cards/TrollCard/TrollSkeleton.tsx @@ -19,33 +19,30 @@ export default function TrollSkeleton() { >
    -

    ffjfjf fjfjjj

    -

    (fjjjf-jjfj fjjfjf-fjffj)

    +

    GABBEN NEWELL

    +

    (gay-ben new-wul)

    - Also known as ffjfjjfjjfjfjjjjjfjjf online. + Also known as gaben@valvesoftware.com online.


    - fj + Lord of Sales - - ffjfj + Software - - fj/fjj/fjjjf + de/ck

    - fj + All Time - - ffjfj + 30% - - fj/fjj/fjjjf + Steam


      -
    • fjjfjjfjffj
    • -
    • fjjjjfjffjjfffjfj
    • -
    • - fjjjjffjjjfjjjfjjffjfjfj -
    • +
    • Steam Summer Sale
    • +
    • Dota

    @@ -56,20 +53,16 @@ export default function TrollSkeleton() {

    thumb_up - - ffjj fjf jjffffjfjfj fjfjjfjfjjj - + n < 3

    thumb_down - - ffjjj fjjfjjf jf jj jjfjjjffj j fff - + n >= 3

    format_quote - jjj fjjf jfjjjf f j ffff j f jjfj jf fj fjjjfj jfj + Hopefully, it would have been worth the wait.

    diff --git a/src/components/form/ErrorHandler/ErrorHandler.tsx b/src/components/form/ErrorHandler/ErrorHandler.tsx new file mode 100644 index 0000000..f695cd0 --- /dev/null +++ b/src/components/form/ErrorHandler/ErrorHandler.tsx @@ -0,0 +1,49 @@ +import globals from "@/styles/global.module.css"; +import form_globals from "@/styles/global_form.module.css"; +export default function ErrorHandler(error: any) { + console.log(error); + if (Array.isArray(error) && error.map) + return ( + + {error.map((errorChild, index) => ( + + ))} + + ); + else if (typeof error === "string") + return ( + + error Error:{" "} + {error.replace( + /\["?(\d+)"?\]/g, + (_: string, s1: string, __: any, ___: string) => + " field #" + (+s1 + 1) + )} + + ); + else if (Array.isArray(error.error) && error.error.map) + return ( + + {error.error.map((errorChild: string, index: number) => ( + + ))} + + ); + else if (typeof error.error === "string") + return ( + + error Error:{" "} + {error.error.replace( + /\["?(\d+)"?\]/g, + (_: string, s1: string, __: any, ___: string) => + " field #" + (+s1 + 1) + )} + + ); +} diff --git a/src/components/form/template/.prettierrc b/src/components/form/template/.prettierrc new file mode 100644 index 0000000..0f21dee --- /dev/null +++ b/src/components/form/template/.prettierrc @@ -0,0 +1,18 @@ +{ + "_comment": "A custom .prettierrc file is here because Formik gets pretty intense.", + "trailingComma": "none", + "tabWidth": 4, + "useTabs": false, + "printWidth": 160, + "semi": true, + "singleQuote": false, + "quoteProps": "preserve", + "jsxSingleQuote": false, + "bracketSpacing": true, + "bracketSameLine": false, + "arrowParens": "avoid", + "proseWrap": "never", + "endOfLine": "lf", + "embeddedLanguageFormatting": "auto", + "singleAttributePerLine": true +} diff --git a/src/components/form/template/clan.tsx b/src/components/form/template/clan.tsx new file mode 100644 index 0000000..1f4f32b --- /dev/null +++ b/src/components/form/template/clan.tsx @@ -0,0 +1,730 @@ +import Box from "@/components/Box/Box"; +import ErrorHandler from "@/components/form/ErrorHandler/ErrorHandler"; +import globals from "@/styles/global.module.css"; +import form_globals from "@/styles/global_form.module.css"; +import { Color3 } from "@/types/assist/color"; +import { SubmitClan, SubmitClanSchema } from "@/types/client/clan"; +import { ArrayHelpers, ErrorMessage, Field, FieldArray, Form, Formik } from "formik"; +import { NextRouter } from "next/router"; +import { useState } from "react"; + +export default function ClanFormTemplate({ + router, + onSubmitURI, + on200URI, + initialValues, + method +}: { + router: NextRouter; + initialValues?: SubmitClan; + onSubmitURI?: string; + on200URI?: string; + method?: string; +}) { + const [submitError, setSubmitError] = useState(""); + return ( + { + fetch(onSubmitURI ?? "/api/clan", { + method: method ?? "POST", + body: JSON.stringify(values), + headers: { + "Accept": "application/json", + "Content-Type": "application/json" + } + }).then(res => { + if (res.status === 200) router.push(on200URI ?? `/clan/${values.name}`); + else setSubmitError(res.status.toString()); + }); + }} + > + {({ values, setFieldValue, errors, initialValues, isSubmitting, resetForm, submitForm }) => ( +
    + + About your clan. Name, members, whatever else! +
    +
    +

    Name

    + The name of your clan. +
    +
    +
    + +
    + +
    +
    + By the way, your clan's link is based on the this name. + /clan/{values.name?.toLowerCase()} + + info{" "} + + Keep in mind - if you have overlapping names with another clan, you will not be able to submit this clan. + + +
    +
    +
    +
    +
    +

    Display name

    + The display name for your clan. If left blank, the simple name will be used instead. +
    +
    +
    + +
    + +
    +
    + + info{" "} + + If you have overlapping display names with another clan, nothing will happen -- though you may have issues regarding + impersonation. + + +
    +
    +
    +
    +
    +

    Members

    + All of the members of your clan. +
    + ( +
    + {values.members && values.members.length > 0 ? ( + <> +
    + +
    +
    + {values.members.map((member, index) => ( +
    +
    + +
    + +
    + ( +
    +
    + +
    +
    + {values.members[index].pronouns && values.members[index].pronouns.length > 0 ? ( + values.members[index].pronouns.map((pronounSet, mbPindex) => ( +
    +
    + + / + + / + +
    +
    + + + + +
    +
    + )) + ) : ( + <> + )} +
    +
    + )} + /> +
    + +
    + + + + +
    +
    + ))} +
    + + ) : ( + <> + + + )} + +
    + )} + /> +
    +
    +
    +
    +

    description

    + Describe your clan to us! + You don't have to, but it would be cool if you did. +
    +
    + + 10000 ? form_globals.render_error : ""} ${ + values.description.length >= 9900 ? form_globals.render_warning : "" + }`} + > + {values.description.length <= 10000 + ? 10000 - values.description.length + " characters remaining" + : values.description.length - 10000 + " characters over limit"} + + +
    +
    +
    +
    +
    +

    Clan Color

    + The color that represents your clan the most. +
    +
    + {values.color != null && errors.color == null ? ( + <> +
    + Red + + Green + + Blue + +
    + #{Color3.fromRGB(...values.color).toHex()} + + This is average text! + + + + ) : ( + + )} +
    + + +
    +
    +
    +
    +

    PFP Image

    + An image. +
    +
    + image + +
    + +
    +
    + + Clan preferences, et cetera. +
    +
    +

    Policies

    + How you want others to treat your characters. +
    + +
    +

    Fanart

    + Allow others to draw fanart of your characters. + + + + + +
    +
    +

    Fanart with other characters

    + Allow others to draw fanart of your characters with other characters. + + + + + +
    +
    +

    Kinning

    + Allow others to kin your characters. + + + + + +
    +
    +

    Shipping

    + + + + + +
    +
    +

    Fanfiction

    + + + + + +
    + +
    +
    +
    +
    +
    +

    BG Image

    + An image that will display as a banner. + Supporter/moderator only. +
    +
    + image + +
    + +
    +
    +
    +
    +

    CSS

    + Styling that is applied when your user page is accessed. + Supporter/moderator only. +
    +
    + + +
    +
    +
    +
    +
    +

    Code

    + + The authentication code for your clan. If this is left blank, it will be randomly generated. + +
    +
    +
    + +
    + +
    +
    + + info{" "} + + Make sure to make this somewhat secure! You can share this code with friends, but make sure you trust them. + + +
    +
    +
    + +
    + + +
    +
    {submitError != null && submitError.length > 0 ? ErrorHandler(submitError) : ""}
    +
    + Advanced stuff +
    +
    + Values (Advanced) +

    {JSON.stringify(values, null, 2)}

    +
    +
    + Errors (Advanced) +

    {JSON.stringify(errors, null, 2)}

    +
    +

    If something is wrong, make sure to send these with your report!

    +
    +
    +
    +
    + )} +
    + ); +} diff --git a/src/components/form/template/troll.tsx b/src/components/form/template/troll.tsx new file mode 100644 index 0000000..a49358c --- /dev/null +++ b/src/components/form/template/troll.tsx @@ -0,0 +1,1453 @@ +import Box from "@/components/Box/Box"; +import SignCard from "@/components/cards/SignCard/SignCard"; +import ErrorHandler from "@/components/form/ErrorHandler/ErrorHandler"; +import globals from "@/styles/global.module.css"; +import form_globals from "@/styles/global_form.module.css"; +import { Color3 } from "@/types/assist/color"; +import { ClassKeys, TrueSign, TrueSignKeys } from "@/types/assist/extended_zodiac"; +import { SubmitTroll, SubmitTrollSchema } from "@/types/client/troll"; +import { AgeConverter, HeightConverterImperial, HeightConverterMetric, PronounGrouper } from "@/utility/language"; +import { ArrayHelpers, ErrorMessage, Field, FieldArray, Form, Formik } from "formik"; +import { NextRouter } from "next/router"; +import { useState } from "react"; + +export default function TrollFormTemplate({ + router, + user, + onSubmitURI, + on200URI, + initialValues, + method +}: { + router: NextRouter; + user: { + TROLLCALL_NAME: string; + TROLLCALL_CODE: string; + }; + initialValues?: SubmitTroll; + onSubmitURI?: string; + on200URI?: string; + method?: string; +}) { + const [submitError, setSubmitError] = useState(""); + return ( + { + fetch(onSubmitURI ?? "/api/troll", { + method: method ?? "POST", + body: JSON.stringify(values), + headers: { + "Accept": "application/json", + "Content-Type": "application/json" + } + }).then(res => { + if (res.status === 200) router.push(on200URI ?? `/troll/${user.TROLLCALL_NAME}/${values.name[0].toLowerCase()}`); + else setSubmitError(res.status.toString()); + }); + }} + > + {({ values, setFieldValue, errors, initialValues, isSubmitting, resetForm, submitForm }) => ( +
    + + About your character - on a personal level. Name, pronouns, basic stuff. +
    +
    +

    Name

    + The name of your character. +
    +
    +
    + + +
    + +
    + +
    + By the way, your character's link is based on the first name. + + /troll/[username]/ + {values.name[0].toLowerCase()} + + + info{" "} + + Keep in mind - if you have overlapping names with another one of your characters, you will not be able to submit this + character. + + +
    +
    +
    +
    +
    +

    Pronunciation

    + How to say the name of your character. +
    +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    Pronouns

    + How to refer to your character. Higher = more preferred. +
    + ( +
    +
    + +
    + {values.pronouns && values.pronouns.length > 0 ? ( + values.pronouns.map((pronounSet, index) => ( +
    +
    + + / + + / + +
    +
    + + + + +
    +
    + )) + ) : ( + <> + )} + +
    + )} + /> +
    + {values.pronouns.length > 0 && errors.pronouns == null ? ( + <> + Short form: {PronounGrouper(values.pronouns)} + + Medium form: {values.pronouns.map(pronounSet => pronounSet.slice(0, 2).join("/")).join(", ")} + + Long form: {values.pronouns.map(pronounSet => pronounSet.join("/")).join(", ")} + + ) : ( + <> + )} +
    + + info{" "} + Keep in mind - the included pronouns are removable, you don't have to keep them. + +
    +
    +
    +
    +

    Gender

    + Your character's gender identity. +
    +
    +
    + +
    + +
    +
    +
    + + What your character does, thinks, and prefers. +
    +
    +

    description

    + Describe your character to us! + You don't have to, but it would be cool if you did. +
    +
    + + 10000 ? form_globals.render_error : ""} ${ + values.description.length >= 9900 ? form_globals.render_warning : "" + }`} + > + {values.description.length <= 10000 + ? 10000 - values.description.length + " characters remaining" + : values.description.length - 10000 + " characters over limit"} + + +
    +
    +
    +
    +
    +

    Quotes

    + Things your character has said. +
    + {values.quotes != null && Array.isArray(values.quotes) && values.quotes.length > 0 ? ( + ( +
    +
    + + +
    + {Array.isArray(values.quotes) && values.quotes.length > 0 ? ( + values.quotes.map((pronounSet, index) => ( +
    +
    + format_quote + +
    +
    + + + + +
    +
    + )) + ) : ( + <> + )} +
    + )} + /> + ) : ( + <> + + + )} + +
    +
    +
    +
    +

    Facts

    + Fun facts about your character! +
    + {values.facts != null && Array.isArray(values.facts) && values.facts.length > 0 ? ( + ( +
    +
    + + +
    + {Array.isArray(values.facts) && values.facts.length > 0 ? ( + values.facts.map((pronounSet, index) => ( +
    +
    + +
    +
    + + + + +
    +
    + )) + ) : ( + <> + )} +
    + )} + /> + ) : ( + <> + + + )} + +
    +
    +
    +
    +

    Preferences

    + What your character likes and dislikes. +
    + {values.preferences?.love != null && Array.isArray(values.preferences.love) && values.preferences.love.length > 0 ? ( + ( +
    +
    + + +
    + {Array.isArray(values.preferences.love) && values.preferences.love.length > 0 ? ( + values.preferences.love.map((pronounSet, index) => ( +
    +
    + thumb_up + +
    +
    + + + + +
    +
    + )) + ) : ( + <> + )} +
    + )} + /> + ) : ( + <> + + + )} + + {values.preferences?.hate != null && Array.isArray(values.preferences.hate) && values.preferences.hate.length > 0 ? ( + ( +
    +
    + + +
    + {Array.isArray(values.preferences.hate) && values.preferences.hate.length > 0 ? ( + values.preferences.hate.map((pronounSet, index) => ( +
    +
    + thumb_down + +
    +
    + + + + +
    +
    + )) + ) : ( + <> + )} +
    + )} + /> + ) : ( + <> + + + )} + +
    +
    +
    +
    +

    Username

    + Your character's online username. This isn't required, but it would be funny if it was. +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +

    Text Color

    + + The color your character likes to type in. This is optional, but if this is left blank, the True Sign/False Sign color will + be used instead. + +
    +
    + {values.textColor != null && errors.textColor == null ? ( + <> +
    + Red + + Green + + Blue + +
    + #{Color3.fromRGB(...values.textColor).toHex()} + + This is average text! + + + + ) : ( + + )} +
    + + +
    +
    +
    +
    +

    Images

    + A collection of images of your character. +
    + {values.images != null && Array.isArray(values.images) && values.images.length > 0 ? ( + ( +
    +
    + +
    + {Array.isArray(values.images) && values.images.length > 0 ? ( + values.images.map((pronounSet, index) => ( +
    +
    + image + +
    +
    + + + + +
    +
    + )) + ) : ( + <> + )} +
    + )} + /> + ) : ( + <> + + + )} + +
    +
    + + + Some things from the Hiveswap/Homestuck series. Can be almost completely ignored if you don't care about this sort of thing. + +
    +
    +

    True Sign

    + Your character's True Sign. +
    +
    +
    + + + {TrueSignKeys.map((trueSign, idx) => ( + + ))} + +
    + +
    + {values.trueSign != null && TrueSign[values.trueSign] != null && errors.falseSign == null ? ( + + ) : ( + <> + )} +
    +
    +
    +
    +

    False Sign

    + + Your character's False Sign, most likely used as a mask for their True Sign in public. This is most definitely optional. + +
    +
    +
    + + + {TrueSignKeys.map((trueSign, idx) => ( + + ))} + +
    + +
    + {values.falseSign != null && TrueSign[values.falseSign] != null && errors.falseSign == null ? ( + + ) : ( + <> + )} +
    +
    +
    +
    +

    Classpect

    + Your character's classpect. Also optional. +
    +
    +
    + + + {ClassKeys.map((classy, idx) => ( + + ))} + +
    + +
    +
    +
    + + Let's get physical! Some stuff that's about your character as they exist. +
    +
    +

    Species

    + Your character's species. Can be just about anything! Not required. +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +

    Height

    + Your character's height (in inches). +
    +
    +
    + +
    + +
    +
    + Metric: {HeightConverterMetric(values.height)} + Imperial: {HeightConverterImperial(values.height)} +
    +
    +
    +
    +
    +

    Age

    + Your character's age (in years). +
    +
    +
    + +
    + +
    +
    + + If your character's on Alternia, they'd be about {AgeConverter(values.age, true)} old. + + + info{" "} + + Your character is under 13 years old. Nothing will happen because of this, just keep in mind that TrollCall is a + resource intended for those 13 and up. + + +
    +
    +
    + + How your character is shown on the site itself. +
    +
    +

    Page Color

    + The color your character's page/card will be. +
    +
    + {values.pageColor != null ? ( + <> +
    + Red + + Green + + Blue + +
    + {errors.pageColor == null ? ( + <> + #{Color3.fromRGB(...values.pageColor).toHex()} + + This is average text! + + + + ) : ( + <> + )} + + ) : ( + + )} +
    + + +
    +
    +
    +
    +

    Policies

    + How you want others to treat your characters. +
    + +
    +

    Fanart

    + Allow others to draw fanart of your character. + + + + + + +
    +
    +

    Fanart with other characters

    + Allow others to draw fanart of your character with other characters. + + + + + + +
    +
    +

    Kinning

    + Allow others to kin your character. + + + + + + +
    +
    +

    Shipping

    + + + + + + +
    +
    +

    Fanfiction

    + + + + + + +
    + +
    +
    +
    + +
    + + +
    +
    {submitError != null && submitError.length > 0 ? ErrorHandler(submitError) : ""}
    +
    + Advanced stuff +
    +
    + Values (Advanced) +

    {JSON.stringify(values, null, 2)}

    +
    +
    + Errors (Advanced) +

    {JSON.stringify(errors, null, 2)}

    +
    +

    If something is wrong, make sure to send these with your report!

    +
    +
    +
    +
    + )} +
    + ); +} diff --git a/src/components/template/credits.tsx b/src/components/template/credits.tsx new file mode 100644 index 0000000..b4aea73 --- /dev/null +++ b/src/components/template/credits.tsx @@ -0,0 +1,90 @@ +import globals from "@/styles/global.module.css"; +import Link from "next/link"; + +export default function Credits() { + return ( + <> +

    + TrollCall rev. 4 created with ❤️ by MeowcaTheoRange using{" "} + + Next.js + {" "} + (Pages Router). +

    +

    + trollcall.xyz domain owned by [person who is not me]. +

    +

    + The TrollCall name is derived from the original Hiveswap Troll + Call. The name may be used in an entity context or a project + context. +

    +

    + The textboxes found in the [INSERT PAGE HERE] are inspired by + those from the game Celeste. +

    +

    + + + TrollCall Display + {" "} + font by MeowcaTheoRange. + + + + Space Grotesk + {" "} + font by Florian Karsten. + + + + Space Mono + {" "} + font by Colophon Foundry. + + + + Poppins + {" "} + font by Indian Type Foundry. + + + + Flow Circular + {" "} + font by Dan Ross. + + + + Renogare + {" "} + font by Deepak Dogra. + +

    +

    + Homestuck and HIVESWAP © Homestuck Inc. +

    + + ); +} diff --git a/src/components/template/not-signed-in-clan.tsx b/src/components/template/not-signed-in-clan.tsx new file mode 100644 index 0000000..bcd22eb --- /dev/null +++ b/src/components/template/not-signed-in-clan.tsx @@ -0,0 +1,18 @@ +import globals from "@/styles/global.module.css"; +import Box from "../Box/Box"; + +export default function NotSignedInClan({ clan }: { clan: string }) { + return ( + +

    + You need to part of the {clan} clan to perform this action! +

    + + Join the {clan} clan + +
    + ); +} diff --git a/src/components/template/not-signed-in.tsx b/src/components/template/not-signed-in.tsx new file mode 100644 index 0000000..4837280 --- /dev/null +++ b/src/components/template/not-signed-in.tsx @@ -0,0 +1,24 @@ +import globals from "@/styles/global.module.css"; +import Box from "../Box/Box"; + +export default function NotSignedIn() { + return ( + +

    + You need to part a clan to perform this action! +

    + + Join a clan + + + Create a clan + +
    + ); +} diff --git a/src/components/template/too-signed-in.tsx b/src/components/template/too-signed-in.tsx new file mode 100644 index 0000000..772d141 --- /dev/null +++ b/src/components/template/too-signed-in.tsx @@ -0,0 +1,18 @@ +import globals from "@/styles/global.module.css"; +import Box from "../Box/Box"; + +export default function TooSignedIn() { + return ( + +

    + You can't be part a clan to perform this action! +

    + + Log out + +
    + ); +} diff --git a/src/lib/db/mongodb.ts b/src/lib/db/mongodb.ts index 75001f4..c052ca1 100644 --- a/src/lib/db/mongodb.ts +++ b/src/lib/db/mongodb.ts @@ -26,3 +26,5 @@ if (process.env.NODE_ENV === "development") { } export const mainDB = client.db(process.env.MONGODB_DATABASE_NAME); + +export const firstDB = client.db("trollcall"); diff --git a/src/lib/trollcall/api/clan.ts b/src/lib/trollcall/api/clan.ts index 99f0c94..04e1112 100644 --- a/src/lib/trollcall/api/clan.ts +++ b/src/lib/trollcall/api/clan.ts @@ -17,11 +17,12 @@ export async function ClanGET( : await getSingleClan(query); if (clan == null) return null; const serverClan = await ServerClanToClientClan({ ...clan }); - serverClan.flairs = cutArray( - await getManyFlairs( - { _id: { $in: clan.flairs } }, - ServerFlairToClientFlair - ) - ); + if (clan.flairs != null) + serverClan.flairs = cutArray( + await getManyFlairs( + { _id: { $in: clan.flairs } }, + ServerFlairToClientFlair + ) + ); return serverClan as ClientClan; } diff --git a/src/lib/trollcall/api/troll.ts b/src/lib/trollcall/api/troll.ts index 99c1f45..42c7463 100644 --- a/src/lib/trollcall/api/troll.ts +++ b/src/lib/trollcall/api/troll.ts @@ -30,12 +30,13 @@ export async function TrollGET( }); if (troll == null) return null; const serverTroll = await ServerTrollToClientTroll(troll); - serverTroll.flairs = cutArray( - await getManyFlairs( - { _id: { $in: troll.flairs } }, - ServerFlairToClientFlair - ) - ); + if (troll.flairs != null) + serverTroll.flairs = cutArray( + await getManyFlairs( + { _id: { $in: troll.flairs } }, + ServerFlairToClientFlair + ) + ); // we know this is not null, as we passed in our own clan serverTroll.owner = (await ClanGET(null, clan)) as ClientClan; return serverTroll as ClientTroll; diff --git a/src/lib/trollcall/convert/clan.ts b/src/lib/trollcall/convert/clan.ts index 61ef1b9..5739822 100644 --- a/src/lib/trollcall/convert/clan.ts +++ b/src/lib/trollcall/convert/clan.ts @@ -14,6 +14,13 @@ export async function ServerClanToClientClan( return clientClan; } +export function ClientClanToSubmitClan(clientClan: ClientClan): SubmitClan { + let serverClan: SubmitClan = { + ...clientClan + }; + return serverClan; +} + export function SubmitClanToServerClan( submitClan: Partial ): Omit, "_id"> { diff --git a/src/lib/trollcall/convert/troll.ts b/src/lib/trollcall/convert/troll.ts index f0d92fb..a953fb7 100644 --- a/src/lib/trollcall/convert/troll.ts +++ b/src/lib/trollcall/convert/troll.ts @@ -10,7 +10,10 @@ export async function ServerTrollToClientTroll( let clientTroll: Partial = { ...sanitizedTroll, - trueSign: TrueSign[serverTroll.trueSign], + trueSign: + serverTroll.trueSign != null + ? TrueSign[serverTroll.trueSign] + : null, falseSign: serverTroll.falseSign != null ? TrueSign[serverTroll.falseSign] @@ -24,6 +27,24 @@ export async function ServerTrollToClientTroll( return clientTroll; } +export function ClientTrollToSubmitTroll( + clientTroll: ClientTroll +): SubmitTroll { + let submitTroll: SubmitTroll = { + ...clientTroll, + quirks: clientTroll.quirks + ? Object.entries(clientTroll.quirks) + : undefined, + trueSign: clientTroll.trueSign ? clientTroll.trueSign.name : undefined, + falseSign: clientTroll.falseSign + ? clientTroll.falseSign.name + : undefined, + class: clientTroll.class ? clientTroll.class.name : undefined + }; + + return submitTroll; +} + export function SubmitTrollToServerTroll( submitTroll: Partial ): Omit, "_id"> { diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 1c40a5e..87b928e 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,48 +1,56 @@ import Ads from "@/components/Ads/Ads"; import Box from "@/components/Box/Box"; import Nav from "@/components/Nav/Nav"; +import Credits from "@/components/template/credits"; import "@/styles/_app.css"; import "@/styles/global.module.css"; import globals from "@/styles/global.module.css"; -import { Color3 } from "@/types/assist/color"; +import { ThemeGet, ThemeGetOpt } from "@/types/generics"; import AuthContext from "@/utility/react/AuthContext"; -import Themer, { ThemeModeContext } from "@/utility/react/Themer"; +import Themer, { ThemeModeContext, defaultTheme } from "@/utility/react/Themer"; import { getCookies } from "cookies-next"; import type { AppProps } from "next/app"; import Link from "next/link"; +import { useRouter } from "next/router"; import { useState } from "react"; export default function App({ Component, pageProps }: AppProps) { - const [theme, setTheme] = useState([ - new Color3(0.9, 0.9, 0.8), - new Color3(0.7, 0.7, 0.6), - false - ] as [Color3, Color3, boolean?]); - const [width, setWidth] = useState(768); + const router = useRouter(); + const [theme, setTheme] = useState(defaultTheme as ThemeGet); + function themeSetWrapper(themeSetter: ThemeGetOpt) { + setTheme([ + themeSetter[0] ?? theme[0], + themeSetter[1] ?? theme[1], + themeSetter[2] ?? theme[2], + themeSetter[3] ?? theme[3] + ] as ThemeGet); + } const cookies = getCookies() as { TROLLCALL_NAME: string; TROLLCALL_CODE: string; }; + // useEffect(() => { + // setTheme(defaultTheme); + // }, [router.asPath]); return ( -
    +