Compare commits

..

No commits in common. "main" and "feature/sprite-gen-3" have entirely different histories.

10 changed files with 393 additions and 343 deletions

17
.dockerignore Normal file
View File

@ -0,0 +1,17 @@
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
README.md
.env
.env.*
docker-compose*
*.md
coverage
.vscode
.idea
dist
build
temp

View File

@ -14,7 +14,7 @@ This is the server for the Noxious game.
2. Install dependencies with `npm install` 2. Install dependencies with `npm install`
3. Copy the `.env.example` file to `.env` and fill in the required variables 3. Copy the `.env.example` file to `.env` and fill in the required variables
4. Extract assets.zip to the `public` folder 4. Extract assets.zip to the `public` folder
5. After MySQL and Redis are running, run `npm run mikro-orm migration:up` to create the database schema 5. After MySQL and Redis are running, run `npx mikro-orm-esm migration:up` to create the database schema
6. Run the server with `npm run dev` 6. Run the server with `npm run dev`
7. Write `init` in the console to import default data and restart the server 7. Write `init` in the console to import default data and restart the server
8. Write `tiles` in the console to fix tile sizes 8. Write `tiles` in the console to fix tile sizes

380
package-lock.json generated
View File

@ -59,14 +59,14 @@
} }
}, },
"node_modules/@babel/generator": { "node_modules/@babel/generator": {
"version": "7.27.0", "version": "7.26.9",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz",
"integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/parser": "^7.27.0", "@babel/parser": "^7.26.9",
"@babel/types": "^7.27.0", "@babel/types": "^7.26.9",
"@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25", "@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2" "jsesc": "^3.0.2"
@ -96,13 +96,13 @@
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.27.0", "version": "7.26.9",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
"integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/types": "^7.27.0" "@babel/types": "^7.26.9"
}, },
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
@ -112,32 +112,32 @@
} }
}, },
"node_modules/@babel/template": { "node_modules/@babel/template": {
"version": "7.27.0", "version": "7.26.9",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
"integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.26.2", "@babel/code-frame": "^7.26.2",
"@babel/parser": "^7.27.0", "@babel/parser": "^7.26.9",
"@babel/types": "^7.27.0" "@babel/types": "^7.26.9"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "7.27.0", "version": "7.26.9",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz",
"integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.26.2", "@babel/code-frame": "^7.26.2",
"@babel/generator": "^7.27.0", "@babel/generator": "^7.26.9",
"@babel/parser": "^7.27.0", "@babel/parser": "^7.26.9",
"@babel/template": "^7.27.0", "@babel/template": "^7.26.9",
"@babel/types": "^7.27.0", "@babel/types": "^7.26.9",
"debug": "^4.3.1", "debug": "^4.3.1",
"globals": "^11.1.0" "globals": "^11.1.0"
}, },
@ -146,9 +146,9 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.27.0", "version": "7.26.9",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
"integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -194,9 +194,9 @@
} }
}, },
"node_modules/@esbuild/aix-ppc64": { "node_modules/@esbuild/aix-ppc64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
"integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
@ -211,9 +211,9 @@
} }
}, },
"node_modules/@esbuild/android-arm": { "node_modules/@esbuild/android-arm": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
"integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -228,9 +228,9 @@
} }
}, },
"node_modules/@esbuild/android-arm64": { "node_modules/@esbuild/android-arm64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
"integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -245,9 +245,9 @@
} }
}, },
"node_modules/@esbuild/android-x64": { "node_modules/@esbuild/android-x64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
"integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -262,9 +262,9 @@
} }
}, },
"node_modules/@esbuild/darwin-arm64": { "node_modules/@esbuild/darwin-arm64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
"integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -279,9 +279,9 @@
} }
}, },
"node_modules/@esbuild/darwin-x64": { "node_modules/@esbuild/darwin-x64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
"integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -296,9 +296,9 @@
} }
}, },
"node_modules/@esbuild/freebsd-arm64": { "node_modules/@esbuild/freebsd-arm64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
"integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -313,9 +313,9 @@
} }
}, },
"node_modules/@esbuild/freebsd-x64": { "node_modules/@esbuild/freebsd-x64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
"integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -330,9 +330,9 @@
} }
}, },
"node_modules/@esbuild/linux-arm": { "node_modules/@esbuild/linux-arm": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
"integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -347,9 +347,9 @@
} }
}, },
"node_modules/@esbuild/linux-arm64": { "node_modules/@esbuild/linux-arm64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
"integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -364,9 +364,9 @@
} }
}, },
"node_modules/@esbuild/linux-ia32": { "node_modules/@esbuild/linux-ia32": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
"integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -381,9 +381,9 @@
} }
}, },
"node_modules/@esbuild/linux-loong64": { "node_modules/@esbuild/linux-loong64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
"integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
"cpu": [ "cpu": [
"loong64" "loong64"
], ],
@ -398,9 +398,9 @@
} }
}, },
"node_modules/@esbuild/linux-mips64el": { "node_modules/@esbuild/linux-mips64el": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
"integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
"cpu": [ "cpu": [
"mips64el" "mips64el"
], ],
@ -415,9 +415,9 @@
} }
}, },
"node_modules/@esbuild/linux-ppc64": { "node_modules/@esbuild/linux-ppc64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
"integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
@ -432,9 +432,9 @@
} }
}, },
"node_modules/@esbuild/linux-riscv64": { "node_modules/@esbuild/linux-riscv64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
"integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@ -449,9 +449,9 @@
} }
}, },
"node_modules/@esbuild/linux-s390x": { "node_modules/@esbuild/linux-s390x": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
"integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
@ -466,9 +466,9 @@
} }
}, },
"node_modules/@esbuild/linux-x64": { "node_modules/@esbuild/linux-x64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
"integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -483,9 +483,9 @@
} }
}, },
"node_modules/@esbuild/netbsd-arm64": { "node_modules/@esbuild/netbsd-arm64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
"integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -500,9 +500,9 @@
} }
}, },
"node_modules/@esbuild/netbsd-x64": { "node_modules/@esbuild/netbsd-x64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
"integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -517,9 +517,9 @@
} }
}, },
"node_modules/@esbuild/openbsd-arm64": { "node_modules/@esbuild/openbsd-arm64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
"integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -534,9 +534,9 @@
} }
}, },
"node_modules/@esbuild/openbsd-x64": { "node_modules/@esbuild/openbsd-x64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
"integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -551,9 +551,9 @@
} }
}, },
"node_modules/@esbuild/sunos-x64": { "node_modules/@esbuild/sunos-x64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
"integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -568,9 +568,9 @@
} }
}, },
"node_modules/@esbuild/win32-arm64": { "node_modules/@esbuild/win32-arm64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
"integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -585,9 +585,9 @@
} }
}, },
"node_modules/@esbuild/win32-ia32": { "node_modules/@esbuild/win32-ia32": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
"integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -602,9 +602,9 @@
} }
}, },
"node_modules/@esbuild/win32-x64": { "node_modules/@esbuild/win32-x64": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
"integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1073,14 +1073,14 @@
} }
}, },
"node_modules/@mikro-orm/cli": { "node_modules/@mikro-orm/cli": {
"version": "6.4.11", "version": "6.4.9",
"resolved": "https://registry.npmjs.org/@mikro-orm/cli/-/cli-6.4.11.tgz", "resolved": "https://registry.npmjs.org/@mikro-orm/cli/-/cli-6.4.9.tgz",
"integrity": "sha512-soy/MA8FoZD/omkqe5vc4POrxYwNVYt0bPf2ySeoFGMxX5C5SeLCGK2pLMmGj0LIdc3WcDicpFf1tmp2tvcJvw==", "integrity": "sha512-LQzVsmar/0DoJkPGyz3OpB8pa9BCQtvYreEC71h0O+RcizppJjgBQNTkj5tJd2Iqvh4hSaMv6qTv0l5UK6F2Vw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jercle/yargonaut": "1.1.5", "@jercle/yargonaut": "1.1.5",
"@mikro-orm/core": "6.4.11", "@mikro-orm/core": "6.4.9",
"@mikro-orm/knex": "6.4.11", "@mikro-orm/knex": "6.4.9",
"fs-extra": "11.3.0", "fs-extra": "11.3.0",
"tsconfig-paths": "4.2.0", "tsconfig-paths": "4.2.0",
"yargs": "17.7.2" "yargs": "17.7.2"
@ -1094,9 +1094,9 @@
} }
}, },
"node_modules/@mikro-orm/core": { "node_modules/@mikro-orm/core": {
"version": "6.4.11", "version": "6.4.9",
"resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.4.11.tgz", "resolved": "https://registry.npmjs.org/@mikro-orm/core/-/core-6.4.9.tgz",
"integrity": "sha512-FCXWpRwcLOjjc1/1gigqWLSeJpSlMOOO9TQMUT5JP5/NEpisLfDyblwMOklRfAidrFRRTSVL9DGa9OcdZC5ACg==", "integrity": "sha512-osB2TbvSH4ZL1s62LCBQFAnxPqLycX5fakPHOoztudixqfbVD5QQydeGizJXMMh2zKP6vRCwIJy3MeSuFxPjHg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"dataloader": "2.2.3", "dataloader": "2.2.3",
@ -1104,7 +1104,7 @@
"esprima": "4.0.1", "esprima": "4.0.1",
"fs-extra": "11.3.0", "fs-extra": "11.3.0",
"globby": "11.1.0", "globby": "11.1.0",
"mikro-orm": "6.4.11", "mikro-orm": "6.4.9",
"reflect-metadata": "0.2.2" "reflect-metadata": "0.2.2"
}, },
"engines": { "engines": {
@ -1115,9 +1115,9 @@
} }
}, },
"node_modules/@mikro-orm/knex": { "node_modules/@mikro-orm/knex": {
"version": "6.4.11", "version": "6.4.9",
"resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.4.11.tgz", "resolved": "https://registry.npmjs.org/@mikro-orm/knex/-/knex-6.4.9.tgz",
"integrity": "sha512-Lypp8Pw1SMFFtwu1ME7QiLECCFBY6B1Q8KcxkWiBFQaWohpU42h9JUPw13pzHCAYWQ5pNbQWrK0fh/1AFtxgkw==", "integrity": "sha512-iGXJfe/TziVOQsWuxMIqkOpurysWzQA6kj3+FDtOkHJAijZhqhjSBnfUVHHY/JzU9o0M0rgLrDVJFry/uEaJEA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"fs-extra": "11.3.0", "fs-extra": "11.3.0",
@ -1146,12 +1146,12 @@
} }
}, },
"node_modules/@mikro-orm/mariadb": { "node_modules/@mikro-orm/mariadb": {
"version": "6.4.11", "version": "6.4.9",
"resolved": "https://registry.npmjs.org/@mikro-orm/mariadb/-/mariadb-6.4.11.tgz", "resolved": "https://registry.npmjs.org/@mikro-orm/mariadb/-/mariadb-6.4.9.tgz",
"integrity": "sha512-mjOb2qQdIg6F0tS+I97G2D7tNriy1kDg6yG7ZdHUj5ZX379fNop5QkZAfHMDIo86RQJYjkth8qvKqubV3MNFGg==", "integrity": "sha512-KuCzDGkC9cmNA8WxE9pZca6/Ds2sso3JUxiGoVyekOj/t9qer81UQYWasI80TBJ82TxrUdLM9NFBBO++tz+NYA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@mikro-orm/knex": "6.4.11", "@mikro-orm/knex": "6.4.9",
"mariadb": "3.4.0" "mariadb": "3.4.0"
}, },
"engines": { "engines": {
@ -1162,12 +1162,12 @@
} }
}, },
"node_modules/@mikro-orm/migrations": { "node_modules/@mikro-orm/migrations": {
"version": "6.4.11", "version": "6.4.9",
"resolved": "https://registry.npmjs.org/@mikro-orm/migrations/-/migrations-6.4.11.tgz", "resolved": "https://registry.npmjs.org/@mikro-orm/migrations/-/migrations-6.4.9.tgz",
"integrity": "sha512-2Sy5TVd4gP4lL+t0BgQ53dHEwZ49HeiE6Xe02hiVH4d+GCv6TD/BXHYI5xgPoPRBaFjjnrWf/8tsUJMfD7tz7g==", "integrity": "sha512-vwTXG8PU3bpzTZxxu1dWlhnUumM2Yob2IWajoh+Rj9+19VBZYc5N3tm8FRekt5oPzxeK5/9+sDfxT9FzXgjeNw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@mikro-orm/knex": "6.4.11", "@mikro-orm/knex": "6.4.9",
"fs-extra": "11.3.0", "fs-extra": "11.3.0",
"umzug": "3.8.2" "umzug": "3.8.2"
}, },
@ -1179,13 +1179,13 @@
} }
}, },
"node_modules/@mikro-orm/mysql": { "node_modules/@mikro-orm/mysql": {
"version": "6.4.11", "version": "6.4.9",
"resolved": "https://registry.npmjs.org/@mikro-orm/mysql/-/mysql-6.4.11.tgz", "resolved": "https://registry.npmjs.org/@mikro-orm/mysql/-/mysql-6.4.9.tgz",
"integrity": "sha512-jd7sd15JOk7DuxV5WrcFJSQX9AyW/xvzI6caMFyAuF0CaiTgwDYEKr9u4+j409ABFzZZ07l/0tsJnazlIp9tag==", "integrity": "sha512-rmHonMzvurB+50BNpKb9FORFVs3+V8S4Om1Tmv6MFvSdeD1Qqb/efvYp7cgv+NncHSrgMtKLMy3FDm7guU6yYQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@mikro-orm/knex": "6.4.11", "@mikro-orm/knex": "6.4.9",
"mysql2": "3.14.0" "mysql2": "3.13.0"
}, },
"engines": { "engines": {
"node": ">= 18.12.0" "node": ">= 18.12.0"
@ -1195,9 +1195,9 @@
} }
}, },
"node_modules/@mikro-orm/reflection": { "node_modules/@mikro-orm/reflection": {
"version": "6.4.11", "version": "6.4.9",
"resolved": "https://registry.npmjs.org/@mikro-orm/reflection/-/reflection-6.4.11.tgz", "resolved": "https://registry.npmjs.org/@mikro-orm/reflection/-/reflection-6.4.9.tgz",
"integrity": "sha512-ERxjKFtx66XFl1ZTQHtgpTpth/VX2PqROSA1alakwigSb6EEZmHqBC5FTH+nx4xkWQzuPldZGyqbHUGiEyxaXA==", "integrity": "sha512-fgY7yLrcZm3J/8dv9reUC4PQo7C2muImU31jmzz1SxmNKPJFDJl7OzcDZlM5NOisXzsWUBrcNdCyuQiWViVc3A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"globby": "11.1.0", "globby": "11.1.0",
@ -1324,9 +1324,9 @@
} }
}, },
"node_modules/@rushstack/node-core-library": { "node_modules/@rushstack/node-core-library": {
"version": "5.13.0", "version": "5.11.0",
"resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.13.0.tgz", "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz",
"integrity": "sha512-IGVhy+JgUacAdCGXKUrRhwHMTzqhWwZUI+qEPcdzsb80heOw0QPbhhoVsoiMF7Klp8eYsp7hzpScMXmOa3Uhfg==", "integrity": "sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ajv": "~8.13.0", "ajv": "~8.13.0",
@ -1375,12 +1375,12 @@
} }
}, },
"node_modules/@rushstack/terminal": { "node_modules/@rushstack/terminal": {
"version": "0.15.2", "version": "0.15.0",
"resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.2.tgz", "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.0.tgz",
"integrity": "sha512-7Hmc0ysK5077R/IkLS9hYu0QuNafm+TbZbtYVzCMbeOdMjaRboLKrhryjwZSRJGJzu+TV1ON7qZHeqf58XfLpA==", "integrity": "sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@rushstack/node-core-library": "5.13.0", "@rushstack/node-core-library": "5.11.0",
"supports-color": "~8.1.1" "supports-color": "~8.1.1"
}, },
"peerDependencies": { "peerDependencies": {
@ -1408,12 +1408,12 @@
} }
}, },
"node_modules/@rushstack/ts-command-line": { "node_modules/@rushstack/ts-command-line": {
"version": "4.23.7", "version": "4.23.5",
"resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.7.tgz", "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.5.tgz",
"integrity": "sha512-Gr9cB7DGe6uz5vq2wdr89WbVDKz0UeuFEn5H2CfWDe7JvjFFaiV15gi6mqDBTbHhHCWS7w8mF1h3BnIfUndqdA==", "integrity": "sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@rushstack/terminal": "0.15.2", "@rushstack/terminal": "0.15.0",
"@types/argparse": "1.0.38", "@types/argparse": "1.0.38",
"argparse": "~1.0.9", "argparse": "~1.0.9",
"string-argv": "~0.3.1" "string-argv": "~0.3.1"
@ -1605,9 +1605,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.17.28", "version": "20.17.23",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.28.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.23.tgz",
"integrity": "sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==", "integrity": "sha512-8PCGZ1ZJbEZuYNTMqywO+Sj4vSKjSjT6Ua+6RFOYlEvIvKQABPtrNkoVSLSKDb4obYcMhspVKmsw8Cm10NFRUg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.19.2" "undici-types": "~6.19.2"
@ -1949,9 +1949,9 @@
} }
}, },
"node_modules/bullmq": { "node_modules/bullmq": {
"version": "5.45.0", "version": "5.41.7",
"resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.45.0.tgz", "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.41.7.tgz",
"integrity": "sha512-b5Gwy+gPFOW68OXaiXrpc+0rCbaXdXu5ms0iv/wIXSdruxkk3hxftdDO6t8GNTEGJFygxKVcJTuWmwqBc+eXMQ==", "integrity": "sha512-eZbKJSx15bflfzKRiR+dKeLTr/M/YKb4cIp73OdU79PEMHQ6aEFUtbG6R+f0KvLLznI/O01G581U2Eqli6S2ew==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"cron-parser": "^4.9.0", "cron-parser": "^4.9.0",
@ -2438,9 +2438,9 @@
} }
}, },
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.25.1", "version": "0.25.0",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
"integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
@ -2451,31 +2451,31 @@
"node": ">=18" "node": ">=18"
}, },
"optionalDependencies": { "optionalDependencies": {
"@esbuild/aix-ppc64": "0.25.1", "@esbuild/aix-ppc64": "0.25.0",
"@esbuild/android-arm": "0.25.1", "@esbuild/android-arm": "0.25.0",
"@esbuild/android-arm64": "0.25.1", "@esbuild/android-arm64": "0.25.0",
"@esbuild/android-x64": "0.25.1", "@esbuild/android-x64": "0.25.0",
"@esbuild/darwin-arm64": "0.25.1", "@esbuild/darwin-arm64": "0.25.0",
"@esbuild/darwin-x64": "0.25.1", "@esbuild/darwin-x64": "0.25.0",
"@esbuild/freebsd-arm64": "0.25.1", "@esbuild/freebsd-arm64": "0.25.0",
"@esbuild/freebsd-x64": "0.25.1", "@esbuild/freebsd-x64": "0.25.0",
"@esbuild/linux-arm": "0.25.1", "@esbuild/linux-arm": "0.25.0",
"@esbuild/linux-arm64": "0.25.1", "@esbuild/linux-arm64": "0.25.0",
"@esbuild/linux-ia32": "0.25.1", "@esbuild/linux-ia32": "0.25.0",
"@esbuild/linux-loong64": "0.25.1", "@esbuild/linux-loong64": "0.25.0",
"@esbuild/linux-mips64el": "0.25.1", "@esbuild/linux-mips64el": "0.25.0",
"@esbuild/linux-ppc64": "0.25.1", "@esbuild/linux-ppc64": "0.25.0",
"@esbuild/linux-riscv64": "0.25.1", "@esbuild/linux-riscv64": "0.25.0",
"@esbuild/linux-s390x": "0.25.1", "@esbuild/linux-s390x": "0.25.0",
"@esbuild/linux-x64": "0.25.1", "@esbuild/linux-x64": "0.25.0",
"@esbuild/netbsd-arm64": "0.25.1", "@esbuild/netbsd-arm64": "0.25.0",
"@esbuild/netbsd-x64": "0.25.1", "@esbuild/netbsd-x64": "0.25.0",
"@esbuild/openbsd-arm64": "0.25.1", "@esbuild/openbsd-arm64": "0.25.0",
"@esbuild/openbsd-x64": "0.25.1", "@esbuild/openbsd-x64": "0.25.0",
"@esbuild/sunos-x64": "0.25.1", "@esbuild/sunos-x64": "0.25.0",
"@esbuild/win32-arm64": "0.25.1", "@esbuild/win32-arm64": "0.25.0",
"@esbuild/win32-ia32": "0.25.1", "@esbuild/win32-ia32": "0.25.0",
"@esbuild/win32-x64": "0.25.1" "@esbuild/win32-x64": "0.25.0"
} }
}, },
"node_modules/escalade": { "node_modules/escalade": {
@ -3346,9 +3346,9 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/lru.min": { "node_modules/lru.min": {
"version": "1.1.2", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz",
"integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"bun": ">=1.0.0", "bun": ">=1.0.0",
@ -3361,9 +3361,9 @@
} }
}, },
"node_modules/luxon": { "node_modules/luxon": {
"version": "3.6.0", "version": "3.5.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.0.tgz", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
"integrity": "sha512-WE7p0p7W1xji9qxkLYsvcIxZyfP48GuFrWIBQZIsbjCyf65dG1rv4n83HcOyEyhvzxJCrUoObCRNFgRNIQ5KNA==", "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
@ -3393,9 +3393,9 @@
} }
}, },
"node_modules/mariadb/node_modules/@types/node": { "node_modules/mariadb/node_modules/@types/node": {
"version": "22.13.14", "version": "22.13.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.14.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz",
"integrity": "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==", "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.20.0" "undici-types": "~6.20.0"
@ -3478,9 +3478,9 @@
} }
}, },
"node_modules/mikro-orm": { "node_modules/mikro-orm": {
"version": "6.4.11", "version": "6.4.9",
"resolved": "https://registry.npmjs.org/mikro-orm/-/mikro-orm-6.4.11.tgz", "resolved": "https://registry.npmjs.org/mikro-orm/-/mikro-orm-6.4.9.tgz",
"integrity": "sha512-vmrAVGalS+pcgsumdHGAF7OwrlSItWwA6y0vBApuy8wDnNsejzUXk1PkoSoMSThVxV897+Dt+8xhbKd+OkNsvw==", "integrity": "sha512-XwVrWNT4NNwS6kHIKFNDfvy8L1eWcBBEHeTVzFFYcnb2ummATaLxqeVkNEmKA68jmdtfQdUmWBqGdbcIPwtL2Q==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 18.12.0" "node": ">= 18.12.0"
@ -3579,9 +3579,9 @@
} }
}, },
"node_modules/mysql2": { "node_modules/mysql2": {
"version": "3.14.0", "version": "3.13.0",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.0.tgz", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.13.0.tgz",
"integrity": "sha512-8eMhmG6gt/hRkU1G+8KlGOdQi2w+CgtNoD1ksXZq9gQfkfDsX4LHaBwTe1SY0Imx//t2iZA03DFnyYKPinxSRw==", "integrity": "sha512-M6DIQjTqKeqXH5HLbLMxwcK5XfXHw30u5ap6EZmu7QVmcF/gnh2wS/EOiQ4MTbXz/vQeoXrmycPlVRM00WSslg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"aws-ssl-profiles": "^1.1.1", "aws-ssl-profiles": "^1.1.1",
@ -4801,9 +4801,9 @@
} }
}, },
"node_modules/type-fest": { "node_modules/type-fest": {
"version": "4.38.0", "version": "4.37.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.38.0.tgz", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz",
"integrity": "sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==", "integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==",
"license": "(MIT OR CC0-1.0)", "license": "(MIT OR CC0-1.0)",
"engines": { "engines": {
"node": ">=16" "node": ">=16"

Binary file not shown.

View File

@ -14,7 +14,7 @@ export class BaseMapObject extends BaseEntity {
tags: string[] = [] tags: string[] = []
@Property({ type: 'json' }) @Property({ type: 'json' })
depthOffsets: number[] = [0] pivotPoints: { x: number; y: number }[] = []
@Property({ type: 'decimal', precision: 10, scale: 2 }) @Property({ type: 'decimal', precision: 10, scale: 2 })
originX = 0 originX = 0
@ -64,12 +64,13 @@ export class BaseMapObject extends BaseEntity {
return this.tags return this.tags
} }
setDepthOffsets(offsets: number[]) { setPivotPoints(pivotPoints: { x: number; y: number }[]) {
this.depthOffsets = offsets this.pivotPoints = pivotPoints
return this
} }
getDepthOffsets() { getPivotPoints() {
return this.depthOffsets return this.pivotPoints
} }
setOriginX(originX: number) { setOriginX(originX: number) {

View File

@ -7,7 +7,7 @@ type Payload = {
id: UUID id: UUID
name: string name: string
tags: string[] tags: string[]
depthOffsets: number[] pivotPoints: { x: number; y: number }[]
originX: number originX: number
originY: number originY: number
frameRate: number frameRate: number
@ -31,7 +31,7 @@ export default class MapObjectUpdateEvent extends BaseEvent {
if (data.name !== undefined) mapObject.name = data.name if (data.name !== undefined) mapObject.name = data.name
if (data.tags !== undefined) mapObject.tags = data.tags if (data.tags !== undefined) mapObject.tags = data.tags
if (data.depthOffsets !== undefined) mapObject.depthOffsets = data.depthOffsets if (data.pivotPoints !== undefined) mapObject.pivotPoints = data.pivotPoints
if (data.originX !== undefined) mapObject.originX = data.originX if (data.originX !== undefined) mapObject.originX = data.originX
if (data.originY !== undefined) mapObject.originY = data.originY if (data.originY !== undefined) mapObject.originY = data.originY
if (data.frameRate !== undefined) mapObject.frameRate = data.frameRate if (data.frameRate !== undefined) mapObject.frameRate = data.frameRate

View File

@ -14,6 +14,20 @@ interface SpriteImage {
} }
} }
interface ImageDimensions {
width: number
height: number
offsetX: number
offsetY: number
}
interface EffectiveDimensions {
width: number
height: number
top: number
bottom: number
}
interface SpriteActionData { interface SpriteActionData {
action: string action: string
sprites: SpriteImage[] sprites: SpriteImage[]
@ -37,168 +51,154 @@ export default class SpriteUpdateEvent extends BaseEvent {
private async handleEvent(data: UpdateSpritePayload, callback: (success: boolean) => void): Promise<void> { private async handleEvent(data: UpdateSpritePayload, callback: (success: boolean) => void): Promise<void> {
try { try {
// Validate request and permissions
if (!(await this.isCharacterGM())) { if (!(await this.isCharacterGM())) {
callback(false) callback(false)
return return
} }
// Get and validate sprite
const sprite = await this.spriteRepository.getById(data.id) const sprite = await this.spriteRepository.getById(data.id)
if (!sprite) { if (!sprite) {
callback(false) callback(false)
return return
} }
await this.spriteRepository.getEntityManager().populate(sprite, ['spriteActions']) await this.spriteRepository.getEntityManager().populate(sprite, ['spriteActions'])
// Update sprite name // Update sprite in database
await sprite.setName(data.name).setUpdatedAt(new Date()).save() await sprite.setName(data.name).setUpdatedAt(new Date()).save()
// Process all sprite actions // First verify all sprite sheets can be generated
const success = await this.processAllSpriteActions(data.spriteActions, sprite) const allSheetsGenerated = await this.verifyAllSpriteSheets(data.spriteActions, sprite.getId())
callback(success) if (!allSheetsGenerated) {
callback(false)
return
}
// Remove existing actions
await this.removeExistingActions(sprite)
// Create new actions
await this.createNewSpriteActions(data.spriteActions, sprite)
callback(true)
} catch (error) { } catch (error) {
console.error(`Error updating sprite ${data.id}:`, error) console.error(`Error updating sprite ${data.id}:`, error)
callback(false) callback(false)
} }
} }
private async processAllSpriteActions(actionsData: SpriteActionData[], sprite: any): Promise<boolean> { private async verifyAllSpriteSheets(actionsData: SpriteActionData[], spriteId: string): Promise<boolean> {
try { for (const actionData of actionsData) {
// Remove existing actions if (!(await this.generateSpriteSheet(actionData.sprites, spriteId, actionData.action))) {
return false
}
}
return true
}
private async removeExistingActions(sprite: any): Promise<void> {
const existingActions = sprite.getSpriteActions() const existingActions = sprite.getSpriteActions()
for (const existingAction of existingActions) { for (const existingAction of existingActions) {
await this.spriteRepository.getEntityManager().removeAndFlush(existingAction) await this.spriteRepository.getEntityManager().removeAndFlush(existingAction)
} }
// First pass: find the global maximum dimensions across all actions
let globalMaxWidth = 0
let globalMaxHeight = 0
// Extract all image metadata to find global maximums
for (const actionData of actionsData) {
if (actionData.sprites.length === 0) continue
const imagesData = await Promise.all(
actionData.sprites.map(async (sprite) => {
const base64Data = sprite.url.split(';base64,').pop()
if (!base64Data) throw new Error('Invalid base64 image')
const buffer = Buffer.from(base64Data, 'base64')
const metadata = await sharp(buffer).metadata()
return {
width: metadata.width || 0,
height: metadata.height || 0
}
})
)
// Update global maximums with this action's maximums
const actionMaxWidth = Math.max(...imagesData.map((data) => data.width), 0)
const actionMaxHeight = Math.max(...imagesData.map((data) => data.height), 0)
globalMaxWidth = Math.max(globalMaxWidth, actionMaxWidth)
globalMaxHeight = Math.max(globalMaxHeight, actionMaxHeight)
} }
// Process each action using the global maximum dimensions private async createNewSpriteActions(actionsData: SpriteActionData[], sprite: any): Promise<void> {
for (const actionData of actionsData) { for (const actionData of actionsData) {
if (actionData.sprites.length === 0) continue // Process images and calculate dimensions
const imageData = await Promise.all(actionData.sprites.map((sprite) => this.processImage(sprite)))
const effectiveDimensions = imageData.map((dimensions) => this.calculateEffectiveDimensions(dimensions))
// Generate and save the sprite sheet using global dimensions // Calculate total height needed for the sprite sheet
const frameDimensions = await this.generateAndSaveSpriteSheet(actionData.sprites, sprite.getId(), actionData.action, globalMaxWidth, globalMaxHeight) const maxHeight = Math.max(...effectiveDimensions.map((d) => d.height), 0)
const maxTop = Math.max(...effectiveDimensions.map((d) => d.top), 0)
const maxBottom = Math.max(...effectiveDimensions.map((d) => d.bottom), 0)
const totalHeight = maxHeight + maxTop + maxBottom
if (!frameDimensions) return false
// Create and save sprite action
const spriteAction = new SpriteAction() const spriteAction = new SpriteAction()
spriteAction.setSprite(sprite) spriteAction.setSprite(sprite)
sprite.getSpriteActions().add(spriteAction) sprite.getSpriteActions().add(spriteAction)
const maxWidth = await this.calculateMaxWidth(actionData.sprites)
spriteAction spriteAction
.setAction(actionData.action) .setAction(actionData.action)
.setSprites(actionData.sprites) .setSprites(actionData.sprites)
.setOriginX(actionData.originX) .setOriginX(actionData.originX)
.setOriginY(actionData.originY) .setOriginY(actionData.originY)
.setFrameWidth(frameDimensions.frameWidth) .setFrameWidth(maxWidth)
.setFrameHeight(frameDimensions.frameHeight) .setFrameHeight(totalHeight)
.setFrameRate(actionData.frameRate) .setFrameRate(actionData.frameRate)
await this.spriteRepository.getEntityManager().persistAndFlush(spriteAction) await this.spriteRepository.getEntityManager().persistAndFlush(spriteAction)
} }
return true
} catch (error) {
console.error('Error processing sprite actions:', error)
return false
}
} }
private async generateAndSaveSpriteSheet(sprites: SpriteImage[], spriteId: string, action: string, maxWidth: number, maxHeight: number): Promise<{ frameWidth: number; frameHeight: number } | null> { private async generateSpriteSheet(sprites: SpriteImage[], spriteId: string, action: string): Promise<boolean> {
try { try {
if (sprites.length === 0) return { frameWidth: 0, frameHeight: 0 } if (!sprites.length) return true
// Extract image data // Process all images and get their dimensions
const imagesData = await Promise.all( const imageData = await Promise.all(sprites.map((sprite) => this.processImage(sprite)))
const effectiveDimensions = imageData.map((dimensions) => this.calculateEffectiveDimensions(dimensions))
// Calculate maximum dimensions
const maxWidth = Math.max(...effectiveDimensions.map((d) => d.width), 0)
const maxHeight = Math.max(...effectiveDimensions.map((d) => d.height), 0)
const maxTop = Math.max(...effectiveDimensions.map((d) => d.top), 0)
const maxBottom = Math.max(...effectiveDimensions.map((d) => d.bottom), 0)
// Calculate total height needed
const totalHeight = maxHeight + maxTop + maxBottom
// Process images and create sprite sheet
const processedImages = await Promise.all(
sprites.map(async (sprite) => { sprites.map(async (sprite) => {
const base64Data = sprite.url.split(';base64,').pop() const { width, height, offsetX, offsetY } = await this.processImage(sprite)
if (!base64Data) throw new Error('Invalid base64 image') const uri = this.extractBase64Data(sprite.url)
const buffer = Buffer.from(base64Data, 'base64') const buffer = Buffer.from(uri, 'base64')
const metadata = await sharp(buffer).metadata()
return { // Create individual frame
buffer, const left = offsetX >= 0 ? offsetX : 0
width: metadata.width || 0, const verticalOffset = totalHeight - height - (offsetY >= 0 ? offsetY : 0)
height: metadata.height || 0
}
})
)
// Skip creation if any image has invalid dimensions
if (imagesData.some((data) => data.width === 0 || data.height === 0)) {
console.error('One or more sprites have invalid dimensions')
return null
}
// Create frames of uniform size with the original sprites centered
const uniformFrames = await Promise.all(
imagesData.map(async (imageData) => {
// Calculate centering offsets to position the sprite in the middle of the frame
const xOffset = Math.floor((maxWidth - imageData.width) / 2)
const yOffset = Math.floor((maxHeight - imageData.height) / 2)
// Create a uniform-sized frame with the sprite centered
return sharp({ return sharp({
create: { create: {
width: maxWidth, width: maxWidth,
height: maxHeight, height: totalHeight,
channels: 4, channels: 4,
background: { r: 0, g: 0, b: 0, alpha: 0 } background: { r: 0, g: 0, b: 0, alpha: 0 }
} }
}) })
.composite([ .composite([{ input: buffer, left, top: verticalOffset }])
{
input: imageData.buffer,
left: xOffset,
top: yOffset
}
])
.png() .png()
.toBuffer() .toBuffer()
}) })
) )
// Create the sprite sheet with uniform frames // Combine frames into sprite sheet
const spriteSheet = await sharp({ const spriteSheet = await this.createSpriteSheetImage(processedImages, maxWidth, totalHeight)
// Save the sprite sheet
await this.saveSpriteSheet(spriteId, action, spriteSheet)
return true
} catch (error) {
console.error('Error generating sprite sheet:', error)
return false
}
}
private async createSpriteSheetImage(processedImages: Buffer[], maxWidth: number, totalHeight: number): Promise<Buffer> {
return sharp({
create: { create: {
width: maxWidth * uniformFrames.length, width: maxWidth * processedImages.length,
height: maxHeight, height: totalHeight,
channels: 4, channels: 4,
background: { r: 0, g: 0, b: 0, alpha: 0 } background: { r: 0, g: 0, b: 0, alpha: 0 }
} }
}) })
.composite( .composite(
uniformFrames.map((buffer, index) => ({ processedImages.map((buffer, index) => ({
input: buffer, input: buffer,
left: index * maxWidth, left: index * maxWidth,
top: 0 top: 0
@ -206,20 +206,52 @@ export default class SpriteUpdateEvent extends BaseEvent {
) )
.png() .png()
.toBuffer() .toBuffer()
}
// Save sprite sheet private async saveSpriteSheet(spriteId: string, action: string, spriteSheet: Buffer): Promise<void> {
// Ensure directory exists
const dir = `public/sprites/${spriteId}` const dir = `public/sprites/${spriteId}`
await fs.promises.mkdir(dir, { recursive: true }) await fs.promises.mkdir(dir, { recursive: true })
await fs.promises.writeFile(`${dir}/${action}.png`, spriteSheet)
// Return the uniform frame dimensions (now global maximum dimensions) // Save the sprite sheet
await fs.promises.writeFile(`${dir}/${action}.png`, spriteSheet)
}
private extractBase64Data(url: string): string {
const uri = url.split(';base64,').pop()
if (!uri) throw new Error('Invalid base64 image')
return uri
}
private async processImage(sprite: SpriteImage): Promise<ImageDimensions> {
const uri = this.extractBase64Data(sprite.url)
const buffer = Buffer.from(uri, 'base64')
const metadata = await sharp(buffer).metadata()
return { return {
frameWidth: maxWidth, width: metadata.width ?? 0,
frameHeight: maxHeight height: metadata.height ?? 0,
offsetX: sprite.offset?.x ?? 0,
offsetY: sprite.offset?.y ?? 0
} }
} catch (error) {
console.error('Error generating sprite sheet:', error)
return null
} }
private calculateEffectiveDimensions(imageDimensions: ImageDimensions): EffectiveDimensions {
return {
width: imageDimensions.width + Math.abs(imageDimensions.offsetX),
height: imageDimensions.height + Math.abs(imageDimensions.offsetY),
top: imageDimensions.offsetY >= 0 ? imageDimensions.offsetY : 0,
bottom: imageDimensions.offsetY < 0 ? Math.abs(imageDimensions.offsetY) : 0
}
}
private async calculateMaxWidth(sprites: SpriteImage[]): Promise<number> {
if (!sprites.length) return 0
// Process all images and get their dimensions
const imageData = await Promise.all(sprites.map((sprite) => this.processImage(sprite)))
const effectiveDimensions = imageData.map((dimensions) => this.calculateEffectiveDimensions(dimensions))
// Calculate maximum width needed
return Math.max(...effectiveDimensions.map((d) => d.width), 0)
} }
} }

View File

@ -482,8 +482,8 @@
"length": null, "length": null,
"mappedType": "json" "mappedType": "json"
}, },
"depth_offsets": { "pivot_points": {
"name": "depth_offsets", "name": "pivot_points",
"type": "json", "type": "json",
"unsigned": false, "unsigned": false,
"autoincrement": false, "autoincrement": false,

View File

@ -1,6 +1,6 @@
import { Migration } from '@mikro-orm/migrations'; import { Migration } from '@mikro-orm/migrations';
export class Migration20250321203033 extends Migration { export class Migration20250221004940 extends Migration {
override async up(): Promise<void> { override async up(): Promise<void> {
this.addSql(`create table \`map\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null default '', \`width\` int not null default 10, \`height\` int not null default 10, \`tiles\` json not null, \`pvp\` tinyint(1) not null default false, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`create table \`map\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null default '', \`width\` int not null default 10, \`height\` int not null default 10, \`tiles\` json not null, \`pvp\` tinyint(1) not null default false, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
@ -16,7 +16,7 @@ export class Migration20250321203033 extends Migration {
this.addSql(`alter table \`map_event_tile_teleport\` add unique \`map_event_tile_teleport_map_event_tile_id_unique\`(\`map_event_tile_id\`);`); this.addSql(`alter table \`map_event_tile_teleport\` add unique \`map_event_tile_teleport_map_event_tile_id_unique\`(\`map_event_tile_id\`);`);
this.addSql(`alter table \`map_event_tile_teleport\` add index \`map_event_tile_teleport_to_map_id_index\`(\`to_map_id\`);`); this.addSql(`alter table \`map_event_tile_teleport\` add index \`map_event_tile_teleport_to_map_id_index\`(\`to_map_id\`);`);
this.addSql(`create table \`map_object\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`tags\` json not null, \`depth_offsets\` json not null, \`origin_x\` numeric(10,2) not null default 0, \`origin_y\` numeric(10,2) not null default 0, \`frame_rate\` int not null default 0, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`create table \`map_object\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`tags\` json not null, \`pivot_points\` json not null, \`origin_x\` numeric(10,2) not null default 0, \`origin_y\` numeric(10,2) not null default 0, \`frame_rate\` int not null default 0, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
this.addSql(`create table \`placed_map_object\` (\`id\` varchar(255) not null, \`map_id\` varchar(255) not null, \`map_object_id\` varchar(255) not null, \`is_rotated\` tinyint(1) not null default false, \`position_x\` int not null default 0, \`position_y\` int not null default 0, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`create table \`placed_map_object\` (\`id\` varchar(255) not null, \`map_id\` varchar(255) not null, \`map_object_id\` varchar(255) not null, \`is_rotated\` tinyint(1) not null default false, \`position_x\` int not null default 0, \`position_y\` int not null default 0, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);
this.addSql(`alter table \`placed_map_object\` add index \`placed_map_object_map_id_index\`(\`map_id\`);`); this.addSql(`alter table \`placed_map_object\` add index \`placed_map_object_map_id_index\`(\`map_id\`);`);

View File

@ -1,7 +1,7 @@
import serverConfig from '@/application/config' import serverConfig from '@/application/config'
import { Migrator } from '@mikro-orm/migrations' import { Migrator } from '@mikro-orm/migrations'
import { defineConfig, MariaDbDriver } from '@mikro-orm/mariadb' // import { defineConfig, MariaDbDriver } from '@mikro-orm/mariadb'
// import { defineConfig, MySqlDriver } from '@mikro-orm/mysql' import { defineConfig, MySqlDriver } from '@mikro-orm/mysql'
import { TsMorphMetadataProvider } from '@mikro-orm/reflection' import { TsMorphMetadataProvider } from '@mikro-orm/reflection'
export default defineConfig({ export default defineConfig({
@ -9,7 +9,7 @@ export default defineConfig({
metadataProvider: TsMorphMetadataProvider, metadataProvider: TsMorphMetadataProvider,
entities: ['./src/entities/*.ts'], entities: ['./src/entities/*.ts'],
entitiesTs: ['./src/entities/*.ts'], entitiesTs: ['./src/entities/*.ts'],
driver: MariaDbDriver, driver: MySqlDriver,
host: serverConfig.DB_HOST, host: serverConfig.DB_HOST,
port: serverConfig.DB_PORT, port: serverConfig.DB_PORT,
user: serverConfig.DB_USER, user: serverConfig.DB_USER,