From dc1f46b5de1a2837056702f1e01a2cbac6643811 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sat, 4 Nov 2023 15:09:20 +0000 Subject: [PATCH] Fix MikroORM migrations and create initial migration Co-authored-by: mrjvs --- .eslintrc.js | 1 + package.json | 13 +- pnpm-lock.yaml | 389 ++++++++++-- src/db/migrations/.snapshot-movie_web.json | 615 +++++++++++++++++++ src/db/migrations/Migration20231104150702.ts | 42 ++ src/mikro-orm.config.ts | 4 + src/modules/metrics/update.ts | 1 + src/modules/mikro/orm.ts | 15 +- 8 files changed, 1007 insertions(+), 73 deletions(-) create mode 100644 src/db/migrations/.snapshot-movie_web.json create mode 100644 src/db/migrations/Migration20231104150702.ts create mode 100644 src/mikro-orm.config.ts diff --git a/.eslintrc.js b/.eslintrc.js index 9cf72c7..5350b42 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,6 +13,7 @@ module.exports = { sourceType: 'module', }, plugins: ['@typescript-eslint'], + ignorePatterns: ['./src/db/migrations/**/*'], rules: { '@typescript-eslint/interface-name-prefix': 'off', '@typescript-eslint/explicit-function-return-type': 'off', diff --git a/package.json b/package.json index 79d2e99..3d0e369 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,18 @@ "lint:fix": "eslint --fix --ext .ts,.js,.json,.tsx src/", "build:pre": "rimraf dist/", "build:compile": "tsc && tsc-alias", - "preinstall": "npx -y only-allow pnpm" + "preinstall": "npx -y only-allow pnpm", + "migration:create": "npx -y mikro-orm migration:create" + }, + "mikro-orm": { + "useTsNode": true, + "configPaths": [ + "./src/mikro-orm.config.ts" + ] }, "devDependencies": { + "@mikro-orm/cli": "^5.9.2", + "@mikro-orm/migrations": "^5.9.2", "@types/jsonwebtoken": "^9.0.4", "@types/node": "^20.5.3", "@types/node-forge": "^1.3.8", @@ -36,7 +45,7 @@ "dependencies": { "@fastify/cors": "^8.3.0", "@mikro-orm/core": "^5.9.0", - "@mikro-orm/postgresql": "^5.9.0", + "@mikro-orm/postgresql": "^5.9.2", "@types/ms": "^0.7.33", "async-ratelimiter": "^1.3.12", "cron": "^3.1.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2e233c..32ff10a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ dependencies: version: 8.4.0 '@mikro-orm/core': specifier: ^5.9.0 - version: 5.9.0(@mikro-orm/postgresql@5.9.0) + version: 5.9.0(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2) '@mikro-orm/postgresql': - specifier: ^5.9.0 - version: 5.9.0(@mikro-orm/core@5.9.0) + specifier: ^5.9.2 + version: 5.9.2(@mikro-orm/core@5.9.0)(@mikro-orm/migrations@5.9.2) '@types/ms': specifier: ^0.7.33 version: 0.7.33 @@ -67,6 +67,12 @@ dependencies: version: 3.22.4 devDependencies: + '@mikro-orm/cli': + specifier: ^5.9.2 + version: 5.9.2(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2)(pg@8.11.3) + '@mikro-orm/migrations': + specifier: ^5.9.2 + version: 5.9.2(@mikro-orm/core@5.9.0)(pg@8.11.3) '@types/jsonwebtoken': specifier: ^9.0.4 version: 9.0.4 @@ -252,6 +258,14 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true + /@jercle/yargonaut@1.1.5: + resolution: {integrity: sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==} + dependencies: + chalk: 4.1.2 + figlet: 1.7.0 + parent-require: 1.0.0 + dev: true + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} @@ -268,7 +282,64 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@mikro-orm/core@5.9.0(@mikro-orm/postgresql@5.9.0): + /@mikro-orm/cli@5.9.2(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2)(pg@8.11.3): + resolution: {integrity: sha512-cK/Oe+ZMcVOuNUcy1n3R40zv8ZTfWCpq9iFsnScOzoKU7/mkvtmBYlQljijM+O/SOzetaK1NyyF6bJCnDATEPw==} + engines: {node: '>= 14.0.0'} + hasBin: true + peerDependencies: + '@mikro-orm/better-sqlite': ^5.0.0 + '@mikro-orm/entity-generator': ^5.0.0 + '@mikro-orm/mariadb': ^5.0.0 + '@mikro-orm/migrations': ^5.0.0 + '@mikro-orm/migrations-mongodb': ^5.0.0 + '@mikro-orm/mongodb': ^5.0.0 + '@mikro-orm/mysql': ^5.0.0 + '@mikro-orm/postgresql': ^5.0.0 + '@mikro-orm/seeder': ^5.0.0 + '@mikro-orm/sqlite': ^5.0.0 + peerDependenciesMeta: + '@mikro-orm/better-sqlite': + optional: true + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/mariadb': + optional: true + '@mikro-orm/migrations': + optional: true + '@mikro-orm/migrations-mongodb': + optional: true + '@mikro-orm/mongodb': + optional: true + '@mikro-orm/mysql': + optional: true + '@mikro-orm/postgresql': + optional: true + '@mikro-orm/seeder': + optional: true + '@mikro-orm/sqlite': + optional: true + dependencies: + '@jercle/yargonaut': 1.1.5 + '@mikro-orm/core': 5.9.2(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2) + '@mikro-orm/knex': 5.9.2(@mikro-orm/core@5.9.2)(@mikro-orm/migrations@5.9.2)(pg@8.11.3) + '@mikro-orm/migrations': 5.9.2(@mikro-orm/core@5.9.0)(pg@8.11.3) + '@mikro-orm/postgresql': 5.9.2(@mikro-orm/core@5.9.0)(@mikro-orm/migrations@5.9.2) + fs-extra: 11.1.1 + tsconfig-paths: 4.2.0 + yargs: 17.7.2 + transitivePeerDependencies: + - better-sqlite3 + - mssql + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious + dev: true + + /@mikro-orm/core@5.9.0(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2): resolution: {integrity: sha512-w+fc7HrjY30LCUkMOsKGK3b7gPICnrRX1GHjMXRkST8pQLx3U8sc0AyUyqNMta+LVZf0P+KIDvIwuy9Eo4iDvQ==} engines: {node: '>= 14.0.0'} peerDependencies: @@ -304,7 +375,8 @@ packages: '@mikro-orm/sqlite': optional: true dependencies: - '@mikro-orm/postgresql': 5.9.0(@mikro-orm/core@5.9.0) + '@mikro-orm/migrations': 5.9.2(@mikro-orm/core@5.9.0)(pg@8.11.3) + '@mikro-orm/postgresql': 5.9.2(@mikro-orm/core@5.9.0)(@mikro-orm/migrations@5.9.2) acorn-loose: 8.3.0 acorn-walk: 8.2.0 dotenv: 16.3.1 @@ -312,10 +384,56 @@ packages: globby: 11.1.0 mikro-orm: 5.9.0 reflect-metadata: 0.1.13 - dev: false - /@mikro-orm/knex@5.9.0(@mikro-orm/core@5.9.0)(pg@8.11.3): - resolution: {integrity: sha512-xBZua8sD9xLMGo8hKU+7GXr4u3ALC8N/U4qJJnKDfAnaCpBf7zLW+HQJSA61XKTh1fECKmMp8dEflfaxEoJp0g==} + /@mikro-orm/core@5.9.2(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2): + resolution: {integrity: sha512-/KzF8MSrrw0ojVRdMEiL5/LdPUh23PRFXyIRgXB+AvyAdtlsztZKEZyBgJMLUE0nVSVrGhPjkLquV2pmVxgyAw==} + engines: {node: '>= 14.0.0'} + peerDependencies: + '@mikro-orm/better-sqlite': ^5.0.0 + '@mikro-orm/entity-generator': ^5.0.0 + '@mikro-orm/mariadb': ^5.0.0 + '@mikro-orm/migrations': ^5.0.0 + '@mikro-orm/migrations-mongodb': ^5.0.0 + '@mikro-orm/mongodb': ^5.0.0 + '@mikro-orm/mysql': ^5.0.0 + '@mikro-orm/postgresql': ^5.0.0 + '@mikro-orm/seeder': ^5.0.0 + '@mikro-orm/sqlite': ^5.0.0 + peerDependenciesMeta: + '@mikro-orm/better-sqlite': + optional: true + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/mariadb': + optional: true + '@mikro-orm/migrations': + optional: true + '@mikro-orm/migrations-mongodb': + optional: true + '@mikro-orm/mongodb': + optional: true + '@mikro-orm/mysql': + optional: true + '@mikro-orm/postgresql': + optional: true + '@mikro-orm/seeder': + optional: true + '@mikro-orm/sqlite': + optional: true + dependencies: + '@mikro-orm/migrations': 5.9.2(@mikro-orm/core@5.9.0)(pg@8.11.3) + '@mikro-orm/postgresql': 5.9.2(@mikro-orm/core@5.9.0)(@mikro-orm/migrations@5.9.2) + acorn-loose: 8.3.0 + acorn-walk: 8.2.0 + dotenv: 16.3.1 + fs-extra: 11.1.1 + globby: 11.1.0 + mikro-orm: 5.9.2 + reflect-metadata: 0.1.13 + dev: true + + /@mikro-orm/knex@5.9.2(@mikro-orm/core@5.9.0)(@mikro-orm/migrations@5.9.2)(pg@8.11.3): + resolution: {integrity: sha512-bWBuEHQurYIuIZkIA9JaNt5tX1zSNZyiG8vrYYnn6nUZt8ZQVsMmleajljI56QJGTrsCQ/2GBWaF2S6Y86JoDw==} engines: {node: '>= 14.0.0'} peerDependencies: '@mikro-orm/core': ^5.0.0 @@ -345,7 +463,8 @@ packages: sqlite3: optional: true dependencies: - '@mikro-orm/core': 5.9.0(@mikro-orm/postgresql@5.9.0) + '@mikro-orm/core': 5.9.0(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2) + '@mikro-orm/migrations': 5.9.2(@mikro-orm/core@5.9.0)(pg@8.11.3) fs-extra: 11.1.1 knex: 2.5.1(pg@8.11.3) pg: 8.11.3 @@ -354,10 +473,75 @@ packages: - pg-native - supports-color - tedious - dev: false - /@mikro-orm/postgresql@5.9.0(@mikro-orm/core@5.9.0): - resolution: {integrity: sha512-UIji7I/r93LbPLG9+a3AN8cK3q8q7RGcjuJ08clofemyN2kj3q8L2TTqAB/PtGSpnmCbGn9o+bifbFDJYRvG4w==} + /@mikro-orm/knex@5.9.2(@mikro-orm/core@5.9.2)(@mikro-orm/migrations@5.9.2)(pg@8.11.3): + resolution: {integrity: sha512-bWBuEHQurYIuIZkIA9JaNt5tX1zSNZyiG8vrYYnn6nUZt8ZQVsMmleajljI56QJGTrsCQ/2GBWaF2S6Y86JoDw==} + engines: {node: '>= 14.0.0'} + peerDependencies: + '@mikro-orm/core': ^5.0.0 + '@mikro-orm/entity-generator': ^5.0.0 + '@mikro-orm/migrations': ^5.0.0 + better-sqlite3: '*' + mssql: '*' + mysql: '*' + mysql2: '*' + pg: '*' + sqlite3: '*' + peerDependenciesMeta: + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/migrations': + optional: true + better-sqlite3: + optional: true + mssql: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + sqlite3: + optional: true + dependencies: + '@mikro-orm/core': 5.9.2(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2) + '@mikro-orm/migrations': 5.9.2(@mikro-orm/core@5.9.0)(pg@8.11.3) + fs-extra: 11.1.1 + knex: 2.5.1(pg@8.11.3) + pg: 8.11.3 + sqlstring: 2.3.3 + transitivePeerDependencies: + - pg-native + - supports-color + - tedious + dev: true + + /@mikro-orm/migrations@5.9.2(@mikro-orm/core@5.9.0)(pg@8.11.3): + resolution: {integrity: sha512-DmWP5vGvW25JtyiVBz1J6GwRY9y3sbrdnQj4PNGOXKGE6qFX8znEjM2Lx7OubEohGfnXVW8QPTG0Lb7hu9bWQQ==} + engines: {node: '>= 14.0.0'} + peerDependencies: + '@mikro-orm/core': ^5.0.0 + dependencies: + '@mikro-orm/core': 5.9.0(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2) + '@mikro-orm/knex': 5.9.2(@mikro-orm/core@5.9.0)(@mikro-orm/migrations@5.9.2)(pg@8.11.3) + fs-extra: 11.1.1 + knex: 2.5.1(pg@8.11.3) + umzug: 3.3.1 + transitivePeerDependencies: + - '@mikro-orm/entity-generator' + - better-sqlite3 + - mssql + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious + + /@mikro-orm/postgresql@5.9.2(@mikro-orm/core@5.9.0)(@mikro-orm/migrations@5.9.2): + resolution: {integrity: sha512-aTrIJ0QYH89Lwt8UH2gwdAuWB3zwHGW+JuW9SJukj08L4V8bA9d7D4dv/alPHf9g1z47SLI84lAA2AR+At0FIw==} engines: {node: '>= 14.0.0'} peerDependencies: '@mikro-orm/core': ^5.0.0 @@ -372,8 +556,9 @@ packages: '@mikro-orm/seeder': optional: true dependencies: - '@mikro-orm/core': 5.9.0(@mikro-orm/postgresql@5.9.0) - '@mikro-orm/knex': 5.9.0(@mikro-orm/core@5.9.0)(pg@8.11.3) + '@mikro-orm/core': 5.9.0(@mikro-orm/migrations@5.9.2)(@mikro-orm/postgresql@5.9.2) + '@mikro-orm/knex': 5.9.2(@mikro-orm/core@5.9.0)(@mikro-orm/migrations@5.9.2)(pg@8.11.3) + '@mikro-orm/migrations': 5.9.2(@mikro-orm/core@5.9.0)(pg@8.11.3) pg: 8.11.3 transitivePeerDependencies: - better-sqlite3 @@ -384,7 +569,6 @@ packages: - sqlite3 - supports-color - tedious - dev: false /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -428,6 +612,14 @@ packages: tslib: 2.6.2 dev: true + /@rushstack/ts-command-line@4.17.1: + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + /@sideway/address@4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} dependencies: @@ -458,6 +650,9 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + /@types/json-schema@7.0.14: resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} dev: true @@ -659,12 +854,10 @@ packages: engines: {node: '>=0.4.0'} dependencies: acorn: 8.11.2 - dev: false /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - dev: false /acorn-walk@8.3.0: resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} @@ -743,6 +936,11 @@ packages: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -777,7 +975,6 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -815,7 +1012,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -830,7 +1026,6 @@ packages: /buffer-writer@2.0.0: resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} engines: {node: '>=4'} - dev: false /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -874,6 +1069,15 @@ packages: fsevents: 2.3.3 dev: true + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -915,7 +1119,10 @@ packages: /colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - dev: false + + /colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} /colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} @@ -932,7 +1139,6 @@ packages: /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - dev: false /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} @@ -1044,7 +1250,6 @@ packages: /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} - dev: false /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1056,6 +1261,10 @@ packages: safe-buffer: 5.2.1 dev: false + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -1071,7 +1280,6 @@ packages: /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -1171,7 +1379,6 @@ packages: /esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} - dev: false /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -1362,6 +1569,12 @@ packages: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} dev: false + /figlet@1.7.0: + resolution: {integrity: sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: true + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1429,11 +1642,9 @@ packages: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - dev: false /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -1445,12 +1656,15 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - dev: false /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -1459,7 +1673,6 @@ packages: /getopts@2.3.0: resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} - dev: false /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1497,6 +1710,16 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + /globals@13.23.0: resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} @@ -1517,7 +1740,6 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: false /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -1538,7 +1760,6 @@ packages: engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - dev: false /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -1580,7 +1801,6 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1588,7 +1808,6 @@ packages: /interpret@2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} - dev: false /ioredis@5.3.2: resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} @@ -1627,7 +1846,6 @@ packages: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.0 - dev: false /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} @@ -1747,7 +1965,6 @@ packages: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 - dev: false /jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} @@ -1831,7 +2048,6 @@ packages: tildify: 2.0.0 transitivePeerDependencies: - supports-color - dev: false /kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} @@ -1902,7 +2118,6 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false /logform@2.6.0: resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} @@ -1954,7 +2169,11 @@ packages: /mikro-orm@5.9.0: resolution: {integrity: sha512-havRz1BdUY22zxcnkKulrkC7m+blFDvWD4pZ7cg1GLtMXcl0F68G2pJb9n6iRG18824DxM+qOKsoQfFwY1PbxA==} engines: {node: '>= 14.0.0'} - dev: false + + /mikro-orm@5.9.2: + resolution: {integrity: sha512-EgWEVtmyNNa2rHzySGhr3SATBQ/rnbxZfuqhWTsM3wsWG1/piz/rROekCzM+2QEaXe/WgPaVYRQS/wBGnDGQTA==} + engines: {node: '>= 14.0.0'} + dev: true /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -1972,6 +2191,12 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -2083,7 +2308,6 @@ packages: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - dev: true /one-time@1.0.0: resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} @@ -2143,7 +2367,6 @@ packages: /packet-reader@1.0.0: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} - dev: false /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -2152,6 +2375,11 @@ packages: callsites: 3.1.0 dev: true + /parent-require@1.0.0: + resolution: {integrity: sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==} + engines: {node: '>= 0.4.0'} + dev: true + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2174,7 +2402,6 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: false /path-scurry@1.10.1: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} @@ -2191,21 +2418,17 @@ packages: /pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} requiresBuild: true - dev: false optional: true /pg-connection-string@2.6.1: resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} - dev: false /pg-connection-string@2.6.2: resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} - dev: false /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - dev: false /pg-pool@3.6.1(pg@8.11.3): resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} @@ -2213,11 +2436,9 @@ packages: pg: '>=8.0' dependencies: pg: 8.11.3 - dev: false /pg-protocol@1.6.0: resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} - dev: false /pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -2228,7 +2449,6 @@ packages: postgres-bytea: 1.0.0 postgres-date: 1.0.7 postgres-interval: 1.2.0 - dev: false /pg@8.11.3: resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} @@ -2248,13 +2468,11 @@ packages: pgpass: 1.0.5 optionalDependencies: pg-cloudflare: 1.1.1 - dev: false /pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} dependencies: split2: 4.2.0 - dev: false /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -2299,27 +2517,27 @@ packages: queue-lit: 1.5.2 dev: true + /pony-cause@2.1.10: + resolution: {integrity: sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw==} + engines: {node: '>=12.0.0'} + /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} - dev: false /postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} engines: {node: '>=0.10.0'} - dev: false /postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} - dev: false /postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} dependencies: xtend: 4.0.2 - dev: false /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -2428,7 +2646,6 @@ packages: engines: {node: '>= 10.13.0'} dependencies: resolve: 1.22.8 - dev: false /redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} @@ -2444,7 +2661,11 @@ packages: /reflect-metadata@0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} @@ -2459,7 +2680,6 @@ packages: /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - dev: false /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} @@ -2468,7 +2688,6 @@ packages: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false /ret@0.2.2: resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} @@ -2587,12 +2806,13 @@ packages: /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} /sqlstring@2.3.3: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} - dev: false /stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -2602,6 +2822,10 @@ packages: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} dev: false + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2677,7 +2901,6 @@ packages: /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - dev: false /synckit@0.8.5: resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} @@ -2690,7 +2913,6 @@ packages: /tarn@3.0.2: resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} engines: {node: '>=8.0.0'} - dev: false /tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} @@ -2715,7 +2937,6 @@ packages: /tildify@2.0.0: resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} engines: {node: '>=8'} - dev: false /titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} @@ -2822,6 +3043,10 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + /type-fest@4.6.0: resolution: {integrity: sha512-rLjWJzQFOq4xw7MgJrCZ6T1jIOvvYElXT12r+y0CC6u67hegDHaxcPqb2fZHOGlqxugGQPNB1EnTezjBetkwkw==} engines: {node: '>=16'} @@ -2833,6 +3058,16 @@ packages: hasBin: true dev: true + /umzug@3.3.1: + resolution: {integrity: sha512-jG3C35jti1YnCuH/k3fJEfHbnIG9c3Q9ITZ0B9eWwnXngh/AUd0mRHv8OdpE2Q9VoK7tB6xL990JrMCr0LtfNA==} + engines: {node: '>=12'} + dependencies: + '@rushstack/ts-command-line': 4.17.1 + emittery: 0.13.1 + glob: 8.1.0 + pony-cause: 2.1.10 + type-fest: 3.13.1 + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true @@ -2844,7 +3079,6 @@ packages: /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} - dev: false /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} @@ -2926,16 +3160,37 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} diff --git a/src/db/migrations/.snapshot-movie_web.json b/src/db/migrations/.snapshot-movie_web.json new file mode 100644 index 0000000..45a00cb --- /dev/null +++ b/src/db/migrations/.snapshot-movie_web.json @@ -0,0 +1,615 @@ +{ + "namespaces": [ + "public" + ], + "name": "public", + "tables": [ + { + "columns": { + "tmdb_id": { + "name": "tmdb_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "meta": { + "name": "meta", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "json" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 0, + "mappedType": "datetime" + } + }, + "name": "bookmarks", + "schema": "public", + "indexes": [ + { + "keyName": "bookmarks_tmdb_id_user_id_unique", + "columnNames": [ + "tmdb_id", + "user_id" + ], + "composite": true, + "primary": false, + "unique": true + }, + { + "keyName": "bookmarks_pkey", + "columnNames": [ + "tmdb_id", + "user_id" + ], + "composite": true, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {} + }, + { + "columns": { + "code": { + "name": "code", + "type": "uuid", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "uuid" + }, + "flow": { + "name": "flow", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "auth_type": { + "name": "auth_type", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 0, + "mappedType": "datetime" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 0, + "mappedType": "datetime" + } + }, + "name": "challenge_codes", + "schema": "public", + "indexes": [ + { + "keyName": "challenge_codes_pkey", + "columnNames": [ + "code" + ], + "composite": false, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "uuid", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "uuid" + }, + "tmdb_id": { + "name": "tmdb_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "season_id": { + "name": "season_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + }, + "episode_id": { + "name": "episode_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + }, + "meta": { + "name": "meta", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "json" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 0, + "mappedType": "datetime" + }, + "duration": { + "name": "duration", + "type": "bigint", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "bigint" + }, + "watched": { + "name": "watched", + "type": "bigint", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "bigint" + } + }, + "name": "progress_items", + "schema": "public", + "indexes": [ + { + "keyName": "progress_items_tmdb_id_user_id_season_id_episode_id_unique", + "columnNames": [ + "tmdb_id", + "user_id", + "season_id", + "episode_id" + ], + "composite": true, + "primary": false, + "unique": true + }, + { + "keyName": "progress_items_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "uuid", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "uuid" + }, + "tmdb_id": { + "name": "tmdb_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "type": { + "name": "type", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "title": { + "name": "title", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "season_id": { + "name": "season_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + }, + "episode_id": { + "name": "episode_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 0, + "mappedType": "datetime" + }, + "status": { + "name": "status", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "provider_id": { + "name": "provider_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "embed_id": { + "name": "embed_id", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + }, + "error_message": { + "name": "error_message", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + }, + "full_error": { + "name": "full_error", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + } + }, + "name": "provider_metrics", + "schema": "public", + "indexes": [ + { + "keyName": "provider_metrics_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "uuid", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "uuid" + }, + "user": { + "name": "user", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 0, + "mappedType": "datetime" + }, + "accessed_at": { + "name": "accessed_at", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 0, + "mappedType": "datetime" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 0, + "mappedType": "datetime" + }, + "device": { + "name": "device", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + } + }, + "name": "sessions", + "schema": "public", + "indexes": [ + { + "keyName": "sessions_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "public_key": { + "name": "public_key", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "text" + }, + "namespace": { + "name": "namespace", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "string" + }, + "created_at": { + "name": "created_at", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "length": 0, + "mappedType": "datetime" + }, + "last_logged_in": { + "name": "last_logged_in", + "type": "timestamptz(0)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "length": 0, + "mappedType": "datetime" + }, + "permissions": { + "name": "permissions", + "type": "text[]", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "array" + }, + "profile": { + "name": "profile", + "type": "jsonb", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "json" + } + }, + "name": "users", + "schema": "public", + "indexes": [ + { + "columnNames": [ + "public_key" + ], + "composite": false, + "keyName": "users_public_key_unique", + "primary": false, + "unique": true + }, + { + "keyName": "users_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {} + }, + { + "columns": { + "id": { + "name": "id", + "type": "uuid", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "mappedType": "uuid" + }, + "application_theme": { + "name": "application_theme", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + }, + "application_language": { + "name": "application_language", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + }, + "default_subtitle_language": { + "name": "default_subtitle_language", + "type": "varchar(255)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "mappedType": "string" + } + }, + "name": "user_settings", + "schema": "public", + "indexes": [ + { + "keyName": "user_settings_pkey", + "columnNames": [ + "id" + ], + "composite": false, + "primary": true, + "unique": true + } + ], + "checks": [], + "foreignKeys": {} + } + ] +} diff --git a/src/db/migrations/Migration20231104150702.ts b/src/db/migrations/Migration20231104150702.ts new file mode 100644 index 0000000..a8d0c47 --- /dev/null +++ b/src/db/migrations/Migration20231104150702.ts @@ -0,0 +1,42 @@ +import { Migration } from '@mikro-orm/migrations'; + +export class Migration20231104150702 extends Migration { + async up(): Promise { + this.addSql( + 'create table "bookmarks" ("tmdb_id" varchar(255) not null, "user_id" varchar(255) not null, "meta" jsonb not null, "updated_at" timestamptz(0) not null, constraint "bookmarks_pkey" primary key ("tmdb_id", "user_id"));', + ); + this.addSql( + 'alter table "bookmarks" add constraint "bookmarks_tmdb_id_user_id_unique" unique ("tmdb_id", "user_id");', + ); + + this.addSql( + 'create table "challenge_codes" ("code" uuid not null, "flow" text not null, "auth_type" varchar(255) not null, "created_at" timestamptz(0) not null, "expires_at" timestamptz(0) not null, constraint "challenge_codes_pkey" primary key ("code"));', + ); + + this.addSql( + 'create table "progress_items" ("id" uuid not null, "tmdb_id" varchar(255) not null, "user_id" varchar(255) not null, "season_id" varchar(255) null, "episode_id" varchar(255) null, "meta" jsonb not null, "updated_at" timestamptz(0) not null, "duration" bigint not null, "watched" bigint not null, constraint "progress_items_pkey" primary key ("id"));', + ); + this.addSql( + 'alter table "progress_items" add constraint "progress_items_tmdb_id_user_id_season_id_episode_id_unique" unique ("tmdb_id", "user_id", "season_id", "episode_id");', + ); + + this.addSql( + 'create table "provider_metrics" ("id" uuid not null, "tmdb_id" varchar(255) not null, "type" varchar(255) not null, "title" varchar(255) not null, "season_id" varchar(255) null, "episode_id" varchar(255) null, "created_at" timestamptz(0) not null, "status" varchar(255) not null, "provider_id" varchar(255) not null, "embed_id" varchar(255) null, "error_message" varchar(255) null, "full_error" varchar(255) null, constraint "provider_metrics_pkey" primary key ("id"));', + ); + + this.addSql( + 'create table "sessions" ("id" uuid not null, "user" text not null, "created_at" timestamptz(0) not null, "accessed_at" timestamptz(0) not null, "expires_at" timestamptz(0) not null, "device" text not null, "user_agent" text not null, constraint "sessions_pkey" primary key ("id"));', + ); + + this.addSql( + 'create table "users" ("id" text not null, "public_key" text not null, "namespace" varchar(255) not null, "created_at" timestamptz(0) not null, "last_logged_in" timestamptz(0) null, "permissions" text[] not null, "profile" jsonb not null, constraint "users_pkey" primary key ("id"));', + ); + this.addSql( + 'alter table "users" add constraint "users_public_key_unique" unique ("public_key");', + ); + + this.addSql( + 'create table "user_settings" ("id" uuid not null, "application_theme" varchar(255) null, "application_language" varchar(255) null, "default_subtitle_language" varchar(255) null, constraint "user_settings_pkey" primary key ("id"));', + ); + } +} diff --git a/src/mikro-orm.config.ts b/src/mikro-orm.config.ts new file mode 100644 index 0000000..7ee210d --- /dev/null +++ b/src/mikro-orm.config.ts @@ -0,0 +1,4 @@ +import { makeOrmConfig } from '@/modules/mikro/orm'; +import { conf } from '@/config'; + +export default makeOrmConfig(conf.postgres.connection); diff --git a/src/modules/metrics/update.ts b/src/modules/metrics/update.ts index 60668ac..56f4ce4 100644 --- a/src/modules/metrics/update.ts +++ b/src/modules/metrics/update.ts @@ -16,6 +16,7 @@ export async function updateMetrics(em: EntityManager, metrics: Metrics) { >(); metrics.user.reset(); + users.forEach((v) => { metrics?.user.inc({ namespace: v.namespace }, Number(v.count)); }); diff --git a/src/modules/mikro/orm.ts b/src/modules/mikro/orm.ts index 9b46417..a22cc67 100644 --- a/src/modules/mikro/orm.ts +++ b/src/modules/mikro/orm.ts @@ -1,17 +1,24 @@ +import { Options } from '@mikro-orm/core'; import { MikroORM, PostgreSqlDriver } from '@mikro-orm/postgresql'; import path from 'path'; -export async function createORM(url: string, log: (msg: string) => void) { - return await MikroORM.init({ +export function makeOrmConfig(url: string): Options { + return { type: 'postgresql', clientUrl: url, entities: ['./models/**/*.js'], entitiesTs: ['./models/**/*.ts'], baseDir: path.join(__dirname, '../../db'), migrations: { - pathTs: './migrations/**/*.ts', - path: './migrations/**/*.ts', + pathTs: './migrations', + path: './migrations', }, + }; +} + +export async function createORM(url: string, log: (msg: string) => void) { + return await MikroORM.init({ + ...makeOrmConfig(url), logger: log, }); }