diff --git a/.dockerignore b/.dockerignore index 75eb6b2..f1de6b4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -15,4 +15,5 @@ scripts docker-compose.yml Dockerfile dprint.json +drizzle.config.ts eslint.config.mjs diff --git a/Dockerfile b/Dockerfile index 0151c9e..cb0eecf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,7 @@ WORKDIR /cache COPY package.json . COPY pnpm-lock.yaml . +COPY patches ./patches RUN corepack enable RUN pnpm install diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..f8d7a4a --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "drizzle-kit" + +export default defineConfig({ + schema: "./src/db/schema.ts", + out: "./src/db/migrations", + dialect: "postgresql", + strict: true, + verbose: true, + dbCredentials: { + url: process.env.POSTGRESURI! + } +}) diff --git a/eslint.config.mjs b/eslint.config.mjs index 9287416..17f9faf 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,10 +1,10 @@ +import { FlatCompat } from "@eslint/eslintrc" +import js from "@eslint/js" import typescriptEslint from "@typescript-eslint/eslint-plugin" -import globals from "globals" import tsParser from "@typescript-eslint/parser" +import globals from "globals" import path from "node:path" import { fileURLToPath } from "node:url" -import js from "@eslint/js" -import { FlatCompat } from "@eslint/eslintrc" // eslint-disable-next-line no-redeclare const __filename = fileURLToPath(import.meta.url) @@ -18,28 +18,28 @@ const compat = new FlatCompat({ export default [ { - ignores: ["**/node_modules", "**/dist"] + ignores: ["**/node_modules", "**/dist", "**/dev"] }, ...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"), { plugins: { - "@typescript-eslint": typescriptEslint, + "@typescript-eslint": typescriptEslint }, languageOptions: { globals: { ...globals.node, - ...globals.browser, + ...globals.browser }, parser: tsParser, ecmaVersion: "latest", - sourceType: "module", + sourceType: "module" }, rules: { indent: ["error", 4, { - SwitchCase: 1, + SwitchCase: 1 }], "linebreak-style": ["error", "unix"], @@ -52,7 +52,7 @@ export default [ "no-multiple-empty-lines": ["error", { max: 2, maxEOF: 1, - maxBOF: 0, + maxBOF: 0 }], "no-lonely-if": "error", @@ -62,13 +62,13 @@ export default [ "arrow-spacing": ["warn", { before: true, - after: true, + after: true }], "space-before-function-paren": ["error", { anonymous: "never", named: "never", - asyncArrow: "always", + asyncArrow: "always" }], "comma-spacing": "error", @@ -78,7 +78,7 @@ export default [ "@typescript-eslint/no-unused-vars": ["warn", { vars: "all", args: "after-used", - ignoreRestSiblings: false, + ignoreRestSiblings: false }], "@typescript-eslint/no-empty-object-type": "off", "@typescript-eslint/no-require-imports": "off", @@ -86,17 +86,18 @@ export default [ "ts-expect-error": "allow-with-description", "ts-ignore": "allow-with-description", "ts-nocheck": "allow-with-description", - "ts-check": "allow-with-description", - }], - }, - }, { + "ts-check": "allow-with-description" + }] + } + }, + { languageOptions: { globals: { - ...globals.node, + ...globals.node }, ecmaVersion: 5, - sourceType: "commonjs", - }, + sourceType: "commonjs" + } } ] diff --git a/package.json b/package.json index 82efae1..8281157 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,14 @@ "dev:ts": "nodemon --config .nodemon/ts.json src/index.ts", "dev:ts:inspect": "nodemon --config .nodemon/debug.json src/index.ts", "dev:js": "nodemon --config .nodemon/js.json dist/index.js", - "format": "dprint fmt \"**/*.ts\"", + "fmt": "dprint fmt \"**/*.ts\"", "check": "pnpm tscheck && pnpm lint", "tscheck": "tsc && echo \"TypeScript check passed!\"", "lint": "eslint && echo \"Linting passed!\"", "lint:fix": "eslint --fix", + "db:generate": "drizzle-kit generate", + "db:migrate": "drizzle-kit migrate", + "db:studio": "drizzle-kit studio", "push:prod": "tsx scripts/deploy-commands.ts", "push:dev": "tsx scripts/dev-deploy.ts", "delete:dev": "tsx scripts/delete-commands.ts" @@ -41,11 +44,11 @@ "discord-player-youtubei": "^1.3.2", "discord.js": "^14.16.2", "dotenv": "^16.4.5", + "drizzle-orm": "^0.33.0", "ioredis": "^5.4.1", "mongoose": "^8.6.3", "ms": "^2.1.3", - "pg": "^8.13.0", - "pg-hstore": "^2.3.4", + "postgres": "^3.4.4", "pretty-ms": "^9.1.0", "sequelize": "^6.37.3" }, @@ -56,16 +59,22 @@ "@swc/core": "^1.7.28", "@types/ms": "^0.7.34", "@types/node": "^22.7.2", - "@types/pg": "^8.11.10", "@typescript-eslint/eslint-plugin": "^8.7.0", "@typescript-eslint/parser": "^8.7.0", "chokidar": "^4.0.1", "dprint": "^0.47.2", + "drizzle-kit": "^0.24.2", "eslint": "^9.11.1", "globals": "^15.9.0", "sqlite3": "^5.1.7", "tsx": "^4.19.1", "typescript": "^5.6.2" }, - "packageManager": "pnpm@9.11.0+sha256.1c0e33f70e5df9eede84a357bdfa0b1f9dba6e58194628d48a1055756f553754" + "packageManager": "pnpm@9.11.0+sha256.1c0e33f70e5df9eede84a357bdfa0b1f9dba6e58194628d48a1055756f553754", + "pnpm": { + "patchedDependencies": { + "whatwg-url@5.0.0": "patches/whatwg-url@5.0.0.patch", + "tr46@0.0.3": "patches/tr46@0.0.3.patch" + } + } } diff --git a/patches/tr46@0.0.3.patch b/patches/tr46@0.0.3.patch new file mode 100644 index 0000000..f5eaad2 --- /dev/null +++ b/patches/tr46@0.0.3.patch @@ -0,0 +1,15 @@ +diff --git a/.npmignore b/.npmignore +deleted file mode 100644 +index 96e9161fde31e9906718f689d5cc135e507a51e1..0000000000000000000000000000000000000000 +diff --git a/index.js b/index.js +index 9ce12ca2d026fa202f7a0d32e0a7c8526660ed78..7c3b5d7ff1624d2bfbb5b83f69a9b460e38dbeab 100644 +--- a/index.js ++++ b/index.js +@@ -1,6 +1,6 @@ + "use strict"; + +-var punycode = require("punycode"); ++var punycode = require("punycode/"); + var mappingTable = require("./lib/mappingTable.json"); + + var PROCESSING_OPTIONS = { diff --git a/patches/whatwg-url@5.0.0.patch b/patches/whatwg-url@5.0.0.patch new file mode 100644 index 0000000..c62ace6 --- /dev/null +++ b/patches/whatwg-url@5.0.0.patch @@ -0,0 +1,11 @@ +diff --git a/lib/url-state-machine.js b/lib/url-state-machine.js +index c25dbc2c486289fbd7446baed24dc6343f0226f6..e1681d27501013c5e6aa9b720b32338c177b692c 100644 +--- a/lib/url-state-machine.js ++++ b/lib/url-state-machine.js +@@ -1,5 +1,5 @@ + "use strict"; +-const punycode = require("punycode"); ++const punycode = require("punycode/"); + const tr46 = require("tr46"); + + const specialSchemes = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1753b39..c1bdfe1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,14 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + tr46@0.0.3: + hash: bpj6gcw6zugqpvk6vn5cnxkdsq + path: patches/tr46@0.0.3.patch + whatwg-url@5.0.0: + hash: qm5bqxbojl4aucv5lfj4d2vjuu + path: patches/whatwg-url@5.0.0.patch + importers: .: @@ -38,6 +46,9 @@ importers: dotenv: specifier: ^16.4.5 version: 16.4.5 + drizzle-orm: + specifier: ^0.33.0 + version: 0.33.0(@types/pg@8.11.10)(pg@8.13.0)(postgres@3.4.4)(sqlite3@5.1.7) ioredis: specifier: ^5.4.1 version: 5.4.1 @@ -47,18 +58,15 @@ importers: ms: specifier: ^2.1.3 version: 2.1.3 - pg: - specifier: ^8.13.0 - version: 8.13.0 - pg-hstore: - specifier: ^2.3.4 - version: 2.3.4 + postgres: + specifier: ^3.4.4 + version: 3.4.4 pretty-ms: specifier: ^9.1.0 version: 9.1.0 sequelize: specifier: ^6.37.3 - version: 6.37.3(pg-hstore@2.3.4)(pg@8.13.0)(sqlite3@5.1.7) + version: 6.37.3(pg@8.13.0)(sqlite3@5.1.7) devDependencies: '@eslint/eslintrc': specifier: ^3.1.0 @@ -78,9 +86,6 @@ importers: '@types/node': specifier: ^22.7.2 version: 22.7.2 - '@types/pg': - specifier: ^8.11.10 - version: 8.11.10 '@typescript-eslint/eslint-plugin': specifier: ^8.7.0 version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2) @@ -93,6 +98,9 @@ importers: dprint: specifier: ^0.47.2 version: 0.47.2 + drizzle-kit: + specifier: ^0.24.2 + version: 0.24.2 eslint: specifier: ^9.11.1 version: 9.11.1 @@ -197,108 +205,327 @@ packages: cpu: [x64] os: [win32] + '@drizzle-team/brocli@0.10.1': + resolution: {integrity: sha512-AHy0vjc+n/4w/8Mif+w86qpppHuF3AyXbcWW+R/W7GNA3F5/p2nuhlkCJaTXSLZheB4l1rtHzOfr9A7NwoR/Zg==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.23.1': resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.23.1': resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.23.1': resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.23.1': resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.23.1': resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.23.1': resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.23.1': resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.23.1': resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.23.1': resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.23.1': resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.23.1': resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.23.1': resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.23.1': resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.23.1': resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.23.1': resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} @@ -311,30 +538,90 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.23.1': resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.23.1': resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.23.1': resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.23.1': resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} @@ -847,6 +1134,9 @@ packages: resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==} engines: {node: '>=16.20.1'} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1035,6 +1325,99 @@ packages: resolution: {integrity: sha512-geUcVIIrmLaY+YtuOl4gD7J/QCjsXZa5gUqre9sO6cgH0X/Fa9heBN3l/AWVII6rKPw45ATuCSDWz1pyO+HkPQ==} hasBin: true + drizzle-kit@0.24.2: + resolution: {integrity: sha512-nXOaTSFiuIaTMhS8WJC2d4EBeIcN9OSt2A2cyFbQYBAZbi7lRsVGJNqDpEwPqYfJz38yxbY/UtbvBBahBfnExQ==} + hasBin: true + + drizzle-orm@0.33.0: + resolution: {integrity: sha512-SHy72R2Rdkz0LEq0PSG/IdvnT3nGiWuRk+2tXZQ90GVq/XQhpCzu/EFT3V2rox+w8MlkBQxifF8pCStNYnERfA==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.1.1' + '@libsql/client': '*' + '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1055,6 +1438,21 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.23.1: resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} @@ -1768,10 +2166,6 @@ packages: pg-connection-string@2.7.0: resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} - pg-hstore@2.3.4: - resolution: {integrity: sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==} - engines: {node: '>= 0.8.x'} - pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -1854,6 +2248,10 @@ packages: postgres-range@1.1.4: resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + postgres@3.4.4: + resolution: {integrity: sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==} + engines: {node: '>=12'} + prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} @@ -2089,6 +2487,13 @@ packages: soundcloud.ts@0.5.5: resolution: {integrity: sha512-bygjhC1w/w26Nk0Y+4D4cWSEJ1TdxLaE6+w4pCazFzPF+J4mzuB62ggWmFa7BiwnirzNf9lgPbjzrQYGege4Ew==} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} @@ -2236,9 +2641,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} @@ -2443,75 +2845,222 @@ snapshots: '@dprint/win32-x64@0.47.2': optional: true + '@drizzle-team/brocli@0.10.1': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.8.1 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + '@esbuild/android-arm64@0.23.1': optional: true + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + '@esbuild/android-arm@0.23.1': optional: true + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + '@esbuild/android-x64@0.23.1': optional: true + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + '@esbuild/darwin-arm64@0.23.1': optional: true + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + '@esbuild/darwin-x64@0.23.1': optional: true + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + '@esbuild/freebsd-arm64@0.23.1': optional: true + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + '@esbuild/freebsd-x64@0.23.1': optional: true + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + '@esbuild/linux-arm64@0.23.1': optional: true + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + '@esbuild/linux-arm@0.23.1': optional: true + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + '@esbuild/linux-ia32@0.23.1': optional: true + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + '@esbuild/linux-loong64@0.23.1': optional: true + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + '@esbuild/linux-mips64el@0.23.1': optional: true + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + '@esbuild/linux-ppc64@0.23.1': optional: true + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + '@esbuild/linux-riscv64@0.23.1': optional: true + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + '@esbuild/linux-s390x@0.23.1': optional: true + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + '@esbuild/linux-x64@0.23.1': optional: true + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + '@esbuild/netbsd-x64@0.23.1': optional: true '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + '@esbuild/openbsd-x64@0.23.1': optional: true + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + '@esbuild/sunos-x64@0.23.1': optional: true + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + '@esbuild/win32-arm64@0.23.1': optional: true + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + '@esbuild/win32-ia32@0.23.1': optional: true + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + '@esbuild/win32-x64@0.23.1': optional: true @@ -2795,6 +3344,7 @@ snapshots: '@types/node': 22.7.2 pg-protocol: 1.7.0 pg-types: 4.0.2 + optional: true '@types/responselike@1.0.3': dependencies: @@ -3011,6 +3561,8 @@ snapshots: bson@6.8.0: {} + buffer-from@1.1.2: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -3250,6 +3802,22 @@ snapshots: '@dprint/win32-arm64': 0.47.2 '@dprint/win32-x64': 0.47.2 + drizzle-kit@0.24.2: + dependencies: + '@drizzle-team/brocli': 0.10.1 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.19.12 + esbuild-register: 3.6.0(esbuild@0.19.12) + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.33.0(@types/pg@8.11.10)(pg@8.13.0)(postgres@3.4.4)(sqlite3@5.1.7): + optionalDependencies: + '@types/pg': 8.11.10 + pg: 8.13.0 + postgres: 3.4.4 + sqlite3: 5.1.7 + emoji-regex@8.0.0: optional: true @@ -3270,6 +3838,64 @@ snapshots: err-code@2.0.3: optional: true + esbuild-register@3.6.0(esbuild@0.19.12): + dependencies: + debug: 4.3.7 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + esbuild@0.23.1: optionalDependencies: '@esbuild/aix-ppc64': 0.23.1 @@ -3926,7 +4552,7 @@ snapshots: node-fetch@2.7.0(encoding@0.1.13): dependencies: - whatwg-url: 5.0.0 + whatwg-url: 5.0.0(patch_hash=qm5bqxbojl4aucv5lfj4d2vjuu) optionalDependencies: encoding: 0.1.13 @@ -3985,7 +4611,8 @@ snapshots: dependencies: boolbase: 1.0.0 - obuf@1.1.2: {} + obuf@1.1.2: + optional: true once@1.4.0: dependencies: @@ -4049,19 +4676,19 @@ snapshots: pg-connection-string@2.7.0: {} - pg-hstore@2.3.4: - dependencies: - underscore: 1.13.7 + pg-int8@1.0.1: + optional: true - pg-int8@1.0.1: {} - - pg-numeric@1.0.2: {} + pg-numeric@1.0.2: + optional: true pg-pool@3.7.0(pg@8.13.0): dependencies: pg: 8.13.0 + optional: true - pg-protocol@1.7.0: {} + pg-protocol@1.7.0: + optional: true pg-types@2.2.0: dependencies: @@ -4070,6 +4697,7 @@ snapshots: postgres-bytea: 1.0.0 postgres-date: 1.0.7 postgres-interval: 1.2.0 + optional: true pg-types@4.0.2: dependencies: @@ -4080,6 +4708,7 @@ snapshots: postgres-date: 2.1.0 postgres-interval: 3.0.0 postgres-range: 1.1.4 + optional: true pg@8.13.0: dependencies: @@ -4090,10 +4719,12 @@ snapshots: pgpass: 1.0.5 optionalDependencies: pg-cloudflare: 1.1.1 + optional: true pgpass@1.0.5: dependencies: split2: 4.2.0 + optional: true picomatch@2.3.1: {} @@ -4103,27 +4734,38 @@ snapshots: optionalDependencies: '@napi-rs/nice': 1.0.1 - postgres-array@2.0.0: {} + postgres-array@2.0.0: + optional: true - postgres-array@3.0.2: {} + postgres-array@3.0.2: + optional: true - postgres-bytea@1.0.0: {} + postgres-bytea@1.0.0: + optional: true postgres-bytea@3.0.0: dependencies: obuf: 1.1.2 + optional: true - postgres-date@1.0.7: {} + postgres-date@1.0.7: + optional: true - postgres-date@2.1.0: {} + postgres-date@2.1.0: + optional: true postgres-interval@1.2.0: dependencies: xtend: 4.0.2 + optional: true - postgres-interval@3.0.0: {} + postgres-interval@3.0.0: + optional: true - postgres-range@1.1.4: {} + postgres-range@1.1.4: + optional: true + + postgres@3.4.4: {} prebuild-install@7.1.2: dependencies: @@ -4244,7 +4886,7 @@ snapshots: sequelize-pool@7.1.0: {} - sequelize@6.37.3(pg-hstore@2.3.4)(pg@8.13.0)(sqlite3@5.1.7): + sequelize@6.37.3(pg@8.13.0)(sqlite3@5.1.7): dependencies: '@types/debug': 4.1.12 '@types/validator': 13.12.2 @@ -4264,7 +4906,6 @@ snapshots: wkx: 0.5.0 optionalDependencies: pg: 8.13.0 - pg-hstore: 2.3.4 sqlite3: 5.1.7 transitivePeerDependencies: - supports-color @@ -4328,13 +4969,21 @@ snapshots: dependencies: undici: 6.19.8 + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + source-map@0.7.4: {} sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 - split2@4.2.0: {} + split2@4.2.0: + optional: true spotify-uri@4.1.0: {} @@ -4448,7 +5097,7 @@ snapshots: toposort-class@1.0.1: {} - tr46@0.0.3: {} + tr46@0.0.3(patch_hash=bpj6gcw6zugqpvk6vn5cnxkdsq): {} tr46@4.1.1: dependencies: @@ -4483,8 +5132,6 @@ snapshots: typescript@5.6.2: {} - underscore@1.13.7: {} - undici-types@6.19.8: {} undici@5.28.4: @@ -4526,9 +5173,9 @@ snapshots: tr46: 4.1.1 webidl-conversions: 7.0.0 - whatwg-url@5.0.0: + whatwg-url@5.0.0(patch_hash=qm5bqxbojl4aucv5lfj4d2vjuu): dependencies: - tr46: 0.0.3 + tr46: 0.0.3(patch_hash=bpj6gcw6zugqpvk6vn5cnxkdsq) webidl-conversions: 3.0.1 which@1.3.1: @@ -4554,7 +5201,8 @@ snapshots: ws@8.18.0: {} - xtend@4.0.2: {} + xtend@4.0.2: + optional: true yallist@2.1.2: {} diff --git a/src/commands-contextmenu/updateuser.ts b/src/commands-contextmenu/updateuser.ts index bb3c13c..bc9298f 100644 --- a/src/commands-contextmenu/updateuser.ts +++ b/src/commands-contextmenu/updateuser.ts @@ -1,8 +1,10 @@ import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { waitingListRole } from "config/roles.js" import { ApplicationCommandType, ContextMenuCommandBuilder, PermissionFlagsBits, userMention } from "discord.js" +import { eq } from "drizzle-orm" import { IContextMenu } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import roleManage from "utils/functions/rolesmanage.js" import { getGuild, getHeadURL, getIGN } from "utils/Hypixel.js" @@ -22,7 +24,9 @@ export default { const targetId = interaction.targetId const user = await interaction.guild!.members.fetch(targetId) const usermentioned = userMention(user.user.id) - const verifyData = await verify.findOne({ where: { userID: user.user.id } }) + const verifyData = await db.query.verifies.findFirst({ + where: eq(verifies.userID, user.user.id) + }) if (!verifyData) { await user.setNickname(`${user.user.username} (X)`, "User used the update command").catch(() => { diff --git a/src/commands/config.ts b/src/commands/config.ts index 217112b..d7682bc 100644 --- a/src/commands/config.ts +++ b/src/commands/config.ts @@ -1,7 +1,8 @@ import { embedColor } from "config/options.js" import { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder } from "discord.js" import { ICommand } from "interfaces" -import settings from "schemas/settingsTag.js" +import db from "src/db/db.js" +import { settings } from "src/db/schema.js" export default { name: "config", @@ -36,10 +37,12 @@ export default { const setting = interaction.options.getString("setting")! const value = interaction.options.getString("value")! - const settingsData = await settings.findOne({ where: { name: setting } }) + const settingsData = await db.query.settings.findFirst({ + where: (settings, { eq }) => eq(settings.name, setting) + }) if (!settingsData) { - await settings.create({ + await db.insert(settings).values({ name: setting, value: value }) @@ -51,7 +54,9 @@ export default { }] }) } else { - await settingsData.destroy() + await db.update(settings).set({ + value: value + }) await interaction.editReply({ embeds: [{ diff --git a/src/commands/find.ts b/src/commands/find.ts index 30f1cef..10eeb25 100644 --- a/src/commands/find.ts +++ b/src/commands/find.ts @@ -1,7 +1,9 @@ import { devMessage, embedColor } from "config/options.js" import { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" +import { eq } from "drizzle-orm" import { ICommand } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import { getHeadURL, getIGN, getUUID } from "utils/Hypixel.js" export default { @@ -37,7 +39,9 @@ export default { return } - const verifyData = await verify.findOne({ where: { uuid: uuid } }) + const verifyData = await db.query.verifies.findFirst({ + where: eq(verifies.uuid, uuid) + }) if (!verifyData) { await interaction.editReply({ embeds: [{ diff --git a/src/commands/forceunverify.ts b/src/commands/forceunverify.ts index 6d7a887..e72c949 100644 --- a/src/commands/forceunverify.ts +++ b/src/commands/forceunverify.ts @@ -1,7 +1,9 @@ import { devMessage, embedColor } from "config/options.js" import { GuildMember, InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" +import { eq } from "drizzle-orm" import { ICommand } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import logToChannel from "utils/functions/logtochannel.js" import roleManage from "utils/functions/rolesmanage.js" import { getIGN } from "utils/Hypixel.js" @@ -26,7 +28,9 @@ export default { async execute({ interaction }) { const member = interaction.options.getMember("user") as GuildMember - const verifiedUser = await verify.findOne({ where: { userID: member.user.id } }) + const verifiedUser = await db.query.verifies.findFirst({ + where: eq(verifies.userID, member.user.id) + }) const mod = interaction.user if (!verifiedUser) { @@ -41,7 +45,7 @@ export default { const uuid = verifiedUser.uuid const ign = await getIGN(uuid) - await verifiedUser.destroy() + await db.delete(verifies).where(eq(verifies.userID, member.user.id)) await member.roles.remove( roleManage("all").rolesToRemove, "User force unverified by " + interaction.user.username diff --git a/src/commands/forceupdate.ts b/src/commands/forceupdate.ts index 0172750..cf57575 100644 --- a/src/commands/forceupdate.ts +++ b/src/commands/forceupdate.ts @@ -1,8 +1,10 @@ import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { waitingListRole } from "config/roles.js" import { GuildMember, InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" +import { eq } from "drizzle-orm" import { ICommand } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import roleManage from "utils/functions/rolesmanage.js" import { getGuild, getHeadURL, getIGN } from "utils/Hypixel.js" @@ -29,7 +31,9 @@ export default { const user = interaction.options.getMember("user") as GuildMember const usermentioned = userMention(user.user.id) - const verifyData = await verify.findOne({ where: { userID: user.user.id } }) + const verifyData = await db.query.verifies.findFirst({ + where: eq(verifies.userID, user.user.id) + }) if (!verifyData) { await user.setNickname(`${user.user.username} (X)`, "User used the update command").catch(() => { diff --git a/src/commands/forceverify.ts b/src/commands/forceverify.ts index e0b774d..10c8cff 100644 --- a/src/commands/forceverify.ts +++ b/src/commands/forceverify.ts @@ -1,7 +1,9 @@ import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { GuildMember, InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" +import { eq } from "drizzle-orm" import { ICommand } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import logToChannel from "utils/functions/logtochannel.js" import roleManage from "utils/functions/rolesmanage.js" import { getGuild, getHeadURL, getPlayer, getUUID } from "utils/Hypixel.js" @@ -35,7 +37,9 @@ export default { const ign = interaction.options.getString("ign") const mod = interaction.user - const verifyData = await verify.findOne({ where: { userID: user.user.id } }) + const verifyData = await db.query.verifies.findFirst({ + where: eq(verifies.userID, user.user.id) + }) if (verifyData) { interaction.editReply("That user is already verified.") return @@ -160,7 +164,7 @@ export default { // Do nothing }) - await verify.create({ + await db.insert(verifies).values({ userID: user.user.id, uuid: uuid }) diff --git a/src/commands/guild/info.ts b/src/commands/guild/info.ts index 54a1e91..e88e564 100644 --- a/src/commands/guild/info.ts +++ b/src/commands/guild/info.ts @@ -110,20 +110,7 @@ export default async function guildInfo(interaction: ChatInputCommandInteraction const guildExp = new Intl.NumberFormat("en-US").format(guildExpUnformatted) const guildLvl = guildLevel(guildExpUnformatted) const guildMembers = guild!.members - - const guildCreatedDate = guildCreated.getDate() - const guildCreatedMonth = guildCreated.getMonth() + 1 - const guildCreatedYear = guildCreated.getFullYear() - const guildCreatedHour = guildCreated.getHours() - const guildCreatedMinute = guildCreated.getMinutes() - const guildCreatedSecond = guildCreated.getSeconds() - - const guildCreatedTime = guildCreatedDate + "." + - guildCreatedMonth + "." + - guildCreatedYear + " " + - guildCreatedHour + ":" + - guildCreatedMinute + ":" + - guildCreatedSecond + const guildCreatedTime = guildCreated.toLocaleString("hr-HR", {}) const guildOwner = guildMembers.find(m => m.rank === "Guild Master")!.uuid const guildOwnerName = await getIGN(guildOwner) diff --git a/src/commands/guild/member.ts b/src/commands/guild/member.ts index f6fe578..e720e50 100644 --- a/src/commands/guild/member.ts +++ b/src/commands/guild/member.ts @@ -111,19 +111,7 @@ export default async function guildMember(interaction: ChatInputCommandInteracti const guildMemberJoinMS = guildMember!.joined const guildMemberJoinTime = new Date(guildMemberJoinMS) - const guildMemberJoinDate = guildMemberJoinTime.getDate() - const guildMemberJoinMonth = guildMemberJoinTime.getMonth() + 1 - const guildMemberJoinYear = guildMemberJoinTime.getFullYear() - const guildMemberJoinHours = guildMemberJoinTime.getHours() - const guildMemberJoinMinutes = guildMemberJoinTime.getMinutes() - const guildMemberJoinSeconds = guildMemberJoinTime.getSeconds() - - const guildMemberJoin = guildMemberJoinDate + "." + - guildMemberJoinMonth + "." + - guildMemberJoinYear + " " + - guildMemberJoinHours + ":" + - guildMemberJoinMinutes + ":" + - guildMemberJoinSeconds + const guildMemberJoin = guildMemberJoinTime.toLocaleString("hr-HR", {}) await interaction.editReply({ embeds: [{ diff --git a/src/commands/guild/top.ts b/src/commands/guild/top.ts index b81f541..32876e9 100644 --- a/src/commands/guild/top.ts +++ b/src/commands/guild/top.ts @@ -1,5 +1,5 @@ import { devMessage, embedColor } from "config/options.js" -import { ChannelType, ChatInputCommandInteraction } from "discord.js" +import { ChatInputCommandInteraction } from "discord.js" import { IGuildData } from "interfaces" import { getGuild, getIGN, getPlayer, getUUID } from "utils/Hypixel.js" import { redis } from "utils/Illegitimate.js" @@ -12,16 +12,6 @@ export default async function guildTop(interaction: ChatInputCommandInteraction) let amount = interaction.options.getNumber("amount") || 10 let guild: IGuildData | null - if (interaction.channel!.type === ChannelType.DM) { - interaction.editReply({ - embeds: [{ - description: "You can't use this command in DMs!", - color: embedColor - }] - }) - return - } - if (type === "ign") { await interaction.editReply({ embeds: [{ diff --git a/src/commands/remove.ts b/src/commands/remove.ts index c2eb607..54fb9bf 100644 --- a/src/commands/remove.ts +++ b/src/commands/remove.ts @@ -1,8 +1,10 @@ import { devMessage, embedColor } from "config/options.js" import { waitingListRole } from "config/roles.js" import { GuildMember, InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" +import { eq } from "drizzle-orm" import { ICommand } from "interfaces" -import waitinglist from "schemas/waitinglistTag.js" +import db from "src/db/db.js" +import { waitingLists } from "src/db/schema.js" import logToChannel from "utils/functions/logtochannel.js" export default { @@ -35,9 +37,11 @@ export default { const member = interaction.options.getMember("user") as GuildMember const reason = interaction.options.getString("reason") ?? "No reason provided." const mod = interaction.user! - const waiting = await waitinglist.findOne({ where: { userID: member.user.id } }) + const waiting = await db.query.waitingLists.findFirst({ + where: eq(waitingLists.userID, member.user.id) + }) - if (!waitinglist) { + if (!waiting) { await interaction.editReply({ embeds: [{ description: userMention(member.user.id) + " is not on the waiting list.", @@ -47,7 +51,7 @@ export default { return } - await waiting?.destroy() + await db.delete(waitingLists).where(eq(waitingLists.userID, member.user.id)) await member.roles.remove(waitingListRole, "Removed from waiting list.") await logToChannel("mod", { diff --git a/src/commands/staff/removeguildroles.ts b/src/commands/staff/removeguildroles.ts index 60c9dcc..ecb3795 100644 --- a/src/commands/staff/removeguildroles.ts +++ b/src/commands/staff/removeguildroles.ts @@ -1,7 +1,7 @@ import { embedColor, hypixelGuildID } from "config/options.js" import { ChatInputCommandInteraction, GuildMember } from "discord.js" import { IGuildData } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" import env from "utils/Env.js" import roleManage from "utils/functions/rolesmanage.js" import { getGuild } from "utils/Hypixel.js" @@ -35,7 +35,7 @@ export default async function removeGuildRoles(interaction: ChatInputCommandInte const hypixelGuildMembers = guildData.members.map(gmember => gmember.uuid) - const verifiedUsers = await verify.findAll({}) + const verifiedUsers = await db.query.verifies.findMany({}) for (const gmember of guildMembers) { const gmemberuuid = verifiedUsers.find(user => user.userID === gmember.id)?.uuid diff --git a/src/commands/staff/updateall.ts b/src/commands/staff/updateall.ts index 560d848..ccfdd20 100644 --- a/src/commands/staff/updateall.ts +++ b/src/commands/staff/updateall.ts @@ -1,7 +1,7 @@ import { embedColor, hypixelGuildID } from "config/options.js" import { ChannelType, ChatInputCommandInteraction, GuildMember } from "discord.js" import { IGuildData } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" import env from "utils/Env.js" import { color } from "utils/functions/colors.js" import roleManage from "utils/functions/rolesmanage.js" @@ -53,7 +53,7 @@ export default async function updateAll(interaction: ChatInputCommandInteraction }) const guildMemberIDs = hypixelGuildMembers.map(gmember => gmember.uuid) - const verifiedUsers = await verify.findAll({}) + const verifiedUsers = await db.query.verifies.findMany() await interaction.editReply({ embeds: [{ diff --git a/src/commands/update.ts b/src/commands/update.ts index 65d4880..935043b 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -1,8 +1,10 @@ import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { waitingListRole } from "config/roles.js" import { GuildMember, InteractionContextType, SlashCommandBuilder } from "discord.js" +import { eq } from "drizzle-orm" import { ICommand } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import roleManage from "utils/functions/rolesmanage.js" import { getGuild, getHeadURL, getIGN } from "utils/Hypixel.js" @@ -21,7 +23,9 @@ export default { await interaction.deferReply() const user = interaction.member as GuildMember - const verifyData = await verify.findOne({ where: { userID: user.user.id } }) + const verifyData = await db.query.verifies.findFirst({ + where: eq(verifies.userID, user.user.id) + }) if (!verifyData) { await user.setNickname(`${user.user.username} (X)`, "User used the update command").catch(() => { diff --git a/src/commands/verify.ts b/src/commands/verify.ts index 6d45f42..a0eddfa 100644 --- a/src/commands/verify.ts +++ b/src/commands/verify.ts @@ -1,9 +1,11 @@ import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { GuildMember, InteractionContextType, SlashCommandBuilder } from "discord.js" +import { eq } from "drizzle-orm" import { ICommand } from "interfaces" import { IPlayerData } from "interfaces" import { IGuildData } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import roleManage from "utils/functions/rolesmanage.js" import { getGuild, getHeadURL, getPlayer, getUUID } from "utils/Hypixel.js" @@ -32,7 +34,9 @@ export default { const user = interaction.member! as GuildMember const ign = interaction.options.getString("ign")! - const verifyData = await verify.findOne({ where: { userID: user.id } }) + const verifyData = await db.query.verifies.findFirst({ + where: eq(verifies.userID, user.user.id) + }) if (verifyData) { interaction.editReply("You are already verified.\n" + "Try running /update to update your roles.") return @@ -178,7 +182,7 @@ export default { // Do nothing }) - await verify.create({ + await db.insert(verifies).values({ userID: user.id, uuid: uuid }) diff --git a/src/commands/whoami.ts b/src/commands/whoami.ts index f496eb9..9fd5aaf 100644 --- a/src/commands/whoami.ts +++ b/src/commands/whoami.ts @@ -1,7 +1,9 @@ import { devMessage, embedColor } from "config/options.js" import { InteractionContextType, SlashCommandBuilder, userMention } from "discord.js" +import { eq } from "drizzle-orm" import { ICommand } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import { getHeadURL, getIGN } from "utils/Hypixel.js" export default { @@ -19,7 +21,9 @@ export default { await interaction.deferReply() const user = interaction.user - const verifyData = await verify.findOne({ where: { userID: user.id } }) + const verifyData = await db.query.verifies.findFirst({ + where: eq(verifies.userID, user.id) + }) if (!verifyData) { await interaction.editReply({ diff --git a/src/commands/whois.ts b/src/commands/whois.ts index ae45f01..73e0ff7 100644 --- a/src/commands/whois.ts +++ b/src/commands/whois.ts @@ -1,7 +1,9 @@ import { devMessage, embedColor } from "config/options.js" import { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" +import { eq } from "drizzle-orm" import { ICommand } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import { getHeadURL, getIGN } from "utils/Hypixel.js" export default { @@ -26,7 +28,9 @@ export default { await interaction.deferReply() const user = interaction.options.getUser("user")! - const verifiedUser = await verify.findOne({ where: { userID: user.id } }) + const verifiedUser = await db.query.verifies.findFirst({ + where: eq(verifies.userID, user.id) + }) if (!verifiedUser) { interaction.editReply({ embeds: [{ diff --git a/src/components/buttons/checkstats.ts b/src/components/buttons/checkstats.ts index 9a20bfa..20328fc 100644 --- a/src/components/buttons/checkstats.ts +++ b/src/components/buttons/checkstats.ts @@ -1,7 +1,9 @@ import { devMessage, embedColor } from "config/options.js" import { bwfkdr, bwstars, bwwins, duelswins, duelswlr, swkdr, swstars } from "config/reqs.js" +import { eq } from "drizzle-orm" import { IButton } from "interfaces" -import guildapp from "schemas/guildAppTag.js" +import db from "src/db/db.js" +import { guildApps } from "src/db/schema.js" import { bedwarsLevel, getGuild, getHeadURL, getPlayer, hypixelLevel, skywarsLevel } from "utils/Hypixel.js" export default { @@ -14,7 +16,9 @@ export default { const message = interaction.message const embed = message.embeds[0] const applicantId = embed.footer!.text.split(" ")[1] - const guildappdata = await guildapp.findOne({ where: { userID: applicantId } }) + const guildappdata = await db.query.guildApps.findFirst({ + where: eq(guildApps.userID, applicantId) + }) const uuid = guildappdata!.uuid const player = await getPlayer(uuid) diff --git a/src/components/buttons/guildapplicationaccept.ts b/src/components/buttons/guildapplicationaccept.ts index ed9e7d3..583df31 100644 --- a/src/components/buttons/guildapplicationaccept.ts +++ b/src/components/buttons/guildapplicationaccept.ts @@ -1,9 +1,10 @@ import { embedColor, hypixelGuildID, waitingListChannel, waitingListMessage } from "config/options.js" import { waitingListRole } from "config/roles.js" import { ActionRowBuilder, ButtonBuilder, ButtonStyle, TextChannel } from "discord.js" +import { eq } from "drizzle-orm" import { IButton } from "interfaces" -import guildapp from "schemas/guildAppTag.js" -import waitingList from "schemas/waitinglistTag.js" +import db from "src/db/db.js" +import { guildApps, waitingLists } from "src/db/schema.js" import { color } from "utils/functions/colors.js" import { getGuild, getIGN } from "utils/Hypixel.js" @@ -53,18 +54,20 @@ export default { }] }) - const applicantEntry = await guildapp.findOne({ where: { userID: applicantId } }) + const applicantEntry = await db.query.guildApps.findFirst({ + where: eq(guildApps.userID, applicantId) + }) const applicantUUID = applicantEntry!.uuid const time = Date.now() - await waitingList.create({ + await db.insert(waitingLists).values({ userID: applicantId, uuid: applicantUUID, timestamp: time }) await applicant.roles.add(waitingListRole) - await applicantEntry?.destroy() + await db.delete(guildApps).where(eq(guildApps.userID, applicantId)) await interaction.editReply({ embeds: [{ @@ -87,14 +90,14 @@ export default { const wlmessage = await channel!.messages.fetch(waitingListMessage) const wlembed = wlmessage.embeds[0] - const accepted = await waitingList.findAll() + const accepted = await db.query.waitingLists.findMany() for (let i = 0; i < accepted.length; i++) { const uuid = accepted[i].uuid const guild = await getGuild(uuid) if (guild && guild._id === hypixelGuildID) { - await waitingList.destroy({ where: { uuid: uuid } }) + await db.delete(waitingLists).where(eq(waitingLists.uuid, uuid)) continue } } diff --git a/src/components/buttons/guildapply.ts b/src/components/buttons/guildapply.ts index 7acf04e..a642dd9 100644 --- a/src/components/buttons/guildapply.ts +++ b/src/components/buttons/guildapply.ts @@ -3,8 +3,10 @@ import { applicationsChannel, embedColor } from "config/options.js" import { guild as guildQuestions } from "config/questions.js" import { guildRole } from "config/roles.js" import { ActionRowBuilder, ButtonBuilder, ButtonStyle, GuildMember, TextChannel } from "discord.js" +import { eq } from "drizzle-orm" import { IButton } from "interfaces" -import guildapp from "schemas/guildAppTag.js" +import db from "src/db/db.js" +import { guildApps } from "src/db/schema.js" import applicationQuestions from "utils/functions/applicationquestions.js" export default { @@ -30,7 +32,9 @@ export default { return } - const application = await guildapp.findOne({ where: { userID: user.user.id } }) + const application = await db.query.guildApps.findFirst({ + where: eq(guildApps.userID, user.user.id) + }) if (application) { await interaction.editReply("You already have an application in progress.") @@ -248,7 +252,7 @@ export default { }] }) - await guildapp.create({ + await db.insert(guildApps).values({ userID: user.user.id, uuid: uuid }) diff --git a/src/components/buttons/staffapplicationaccept.ts b/src/components/buttons/staffapplicationaccept.ts index 3042443..efe0919 100644 --- a/src/components/buttons/staffapplicationaccept.ts +++ b/src/components/buttons/staffapplicationaccept.ts @@ -1,7 +1,9 @@ import { embedColor } from "config/options.js" import { ActionRowBuilder, ButtonBuilder, ButtonStyle } from "discord.js" +import { eq } from "drizzle-orm" import { IButton } from "interfaces" -import staffapp from "schemas/staffAppTag.js" +import db from "src/db/db.js" +import { staffApps } from "src/db/schema.js" export default { name: "staffapplicationaccept", @@ -43,8 +45,7 @@ export default { ] }) - const app = await staffapp.findOne({ where: { userID: applicantId } }) - await app?.destroy() + await db.delete(staffApps).where(eq(staffApps.userID, applicantId)) await interaction.editReply({ embeds: [{ diff --git a/src/components/buttons/staffapply.ts b/src/components/buttons/staffapply.ts index e65dbf5..7cfaf78 100644 --- a/src/components/buttons/staffapply.ts +++ b/src/components/buttons/staffapply.ts @@ -3,9 +3,10 @@ import { embedColor, staffApplicationsChannel } from "config/options.js" import { staff as staffQuestions } from "config/questions.js" import { guildRole, guildStaff } from "config/roles.js" import { ActionRowBuilder, ButtonBuilder, ButtonStyle, GuildMember, TextChannel } from "discord.js" +import { eq } from "drizzle-orm" import { IButton } from "interfaces" -import settings from "schemas/settingsTag.js" -import staffapp from "schemas/staffAppTag.js" +import db from "src/db/db.js" +import { settings, staffApps } from "src/db/schema.js" import env from "utils/Env.js" import applicationQuestions from "utils/functions/applicationquestions.js" @@ -17,7 +18,9 @@ export default { const user = interaction.member as GuildMember const guild = interaction.guild! const userRoles = user.roles.cache - const setting = await settings.findOne({ where: { name: "staffAppStatus" } }) + const setting = await db.query.settings.findFirst({ + where: eq(settings.name, "staffApplications") + }) const status = setting?.value || "0" function sq(n: number): string { @@ -48,7 +51,9 @@ export default { return } - const application = await staffapp.findOne({ where: { userID: user.user.id } }) + const application = await db.query.staffApps.findFirst({ + where: eq(staffApps.userID, user.user.id) + }) if (application) { await interaction.editReply("You already have an application in progress.") @@ -221,7 +226,7 @@ export default { }] }) - await staffapp.create({ + await db.insert(staffApps).values({ userID: user.user.id, uuid: uuid }) diff --git a/src/components/buttons/waitingListUpdate.ts b/src/components/buttons/waitingListUpdate.ts index e10c15b..67ae2fe 100644 --- a/src/components/buttons/waitingListUpdate.ts +++ b/src/components/buttons/waitingListUpdate.ts @@ -1,6 +1,8 @@ import { hypixelGuildID } from "config/options.js" +import { eq } from "drizzle-orm" import { IButton } from "interfaces" -import waitinglist from "schemas/waitinglistTag.js" +import db from "src/db/db.js" +import { waitingLists } from "src/db/schema.js" import { getGuild, getIGN } from "utils/Hypixel.js" export default { @@ -13,14 +15,14 @@ export default { const user = interaction.user const message = interaction.message const embed = message.embeds[0] - const accepted = await waitinglist.findAll() + const accepted = await db.query.waitingLists.findMany() for (let i = 0; i < accepted.length; i++) { const uuid = accepted[i].uuid const guild = await getGuild(uuid) if (guild && guild._id === hypixelGuildID) { - await accepted[i].destroy() + await db.delete(waitingLists).where(eq(waitingLists.uuid, uuid)) continue } } diff --git a/src/components/modals/denyreasonbox.ts b/src/components/modals/denyreasonbox.ts index b306f55..fb361b4 100644 --- a/src/components/modals/denyreasonbox.ts +++ b/src/components/modals/denyreasonbox.ts @@ -1,7 +1,9 @@ import { embedColor } from "config/options.js" import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, GuildMember, Message } from "discord.js" +import { eq } from "drizzle-orm" import { IModal } from "interfaces" -import guildapp from "schemas/guildAppTag.js" +import db from "src/db/db.js" +import { guildApps } from "src/db/schema.js" export default { name: "denyreasonbox", @@ -81,8 +83,7 @@ export default { responseEmbeds = [responseEmbed] } - const app = await guildapp.findOne({ where: { userID: applicantId } }) - await app?.destroy() + await db.delete(guildApps).where(eq(guildApps.userID, applicantId)) await interaction.editReply({ embeds: responseEmbeds diff --git a/src/components/modals/staffdenyreasonbox.ts b/src/components/modals/staffdenyreasonbox.ts index 4833416..dea399c 100644 --- a/src/components/modals/staffdenyreasonbox.ts +++ b/src/components/modals/staffdenyreasonbox.ts @@ -1,7 +1,9 @@ import { embedColor } from "config/options.js" import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js" +import { eq } from "drizzle-orm" import { IModal } from "interfaces" -import staffapp from "schemas/staffAppTag.js" +import db from "src/db/db.js" +import { staffApps } from "src/db/schema.js" export default { name: "staffdenyreasonbox", @@ -43,8 +45,7 @@ export default { await applicant.send({ embeds: [dmMessage] }) - const app = await staffapp.findOne({ where: { userID: applicantId } }) - await app?.destroy() + await db.delete(staffApps).where(eq(staffApps.userID, applicantId)) await interaction.editReply({ embeds: [{ diff --git a/src/components/modals/verifyModal.ts b/src/components/modals/verifyModal.ts index 908af72..cc28791 100644 --- a/src/components/modals/verifyModal.ts +++ b/src/components/modals/verifyModal.ts @@ -1,7 +1,9 @@ import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { GuildMember } from "discord.js" +import { eq } from "drizzle-orm" import { IModal } from "interfaces" -import verify from "schemas/verifyTag.js" +import db from "src/db/db.js" +import { verifies } from "src/db/schema.js" import roleManage from "utils/functions/rolesmanage.js" import { getGuild, getHeadURL, getPlayer, getUUID } from "utils/Hypixel.js" @@ -14,7 +16,9 @@ export default { const user = interaction.member as GuildMember const ign = interaction.fields.fields.get("verifyign")!.value - const verifyData = await verify.findOne({ where: { userID: user.user.id } }) + const verifyData = await db.query.verifies.findFirst({ + where: eq(verifies.userID, user.user.id) + }) if (verifyData) { interaction.editReply("You are already verified.\n" + "Try running /update to update your roles.") return @@ -149,7 +153,7 @@ export default { // Do nothing }) - await verify.create({ + await db.insert(verifies).values({ userID: user.id, uuid: uuid }) diff --git a/src/db/db.ts b/src/db/db.ts new file mode 100644 index 0000000..f2d500d --- /dev/null +++ b/src/db/db.ts @@ -0,0 +1,11 @@ +import { drizzle } from "drizzle-orm/postgres-js" +import postgres from "postgres" +import env from "utils/Env.js" +import * as schema from "./schema.js" + +const queryClient = postgres(env.prod.postgresURI) +const db = drizzle(queryClient, { + schema +}) + +export default db diff --git a/src/db/migrations/0000_shocking_gladiator.sql b/src/db/migrations/0000_shocking_gladiator.sql new file mode 100644 index 0000000..70f3f1a --- /dev/null +++ b/src/db/migrations/0000_shocking_gladiator.sql @@ -0,0 +1,30 @@ +CREATE TABLE IF NOT EXISTS "guildApps" ( + "id" serial PRIMARY KEY NOT NULL, + "userID" text NOT NULL, + "uuid" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "settings" ( + "id" serial PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "value" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "staffApps" ( + "id" serial PRIMARY KEY NOT NULL, + "userID" text NOT NULL, + "uuid" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "verifies" ( + "id" serial PRIMARY KEY NOT NULL, + "userID" text NOT NULL, + "uuid" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "waitingLists" ( + "id" serial PRIMARY KEY NOT NULL, + "userID" text NOT NULL, + "uuid" text NOT NULL, + "timestamp" bigint NOT NULL +); diff --git a/src/db/migrations/meta/0000_snapshot.json b/src/db/migrations/meta/0000_snapshot.json new file mode 100644 index 0000000..4d550e2 --- /dev/null +++ b/src/db/migrations/meta/0000_snapshot.json @@ -0,0 +1,162 @@ +{ + "id": "fc9135a5-9614-429b-880c-ac41f9192a8e", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.guildApps": { + "name": "guildApps", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "userID": { + "name": "userID", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "uuid": { + "name": "uuid", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.settings": { + "name": "settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.staffApps": { + "name": "staffApps", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "userID": { + "name": "userID", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "uuid": { + "name": "uuid", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.verifies": { + "name": "verifies", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "userID": { + "name": "userID", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "uuid": { + "name": "uuid", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.waitingLists": { + "name": "waitingLists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "userID": { + "name": "userID", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "uuid": { + "name": "uuid", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "bigint", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/src/db/migrations/meta/_journal.json b/src/db/migrations/meta/_journal.json new file mode 100644 index 0000000..8ef530d --- /dev/null +++ b/src/db/migrations/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1727898828198, + "tag": "0000_shocking_gladiator", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/src/db/schema.ts b/src/db/schema.ts new file mode 100644 index 0000000..36c6f21 --- /dev/null +++ b/src/db/schema.ts @@ -0,0 +1,32 @@ +import { bigint, pgTable, serial, text } from "drizzle-orm/pg-core" + +export const verifies = pgTable("verifies", { + id: serial("id").primaryKey(), + userID: text("userID").notNull(), + uuid: text("uuid").notNull() +}) + +export const guildApps = pgTable("guildApps", { + id: serial("id").primaryKey(), + userID: text("userID").notNull(), + uuid: text("uuid").notNull() +}) + +export const staffApps = pgTable("staffApps", { + id: serial("id").primaryKey(), + userID: text("userID").notNull(), + uuid: text("uuid").notNull() +}) + +export const waitingLists = pgTable("waitingLists", { + id: serial("id").primaryKey(), + userID: text("userID").notNull(), + uuid: text("uuid").notNull(), + timestamp: bigint("timestamp", { mode: "number" }).notNull() +}) + +export const settings = pgTable("settings", { + id: serial("id").primaryKey(), + name: text("name").notNull(), + value: text("value").notNull() +}) diff --git a/src/schemas/guildAppTag.ts b/src/schemas/guildAppTag.ts deleted file mode 100644 index 3db41a8..0000000 --- a/src/schemas/guildAppTag.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Sequelize, { InferAttributes, InferCreationAttributes, Model } from "sequelize" -import { sequelize } from "utils/Illegitimate.js" - -interface GuildApp extends Model, InferCreationAttributes> { - userID: string - uuid: string -} - -const tag = sequelize.define("guildApp", { - userID: { - type: Sequelize.STRING, - allowNull: false - }, - uuid: { - type: Sequelize.STRING, - allowNull: false - } -}) - -export default tag diff --git a/src/schemas/settingsTag.ts b/src/schemas/settingsTag.ts deleted file mode 100644 index 733d4d2..0000000 --- a/src/schemas/settingsTag.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Sequelize, { InferAttributes, InferCreationAttributes, Model } from "sequelize" -import { sequelize } from "utils/Illegitimate.js" - -interface Settings extends Model, InferCreationAttributes> { - name: string - value: string -} - -const tag = sequelize.define("settings", { - name: { - type: Sequelize.STRING, - allowNull: false - }, - value: { - type: Sequelize.STRING, - allowNull: false - } -}) - -export default tag diff --git a/src/schemas/staffAppTag.ts b/src/schemas/staffAppTag.ts deleted file mode 100644 index 629f0c8..0000000 --- a/src/schemas/staffAppTag.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Sequelize, { InferAttributes, InferCreationAttributes, Model } from "sequelize" -import { sequelize } from "utils/Illegitimate.js" - -interface StaffApp extends Model, InferCreationAttributes> { - userID: string - uuid: string -} - -const tag = sequelize.define("staffApp", { - userID: { - type: Sequelize.STRING, - allowNull: false - }, - uuid: { - type: Sequelize.STRING, - allowNull: false - } -}) - -export default tag diff --git a/src/schemas/verifyTag.ts b/src/schemas/verifyTag.ts deleted file mode 100644 index c556dc0..0000000 --- a/src/schemas/verifyTag.ts +++ /dev/null @@ -1,20 +0,0 @@ -import Sequelize, { InferAttributes, InferCreationAttributes, Model } from "sequelize" -import { sequelize } from "utils/Illegitimate.js" - -interface Verify extends Model, InferCreationAttributes> { - userID: string - uuid: string -} - -const tag = sequelize.define("verify", { - userID: { - type: Sequelize.STRING, - allowNull: false - }, - uuid: { - type: Sequelize.STRING, - allowNull: false - } -}) - -export default tag diff --git a/src/schemas/waitinglistTag.ts b/src/schemas/waitinglistTag.ts deleted file mode 100644 index 412d997..0000000 --- a/src/schemas/waitinglistTag.ts +++ /dev/null @@ -1,25 +0,0 @@ -import Sequelize, { InferAttributes, InferCreationAttributes, Model } from "sequelize" -import { sequelize } from "utils/Illegitimate.js" - -interface WaitingList extends Model, InferCreationAttributes> { - userID: string - uuid: string - timestamp: number -} - -const tag = sequelize.define("waitingList", { - userID: { - type: Sequelize.STRING, - allowNull: false - }, - uuid: { - type: Sequelize.STRING, - allowNull: false - }, - timestamp: { - type: Sequelize.BIGINT, - allowNull: false - } -}) - -export default tag diff --git a/src/utils/Client.ts b/src/utils/Client.ts index 5956d5a..c9793a1 100644 --- a/src/utils/Client.ts +++ b/src/utils/Client.ts @@ -33,7 +33,7 @@ export class ExtendedClient extends Client { async start() { let token: string if (process.env.NODE_ENV === "dev" && process.env.TYPESCRIPT === "true") { - console.log(color("Running in development mode. [ts-node]", "lavender")) + console.log(color("Running in development mode. [tsx]", "lavender")) token = env.dev.devtoken autoDeployCommands("ts", this) } else if (process.env.NODE_ENV === "dev" && !process.env.TYPESCRIPT) { diff --git a/src/utils/Illegitimate.ts b/src/utils/Illegitimate.ts index f591675..4b76eae 100644 --- a/src/utils/Illegitimate.ts +++ b/src/utils/Illegitimate.ts @@ -5,23 +5,17 @@ import { color } from "utils/functions/colors.js" // import { connect } from "mongoose" import { Player } from "discord-player" import { YoutubeiExtractor } from "discord-player-youtubei" -import { Sequelize } from "sequelize" +// import { Sequelize } from "sequelize" import { MissingEnvVarsError } from "./Classes.js" import loadAllEvents from "./Events/loadevents.js" const client = new Client() const redis = new Redis(env.prod.redisURI) const player = new Player(client) -let sequelize: Sequelize - -if (process.env.NODE_ENV === "dev") { - sequelize = new Sequelize({ - dialect: "sqlite", - storage: "dev/db.sqlite" - }) -} else { - sequelize = new Sequelize(env.prod.postgresURI, { dialect: "postgres" }) -} +// const sequelize = new Sequelize({ +// dialect: "sqlite", +// storage: "dev/db.sqlite" +// }) let ft: "js" | "ts" if (process.env.NODE_ENV === "dev" && process.env.TYPESCRIPT === "true") { @@ -46,11 +40,11 @@ class Illegitimate { redis.on("ready", () => { console.log(color("Connected to Redis", "green")) }) - if (process.env.NODE_ENV === "dev") { - sequelize.sync().then(() => { - console.log(color("Synced the db [dev]", "green")) - }) - } + // if (process.env.NODE_ENV === "dev") { + // sequelize.sync({ logging: false }).then(() => { + // console.log(color("Synced the db [dev]", "green")) + // }) + // } // connect(env.prod.mongoURI, {}).then(() => { // console.log(color("Connected to MongoDB", "green")) // }) @@ -75,14 +69,14 @@ class Illegitimate { } private loadMethods() { - String.prototype.removeIndents = function (this: string) { + String.prototype.removeIndents = function(this: string) { return this.replace(/^ */gm, "") } - String.prototype.capitalizeFirstLetter = function (this: string) { + String.prototype.capitalizeFirstLetter = function(this: string) { return this[0].toUpperCase() + this.slice(1).toLowerCase() } } } -export { client, Illegitimate, redis, sequelize } +export { client, Illegitimate, redis }