From 6b38935d43a21e3b8c6f7f0d32f66694c0891040 Mon Sep 17 00:00:00 2001 From: MeowcaTheoRange Date: Mon, 26 Jun 2023 21:56:32 -0500 Subject: [PATCH] Move to Next.js --- .eslintrc.json | 3 + .gitignore | 37 +- next.config.js | 6 + package-lock.json | 416 +++++++++++++++++- package.json | 15 +- src/app/api/index.ts | 8 - src/app/api/troll/index.ts | 21 - src/app/api/user/index.ts | 63 --- src/app/index.ts | 6 - src/index.ts | 18 - src/pages/_app.tsx | 7 + src/pages/_document.tsx | 14 + src/pages/api/user/[user]/index.ts | 39 ++ .../api/user/[user]/troll/[troll]/index.ts | 24 + src/pages/api/user/index.ts | 30 ++ src/pages/index.tsx | 115 +++++ src/styles/Home.module.css | 229 ++++++++++ src/styles/globals.css | 107 +++++ tsconfig.json | 27 +- 19 files changed, 1049 insertions(+), 136 deletions(-) create mode 100644 .eslintrc.json create mode 100644 next.config.js delete mode 100644 src/app/api/index.ts delete mode 100644 src/app/api/troll/index.ts delete mode 100644 src/app/api/user/index.ts delete mode 100644 src/app/index.ts delete mode 100644 src/index.ts create mode 100644 src/pages/_app.tsx create mode 100644 src/pages/_document.tsx create mode 100644 src/pages/api/user/[user]/index.ts create mode 100644 src/pages/api/user/[user]/troll/[troll]/index.ts create mode 100644 src/pages/api/user/index.ts create mode 100644 src/pages/index.tsx create mode 100644 src/styles/Home.module.css create mode 100644 src/styles/globals.css diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/.gitignore b/.gitignore index cfbfa63..45c1abc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local .env -node_modules/ -dist/ \ No newline at end of file + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..a843cbe --- /dev/null +++ b/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +} + +module.exports = nextConfig diff --git a/package-lock.json b/package-lock.json index 4782095..e12e6c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,17 +10,23 @@ "license": "ISC", "dependencies": { "@types/cookie-parser": "^1.4.3", + "@types/react": "^18.2.14", "body-parser": "^1.20.2", + "cookie": "^0.5.0", "cookie-parser": "^1.4.6", "dotenv": "^16.3.0", "express": "^4.18.2", "lodash": "^4.17.21", "mongodb": "^5.6.0", "nanoid": "^3.3.6", + "next": "^13.4.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", "tsconfig-paths": "^4.2.0", "yup": "^1.2.0" }, "devDependencies": { + "@types/cookie": "^0.5.1", "@types/express": "^4.17.17", "@types/lodash": "^4.14.195", "@types/node": "^20.3.1", @@ -42,6 +48,146 @@ "node": ">=6.9.0" } }, + "node_modules/@next/env": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", + "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", + "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", + "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", + "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", + "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", + "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", + "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", + "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", + "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", + "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -77,6 +223,14 @@ "node": ">= 8" } }, + "node_modules/@swc/helpers": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -94,6 +248,12 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", + "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", + "dev": true + }, "node_modules/@types/cookie-parser": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz", @@ -140,6 +300,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -150,6 +315,21 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "node_modules/@types/react": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", + "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, "node_modules/@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", @@ -332,6 +512,17 @@ "node": ">=14.20.1" } }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -352,6 +543,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001508", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", + "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -407,6 +617,11 @@ "fsevents": "~2.3.2" } }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -533,6 +748,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -867,6 +1087,11 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -887,6 +1112,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1039,6 +1269,11 @@ "node": ">=0.12.0" } }, + "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/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -1055,6 +1290,17 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1238,6 +1484,56 @@ "node": ">= 0.6" } }, + "node_modules/next": { + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", + "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "dependencies": { + "@next/env": "13.4.7", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0", + "zod": "3.21.4" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.8.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.4.7", + "@next/swc-darwin-x64": "13.4.7", + "@next/swc-linux-arm64-gnu": "13.4.7", + "@next/swc-linux-arm64-musl": "13.4.7", + "@next/swc-linux-x64-gnu": "13.4.7", + "@next/swc-linux-x64-musl": "13.4.7", + "@next/swc-win32-arm64-msvc": "13.4.7", + "@next/swc-win32-ia32-msvc": "13.4.7", + "@next/swc-win32-x64-msvc": "13.4.7" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "fibers": ">= 3.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, "node_modules/nodemon": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", @@ -1352,6 +1648,11 @@ "node": ">=8" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -1373,6 +1674,29 @@ "queue-lit": "^1.5.0" } }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/property-expr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", @@ -1466,6 +1790,29 @@ "node": ">= 0.8" } }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1571,6 +1918,14 @@ "node": ">=6" } }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1709,6 +2064,14 @@ "npm": ">= 3.0.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -1732,6 +2095,14 @@ "node": ">= 0.8" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -1766,6 +2137,28 @@ "node": ">=4" } }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -1876,8 +2269,7 @@ "node_modules/tslib": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "node_modules/type-fest": { "version": "2.19.0", @@ -1945,6 +2337,18 @@ "node": ">= 0.8" } }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -2028,6 +2432,14 @@ "toposort": "^2.0.2", "type-fest": "^2.19.0" } + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index b6140f6..e1c6405 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "devDependencies": { + "@types/cookie": "^0.5.1", "@types/express": "^4.17.17", "@types/lodash": "^4.14.195", "@types/node": "^20.3.1", @@ -11,24 +12,30 @@ "name": "trollcallquick", "version": "0.1.0", "main": "dist/index.js", + "private": true, "scripts": { - "build": "npx tsc", - "start": "node dist/index.js", - "dev": "trap \"rm -rf dist/*;fuser -k 3000/tcp\" SIGINT;concurrently \"npx tsc --watch\" \"tsc-alias -w\" \"nodemon -q dist/index.js\"", - "devonce": "npx tsc && tsc-alias -p tsconfig.json;trap \"rm -rf dist/*;fuser -k 3000/tcp\" SIGINT;node dist/index.js" + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" }, "author": "MeowcaTheoRange", "license": "ISC", "description": "", "dependencies": { "@types/cookie-parser": "^1.4.3", + "@types/react": "^18.2.14", "body-parser": "^1.20.2", + "cookie": "^0.5.0", "cookie-parser": "^1.4.6", "dotenv": "^16.3.0", "express": "^4.18.2", "lodash": "^4.17.21", "mongodb": "^5.6.0", "nanoid": "^3.3.6", + "next": "^13.4.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", "tsconfig-paths": "^4.2.0", "yup": "^1.2.0" } diff --git a/src/app/api/index.ts b/src/app/api/index.ts deleted file mode 100644 index 753caa0..0000000 --- a/src/app/api/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Router } from "express"; -import { trollRouter } from "./troll"; -import { userRouter } from "./user"; - -export const apiRouter = Router(); - -apiRouter.use("/", trollRouter); -apiRouter.use("/", userRouter); diff --git a/src/app/api/troll/index.ts b/src/app/api/troll/index.ts deleted file mode 100644 index abfc99f..0000000 --- a/src/app/api/troll/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ServerTrollToClientTroll } from "@/lib/trollcall/convert/troll"; -import { getSingleTroll } from "@/lib/trollcall/troll"; -import { getSingleUser } from "@/lib/trollcall/user"; -import { Router } from "express"; - -export const trollRouter = Router(); - -trollRouter.get("/user/:user/troll/:troll", async (req, res, next) => { - const { params } = req; - const user = await getSingleUser({ - name: params.user - }); - if (user == null) return res.sendStatus(404); - const troll = await getSingleTroll({ - "name.0": params.troll, - "owners.0": user._id - }); - if (troll == null) return res.sendStatus(404); - const serverTroll = await ServerTrollToClientTroll(troll); - res.json(serverTroll); -}); diff --git a/src/app/api/user/index.ts b/src/app/api/user/index.ts deleted file mode 100644 index 1452fdc..0000000 --- a/src/app/api/user/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { MergeServerUsers, ServerUserToClientUser, SubmitUserToServerUser } from "@/lib/trollcall/convert/user"; -import { changeUser, createUser, getSingleUser } from "@/lib/trollcall/user"; -import { PartialUserSchema, SubmitUser, SubmitUserSchema } from "@/types/client/user"; -import { ServerUser } from "@/types/user"; -import { Router } from "express"; - -export const userRouter = Router(); - -userRouter.get("/user/:user/", async (req, res, next) => { - const { params } = req; - const user = await getSingleUser({ - name: params.user - }); - if (user == null) return res.sendStatus(404); - const serverUser = await ServerUserToClientUser(user); - res.json(serverUser); -}); - -userRouter.post("/user/", async (req, res, next) => { - const { body } = req; - let validatedUser: SubmitUser; - try { - validatedUser = await SubmitUserSchema.validate(body); - } catch (err) { - return res.status(400).send(err); - } - const checkExistingUser = await getSingleUser({ - name: validatedUser.name - }); - if (checkExistingUser != null) return res.sendStatus(409); - // we are sure this object is full, so cast partial - const serverUser = SubmitUserToServerUser(validatedUser) as Omit; - const newUser = await createUser(serverUser); - if (newUser == null) return res.sendStatus(503); - // Give cookies - res.cookie("TROLLCALL_NAME", newUser.name, { maxAge: 31540000 }) - .cookie("TROLLCALL_CODE", newUser.code, { maxAge: 31540000 }) - .json(newUser); -}); - -userRouter.put("/user/:user/", async (req, res, next) => { - const { body, params, cookies } = req; - let validatedUser: Partial; - try { - validatedUser = (await PartialUserSchema.validate(body)) as Partial; - } catch (err) { - return res.status(400).send(err); - } - const checkExistingUser = await getSingleUser({ - name: params.user - }); - if (checkExistingUser == null) return res.sendStatus(404); - if (checkExistingUser.code !== cookies.TROLLCALL_CODE || checkExistingUser.name !== cookies.TROLLCALL_NAME) - return res.sendStatus(403); - const serverUser = SubmitUserToServerUser(validatedUser); - const bothUsers = MergeServerUsers(checkExistingUser, serverUser); - const newUser = await changeUser(bothUsers); - if (newUser == null) return res.sendStatus(503); - // Give cookies, redundant style - res.cookie("TROLLCALL_NAME", newUser.name, { maxAge: 31540000 }) - .cookie("TROLLCALL_CODE", newUser.code, { maxAge: 31540000 }) - .json(newUser); -}); diff --git a/src/app/index.ts b/src/app/index.ts deleted file mode 100644 index d4d90bb..0000000 --- a/src/app/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Router } from "express"; -import { apiRouter } from "./api/index"; - -export const appRouter = Router(); - -appRouter.use("/api/", apiRouter); diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index aaf9d75..0000000 --- a/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import dotenv from "dotenv"; -dotenv.config(); - -import express, { Express } from "express"; -import { appRouter } from "./app"; - -import bodyParser from "body-parser"; -import cookieParser from "cookie-parser"; - -const app: Express = express(); -app.use(bodyParser.json()); -app.use(cookieParser()); - -app.use("/", appRouter); - -app.listen(process.env.PORT, () => { - console.log(`⚡️[server]: Server is running at http://localhost:${process.env.PORT}`); -}); diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx new file mode 100644 index 0000000..4446905 --- /dev/null +++ b/src/pages/_app.tsx @@ -0,0 +1,7 @@ +import "@/styles/globals.css"; +import type { AppProps } from "next/app"; +import React from "react"; + +export default function App({ Component, pageProps }: AppProps) { + return ; +} diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx new file mode 100644 index 0000000..793d834 --- /dev/null +++ b/src/pages/_document.tsx @@ -0,0 +1,14 @@ +import { Head, Html, Main, NextScript } from "next/document"; +import React from "react"; + +export default function Document() { + return ( + + + +
+ + + + ); +} diff --git a/src/pages/api/user/[user]/index.ts b/src/pages/api/user/[user]/index.ts new file mode 100644 index 0000000..74b1c61 --- /dev/null +++ b/src/pages/api/user/[user]/index.ts @@ -0,0 +1,39 @@ +import { MergeServerUsers, ServerUserToClientUser, SubmitUserToServerUser } from "@/lib/trollcall/convert/user"; +import { changeUser, getSingleUser } from "@/lib/trollcall/user"; +import { PartialUserSchema, SubmitUser } from "@/types/client/user"; +import { serialize } from "cookie"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const { body, cookies, query, method } = req; + if (method === "GET") { + const user = await getSingleUser({ + name: query.user + }); + if (user == null) return res.status(404).end(); + const serverUser = await ServerUserToClientUser(user); + res.json(serverUser); + } else if (method === "PUT") { + let validatedUser: Partial; + try { + validatedUser = (await PartialUserSchema.validate(body)) as Partial; + } catch (err) { + return res.status(400).send(err); + } + const checkExistingUser = await getSingleUser({ + name: query.user + }); + if (checkExistingUser == null) return res.status(404).end(); + if (checkExistingUser.code !== cookies.TROLLCALL_CODE || checkExistingUser.name !== cookies.TROLLCALL_NAME) + return res.status(403).end(); + const serverUser = SubmitUserToServerUser(validatedUser); + const bothUsers = MergeServerUsers(checkExistingUser, serverUser); + const newUser = await changeUser(bothUsers); + if (newUser == null) return res.status(503).end(); + // Give cookies, redundant style + res.setHeader("Set-Cookie", [ + serialize("TROLLCALL_NAME", newUser.name, { path: "/", maxAge: 31540000 }), + serialize("TROLLCALL_NAME", newUser.code, { path: "/", maxAge: 31540000 }) + ]).json(newUser); + } else return res.status(405).end(); +} diff --git a/src/pages/api/user/[user]/troll/[troll]/index.ts b/src/pages/api/user/[user]/troll/[troll]/index.ts new file mode 100644 index 0000000..9e01f64 --- /dev/null +++ b/src/pages/api/user/[user]/troll/[troll]/index.ts @@ -0,0 +1,24 @@ +import { ServerTrollToClientTroll } from "@/lib/trollcall/convert/troll"; +import { getSingleTroll } from "@/lib/trollcall/troll"; +import { getSingleUser } from "@/lib/trollcall/user"; +import { Router } from "express"; +import { NextApiRequest, NextApiResponse } from "next"; + +export const trollRouter = Router(); + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const { query, method } = req; + if (method === "GET") { + const user = await getSingleUser({ + name: query.user + }); + if (user == null) return res.status(404).end(); + const troll = await getSingleTroll({ + "name.0": query.troll, + "owners.0": user._id + }); + if (troll == null) return res.status(404).end(); + const serverTroll = await ServerTrollToClientTroll(troll); + res.json(serverTroll); + } else return res.status(405).end(); +} diff --git a/src/pages/api/user/index.ts b/src/pages/api/user/index.ts new file mode 100644 index 0000000..7d38126 --- /dev/null +++ b/src/pages/api/user/index.ts @@ -0,0 +1,30 @@ +import { SubmitUserToServerUser } from "@/lib/trollcall/convert/user"; +import { createUser, getSingleUser } from "@/lib/trollcall/user"; +import { SubmitUserSchema } from "@/types/client/user"; +import { ServerUser } from "@/types/user"; +import { serialize } from "cookie"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const { body } = req; + let validatedUser; + try { + validatedUser = await SubmitUserSchema.validate(body); + } catch (err) { + return res.status(400).send(err); + } + const checkExistingUser = await getSingleUser({ + name: validatedUser.name + }); + if (checkExistingUser != null) return res.status(409).end(); + // we are sure this object is full, so cast partial + const serverUser = SubmitUserToServerUser(validatedUser) as Omit; + const newUser = await createUser(serverUser); + if (newUser == null) return res.status(503).end(); + // Give cookies + res.setHeader("Set-Cookie", [ + serialize("TROLLCALL_NAME", newUser.name, { path: "/", maxAge: 31540000 }), + serialize("TROLLCALL_NAME", newUser.code, { path: "/", maxAge: 31540000 }) + ]); + res.json(newUser); +} diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 0000000..01ba52d --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,115 @@ +import styles from "@/styles/Home.module.css"; +import { Inter } from "next/font/google"; +import Head from "next/head"; +import Image from "next/image"; +import React from "react"; + +const inter = Inter({ subsets: ["latin"] }); + +export default function Home() { + return ( + <> + + Create Next App + + + + +
+
+

+ Get started by editing  + src/pages/index.tsx +

+ +
+ +
+ Next.js Logo +
+ + +
+ + ); +} diff --git a/src/styles/Home.module.css b/src/styles/Home.module.css new file mode 100644 index 0000000..9411a5e --- /dev/null +++ b/src/styles/Home.module.css @@ -0,0 +1,229 @@ +.main { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 6rem; + min-height: 100vh; +} + +.description { + display: inherit; + justify-content: inherit; + align-items: inherit; + font-size: 0.85rem; + max-width: var(--max-width); + width: 100%; + z-index: 2; + font-family: var(--font-mono); +} + +.description a { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; +} + +.description p { + position: relative; + margin: 0; + padding: 1rem; + background-color: rgba(var(--callout-rgb), 0.5); + border: 1px solid rgba(var(--callout-border-rgb), 0.3); + border-radius: var(--border-radius); +} + +.code { + font-weight: 700; + font-family: var(--font-mono); +} + +.grid { + display: grid; + grid-template-columns: repeat(4, minmax(25%, auto)); + width: var(--max-width); + max-width: 100%; +} + +.card { + padding: 1rem 1.2rem; + border-radius: var(--border-radius); + background: rgba(var(--card-rgb), 0); + border: 1px solid rgba(var(--card-border-rgb), 0); + transition: background 200ms, border 200ms; +} + +.card span { + display: inline-block; + transition: transform 200ms; +} + +.card h2 { + font-weight: 600; + margin-bottom: 0.7rem; +} + +.card p { + margin: 0; + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + max-width: 30ch; +} + +.center { + display: flex; + justify-content: center; + align-items: center; + position: relative; + padding: 4rem 0; +} + +.center::before { + background: var(--secondary-glow); + border-radius: 50%; + width: 480px; + height: 360px; + margin-left: -400px; +} + +.center::after { + background: var(--primary-glow); + width: 240px; + height: 180px; + z-index: -1; +} + +.center::before, +.center::after { + content: ''; + left: 50%; + position: absolute; + filter: blur(45px); + transform: translateZ(0); +} + +.logo { + position: relative; +} +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + .card:hover { + background: rgba(var(--card-rgb), 0.1); + border: 1px solid rgba(var(--card-border-rgb), 0.15); + } + + .card:hover span { + transform: translateX(4px); + } +} + +@media (prefers-reduced-motion) { + .card:hover span { + transform: none; + } +} + +/* Mobile */ +@media (max-width: 700px) { + .content { + padding: 4rem; + } + + .grid { + grid-template-columns: 1fr; + margin-bottom: 120px; + max-width: 320px; + text-align: center; + } + + .card { + padding: 1rem 2.5rem; + } + + .card h2 { + margin-bottom: 0.5rem; + } + + .center { + padding: 8rem 0 6rem; + } + + .center::before { + transform: none; + height: 300px; + } + + .description { + font-size: 0.8rem; + } + + .description a { + padding: 1rem; + } + + .description p, + .description div { + display: flex; + justify-content: center; + position: fixed; + width: 100%; + } + + .description p { + align-items: center; + inset: 0 0 auto; + padding: 2rem 1rem 1.4rem; + border-radius: 0; + border: none; + border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); + background: linear-gradient( + to bottom, + rgba(var(--background-start-rgb), 1), + rgba(var(--callout-rgb), 0.5) + ); + background-clip: padding-box; + backdrop-filter: blur(24px); + } + + .description div { + align-items: flex-end; + pointer-events: none; + inset: auto 0 0; + padding: 2rem; + height: 200px; + background: linear-gradient( + to bottom, + transparent 0%, + rgb(var(--background-end-rgb)) 40% + ); + z-index: 1; + } +} + +/* Tablet and Smaller Desktop */ +@media (min-width: 701px) and (max-width: 1120px) { + .grid { + grid-template-columns: repeat(2, 50%); + } +} + +@media (prefers-color-scheme: dark) { + .vercelLogo { + filter: invert(1); + } + + .logo { + filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); + } +} + +@keyframes rotate { + from { + transform: rotate(360deg); + } + to { + transform: rotate(0deg); + } +} diff --git a/src/styles/globals.css b/src/styles/globals.css new file mode 100644 index 0000000..d4f491e --- /dev/null +++ b/src/styles/globals.css @@ -0,0 +1,107 @@ +:root { + --max-width: 1100px; + --border-radius: 12px; + --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', + 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', + 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; + + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; + + --primary-glow: conic-gradient( + from 180deg at 50% 50%, + #16abff33 0deg, + #0885ff33 55deg, + #54d6ff33 120deg, + #0071ff33 160deg, + transparent 360deg + ); + --secondary-glow: radial-gradient( + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); + + --tile-start-rgb: 239, 245, 249; + --tile-end-rgb: 228, 232, 233; + --tile-border: conic-gradient( + #00000080, + #00000040, + #00000030, + #00000020, + #00000010, + #00000010, + #00000080 + ); + + --callout-rgb: 238, 240, 241; + --callout-border-rgb: 172, 175, 176; + --card-rgb: 180, 185, 188; + --card-border-rgb: 131, 134, 135; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + + --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); + --secondary-glow: linear-gradient( + to bottom right, + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0.3) + ); + + --tile-start-rgb: 2, 13, 46; + --tile-end-rgb: 2, 5, 19; + --tile-border: conic-gradient( + #ffffff80, + #ffffff40, + #ffffff30, + #ffffff20, + #ffffff10, + #ffffff10, + #ffffff80 + ); + + --callout-rgb: 20, 20, 20; + --callout-border-rgb: 108, 108, 108; + --card-rgb: 100, 100, 100; + --card-border-rgb: 200, 200, 200; + } +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +a { + color: inherit; + text-decoration: none; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } +} diff --git a/tsconfig.json b/tsconfig.json index d0878aa..c12c62a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,23 @@ { "compilerOptions": { - "target": "ES2021", - "module": "commonjs", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "jsx": "preserve", - "strict": true, + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, "skipLibCheck": true, - "noErrorTruncation": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", "moduleResolution": "node", - "rootDir": "src", - "baseUrl": ".", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, "paths": { "@/*": ["./src/*"] - }, - "outDir": "./dist/" + } }, - "include": ["src/**/*.d.ts", "src/**/*.ts"] + "include": ["src/**/*.d.ts", "src/**/*.ts"], + "exclude": ["node_modules"] }