{"_id":"metahkg-server","_rev":"64-0e463559c41ff36d305b6b67672cbf81","name":"metahkg-server","dist-tags":{"latest":"3.4.2","dev":"4.0.0-1-dev"},"versions":{"0.5.8-rc2":{"name":"metahkg-server","version":"0.5.8-rc2","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","react"],"dependencies":{"@sinclair/typebox":"^0.23.4","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.26.0","bcrypt":"^5.0.1","body-parser":"^1.19.2","cookie-parser":"^1.4.6","cors":"^2.8.5","dompurify":"^2.3.6","dotenv":"^16.0.0","email-validator":"^2.0.4","express":"^4.17.3","fs-extra":"^10.0.1","hash.js":"^1.1.7","is-sn-integer":"^0.2.0","jsdom":"^19.0.0","mailgun-js":"^0.22.0","mongodb":"^4.4.0","multer":"^1.4.4","node-html-parser":"^5.3.3","sharp":"^0.30.1","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/bcrypt":"^5.0.0","@types/cookie-parser":"^1.4.2","@types/cors":"^2.8.12","@types/dompurify":"^2.3.3","@types/express":"^4.17.13","@types/fs-extra":"^9.0.13","@types/jsdom":"^16.2.14","@types/mailgun-js":"^0.22.12","@types/multer":"^1.4.7","@types/node":"^17.0.21","@types/sharp":"^0.29.5","@types/valid-url":"^1.0.3","prettier":"^2.5.1","system-commands":"^1.1.7","typescript":"^4.5.5"},"scripts":{"start":"node start.js && node dist/server.js","start:api":"yarn run start","build":"npx tsc","deploy":"yarn run build && yarn run start"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"gitHead":"44c079f2a705ae448302614fa15fd916652c3517","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@0.5.8-rc2","_nodeVersion":"17.8.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-IZSXM57TJFwWyMMZwOiedSshREo/6LFCgv0xAepuoyWhhPzMT7eGbXc4kMfVPtspAdt3Tc9GTBHByGfvutEHxw==","shasum":"be2861c4311956a494003b711e508828f7456206","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-0.5.8-rc2.tgz","fileCount":79,"unpackedSize":134218,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCjUhu1McbsNzrTwrHF0rvY65frVOA0v6fjqKbdfC+krQIhAJxa4XOlffVNS+JtQFUwO3OTj3FnENLkn9LrBiAF+kG7"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUPYSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoidg//ayLr/woQ7u1B7M6WCLKBYv8lYoEgofyppUumKav3/il4Rram\r\nySLYSTZN+LyOVPNEVQDJE4U/42OnEDOVjW6uQaI5/mhTvu7Xxd8ziO6OLQXd\r\nWDGKAcnLYh8rTcTcPpxkwYmX1ofYnxkcxxlabtREvD0DJnWAJQhF9ja5N+Xk\r\nKwihB0TYvP0LaOcboMHaNSGbSLfh+gCJuApMJyAE7fe3GvvMSlC+NC745DPe\r\n4xW7cmA1lU+4/l22D1vblVVBYr6AQTtALoBOuVxTEZdODEd2stYUewuGUVol\r\nctLPI09l/9Byp/DL4DGZS9CDUKN8lMcBpQEVV2vBDQwg14Fzh0viv5KsZkJa\r\npa57gmNxkFDgWjRZcmbPqPKO1ZGCrm3ehuvA1S1uXH2gfV+KwAdiJIsIcZuD\r\nmlsB7vY2LnqFftIvRH8FS7odTrraqUGUVDaTKuRdCKbND1yIiJ0JqRwOeImX\r\nc3DsARvRnZ3jzOoZvDDZ9UfZQSyytZvf63yaqnHEp6f2ELEmvGNLVZurCHP0\r\nGVqn42uSL/5U4SZLxpwX1QCUCgVzbakzvIcaXUNF34U7namb/Hnts26/zCSv\r\n9dA7eog4wu9QDCeZ3XUVLbMhgVSMt+aSyDtkygn/7IUcCOsfXoiT/3m8/ZqZ\r\nDGe63boNpjfutDYkRyZ9CdYkoLsW6+uBJt0=\r\n=SRfE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_0.5.8-rc2_1649473042035_0.4812351974912039"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"0.5.10-rc1":{"name":"metahkg-server","version":"0.5.10-rc1","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","react"],"dependencies":{"@sinclair/typebox":"^0.23.4","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.26.1","bcrypt":"^5.0.1","body-parser":"^1.20.0","cookie-parser":"^1.4.6","dompurify":"^2.3.6","dotenv":"^16.0.0","email-validator":"^2.0.4","express":"^4.17.3","fs-extra":"^10.1.0","hash.js":"^1.1.7","is-sn-integer":"^0.3.0","jsdom":"^19.0.0","jsonwebtoken":"^8.5.1","jwt-decode":"^3.1.2","mailgun-js":"^0.22.0","mongodb":"^4.5.0","morgan":"^1.10.0","multer":"^1.4.4","node-html-parser":"^5.3.3","sanitize-html":"^2.7.0","sharp":"^0.30.3","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/bcrypt":"^5.0.0","@types/cookie-parser":"^1.4.2","@types/cors":"^2.8.12","@types/dompurify":"^2.3.3","@types/express":"^4.17.13","@types/fs-extra":"^9.0.13","@types/jsdom":"^16.2.14","@types/jsonwebtoken":"^8.5.8","@types/mailgun-js":"^0.22.12","@types/morgan":"^1.9.3","@types/multer":"^1.4.7","@types/node":"^17.0.24","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.2","@types/valid-url":"^1.0.3","nodemon":"^2.0.15","prettier":"^2.6.2","system-commands":"^1.1.7","ts-node":"^10.7.0","typescript":"^4.6.3"},"scripts":{"start":"node start.js && node dist/server.js","start:api":"yarn run start","build":"npx tsc","deploy":"yarn run build && yarn run start","dev":"nodemon ./src/server.ts"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"gitHead":"a90b7a7122229af25ea8e38d48840c522617f392","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@0.5.10-rc1","_nodeVersion":"17.9.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-+x+aC0o61ymuaZqLBjKTB/53dCE68N5SerwKmpVtINb5r5MyihHnh8yaQL/xBF9Ly1jkDpM6HH0VjM/bMjAwhw==","shasum":"09f48722d5813983d963f2076b7fb82ee400fe55","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-0.5.10-rc1.tgz","fileCount":80,"unpackedSize":221016,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXkeRo3nXa9QZ+yS8CDymmKjG11Ui8LoW1HchmHxgBnQIhANWW0q4wJrv1Oz9NqZbNy4vmSQtZJ06Rfb+ljFsiIHaa"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXlupACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoauQ/9EUEkBSIsh2PGR/zKcoaaJHQyyhcFtTkr7pXG/+GLgwpY/DO9\r\n7g/lp7H0sEcx18xLFHAPeezH0U9gL6PTn9Hr3zc4QXiFd6Z+c/2tr2inf+nd\r\nEfT+EQbkTKZoaJPuHD7nVIJn4R3bISEsbuHXaJyQ3ChCo7uLREJeluCkjZmk\r\nD5VFgg5oawU+Le5X0FYFJ/EsGafacurPH3+8ow1/LPL/AM83Y4EhVrqH251C\r\n/54/BPyvpEhLDX6jBOyAw5eaeVl544rwWiyl8DH8x1vaOVVoyc2p6B3xIrZ7\r\njng0Ieq/UKe2hQgvHi1kQjUgBR9qO3O4qv2Bo1JbrBJmxGjObfTA3hoGejo/\r\nh2+srqoaTc2yMyDqyeavTvCztvwMcKKcA+ZHJSZHWm+YXwY62pJTaeohbKMh\r\nJr1l21TG92ss3s9hdrKRP35PPKyB3NHGhjtBGbj6CTBnaE4mr5SiXgd7k672\r\ntlSre/WH5+8Estdafavy/vDV2XDbzR8vMHYhKgTG3EoF8PHHEYbIfdDDfeb7\r\nZmHjUVlQuUWKxyMYbB0XxF1bB/x5GZBJjlIiL4nBndTkIby3PDMeYSnPx1ui\r\nF+Y+vorkOYD3EWZPT/MwgBzjDXXUnse10pUMJSxP5cL4TcyrPx+lsgZ0XTEd\r\nxVYVb4adMJC59ntyQkvV6//F1kEu/zdFY/g=\r\n=inGP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_0.5.10-rc1_1650351017011_0.048415053722187906"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.1.0":{"name":"metahkg-server","version":"2.1.0","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/express":"^2.0.0","@fastify/multipart":"^7.0.0","@sinclair/typebox":"^0.23.4","@types/bcrypt":"^5.0.0","@types/dompurify":"^2.3.3","@types/express":"^4.17.13","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsdom":"^16.2.14","@types/jsonwebtoken":"^8.5.8","@types/mailgun-js":"^0.22.12","@types/multer":"^1.4.7","@types/node":"^17.0.24","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.2","@types/valid-url":"^1.0.3","add":"^2.0.6","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.26.1","bcrypt":"^5.0.1","dompurify":"^2.3.6","dotenv":"^16.0.0","email-validator":"^2.0.4","express":"^4.17.3","fastify":"^4.0.2","fastify-plugin":"^2.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","jsdom":"^19.0.0","jsonwebtoken":"^8.5.1","mailgun-js":"^0.22.0","mongodb":"^4.5.0","multer":"^1.4.4","node-html-parser":"^5.3.3","sanitize-html":"^2.7.0","sharp":"^0.30.6","typescript":"^4.7.2","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@typescript-eslint/eslint-plugin":"^5.23.0","@typescript-eslint/parser":"^5.23.0","eslint":"^8.15.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.0.0","nodemon":"^2.0.15","prettier":"^2.6.2","ts-node":"^10.7.0"},"scripts":{"start":"node start.js && node dist/server.js","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","build":"npx tsc","test":"exit 0","deploy":"yarn run build && yarn run start","dev":"nodemon ./src/server.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"gitHead":"7de1cbb46751c64f5b8a5eff2bb3e0ee5fbf92f5","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.1.0","_nodeVersion":"18.3.0","_npmVersion":"8.9.0","dist":{"integrity":"sha512-lxDOyJ3ObYZdoC2yGMjWTyUpITwMRxa6edYFL1hYBbTfcDqBwHoqM7wgEIGIajXCMJ9y9nYIrkX48+3teDkFAw==","shasum":"304650f6fb77882f46c2345bf0737733b8ee25ef","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.1.0.tgz","fileCount":98,"unpackedSize":257629,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF77YJ8DNmEe2kLdvWvxyXiSabAs5aXhmzh9L0qASmthAiBoqgZPPumEVc8Uh6DcR6ZQhecSJYvP/C1DBIG8jeu1Sw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJitEI6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp+lBAAj4p8/4BD3f2vhlbgDFVzniJNGsZfpBbQnScxOgjpGQg6cAfN\r\nxnFJ/kD/Xv4frN8FJww7ziLYMijYG4ENbZqK9xaV0oEXxrkUhSkbFTxbsPEc\r\niIwU+QYIbb8GgGyam+vECImp307cR0PbGdXo0W7sWPyydLdCLAU/2/FOlo//\r\nke50mC8WCuF8jhHjszrZ90Ra4bXskhklOmfTmg1uOWZFW0JgpvK8uJ/P3LrV\r\nfPxnaGKtUZbY/oPUGVplU9mjP9qo0QHBx3txSR/s9K9rW1H762Sc3G5lWpEg\r\nD80/dzylhbVl0Wvo2t5smMIDbNPkZy33QK0ViHaFZgqhbEdwSSDeyTulLTS/\r\nS5lty8L2Dfd//IDrEp8uZRvUQ5o+gmZdwqZqUJcJE6KltrtfPqCYeHHuKONJ\r\nox9l0BwL5dMu6vc6uPIa5oLUwJ5yxjF1PvtfAiS1umu4fX4FwwXrNQQh76S2\r\nc1zN7LJzAovFbfttRlYPGhDIp2yT+avgk7JTz3uD8fgEiIWV3opmSQUsxZZe\r\nQVO29HW1T8y/DhjE7M9JtYaIJ0oxb0R6f1WBiGY39+tO/FfNAFq0uiDrQ3Fy\r\nvaOBLdPktVNkLSOfwhSb22/eBBJxwti/4yqTQGziLXm5jcjxLsEj3H2M6shU\r\nLEO8ATg4BenDqpoNXQTLqxKjCFn87YnWldo=\r\n=e9m5\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.1.0_1655980602570_0.0610168851673627"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.4.0-dev":{"name":"metahkg-server","version":"2.4.0-dev","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/mailgun-js":"^0.22.12","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun-js":"^0.22.0","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"gitHead":"839c65def68e9e58d2941ffbc98cea32121b66ce","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.4.0-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-nPyGGfY+btky7GwMnsGtpdB8Vgnry9DIa52zjjsdTCfpsr8Q9CIRjf7rTqm8i95Q1kpWK8eM+jxzbwD3C+GbuQ==","shasum":"1ce7d21249ecc802c531422c9d423462ebcbbbcf","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.4.0-dev.tgz","fileCount":108,"unpackedSize":442359,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHo94N9Sc/1b2TMvgQy8s5UI631J8MhpYhMTYaYCe1g4AiB6J3eziGK+HzqV5mM0nYJuJs6bsKmQ4257dqfw2cQRUw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivYUuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo+kw/+KYf3zRFa/4gDsRMTxvf9tO1EdE/iQj49Z0A6GQygMgH7bw9o\r\nttoHPoUDtde4CCiqYhLi8boUBg+buFUeD6VnfTI7POPixJwdGOs+kd2ZjPZY\r\n6W4+KojgjtE/S8AXuxfd2z5dLommVkSabMZpgmCVcHBMyYCNIKg4gc4pDCMu\r\nY76+RpbyAVhhvU5LQpDGZ/jGZnu3XCBGiNCrd5IdViADRsfplhYJZg1aUNuC\r\nDkQUDF6KqeOOGxtzP/8RNFbVqwGIBlVVn7UIDoYU55mc37ZW0XS3jTuvNGSH\r\nENydMJdxkI2oI9Y4n7dh1UG6htn8X81+/QraXD/aeprZtdXc8a0lRqIHd9nr\r\nOcquPiZ+/bsm1LXE9isluWyoGvKda+2LbaSR6uKhxvtsM1HV3fvClrds8nqX\r\nnF6HTLJD8wTQ522rW6zsXrM3+xGywZ/JAQFX0liT7fJ/z7vXPcvaXjE3rLqQ\r\nSnUS/9SuklpMOhVBFAZ6krrisFPlewNNtWfr46w3FARupNbznqkTpB+4PjlS\r\nrg6birlai+koIZTJD7T2R9+0obfULhecoFT75GRmHTbu4tD6Hv0RSglhBILB\r\nWoNvAgq4a1+RRtIKdoUF2MQ34mXdQFAiriSm4i1bkhX9R6btCrOj6XSqSdtv\r\nELFdcbJEYjI55u4CxpYYb67U3y8QCCtgd6k=\r\n=HFke\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.4.0-dev_1656587566471_0.6719826782400733"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.4.0-1-dev":{"name":"metahkg-server","version":"2.4.0-1-dev","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/mailgun-js":"^0.22.12","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun-js":"^0.22.0","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"gitHead":"8d0570b3e25c75d98d1061a577a9dc7f1161f615","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.4.0-1-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-h20l73p5rP1NNAi1AfgDgIaH9zimvm8hwoPAE2WXTeo3pp4GdKLfWXY++d2OeDoCCmuS+2GdRIUVCS/b8ePIeg==","shasum":"4a817e2437cde86ad0f296b5fb71d826dc7d0a56","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.4.0-1-dev.tgz","fileCount":272,"unpackedSize":678988,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCGx1scVkGa3zT2+i9VWJY0x7Csj3RJsH3gDzERjhl+AAIgdVe8cOaNVm6qXbejotZ8u1rQWA/zVYoqkVWFOxByOIY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivbnrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp74g//QYiXvdJyEBo8s4KWs1WoWVTUJ1XGSCt9ur6NJifJljWuHGEk\r\n1HYPPmrCql7mQWVJG0hdM9PFt+A78db2/JyAAyZXLM7gdW2NmBmc/xu4+wse\r\n9XXDKyUmO5KPdOpghg4lCBxvAt63omVN9t9TfxCgRWv/J5hS5UDIw5XSR0zZ\r\nzBF6yJhvHtQAf5n4RxvdRbBOcO+5fCSqWyLNxIR1lR3hzjAk3Cj7/j64dNvs\r\nmFUv+FQrdy6kn5GmHFfK67RNYBgUKoIogaeSf0RXyPcigVYyBrI9FRtHSkkD\r\n9a7As2e3PYL7/+gYq7SyYUCk5AF3XqWd7kW0K956QGWUMxiF1vMjlKwh6g1s\r\n/S74MK3q3Eo1uaoSXnbA103gmSUe52ronMeUgEm/xmFQR07kI0v1iniLxaGm\r\njKD2NsVEl21mYJGJ+VMW6D8B5CKsEd7vRPmiAKyNyKQYDenWhuJ0OWi1HHp3\r\nJsMRCxcFwsjp0a2u7PvVZnEz/bFkZU+7gE7oAJ+qS6OjDDPRZmHDVHsi/eSG\r\nXnmwHBxVG/wSlBiSWpOhq2wmU85tQAsR9Cvg0A0CLvNFdyn3ylnEq3331VIj\r\nONkpR1Mx+yKu5r0qPQtSfvPy+ShVXilh2380Gc34XtQ22JgPfUu2GFM6kSvc\r\nbaUNTLfyOHHm5cQcEa+orNV+Pbl0cvgNGZI=\r\n=YlaN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.4.0-1-dev_1656601067379_0.12809449715344545"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.4.0-2-dev":{"name":"metahkg-server","version":"2.4.0-2-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/mailgun-js":"^0.22.12","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun-js":"^0.22.0","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"f8705023ccd5f920ef462a9100ebbd470af290b0","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.4.0-2-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-UJ9hYpkLU4IOJHay+TjVR4UbGT/HxeB5Ry9pRmPQF+tC4fAZWsSNijgzjQg2EmXnm+Ru6voM0LdT1i6oZE/KlA==","shasum":"a378722c2b56cf926f2aa54cf0b2fbbf5673477b","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.4.0-2-dev.tgz","fileCount":358,"unpackedSize":698510,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC01mYxpenmc68JA+FPqtYObrE30dlO4kv5iO3t3yuvUwIgf+TNi53UELb0WysIVUAEmAlL+b/pY2Y55cyow/IC2Vo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivb3DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmocKA/6AsBmBPGwIYXWr4Ezymd+Pe/9PZs64oJhAj3/aM/5H6mBf+IH\r\nGd922peYcFBfQy/BC+z2Z6DE63pVV4a/mn5I8HVsyUQ28n2dwdSdbkAxJtox\r\ndLq3lTZAzIzkF/aDG9F3kAXk/x1zmSNX2pFNt655tcRv7PGjkHX5FsXug6HT\r\naTwKkMvx2MiQSZh1PcxruETnpbrwqx+RNVumkBy0ks7GjUH1pcGi2j7U44Yg\r\nWzfvNGEAaRu0Vu7cq6NI2raufoLuNHYj0/t2S/4Gt6XllrlJPkfDwfsm1hae\r\nggEZ+Z77oZIcByiqONGHX3ultseQDJ3pAVTIQ/CkZDcPVT3KMbYT1Q8O97I+\r\nvDERocBi0fW9/ToymD31XgnqZTfX0nuET7s3N0MAS45O964iDmoaX5kwAq2S\r\n/kKRWXr+g987s6MY7VjhBge8ozuh8SAMFr8O+VaKtjjgM3zrHHDKUDko9/vZ\r\nK0GSQFd7VBQANdkfzCFYnXv5Vm4xxaZ3TNoikOz0MPJkzwNSpWBlCmffD8Ns\r\no+kn7nLvm2meaywFG1YFLyil5oTdvJSmLh8CersPODu3h+x6K9Git7crW2QN\r\nHTERLDwM3NPA/1K5LduEm1NkfSzzwmdaWUEwpgCuD9grImEq854IRRezTrJD\r\niOOgjLagV6YMHpqZURPXJF9JbiyqwR67HYA=\r\n=1vjZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.4.0-2-dev_1656602051323_0.22030998639751598"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.4.0-3-dev":{"name":"metahkg-server","version":"2.4.0-3-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/mailgun-js":"^0.22.12","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun-js":"^0.22.0","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"e91ff8cfcb546b20104fabd6dad10d0998ccc8e9","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.4.0-3-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-0tqGUji0ndz7crkv/gT3X3Pjw8seoNfV925IzBqdqxTpJfViN3JyH+0n1XNhPvYDBc2oOOFAP4nPfVUkBNK9Nw==","shasum":"c195d5e8308e0faecd72d5f27482ac96133b5576","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.4.0-3-dev.tgz","fileCount":358,"unpackedSize":698174,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHpNyS74Yx7igvOFaVeiTJQT9UAwJhWko/Wd+v80/pNgAiEA22ns8kExF9laiEMCQJbrXJ52CkCxI7e22lkMOlmkS0U="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivb4CACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrRyA//aEvGXvCjCZmrF37ew5PmCThXjLrh0LyVxkUTp057iBK/Btxu\r\njdAXp4NQJBpNVZGERhUDlJs0N3HOEPRjNGnkgMypsWYoVvmkhNS4dqgQjfZQ\r\nnbOQPpOZSoFbAemTbEWwvm+WuQPhyO/K/Xkl3O9Ms4GDQ3DzoZbp0c6QHBw/\r\nQtguy3RWmhdwOTzXUljXnUpc1AE5l3Gx1iZAP9vmaboF54N/dYCukKSnzB4e\r\n1oHkBG5HuOVL5viOS2UW6BCXQQGNHw8oine/iZwQ1KoMVU5Fcu4RiIANJ0yh\r\nkjcU4xmQXWM2ibhvZUX8QMTgb6qXLkrW0nygVxcSCCccpqCqB5iTg8CwHqvC\r\noO8N5jeggPHgQ0AXIfPaPtqSSYs3iIR5jngoJOAKzkrhp+ytjlRG46b2Ba7o\r\nc+nEv2eSrBA1hwpjSc/wprPKXYTdOt15pRFW/VyBJeL1MX8/vbQy7A4nuONl\r\nRbYmJzWbyUkcsQmTE9I3PeYMMjewjppdgIxTipVuPl/d1m9gi8Dk6Xo+ClK1\r\nNT38FQ9+sdnyh9y0+5lS88A2HApdGzfSzX3CPWtCGHFSMlWNL83l43FIGoAT\r\nh2XeaybKs2+bEgnxQb/oAJTYRZi59R5CaY8i8BDwgBsp9CbALPCZsauv1sJo\r\nyzZI7WCPkNtlHHyeVc66KAMvfR6ocqBk++8=\r\n=qKwW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.4.0-3-dev_1656602114682_0.06394248613871434"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.4.0-4-dev":{"name":"metahkg-server","version":"2.4.0-4-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/mailgun-js":"^0.22.12","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun-js":"^0.22.0","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"c0378241f2e6e6a0a2e0502a47a62f6f4291ba4d","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.4.0-4-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-4RPv34wUtD/eOko2ixgFhTOaER26SGh+U0ZjUcwl5iK+brZZf3c7hUIXpcWCxRf2pke4L7DlAyWrkEHzOj+QrQ==","shasum":"7441552ce0c4fa417115dd8d861337dd37ec65ae","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.4.0-4-dev.tgz","fileCount":358,"unpackedSize":698192,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHVVykgs/Um9sIqPuEDdsA3Reg+YVh58MSUXy52XB8MuAiEA+EOiDafPR2F+0+g+r2gXvTg4eu/zeFf0vjY/C0PL3Ls="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivcVFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2Fg/+I9ALMopI/u6LTKVo2166YG1VwwBUz60vFt2WnGnOthmMghMi\r\nWv4vJgYNuEHNS92+O2n13CYJseFQwtIvQvtEUwuJJi4XpBEWtSmhea4OrsSe\r\npDg87JT02NIiPZq0EA0q+P+p+lsCX//a9L0vv3DsW2m+o45lh4QCHYvW5Hk9\r\nZ4aPTbjegGWAOC40xZtoYAPacO5ITivnARgup3FGHQIEHUcC8L1mmu1+yaHU\r\ndPHEGheJmCr7uLGmiTiNBFs2+Yms2JmidtHO5Joi8Molf3b/W3CI+0wqwv7D\r\nQLn4k800zLARDO22LJMhoPU1Y+d9MtpFEZ1srpT4owAqLnzBV/dxsTn8xVgd\r\ncOagP7ScLVFsYiq0tMFMClXNXoQ8NqaLODQos79vHA72Japv15pPzSr0jSe6\r\nKO4LbeHB1nJ/Oc6TlDGoG+Ulso9IjsUy1UEycTyifushKK/41JlySXn/FCuP\r\nQGACzzMj+NUKPnvsVVXA5fnyRqNNf8WgW1NJS5yJz8q1u5QWRchHN9/r0kZI\r\nqcqGKsPif1KEjXFVa3VB0jxGr2iQgoSz61VFXWdqwYnt6LNwth6I5/Dz2Z0x\r\n3InHTkQJs7hmy8HqE+53QmcivlGUis11D948gPkACAgTQ71PZgdk5jJd6pKx\r\neXnriaFk5j+CrnuwgrY8CF0v9kfUIcQ21xw=\r\n=Eexg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.4.0-4-dev_1656603972951_0.7513267098001835"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.4.0":{"name":"metahkg-server","version":"2.4.0","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/mailgun-js":"^0.22.12","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun-js":"^0.22.0","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"3941064eb7cc9d8b0b17646fc747e066ca78a163","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.4.0","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-144ecx2kylg9p/dvaWYCKvpyW22O/chQuci6Mm9HexXitvpj+JWprP97TBPI6Ieqsb73QjOH/xJUfRvwQMWxaA==","shasum":"b330b1ca7d75b33feb2991e0a4cb5cc6c33e7ee8","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.4.0.tgz","fileCount":358,"unpackedSize":698186,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDg+18qX3HWxlWLmL28AnU2wk8v+ScdpJejloSyHUjw0wIgRtpQ9EPNe+mZJXQwuGcXWlZwVGarEa9YujWu3uRXkuE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivcV9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo/WA//f/pHdUl52NL8olrXiuihRM2bhM8gV7gqiJvbSf6GA+RlIziY\r\nkOTfPn0QYtwUOpEawIjgNXkK4CGRzX0Cmn7+n2cZ+l38RugiFzU3dS7pKaP/\r\ny1IlpZ5po1j0TIpK2A6t8gShT4e3lT64RwQL+94sUa5VfZMHSivs12aq2y7W\r\nctZV5Hw8tRmCVkqhCuqf+nEOEFVwdgmDGkwqPSZYNu2CF0yLLBOgXWnHQsva\r\nCDL6fGbKFS/5yqNGrbEJ3HF+BO/XLe2ImzoZ4N3NvvgFXCL26K4JWFByGC1X\r\nUNLBbrRZBTZYlFO2urS/nNMJY4N4J6nE9IQ1UOqyF6tu86QUqhdW1na5Hino\r\nYMFtkeLH4X9LEPgiHJZlMOE/9kXEQG6pZoQ7kCwhpmDoe4QyXkv8EH57LKX3\r\nMWeL8P3N0jqRGX6CrdGr9YdC7+vld3tOPnRMYH5vYpAbLJRkdvg4TL5S9ujj\r\nwG9k4bzRCe+VNpn0bnaMsZfzSl7JEszuTLgwKl/WmgoLflVxTAyc2xeQLVQU\r\nT0EQxCf679yUzD0W5tASBDSQIiOQsSffUo8SLRgUfWpkm5oraNFmLdGXm5ad\r\nYFP2jVJZOUGUIhyafxA0K60iIYr2fLF8zwW+7YhTaGtvj9serU2EO120jpap\r\nxed4A58/5/J8OqfHU2kFo2/ai18fORPAqe4=\r\n=omFL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.4.0_1656604029262_0.8587045777300428"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.4.0-4":{"name":"metahkg-server","version":"2.4.0-4","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"436e6849066b094a91f3cd2ee261805853e05928","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.4.0-4","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-W+rKhuhnJ44LHSnzKDL/+Zo+AaQ3kZc4ESMfZmmh6yOUiMs9BhsJTW8fMr4M2ukeYlo2oOGzrn+28FaubDu0Xg==","shasum":"8b0fc305e4d320d5560f2f440c500571147d7bf2","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.4.0-4.tgz","fileCount":358,"unpackedSize":689069,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8eu0o/PalcT+1W62ZPKt88aW7173tZlk/ZU0LzJ+5EgIgQdbMUKHv//+X5+pQU6UZcmD5KagWCkoH/rna03CGlFQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivcdwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpXww//QyJMNjqLSwsPvLEOeAs2mDKHTvkP6r1UiVV5sOTaQ/jHqIGd\r\ngBH7mmxkl/uDkEqtguf83wOu6lv8GJtODyfYvJd4G7j4JMhEXQKmlBMX1EaW\r\nvhfNmN9MxNhZqt/8JpPwqBhn2eCB40V9ce52nJ+UP3s3ZOqJxSXjooMKkX1O\r\nA9Uk8/AGWLTcgbGjoeYs80CyeX0cf8m517UMh8S0VnUHUlQmXaLadR42wpOt\r\npquN4KUOtJNknAmUqec3x3/oJfWn34mhFjIAnc8RD0S4QDdygJmsOrE/pa5k\r\n69aUgmHl/LZTR21grDiBQ3NsXhVSmjz+7ClBAa0UX9Vuf/4Ct5zbEUz9NLbC\r\nreijSwQ8hLLjxZEVc9qMOShw+i7NyWHIQrIUmOuz7RX1bXOd8hfDZLHs/+gv\r\n6rKi371mk4PjdHXd3WmXI8huPjOPLS/03IbijGdqUs6THLBD2S8aM9rN6BE6\r\nGI7bJav2AkHwcLs8iEuTJJAJT0XRykxeeAgLJMARTsQXTvqBmMmV3y3H7Z5+\r\nprCr2f8sKNBcG7yUTFy7l8E6ZkRKXw3SMGcbrXePmyimxtwLuQGR863ULnEL\r\nj7KE0Lf+Uk80lsLsB9hMdVitlC4IgmuwW0TotjCfxcTlZzwu4WARCepWoLUj\r\nNr4C08tyJ8oLQ0EfZo6mPeDeLNb5W4JRw8w=\r\n=fKyp\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.4.0-4_1656604528267_0.9634771742778585"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.0-dev":{"name":"metahkg-server","version":"2.5.0-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"efd6fb74b1990bad182369e37bc39c94cbf69eef","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.0-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-Zz7XRHGJv+ZdkrK7FcuA+caJLiFuDcuYzwE4Hlp7WUe13F/YB4/3GQ59/W1l6Wu5+Gxm8LGdhBPcZ55iIFZ/Gw==","shasum":"0bfddc3f8b8fe98cb03c8cc0b34f5fa1084aacfa","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.0-dev.tgz","fileCount":358,"unpackedSize":688992,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYK8nmuGqRE3K40GJ0+Rzcuxskfv6+ZTzxVp29/iT+pgIgM94BgXd8hemUPaYD0dwU8MRDv/OLiCkYzjXS+L4X2Tw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivsAdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqRcA/9H98h9zx0NuoQnS6Jx2Cx5HL5PBDQemB9RFvQjH8X31UTQ/qV\r\npVaiu926nlL3xAzkcS6p7BXN6ZeVIyOhYKP5jsawBag1hHn8Wcp3Sroa1btC\r\nUWPK9+7qPxclBjh6WsthOoJFdXOYGl70hq9kwO3hjpxhxj0RVxzuOPfdqjHV\r\nYAP/3XngBWRl39RHTgok16WZUrxuwxJL5/FedABRnGrRSMXzwGOsZvIoycro\r\ngO9UejBYpYZWzvgIg+VTeQ4JHU0WAgwMrUpORuHSJfRbpEBACaT756VdtHTr\r\nN/OjfWDnlYO+wV6oNrY9t5rNY2Tr2JBN1w+23eT5UANeruXn3yrvJBLmkRi8\r\n6kLlVdo+hMafkbLVPosfaFnAKC0FBvXvN+tg+Azf6KG+VBHysXjhp9jmoex4\r\nUsCIRCXnBP++HfI3+yCo0+WBqH4taeAqziXNUutjCBBd1xDY9mHdSN88ah7Y\r\npqUZvllXcpV79fvTXJgIhgepZHxr+ZqBFtbVuDiy/vRvSYXbg2lOQuwFJjXl\r\nJ5edzzEoftzG1NymG8UJQk85b1QptQ6l3k79p7NmYc8zdgzVrvTUItH93QbH\r\n4X6eVLBL5vzusoK7Yjo/6Q3gNUgNmO/KR0XSwyohY5edzmq1xKmN4szu9PfS\r\nc1Q16qmxhhVy1+Hn4VfY6Krx2Xf+dqLIL+Y=\r\n=z8jO\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.0-dev_1656668189051_0.8100856231808606"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.0-1-dev":{"name":"metahkg-server","version":"2.5.0-1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"46761f0845f5ac7cfc72bc8d8fd2c4d8b9140a80","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.0-1-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-ra4RPqHhwmNt2EYnEBLkR566D2KB7cUkpRrKZ+nTdTh+foPUUNVZf1U4v+AGlk+KIp+99gMWhd0JtyQhHmRnFA==","shasum":"5b604c3b6d459c4ce54fb6872c281527d843c864","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.0-1-dev.tgz","fileCount":358,"unpackedSize":690518,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA5rMjO4uNA/VTo43TKQBlUfCDsAZL0XMzUcBB9uIkcmAiEAm3N07hCDFFSwdCsE1VObECuCQnyKGwoKFfAdzc2/VBk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiv8T1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrH8Q//eno46D0sr9BUmTire0BHNvAhZ4CF2q5rse3QM/42VnYYv1hv\r\nlFupPhJh92mKcf81zgLYkbIc6DbagWMpXlHPtD0JmQ7hdaJAHZGcLlvBXuIH\r\nuZHpx4lR5GScLpshDr8O7pw2fceuaO8nIswvRh4n0weVmKNT5UO0GldrJuBW\r\n00wCLGbV5mXfxArWCglhYVRukCDJ4l+Hx0o2Eyp4daNuutOjHWwUsomtIDLo\r\n88ibduGN6DMJceG/lvJ4+Ixpt3/8iQoCp2CimL99UriLwNWKPfOhKVhfzJ7x\r\nQzD8cgID6sdBxyyU5PXpN4/m/NU0qs1025KQlElgSdSqdawwCWYL8xrVrC1L\r\nUTmPFmAQJgGgqz9QAXvxoYvAs096LpFWxUxOEMftNxV2qNDJfut94S8YKVE5\r\nUS1QSs5fMhfa6jNo3S/sIH3qYFlKCUjKhQzvlHCKWVa8x70itw1h2eqXZlek\r\noO5XmICxkuaMsGRaUyBxId8kSK2T1A0nehwg9uSE/jL8AA9tw3Y9dUnn4YXH\r\nz6wIn39fp8gc66GJ6RlXsP3TNjpkniBUZ+Mj3umgdBydVCHa/UEXAr7R0KwO\r\nRTapzAA20MQgSRfgYhO/EjOPeSYizHMYddmycDdpsh16wD0GvXkREoYh2krP\r\nF6c4Mc5qlD8Cb1S7QeqhpmtoN/BoqY+pZrY=\r\n=Bl1f\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.0-1-dev_1656734964840_0.07677288905119517"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.0-2-dev":{"name":"metahkg-server","version":"2.5.0-2-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"d64e358877a40b8da65d7b184d0da218c627e305","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.0-2-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-SnUNBT57aFSKfqW06Q0PRPWHxcavQA1r4o+5ZyPnxCEXq4Gty+rT0JaSsKmvl2Vpff7SW6UefoDC2eN8Cnamlw==","shasum":"cceba1acbbe508eacae4c662d437b69f864b3e6b","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.0-2-dev.tgz","fileCount":358,"unpackedSize":690712,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG+jbXye0BfZvgwVzAp66sP1z8L728YSokRwFR82mx+gAiACH0aq7VnID6JuMcD5bv1/i6CvP98zG8KjyQSfWI1kWg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiv/3/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpHfQ//dGWhkPgKHUXRfidJwFmXA05ZyLqTcMLOZZqZcGr5Gfa4rIem\r\nfBMCGjEpLoncqzHqX1qs/CO9ze7Y8wvke+tFZwaKQQdZR8EVN7YnZyKqGl5G\r\nXfm4CdcQKf6w+9M1PU1423LqFCkBSl0g66gufS5yh4hg80VG4zCwL8xxqTDy\r\nsWLKBTZ9j+O7Xp9DMaRdD1K/oJ3BfXNwY2QbUzhqM/LO6jK8hr+wWEj6yFER\r\nEuxHhFn6BuovFRdwieg5NNezQztEN19LCxhUBQ6l//30PTud/bpoQ5/nWvlK\r\nVh1sj78LpGNOy6UwwjDfhWRoLw+m+rDAODFsIfmyuldWMWsTzpumcYIe0uQO\r\nwyaGTiCiWVvLhJo6EqIqBw+Jb13y2cwGucXoO0apUdxK7UKhxgtdNif0bTJR\r\nWQTTwfsTBnaxvOsp33hTzpbzI53/gYXC7ceG5IycGHk6vRwjQug24bdhaK2C\r\nUnS6bWyTL5zo4N7JbLZ+cxqAYPlJcCZUJbja6/GZYzKDBCdPR8kkAYM2g/TB\r\nlmRIRdPGpY1iWjgZpRyXxrwnD58KVX+lmtr6VplRzkPlnCazS7lDH2znKWeV\r\nfAm5l0LF+XLyc9GvDSTKwz5MNk7xIMifd4j0zgDbRWq66GoJf0MO2u5D/Twb\r\n6xowy/Ouq1dVqczpDBcQiM9abUTvUGXE6DQ=\r\n=sKVb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.0-2-dev_1656749567537_0.18307000938545293"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.0-1":{"name":"metahkg-server","version":"2.5.0-1","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@nestjs/cli":"^8.2.8","@nestjs/common":"^8.4.7","@nestjs/core":"^8.4.7","@nestjs/platform-fastify":"^9.0.0-next.2","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","reflect-metadata":"^0.1.13","rimraf":"^3.0.2","rxjs":"^7.5.5","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@nestjs/schematics":"^8.0.11","@nestjs/testing":"^8.4.7","@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","supertest":"^6.2.3","ts-jest":"^28.0.5","ts-loader":"^9.3.1","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"nest build","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:debug":"nest start --debug --watch","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"7dff2fb8d9d4419cd095ac02e81443fe68970330","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.0-1","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-jKjEo5O95YW/iqADAGxZgwAfQzGMzMfXUiSzBYVP+wYxXMQairrdXbjisfsQu+5Sxy/KDWp4XwZEtpMxuOutLw==","shasum":"1e1dfa0c49540ff05e71ac87b4f6f540dc1c5cef","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.0-1.tgz","fileCount":357,"unpackedSize":520837,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHYnfZHnd+54XoXrHRktcbSfzdc14AWj5TbQUvww/XcLAiAoO7fGJ64wlO903f0GfeYT2+LTKfZnjc4zNIvf4BfgpA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiv/7dACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoqsw//XbmWrDCo7sxH48SlTq5+4so03nqSHKAFGBoWiDioBpULQL9Z\r\nxdJB67ByoVrc6f01t/5vjh5ZdmZyG1RZaWdQwjK82U6ZyFHFkhu4BhTcCirD\r\nR0NtQvWIGLu8mddawFmS4Vx9paKHAqXU8ghAhnvpE/reYEEugLRdMER3S3mb\r\nj4TawAzxvHN8BINujsuhq3TuKB1P6jMXPt5F3uzTtJPM2NT2Bu6Du21Hdcfq\r\nL1X9jucGy1g78sI3oZRcweq3rqYIKKSM8htINHtrkd3KDMTzVsANu+gxnTuQ\r\nANNptguVovnqgeasJ9+tOGeab6Qq3GzjKdjcx/5bjcEBDhQyqu67V7sChBvN\r\ns+wO8uVfCXSbP3U/JYg5hQE8jZDcbNAKFDqxOoWNSEzJonniPZH6CM3Zc7M/\r\nfvqN7ipueYdYR2clFp+FGEegJNopI/d19IPoKif6+Wj3uy9PSn6qCMp4QBiJ\r\nilKA+ZuHOdDdUmmV87PYK1ap3gsuhGYrnHM4h5lFJFCQQZd7AKWhM4DBdHu+\r\nPdOooxyumiWyUg0DWwNUZ2znbHq4a6MkxJ2O/Y6GOqiyVmMuvPE4K5Nv7ywR\r\nCOmanGbR3aszAEWF9Oxy9K1lHZZ6ZnnPqo+ZQnx7cXkmq+Qy5HlpC3ZcSn/x\r\noCTZJHNwZpmo1586c1ABT4iotCaeddJ5UxY=\r\n=JXyT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.0-1_1656749789529_0.8190849643250027"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.1-dev":{"name":"metahkg-server","version":"2.5.1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"607d7d3aa62c63cfaf01975614c9fc970dc2977a","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.1-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-oXND5Z8yZ6atlEdNWzX1Lblycjcl+HQy0RmUfiuQf3gWsJDxWazWypl7k7+xZqYzji4ng6Yp+2JtAtAbd79xLA==","shasum":"82765d5c1144d1f6b5c7ba9d9a4670bbbced1f6c","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.1-dev.tgz","fileCount":347,"unpackedSize":657910,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC3UIcG3ZD/xC7U6Z/hXioBYC6rPUNNHU8XGlWmItU1qAiEAoptNv+s0p7KOsnewzC2M1BQjH5hIT/f7DAobX9DoAGo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiwBupACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoZBQ/+JGnKvNOigJY9OmFzeQJWh18HMRT//s2+n4F0EuS1D/b6224i\r\nEdEWBhrvSAvHOyO/moXAxKNLDqSzadW/j/vRHHsgoy5RA4+dEiA6CFsna4XO\r\nar5CndsNEn69aImAOY0UWXf9ALJQ7dSETUgIvDOwREGXqGwvdj3v+9vaBQsb\r\n0NiqbjHpxt3zW8ruDztMts9IuSMUalLVLwrQgp/FFCYaaovPjmgt7fpUPH7N\r\n8GuAEsVfXR5BMQSk659DvBmT8mqURrv8lFWWW4ppejF1RRfkXDGYQkza9i2d\r\nVphtsWdRkuH/gQ5m2Y3z7S8LpEIHoMMkJMyv4GdBs4wJX2621q8yHWVJP8n4\r\npQGatjc7LgQ5KC8TK6ePiYAeW48qrCyBO8/u0D1j04Sa9X6HCd7jNzuB+2s/\r\nF6GrWHWa2X1OLLIisDrF5tByI3oQRDFhnehY2RPBOES+2OfpY3dEb/tsWQiK\r\n5TlVQns5M7J8wMCABPun0yDm1GmBzH02rb0tQqonxNNjvdfooCizxRa+381F\r\nCDTuUgd/OiYg6/BE4Jy4D2kSPhq4PXsn79TL/QKqMq+ANxBXoZPHHJb2ShAJ\r\nSyVIZWNs4ugNHElvp65lBM57T7nkS7CPExhwhZQtftG0lav+zmBOWUAxNAIf\r\n3ycGEvzf2VvC2snqBxVj78hzYz4/VrBzeYI=\r\n=7Opb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.1-dev_1656757161303_0.12576169107540736"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.1":{"name":"metahkg-server","version":"2.5.1","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"607d7d3aa62c63cfaf01975614c9fc970dc2977a","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.1","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-mUTyWtO4REKqNshxOf/xI6Rb/dsHKyxLHxzFmo/pcpqnseQOxsovdufDZ2CPqG9PYtKjDjmcGYL4ytfhMqwoYg==","shasum":"d5913342ae469007cbf2127db1aca3721dd1c2ff","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.1.tgz","fileCount":346,"unpackedSize":514083,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFLkWnji4+VI42PseACUtfOstg2qKMhPj6yOYKNzmnQnAiEA1WZQqMulhElzW2ZB6IbGV09AfJrJsb5Fhuz0KdeQMws="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiwB1dACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqkQRAAk7e26vNwomMri6UxMeZp+DT4OlPIFEqmxCb0A27yQDN/J1CZ\r\nLfvlNo72WLDU1spZEmnLcismbfMjWbjVHqE26nsW6VAhcNFZu3a8bPbF0HNj\r\ng0rKA9ujiz97b3OYxfHhp8UK+qIm5k/vODn+LjM4VH9lQiPtDc1redABXxyh\r\ngV2eZJHAQOnmKhXAIc/lqGocKbIJWE5MCDH+Qo7mHwimcTJGsv4imSJDJEb1\r\nyIMUXiZoD+16WYM8alabLAAH8WD4tQmu+7AsZGEINpc8qClOQmNBFvM6Mjjg\r\nFXBCO275b4CpbL4eedmKNveJ2Zp92Yy7LAO/JDHuir1JcRRHIzyCT6HVZ04k\r\nZimmjTt3AU/0zQfp12BdHbSm2Xs1KorGMnetiMrB2kFzBygZ4eu+/w3GHppX\r\nIyp1R9vbgsV7sH0d0Xj+EC+rtApuAkK0VkXAI6lnWaYmPC8yyNmjMXoJfYjo\r\nD5hOWYoruTyBxfXM7nCDw8a4/w4fUfW1VkdA430ZbG319n2jj8xlQ87A5bOW\r\nmfy6MpkN/gZuPPeu5JdBBSCYfQWIZ2XmBWtJEpHS6axntOGeZEr25betlt8v\r\nFl9RgaGgO06YKIM36w7gVDLCYeKXdSG9JCuDZEEIoaCSJyGwEkLdQ7rQoFBU\r\nOEiaUduXv1mxqWpfHlECC9N7a0wEwsK6hEg=\r\n=huFz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.1_1656757596972_0.1826133579727558"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.1-1-dev":{"name":"metahkg-server","version":"2.5.1-1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"faf70a2423af1bc2bdea004072e24b0391ba3320","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.1-1-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-nMgB+sllTLSjc2g6KaWFFXznrLRjDpg4UI7frEJYci+fuRLxSP3+dQlCjDtZVPUKGh9gT1WIP+tM1J0Y/JhmCQ==","shasum":"0b42508d89ae396ffe69377fe7ca846fcfe39ad8","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.1-1-dev.tgz","fileCount":347,"unpackedSize":660546,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDMoRTNAfH9U+jlyuhYfhRXne+dqDubfH8YStt0dLA7PAiBHUQCXhpgiQAw7l/bBYdKHBvqWgTd2Bw+83ojXqBo67A=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiwTxYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpEEg//VsFfPhtZhn4jmmu1J5eJtP/KuzmsgkpQ9U2R7lqKzufJoGco\r\nHrcrZCv8CmhFz7Q0P+b/MxHXxi3VnWn5KSMDE5f6h1CcGV7Fbx4W3tmMWzVL\r\nxvvDamQ7RvulaH53DZzcoYrqyNHh2RgS5WrFNA9fRX+RCgRdQ4uFFMlxiDBj\r\noi4Cy6nSihc+GIP/hndqs+yze0HFTUMrFIMXX3J/rIrsAjNx15YVgYKJzES7\r\nkJwd3sqTObls4SOM0Q6/6hzvRiG2urVvk5GQ/ATd2rp6HozkpVC1uIcaNSbO\r\nZF1bZhIwuuDJU9X/0CtsKdYZDRRjJuRMPIjAGzfi/69xyNd3gWapMiTNlEk0\r\njtNpnqomEvygOVIup3fxOhc8mdz5EM1WC3euLSSyAuwUs2tL1MhjIbP1rbOO\r\nWBzgU7sWJC24OCiaLHvSH0gx+EJumKDOMno/ITMICPeP+RDcDjNraAu8wGSK\r\nHLeBPv75ErTINU8Pv5S/O5DAFXnaunIMm/Os/uz6/W50/0N8rcSZjvyiwvGC\r\nLHBCSg7iCuRoc+aX5yuVc5tBCGZmyYFYXbm6Xh5wgJdZbJS2lMvr2C+6UIPD\r\nN8DjvzrlRe5nq7G5F+JuWe0Wffqg4EuA967bSL/6d+OoYZmBEXyoLtXnUHx0\r\nKOom43DRUse8VI3ZVqN1Iikp4PAH/jEzVfU=\r\n=KUF+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.1-1-dev_1656831064430_0.6596871176735437"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.2-dev":{"name":"metahkg-server","version":"2.5.2-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"4d3c04ef9562fbcd422a79a985595e745a0b211b","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.2-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-wu97L2J5RYMjQIhju/kvoEKncyOVyET2sPEjGrhZFcOf3AlBMJMrK81HHioJRrxEqxxTWKTHIdTcehT44xGr5g==","shasum":"cb8db529c5028e65932a62966e4e8c88ccf9bbaa","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.2-dev.tgz","fileCount":347,"unpackedSize":659896,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFPOZqVq+IBMLgYGJiSc+1EU6WK5S46XkWWAjSshk07JAiB+UFcBTTGa7fi4RglFTjJOhcIFr+6NNNexIGZTUaNHRg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixDpWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmocmg/+IWVM3RxiJvyzEOc1j6AcP0z0++6q3O9itc7p9K8PbQbFAb34\r\neMupmkzjatA6cj51cF4C882RgFYeEwvH2VYFl+iVq1UUcEi85ruRSpmqhJGr\r\nd9AFPq2XPnR1x8YFfGV0Mv8dZt+1hPWv+zeLBkPZ4JlNCvAJ2IO2MFV3RJ2c\r\n9JYVuNSJJNlORLAVwFeJLiXI1FDfsS/RCMFQimLTui3fHnyjQFcyPIOsIgBS\r\n7p+DQTt29BYfHIeavXpzDMM09/03EpKLS6Ez/duCs4zk50w+cEKyvlDvTiwV\r\nhrPUjZNewdnF9c8lC7zAJHPHumznanBf4d0+PmRwRdptAZDRgkvwGlblFlX8\r\nu/vj3c1o3eWfAhCmDDvKvFTDxTUnGTk0IWzMFcN0XJzLyrsNZnakPgpwZI2d\r\ndxcaClvNmGDeCifXU6G0Qaalh5FFFVzn1r1s0BGDtuzYJ6peeUC0arEHIa3H\r\nWCSlG/M4lmFqCKe1+GJZKkDNBRUy3dv25BnQNTThVV+wSc9B7kJnUvVX/RPa\r\nUvAimh//xuTfwt+epaMDjFL1k948QIG7+FivpJvRmYO82j6K+1ONTRU5NXiV\r\n3yBawGi8YKceSxtqEIKAzyJvpxYBgZtlsWUj99fkz/vfpBR40BPdZqhffTHh\r\nEVs7gVE3gxQt9stfLnJB8mGe6K3jxLiLe3A=\r\n=TmnV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.2-dev_1657027157784_0.08222896527557455"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.2":{"name":"metahkg-server","version":"2.5.2","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"4d3c04ef9562fbcd422a79a985595e745a0b211b","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.2","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-jj56RCBoVa5YHzz8akMsH9q1Iq/KXXUfbQ9jrkhNJhEme7gVLR7XQlEpsDxQidTELqUHWPJ7wX8TAE7Km4stiQ==","shasum":"80f1e14921eb2660a1da399d84de17d39581f06d","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.2.tgz","fileCount":346,"unpackedSize":516069,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFhMkJn5P/pxDQW20qibVFkp/tl/ELofN/Z2/j++6gnnAiB3Gwm+Ou0+EDkaIBQ9tln9OFIUgNzbTaOct/CUslQG4w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixDvnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqpXQ/8Dg5WNtwqmLrv4GOrZt070EiGMtWYvroz0srFG/s4zbwPKW8p\r\nJrSG7sH6bfwwXirti6QPFmVQHIOFP7qhiiKoWA1aaXF2aKSUBF/gn7VjUQYg\r\nVBplV2YrhNEE8Kh3b52SmXr+HaAMFtkrWzcVyws4hOp7BvtuWTK68YE5F3JC\r\n9yckY+BozUghZgPyCDlr44V3Sa/YHCow9XU5FAL3ZYA64XYuVX0N7oSLRBEU\r\n70iC9pPnOTJl5EdW5Hf5qWo+wT2p06WJ/qyYpPIUmGkZcme79P6HstNOoJQL\r\nLirShnpD14hQMELk/vImeNgBl0ekav5Sgnl9K8DEyG06YTk0Ac1yNcxJo5VJ\r\nRqxYUVfeLXNM3Hlm+dMVuAsvmzVQUldLyd3avi5VOwnKuypKP/Fx2zwEphl3\r\n1iOEeZj61mkz7aNwxPzZJbQ1G2F2FKVhdSGPBWFRb3xlyTOP7tloqvvTGCJy\r\n01rCHKIaDZp0zAj7xIsJP5jaNKHkSV1gcPjzuibzjD0wXwlTo2DIra63pu7j\r\nLdYQSiLYyhUsYPvRbF2vZ+X5fACXfVSsXdJcFSJzKxi4WwZdbRlPMTu75W8l\r\nRwB9ann4egNodlCqF9+ELWVwQZG989ZIvW9cV8vFRzQ630Yo8lFJhwF8fmte\r\n9iUoyoyfxLvSno8WHvzl2G3FnHFbJ8389Ro=\r\n=JImA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.2_1657027559224_0.9475605897433679"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.3-dev":{"name":"metahkg-server","version":"2.5.3-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"095427f9b48226bc1b16e3ca8e4fe26b38b80a79","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.3-dev","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-GDGPXKyngnHCreflvqRz+ioM0F0ox5/bb7WuLiyxfR7gqP6pbaNQol4fRgcEqbW886Krz8sYTxwvqK6UgakniA==","shasum":"07747adaab36d63a55928f9d123a3baffc418cf7","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.3-dev.tgz","fileCount":347,"unpackedSize":660541,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPuU3jH9dOc6KNtrMwK1Ei7cmJqqMAz2YW/B1gE/hljgIgZGZ6YVWYopfxKIFS3Nc15x73jPp94EZnxOHMFnYrq9c="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixEfgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqpAA//fW4FLx8uZNvq/G3njj7AA+7JqvY/RnJ1zSuW7lBv26U69Elv\r\nQsM0DCRw0Tr91Hys8g07TlLzKYh7VFJ22oj68yEUB9whtYejvjzHFzpHePXA\r\n4IIzVrSofXSJ9bM6CkATIZluyeFGhIs898zx+5cNX9U5LTGS0RgX88uM0Qdf\r\nvPZN1l7oRpOX8Fl+rzRRvQfp2b23KGvgLoGcOu3jvx/X2+gXfpUvrVuLmsqq\r\nCIxoj/IqS2ZkEKBYlQto2612L4w53vVPfUSB5BL4coNO8F15eBk3btsDwFbR\r\n3EZo/Mu+xJXEeEHCQifcKpNonEQlocC1HBSdCwTq9sVUD3oqygWMcxoW1P3r\r\nd4j/ahKW6cioP/D7opJG6eHOr5o26o6q9kscT2Jq6SgAjS99IODKPZ0TDjf6\r\nm0KvEWJc+AY/OEWgO4vvFWySagh6fw8MKxL4QwK2v/wC8oc518jFctjZEJNa\r\nRlMf4SPTOF9uyK2MPRwRlqknioX6f+V9rVHG3FzAEbS5MaMEHIVw8te+4H4T\r\nHt2km9ykNYzw8IQD8La5WnBCbkutpl7f/N9GnWAJ6Hp8hp+nFoLwotsPm7Vo\r\n6n8UtXNx83e2TDeOMhlHGEoFUtVmcHmK3I5QsgafFHYyqePtlbFZyGH/lxFa\r\natj5lwXmE/G5Ia+0LpygSHtwNOWsodtMd/o=\r\n=6SLV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.3-dev_1657030624722_0.2557763490341656"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.5.3":{"name":"metahkg-server","version":"2.5.3","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"095427f9b48226bc1b16e3ca8e4fe26b38b80a79","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.5.3","_nodeVersion":"18.4.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-Wir9IIbaGhYRbu63iLUvz41sUYTBlOa/kxvL5CCeh+eL8XqvdDNXNloHIFBSRh1o7TUQY9BSIt+8Rica++/d9w==","shasum":"b300ea0c2fc29938725a082a0294174c52d6a6bb","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.5.3.tgz","fileCount":346,"unpackedSize":516714,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFZ1p9rjVoZgZeb1FFe3+k5D4QJOvboNzMmD/8hVD57FAiBDc4MW6g5KRjlE7qucckPus+Z8fLx8N0sEZZLNuTgxoQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixEmCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrdjBAAn/Zoij9p1iWhhKRSrmV0ZItXYkfpJEVuz+hCGW3E4ZkBk0lG\r\n52bbPXx7hr06zXws3hlrMU/wKFqiM2v8oW+1N18+4zi5YKMtUAhml4J2zYRP\r\nex+FCAsRkVgz2M2WVurnmIZDHiCtuMblo5bw4AAiPmGoEPN8smPRCzrO5Zyv\r\nPzCelfBek5GFehMrdizA9LWn5mmxsF9xqzKBN7oQdLCkc6S57S46Y+7QaAop\r\ntAvQP5qd+6nhzBSBcZwCIQ2mAcOuEDOOimmyHPF1hylEZIdowv5Z7L1dLfes\r\n4d0aWuSkbViFWG/PciMqjhj6euxU0Xn7yCgBZHFL8UTjUpAFCXotYigZcNhx\r\nlzr8ZehNYAwSyQ7VO+cZ3yIafr3+VhjuqK97AgKP/V+hNe78ph8tOUwDUGJm\r\nsJqI5yTlCeZ8b+sPT8NkpW4SvOZZ/bjusX+VgnfXrGMBCesQpGhl/OoFF90L\r\n5RLvARb8Lo278L/o5fMvkOxJOR/h34Gj+4YvMrTVHa77zG5k4lXXQ6exY3rG\r\nrFChhSKXiMX3WJbiXYfkUSgx7n3DiDVG+GoJBYdK7aMco4Pz6YxYEKno4DPc\r\n8QM1CAZovepKMWd8cJjpE6YWHJIyKkMGbQlYosQcLHjVVDgEekkAMI0PCyyD\r\nbQOfXu+1xyc77uTdYQ9xGVxds/4cXEQi3s0=\r\n=25so\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.5.3_1657031042041_0.036785822092445075"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.6.0":{"name":"metahkg-server","version":"2.6.0","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"eeb89a5834db55ab89311539a7469cacb61d5488","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.6.0","_nodeVersion":"18.5.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-Jbp6KsqrcWMbF0s15Q+SzF9IbRiHOtNrqOI8eZ10qdUSo1m9eZcZ1nfC5uNZLtn9BoITo/PExkWVlMiPkwVrHA==","shasum":"f70f186a24fc5a4b95bd3c66135ab7141beb2200","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.6.0.tgz","fileCount":349,"unpackedSize":520309,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqfX3jPyCsrWDMQqExLsJphnQ8if9D+oP3iEogsAsE1AIhAMHlq60Xl1EAH0b26SHKzZgPzda6IpEQDC3b7+XOgIs5"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJizAOsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrVCRAAhePPNDS5j035C3TVSPPBlpXgq5HGMheWPIyaEl5e1Pkadvcw\r\nYyV0z5i25RiPhuI0YhxqjbM7TzmxsF5TLFl1AjMbSlp7J5fIeVb9ohMASyAl\r\nt5X3QDh1at+Qxonsfq8MUpqG9SHg3GCEHXX4A+hW81K4pZG0KHIk3OAP/pk/\r\nM6D9kUJRbwNBPTWGCmPdz0siOraFZVtmUpKtdgM6lqqaqelZac9j1JZ3CzQd\r\ny6fPYgFlsVJz+rIp7VMhHQ1dpZknTaLEbY/Ntq/vfk/DmJ+K1dnm1vJ9KBMi\r\nLZpp5acaI7MStHWIvWTEbqe32g1SEJboZJZ7UPBlO+DB3YyNGPtRlo2DVy/x\r\nk7d9x+SSIr7Ut7TvyZdnk80AuqCP44mABCkOe34JKmL/sdWlwZrFS8Z/1sa9\r\nvcpRQKzSMy829Cw4i0QW2Dy94vl4/bHCUag7lpnrIJkwYZmRCtovA0v8SEaK\r\nccMxp+FuZVd/xjgOJaOSR73f98Lc2DHaQZTNDkimcB6CvRZVGeXPeRVKCosU\r\n4bDpUgnpRlCTPe4hPLHzKJZ+5aCPsaDe0omDWA6jnzupLH5QFh0jivAGVk0+\r\nIo8Dsxy9dHKeU5dHzdEuOXWDneP48t03dVwSNaPwNpiM+ekTHzW49yngP60h\r\nNTH71yyByyaph6F82TCCXYrQt+NrdrW+i+Y=\r\n=VxwV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.6.0_1657537452689_0.6825259685946898"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.7.0-dev":{"name":"metahkg-server","version":"2.7.0-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0-dev","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"b41d28bcac64fd053ff099823a7a4edbb726bff6","readme":"# Metahkg server\n\nThis is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).\n\nstable: [metahkg.org](https://metahkg.org)\n\ndev build (probably daily): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![GitHub license](https://img.shields.io/github/license/metahkg/metahkg-server)](https://github.com/metahkg/metahkg-server/blob/master/LICENSE)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## About\n\nThis open-source project was created primarily because of me being unable to register a lihkg account as a high school student.\n\nCurrently, it aims to be a fully featured alternative to lihkg. However, I might also add other useful features.\n\nAs contrasted with lihkg, metahkg is open to everyone and anyone can create an account with a email address, no matter issued by a university or not.\n\n## Deploying\n\n### Docker\n\nIt is recommended to use docker for deployment (also supports hot reload).\n\nDocs:\n\n- master branch [master.docs.metahkg.org/docker](https://master.docs.metahkg.org/docker)\n- dev branch [dev.docs.metahkg.org/docker](https://dev.docs.metahkg.org/docker)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. For frontend, please refer to [metahkg/metahkg-web](https://gitlab.com/metahkg/metahkg-web).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.7.0-dev","_nodeVersion":"18.5.0","_npmVersion":"8.12.1","dist":{"integrity":"sha512-VEZN4S1zqHmUi1yHyfbUaNdqtmiszNzllKDf/kVujAKTyZ1d8I3SeWu4CEgfqP2Y6k0nJ87uWjXI6A/uXfaZbQ==","shasum":"5c5aa7587e5e4d6ea5bd4d1570e9b0633b926509","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.7.0-dev.tgz","fileCount":349,"unpackedSize":522204,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1hjBfdEIFt2Y5hcrIy7OfQfEXqXAyhtCyTWyYVmmTJQIgZwfP4ogGjWQYSXpxafAiqx9UUzhQ4RUNND6bgG+mKRw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJizo4jACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpT2BAAkqy6dUMJe2sh0MyF2Y0JcRgvhtSCC6zI0BhuBqtnI9Ksxidv\r\nCEZCieE3CDQ2jhrRKkDto3tZ+j9RbqUUrAkCjXmS8Zj0qUIaPTZz/XhgtYfk\r\n5N/xgZzEFO+ItUQZxNvcPXUG616DfoDkqLFSIkNWdkJZIt2kdL1sQ7LxoUxD\r\nk3sJVjO+0RsYB783C3aq+/FQTn2N4Bm8ea++4qP3cPKeJ8ffmkL3ZXE639Yb\r\nLsz5EF7/csisSBDzlolleuPVS9TcR2+rkWCCh2T0YDYTt24twAWJJPdI9HLy\r\nKxnJmsFmxVGLdhQPWXmgS6aXAJz7apQCFMCmVjsDYD8ufeOf3DMz2idkhzkz\r\ntjWUAiMCME5zhicbqS6DRTveEc/0trTjzs/t4ni8TcpiYlNB37bpgTTKdH37\r\nF1GuYm1bWO+28JGPYWhDvWQtozlz4sz+n9zxfvbyHMIX18bf7HLdnVljVux4\r\ne31r8BPey3XCG7GAVYWqHK8v8mz5ok/PL5zEaZn944elfilevT54V6BPy9Y9\r\nKxR6G7vZ9Hy9+94UxQxxxQr4PGMwtEBH0Tw7/LseUOlgkfrH4ybXHvmJfneR\r\nP6gyF3Us4zGuhua1+wtSzEHOIzWsbjazpLkFS770C8j6LoeACwdtquKLjI32\r\nqQJ3hFblQkCIB8+5JEmvVtUdJoSMmBBtDyM=\r\n=yTnK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.7.0-dev_1657703970467_0.6726721223985188"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.7.1-dev":{"name":"metahkg-server","version":"2.7.1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1-dev","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"6d5ddce3ab5773ce0694e7f5851580f98709d701","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.7.1-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-ZKK5Qivc10LEhxHhIVgm9WK/9hJUhfN3mxd0Rj/GcMBTWjzWNtQkqjHNk633QJNpZKe60m7oX3p6m17sdA8ivA==","shasum":"a38ee868f71429fa8d07223862ecd710c7a9993f","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.7.1-dev.tgz","fileCount":349,"unpackedSize":521994,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDt8HDmgxNLi2LjXdE7Mz/pYd/BpqCHkBxma+nxYMOaYQIgGhJfGguaAC9OB2EU5xcsdq4E9Rg0L7ydHT1sI38A9+w="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0sGjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmru9g//UNJ2jf6ttgiqkIGtNGxtXpKpoFzxJn3UwPiSKJXB2MrVUSEd\r\n5LbUkaOE9LghQflolfTzmGaZMUtw2WQeb0pA2tSlvKAsO5tWYfuntHzNiz9N\r\n8bhBoPvtABUZLCoVl6Cf30SK1kvpzmeJh6WcMfXOJjkAKr3UYhRac9UMliTQ\r\nMss6qymLPdticrOyVWXWbFfcJJbDm6pHOn+Q8Isdps18txZdmMOY6DFLnCUD\r\n4MTTgW4xLXahe2FxtnlOFlc1jiucM4X+uDdQApqb8jXxU09by7kYJuyU5EoL\r\n0oygLiHVucCyrKk9XjoyKTztnVPNzIfEB0AfouQfcoYcVkr3jZ4m8RXKD3bs\r\ntHxmQGndwyoNS6IBcmBPIin5IhjD4q3TP9N/vlz15SuG3FnPjpZ+rA3ksa3W\r\nXFrbKOQ9yjFmRcQKDUaTT7yqFkKYJtRkMRGH8nhsYuAscE3xFcaRfQIUe8Sr\r\ncw0wYPOA0dny1dAsvMT0IiqhaSB6Q94dxHJqriqKo12r/Brk23AIPpvZslLt\r\n8/a58IHmo3GuR6kAc27dWWlwM+biFoiOtydk7c7kX6kXX2C+3yj/ieiK1Q8L\r\neZMR0eyU62rg5FYTO/ziIX+46S1fNJxi8q8GzxW7i52ajG+iCr+vQjJyQb0N\r\nwSQWTVFB5ANA6yy8GA6hwz0NdNXsRrrGWYo=\r\n=3XSX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.7.1-dev_1657979299118_0.6557222485825989"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.7.2-dev":{"name":"metahkg-server","version":"2.7.2-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"9f307ca113309c6b38e86fd43d1e59a7c7c6d413","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.7.2-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-dBTasSCjFVzuG31pDgrIZspB0pZilb7k2WTs5bFiucMbKLGXxYAy3dfy3z1v7Uw5y46Eld0x8MbKoTlRbWv2zg==","shasum":"3955b285d160df55897f4b9e70f690a3d6a53502","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.7.2-dev.tgz","fileCount":349,"unpackedSize":522407,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGH5zx1im4q2/KsDZvrY8Bbxg9i/Dovh8TkBXu0E08mUAiAB9sA8bte7kMVbXtgHldRmYKlWPBIQt08ia5EsKrIvVA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0toKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCAw//T+zY+DzXdeuKpTFBTVzL+QqoR9g5pEobr29iUV/hCmj1+MJH\r\nsFkQjiGPVIN+30lR3tQCAUAJaEouOuhcggh9lDsBKWnB38ste5NtFxjFH1CB\r\nQiBQ+JJjveDoCN9df2Cz4uEMMGMn6FrBYZHFpYtuqLssCao5CWJLmBaZDwqr\r\nDcttrNEWxnlK2Lh84LrWs41kvIAdNNkcSKbnMwT23/svaAHkU6ohXAeRxYox\r\nz48wi/LmHVQ4R1BAj/Kq5wcjB3lwioycIkrHsxNZsUWTYeOqT4pwFd4r+xUq\r\n1WoRjZi9T4r0igvfGwHB/71Pkj1qFUScq6BYpwE1XbkP8WE/dl7rK3uYgI7I\r\nev6MaCxwBqSUTVCLvIsFNsvXv03guVMtnTOahzxe2lCzTTE88M9T6V0/GR/2\r\n5bt89DWL548s8Skgxxvkw+/D8o6wqa6bNPGpa2yTwCnVRJCbTe0vrWCQsSif\r\n6VQIn7eg/JsJXa4WQOyDMz50yOlecVjJ0zZKK328fBMU/FJ+Xzsn6XMcEG37\r\nt5nGgGXCZ5Ev+UQ19lPx5VdMiRZ+q+hPMkcxncVt0HiTb/hh54I/B3XwsqS9\r\n95YVMQ+381ibxd09PCAazL4t1V/f6oxnLYiJR+YdtZZZFIPFMxFFE9RfOWPT\r\nvoV/QOCs019HTINSAKJoDLrvdXZcbjYJ0FU=\r\n=FjsC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.7.2-dev_1657985545837_0.2956607560559894"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.8.0-dev":{"name":"metahkg-server","version":"2.8.0-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"8e9c5e2ea9501e3f4571432c0f2d598af39c28fb","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.8.0-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-9GhIuFfOM+LIOgjEMIF9bRqXER3whcvoXiBEPvzDcXfDAcq7/3lVW0bGjsHYRY+FyqVz5iHoJkBvmXmL/HcdWw==","shasum":"7e4dc309529b02e1f3f856420f886a60c31ee89c","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.8.0-dev.tgz","fileCount":349,"unpackedSize":522503,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICkWQSk2ZLykfgXr0tpZKqlp6ag1ivxhb0T/WAizxhEfAiEAjaXhy1ih3niwh5zvnkMX3KC83RKggP9MyWvuYuGgUbg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0tzUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoXYRAAhIztEoX3Diw0+mP8v7VnIAL+M5AHUIwY4bthV0ZVn1x5Jmjk\r\nhwM+ONX+7zsJIiYqtk8noix9WcRv4c/X0ySQx6pomb6PLGAYg5nUaYAfnTLW\r\n7Vku/td4lcskFXc33v8/hDfDuWum/b0DIgOMO33ar+1GznRplMfUUV0Ikdkb\r\nFZWBKqCjiV/9sBWcSUXciQOSq6Y6qfWodzN8fSbnGZ+ZpQhDpQi6S1pyeKFh\r\n+uRbsANQ5c/eQfiOdD/+gBDfqgEzxFcWxBK6VRYpKPdR/QcMTMwKxa8pd9uQ\r\n1aEBHaCpvm4Os5poo0SBWK7MLdfWXd1VtCS+sbNC5EXUIU3rbQotnbAUrp++\r\nGAObrbiNDWdieQb/VPVDivpAzkGeh8UQ4cIzT2Niep5kTe8pvYO96qS1zLJw\r\nQnQoQ6l6XI7Q79tuMmrMfHJA0wVMbXV6kB7TSk23yyX0ZWMRn8RlQLwKmONn\r\nT5iAuAfMW4GH+4lG4SGhV8hjaraG0IOImEMXvXhXHpBCosRhWPUz1D+INcAs\r\nTHw42GynmRPUVzO7iMeeYaStKbWcOgcmUpumniXmPxukCnRi8GE8ilcm8eE7\r\nCVCNZ2roR+Os6oZo0unHE2Aqyp+F+DhL6JELdzd8sGKWkcnHtYADG0u7MROH\r\npPNzxiS7pmdCFzoxa4YP2+vo2ABdY/nba/c=\r\n=G/qQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.8.0-dev_1657986260268_0.14638681717427904"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.8.1-dev":{"name":"metahkg-server","version":"2.8.1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"4ff368f627cc0c059ad1cd989506dc6be9426de6","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.8.1-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-PuJPFeJTu9jNB00YVB5u3t3yqGAJXoVZZM7h3qizaPBaOxogHbJLeGvfToqeSRXKXtePpSMkNTV7tsBcsa9ewg==","shasum":"20881cafc27d41dd4b119d34d98a22df4ec393a7","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.8.1-dev.tgz","fileCount":349,"unpackedSize":521856,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFBm8RccTp3L4F/PiSvsF5aVJ25zV1cxv0rHZZMcKZGyAiA52k5Bw3xcsKq4NI25uwfpqGWsNqpXzkMhAoi0Wn8Kfw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0uEXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrsWhAAnIABrWG1uz2O5d7ypoBbtJmzEQ+TiLllTzj5dBT9j3l62Eoe\r\nbUte4e6lPEMnnDncP4idX0NZQqpYmz1qOlX/gTyMQRvKR7WufRmHW7OFF0NM\r\nQMS1+BQTe8cd4nWaNpECXyh6zS6hkz+Tg+lCY25wzALlYoRN+x5dEn0iUN1N\r\nfnD4eftar8y4e6SEWrc+XVc2CI+517LPBzpwCReocNbqBl8DnNssKKKJATPv\r\nJpL6RBfWzoGdRxoa340yRQbNLAw4NE3GC0HN0GwBuVwSQPsbKMBUgAuyi0ax\r\nOdduERUP016H531o1nLoQZoeokHOwTNrNlmvmAx2xT3YD/J02UR5SZ9qVxmE\r\nqxLqsLHGG3k8C8BkJZTSPPNXGNTz3xyImAe8ZJwnFT9v5Mtv3AwFge3IRQb/\r\nK8wmuCM02VS13ABUJvwR6zXRVmJwHsB3zwDMh1abH6Y9VhxG858hl1Yv6tQU\r\n9frpANXuqW3GGg8b45wnhPMhWpuDaR22bha/tlh8V2acUYqs17r3kzqViqHA\r\nOaG7T7dFgV/c6TRMpJYY7esUY6qfEYejUKj001e43b0aLGRaUj2SqcM7kULi\r\nqcQ+rMtdM6bGMB/+i2ixVv7P3+M2JJ2aVpepENq9YRHX5/P+0nAxKvp5ams/\r\nyCr3vqcVe1e/mJHRVwsI5sUNkv+PY/z7wXo=\r\n=WoHU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.8.1-dev_1657987350940_0.3838916860228545"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.8.2-dev":{"name":"metahkg-server","version":"2.8.2-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"333d47d4b84f52dbe54cbbd5163c253bd55bb384","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.8.2-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-wDEyDxmUgtarAqiuAaYnyG4C/3nKxRcG7D30VlDOSKaV66Vww3J80d2MXEVo0goXKIxg8m1XWFOrmiQx7GLF4A==","shasum":"2961b5a8fc7a00b9a75b7e519c477e5ff489b62b","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.8.2-dev.tgz","fileCount":349,"unpackedSize":522794,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAYNMDUp7XQogKqvVcqiPjJBMKizrnPdfqkJYjoa5xtQAiBc27jznSxPxLsDIJPxSPnGTwD3YT/cmcTeXY+b0xy0rA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0vqUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpTlw/8CyQw0xWVm5EpnPhzZ/wlrbhhuLtRX9d3UlBJIzkiVYagw6ZU\r\nHiAc3Ke4ki1AVTzGHgHJFhfIjR6tDyC4IqEu67Va1OwoZln3OTET3op/7J1T\r\n9M3JF4IrqMUdOSu8nXap6kRy5+N4GaaWrXNJPus5na9rJkSxWKijG7UHv++U\r\nm0Ew0VYyjXPqxmNcVwkRbYsBJxamfAdnmzwv8MepbXgzty5qEMqhvqqKYA8v\r\nvo1tBGJGXK8W3fdpbf05gWJmFYg6gECxvcu7NDJx2L6nSQICD9T9l/7TLnTO\r\nH4FoG0KT8SlDuS1jWDj+o7MdsXM9g8a8uoP6Ox/Khc0XKNMM/lShXluyu6Qn\r\nLMQafy0eZfHQAecDo03LFeD5pGeg6w1Y+Nu1UbUbvyUzaA7t7GOvUIWeAzWi\r\nb5E+xARHs6kjlx25xc3MxinWbzVZDKSlRhWNcghX/95tvni/B4GnHkQdVsem\r\nb18iOlBczWwpRs9ZlRAxtBu9YL8EFB6yCe1VFgBvlaoPHr+Ij1UF/V7PPWQW\r\ndWw/oC61Mb1yFQBZ0Pz5iUp6VZ3lEhJ64DCRzm/dP9IK19Dz43eUrUzPTFAm\r\n3Q380jhuWMy5N2XTRMO5dxdRep9sHog0zbPMWCbReVUE6x/Jnf0eoufG3fi7\r\nh3bYIG4XwZ9CgDXM9rrACAEFBTz7IJNp4sc=\r\n=TzdH\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.8.2-dev_1657993876221_0.5050473253973895"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"2.8.2":{"name":"metahkg-server","version":"2.8.2","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"333d47d4b84f52dbe54cbbd5163c253bd55bb384","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@2.8.2","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-2aP0ZACPLOxbNRhTS6ptB+0Triatg6xo3ubgQl8WBLGx+QFukjW9D4N1mGKPmmy9jGfv+1LSsdSwfL6mol/Exw==","shasum":"163d68b74f3533259aead38b1e888b226795a3c0","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-2.8.2.tgz","fileCount":349,"unpackedSize":522790,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCoEVXVRw3ALZAM8jmi9aIhtJwEwx6Qumf+jZ6oOtRrGAIhAIQlQHZhXXx9ZcbGOmsACvEUom+WRkHIkjzSqSnkvJJv"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0vwqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrTGg//Y1qQ9myV90NsPlOwFDxcAtTFSj3WTb4Wt2Oq+ncEMdrDXbJH\r\nkhTacLVAUwTY4xXcrqMm04MN5lx06UvowzohKyD2OLIc6Ke/r9WBgICpgkVd\r\nlZHSt4kpYihNu3K4G9IiAFUlmv3fM9ug8Ud5owj15HeQVmpmcs9gwq3YnM3K\r\n9l2flb1zx5kj4uXuqup2uTlKZ47ubwxB0KEXJBsOx6mtK4FjIn9LiWjmNvKx\r\nULidN8f/J96OdmFtQva0eV3wovfKS4dD4eo0u/SkpeqNaWUj5YQer/RrnXHu\r\n61H+dK1oCKVQ4QhGJ8w0ObUvjrU1n6B11BWoLFQTqjvPOW9AsV8F/ohb+Ptc\r\nYGJMOZEdPMj5dL2UAmQnsAk+BEAYx7Ueew0xHje8FefKfFhE25Vaa0H09DQI\r\n+A4/JhfqIOh4bm9zyP5sX1XE34JxqzmymqP/9nnjHzafbvKTTRpYE0Ir83X1\r\n5kK9ElnahDIQlUWw8iNoIlSz1jan/BvDQmNLYGc8nBHD38i+Y43nveq/tC75\r\n9XNTqdf96rA/DK6Gtx5iJ7e/Sh0HkbBW47NBP0SJIZfOhXqFLrnoKfBhh4Bh\r\n5HQeaALMhI6aVxs5I6N3FTkSAX5jYwHixkU0TW3MIODu2Qy3YBJK/lzpfITx\r\nioixEGf7hFF9k/+ox14BClTxUfdvFi6sFDw=\r\n=lmeU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_2.8.2_1657994282427_0.5682988167887963"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.0.0-rc1-dev":{"name":"metahkg-server","version":"3.0.0-rc1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"0f532b844a43b24a34f65231eaa0b87198d0a65a","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.0.0-rc1-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-FyLArG4jw5LWrPVi9SGbJ7MBHU0bUU+F6fJ37lQysgk35lCObxsx9pcqTfgXhibzMDCNpIVcZyd2Y7XNnBlbGQ==","shasum":"6eba3ac46e3bd297c920a5c05e23a63c18752030","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.0.0-rc1-dev.tgz","fileCount":357,"unpackedSize":531186,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG7ELCLJJutYttxce35AyT3bJoOsUBn1d3FbWRi7gOkyAiEA7+9/oTFk7vQRWXwBhGMZQ4twv+N28aCs+fCrdhVHmeU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1t7oACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpqew//aCT3DM66W1gwlq+1VBgX90BfNUtoQQdsmVwt5QoQsY4uR/dS\r\nazzY7fRnbrxJ8bZWWE9IhXdmb1hdIuFELkM8g5th/k6rc9FgThonMfy6/M99\r\n6DSzFpPq+CEhJiAdpiylQQq5S4EFFP7aQkoUSpASYsncxgDkdHNXa++HFad1\r\nsen+ZpbLxnmxepSpyWbDQOr+lRw+2iTlEQGE6DWolOp9qZTwaEpS7JlehLu8\r\nlo0PAYPhvTuswzGYsIT5wrHlft1DBchHQ4zWh4PsWezjjHB1jbnD1RtmLInq\r\nr4ws5IoY8O8pC8+zgIQ/PbbZHYAoVyAm+1oEYS4Z5I45tgfS99pOmWwmY8Ke\r\nVpJbASBCaXQ9JjiUkSAmjOtDkW+NMRn+IdP3qqYeih37g3coDFahgdzvU4ck\r\nyfgIgp2I2qNkcz+Xg9VyhB4+xzILieWP0Ea99t3cV1OiAWdk+xp0XR0isCCx\r\nSEEM2rYFhPAkX0CyqZdYXulg7J2YsTYlPmSzMEI4CQs5M0N4olwW/Qvk0tBf\r\npMRBDfh1z88H1aARXAh8RrAQ3yHc1RQ/TBG5FPsx4nWWORHvxVWzx5PC9GE9\r\nr3gViFcbZ1S7gem9TYGvNrnNyRtv/Q1ESRkl/C8NJxu9gBm5h4WNE4RUw6HE\r\np3tTn9zWfGRJFZtoYFuC+cPXPXLN3ISf8Vs=\r\n=Axub\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.0.0-rc1-dev_1658248935996_0.24035963158340445"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.0.0-rc2-dev":{"name":"metahkg-server","version":"3.0.0-rc2-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.0.0","@sinclair/typebox":"0.23.4","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.0","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.2","mongodb":"^4.7.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.3","@typescript-eslint/eslint-plugin":"^5.30.0","@typescript-eslint/parser":"^5.30.0","eslint":"^8.18.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.2","nodemon":"^2.0.18","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.5","ts-node":"^10.8.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"f2e1abea77d79c6ad49599ae91b3815d49ba3e50","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.0.0-rc2-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-LzYEtQ6UobPZpfKHKVep5zzSto0+Ah2i97d4Jzow/aqI3R5gOwVhW+28I6i9pheoc00ZTe339+ECnlGgAEzUiw==","shasum":"ea8ad65672dad244ab174997d536378785b3436e","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.0.0-rc2-dev.tgz","fileCount":357,"unpackedSize":531214,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBH4pIAs9KdEU45UpvidcqwrSCSTjblaxABbCngOBMCCAiEA5roMnEkWj3HmISweOeijFFPhAhBVzEZwjWi56l2XL2A="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1uG2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqAxw/+OH49I+vMmcV4CC/sHkGcKXkP2IPrkBbZO113b07M11R/QFPa\r\n157tzhJ0IXQ5WSR22mk7erN8Q258Fzc+z4feo3MgLKIVpn4ko5bUqwST7zHv\r\nAFaMfHz61bt46K3dta2ZhXgufhJV2Psh5qazC2ZRQhKhRVjIrU2wRRDHjxoK\r\nhwG92Ymcrzfb8TQd7vnF/xlrMx6aqsW11NxcLr/5Z3GG7wKq1HQsF0Qedps+\r\n6KMPC35iS9bYbwFJKtC1lrHfs2oxVXvF14KFrjR7JX91Y30b3bLiuvehBMEF\r\nc+zulj4K0FQrHFOxMcdsLhu0vs9iipV/Yb3BQhfFVpQ+J0Ym/LJmiW5Rj2Aq\r\n2r5agoURN0sVz8kmTZYszA1C2gxqzG2y20JvEV29KJJKINA31Vml72Ylrudy\r\nt/yc6HljKmNbbO/CiPm1kkvxBkLfzVXNIClhOAMMPhV31X+eD8J6jd8DsxHp\r\nvAbztWvrxk1X2fwpVkcOo0hux0ryhHkuEvJ3KsdPydqaJoX0GAa5NJUk4Hhv\r\ntaJo1k66CCIKUudF3r9TcHiF62zHbA9m5hTvHddi4uA1AsgsAt2CLCM1rukn\r\nQRq7sEFIB+PgB/Bc+3Lvv4ih/Vyh2gHyF2YKnLB2pgn756bxaeebWQteZ7SO\r\n7c+Q7LRq1YsHCeJmB5uKzsA2r8dRQ8P4W8Y=\r\n=Rsyt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.0.0-rc2-dev_1658249653914_0.06676781161204715"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.0.0-rc4-dev":{"name":"metahkg-server","version":"3.0.0-rc4-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.2.0","@sinclair/typebox":"0.24.20","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.6","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.1","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.4","mongodb":"^4.8.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"f2b2de2e1e1e5ea7c6e14f633a6ba6f43327db1a","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.0.0-rc4-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-LcIwPYCX+MRdV8OLg8xldW4ImqJzZB4llET9bKUsvMqjni2KwziB7so+X3M0n9245Ux2EhOFkN96mWyiiYQPhQ==","shasum":"dbf6f08e73dda5c6fe0dc1fce42724afa1633b45","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.0.0-rc4-dev.tgz","fileCount":357,"unpackedSize":531497,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBKXIsEZS0IU/H+J2eSWFy1Ei2DE2LewXp7JFa0lmehyAiEAlD/cVvOebrmgbaRUVwwupxXfH9iNXDqv00tmAaD8eDs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1vJBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr3RQ/+JdPxlVlu/kMJ2WSKipuzS+1r7zSm2S37ujZ105SmoL/faSs6\r\nyc8k3DJ303DzP5wMziHlxT+Z8FGtClEnf5ZtbZqXFecD83exumDjzCjuaq4B\r\nuH57vC4v6qwuoWulU7SH128KMitI2Q3gibWpFlRqOYCZfNXu6wTfTJSa1DCG\r\nLrwPmra+iUKpvg8mf98WZK7ve27PlardHidRCsxS719NGcKd9p+kugRVK9Sd\r\nlXYMVD2kk10AO0FcVLBVde/RP6c2lppC0xMKwY3aERu+X4WybdMQP+lrf7WX\r\nY3rHHCM5iVhtUgS8r1ZSCybZi8rS7WmcPP8LzTUdyjgS6JPgzhFrKnjZkBQg\r\n7/npLjwXxevhhHl0SY4YYRnl6mm6cS6fXdn52Qdk1d2CmPLPurH0W0bxvGof\r\n5aDiO+xwAs0CJ4sU4kZ6X9230jSZHwetA2jSAKfFcgQ89UxORaM4wVlWEdUU\r\npOG/wElSWj7rs64CDOwcFiro00mqmO6PC7QT+iswXnVIwleFbWu2X3xaQTbj\r\nDMN1L6pVovdhOH2ELrD56yet0RcYGPqJf0/QVuohqdWos/Amx6fa+pMYKSO4\r\n302/87kP9YuAK1PFSeHjjjTgRi9NJ/AUxar8nxGU7NaTtLFzMfwfuRHlx45r\r\n9UPJ/kReI9IjyczlhuWa43HvoV3uTS3nKSQ=\r\n=7D4x\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.0.0-rc4-dev_1658253889398_0.5058445872422868"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.1.0-dev":{"name":"metahkg-server","version":"3.1.0-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.2.0","@sinclair/typebox":"0.24.20","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.6","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.1","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.4","mongodb":"^4.8.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"c95a9aa19213bdfb39a3964caba289c20a0fb3bc","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.1.0-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-3XBKzzkouWScQEYebJm4jaYXJXwkSW2z7Evc0FG51x4FsgiAOto8wVzaI4goVvXd0gOsP+yzaV98zeiXmiu0CQ==","shasum":"4dc185fd23ef98fcc0daaeed0291af03eb406764","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.1.0-dev.tgz","fileCount":362,"unpackedSize":558878,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGda1bTPP8npRpvH6PTEB/GslNpl6ShfMw+Kol0xP1peAiEAzAjv7RPWtGVxdYdMmo4IlokkQ9ZvC5Xa/dj7HLp2xpU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi17k4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp3iw//Z7vPLK626O4OqttxYp2s/YYLa4BEXQRn8bJ1Zh7JfmhXp2Oq\r\ne+e6Pv1ZvWrPihqy7kfRAHHoMMrNOGNrF2Yb7yrX5damlvm3CLMbbJVGdEEN\r\nC448T6TAdKR2j2TN1Nio1SEUpqjD42iGcegEuqgOvFsvvi3LeqfIhfVpU3mh\r\n6m9gGitUHvmKlNGB9+yU6b0toxoC4sCOTUUQvYrmRvQqRbwPpkuAvciEKBMU\r\n+g5yJBhjfh921sfsTceQQAzDm8ggJwo5lyvuBA/95mujkuNGXJFruN2oSFMl\r\nkSk1dd33B/wWKNCMnyZcrH8O/uoynf8FnJK7NXvjTB692r66XXeM59bmQFao\r\nb743Lt96LacRZHYgbo4kwsa183/YfKDx786jSgzs1EMpJlM7n2G0K6GG/zRY\r\n5Mr97obsNTtxcw632I1qLQpf26eCKaeLNSFGlT4wn7sRyijaHSxI3Lx3yG/t\r\n4W/TGkIZlO4Cnd7+SPNpQBb/x3T8fLN8xO8hotIpZ1EADjr9xGT6WrGgBgzi\r\noYF8dzachjjrZgOfscFd1YCOB/Rzbby0N3ybnabjdn129s7MafN6oBV0qw/I\r\nHHxSyZpuzsyttvmnzZeCvkqOd4PT+dRRi1nnU3ayFauc7nER4G8JJCb7YBfE\r\nZl9QBkGjSXd8uGvwF63PfOQlbHwFPBvHR+w=\r\n=swe9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.1.0-dev_1658304824592_0.40016672809446496"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.2.0-dev":{"name":"metahkg-server","version":"3.2.0-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.2.0","@sinclair/typebox":"0.24.20","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.6","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.1","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.4","mongodb":"^4.8.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"088c40ddf2c5e7c3ddbaef9c8f7557bee9459efd","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.2.0-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-z/lyNWoC6yaGnd3ABAbDaaCjXh9NER+K9OPcGvkQFJp21Au0KKxk1Yk6rmjMhJqzp/TDpj1WHgurmUwRBjJXLw==","shasum":"4981698024b6073ec5f403b76a184dc90999de73","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.2.0-dev.tgz","fileCount":366,"unpackedSize":563648,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA4Hpm5AaBHvBdObnBC2VuHVpXL6MJ8TT7EHfLIYFvW7AiBuPf/BuJcY684iWEQG0uYJ2hwk9xH9GUACUajPYfgd8w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi18JMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrBnA/+NnJo8gLupVcmFRASggW0eOH2XvC+3jnf8/kv1UO8B7+mUXay\r\nh64TW7kFSS8ScuT+oP4HyxcYhfERnEBlrMmu0Eo6Sc7OovnkcTaJxbQf2hKT\r\n7WSU5MgVRPCmStZ9uPiLIGDjidAYYGnXhBlF4ytFS+lbTCWo15k+KC/xUYgg\r\ncvIQfua0xSlJKUvb0j4gbWcIbFK8liGKYj4YSpAbiYFGwJWCvM9S65+fsUHM\r\ne03SmNetOVCwkVIsPXSSiNYX/VblafTXy3RMmDmQ95jSvqbC1ulHqslh4fRz\r\n7DxEqWc3bIRXbSZuez8yeFT7twcc8jqYSz81Ok6IB36Td1N1IKog3GWElG1m\r\nsDzbV/+evcikeSe9UWmyI3gLUUuoyVsrSpuFcuv/nBaBkC/vSIVlj+Q0H6Y6\r\nkSRf8ARRWSDaWxIwjV2hIi7xK8zBvAfWI0RZxtic+3rFNb84qzNZ5Q7IAVGP\r\ntkuzNBSmakTK6DLZBvJ0tEt077MucF0Tve659YFlgdANleCHWybV3ZCzjM+B\r\n2DXx+NlnSMvzb3uiZCgfmKLSnf9A6o/173dXJbpas2U6CoU1Hjfcb8c85BGg\r\nXkSFn0FVbXWgWcEa8pl3OS3h+Yce6k59O3R2hJanXd4RuaNjip5SlyJ9mJpe\r\neZKXEdFBUB8tfbUgQ/SAdVWof79P6iVrQd4=\r\n=1g4r\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.2.0-dev_1658307148724_0.9856770186531769"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.2.1-dev":{"name":"metahkg-server","version":"3.2.1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.2.0","@sinclair/typebox":"0.24.20","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.6","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.1","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.4","mongodb":"^4.8.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"49387ec251562c83f300100c25a113729e29cf1e","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.2.1-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-rrkmdfoAzNJgC/6aKnSt7UdgjdKn/HuGbsslXxkWB4gnoGEFzbnEocblclwdJC8/FLbiGSJnyWhqrdkdPqEveg==","shasum":"21f0d849b29eafd3cac7bedf097193a3049cd6c9","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.2.1-dev.tgz","fileCount":338,"unpackedSize":557363,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE85ByMtmLwdyHqWJCuD91AafUxQ3XrmRq4yaWpHITeHAiEAmWgSy1zQkSW2ym10a4ZkWOvCnYuh4IN5rXK/9JM39PI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi19epACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpAlBAAj8dr85zTl/SMx85ebXPx9Qu5xsB5G3ZsZIQgahlCOsmjE2Zs\r\n/Xb9mQhC1w5OMV0Xd4eVAy6ffkHpyGhva7tlQ+Tb0QLKZZ2wslDYVvw327I3\r\nA73MLYX9Nf8/FN9wsSR8NGDiOQEjDU2opfl24ImX6I5d2qnJmGsEtjaG126H\r\nPzRU+T6xfoknPcGvCWyKhtQDfTVgLzxSr3in4ZTL44oQb5T2XqQlZDW8g0Px\r\nmTnuJi6Bb3hsojryrcEzyNaXVdITXSFXpqzPVGPF7SKQITMc/abdDt5rvwQz\r\niDzK3aUONim5kjiTYNR3DhH0BGnb3a9ukNJVahmNdsSANtxorvpWOOPvZywJ\r\nJwqvaKbtfHk2VZa4TnuEtSSLtrWcHLdHYFd+Y9WmRKwS18yjTz6LrGcOTuqI\r\nNINQRlxl+d4tqyLbSHtfTlDrYgMmkETks4qxINbUIYt1pEgXMsTKmVe5pLRr\r\nx//KIJq5mNgeZxBKHUXuIgSLMhA8dQh4g07AVlZyEQWbjmA42HAinLVxGRJE\r\nV6B4j1MfFoqlR3FW0QcAwi2dsJ4HLaYiB7ak1kvw5sOUWqdAAT7RtBNqXdzL\r\ncEECL3H0yPeB9HCKSDobFVbjPvLLx8bOrv0/y6D2zAVb50tpgo/EvIXGgTr3\r\n8wiioJiWYCHqHZ0OQWxo/JCLxs37Csnq9+Y=\r\n=HAoL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.2.1-dev_1658312616949_0.012393332265598245"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.3.0-dev":{"name":"metahkg-server","version":"3.3.0-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.2.0","@sinclair/typebox":"0.24.20","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.6","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.1","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.4","mongodb":"^4.8.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"e9468a83d052e45fb8585c55700fa6385584a547","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/ategory/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.3.0-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-HyZX3BBQ2gJjl4j5hyW9LMNYfD5GUHlEt8ReMqsqzNWzzRPiKbsJR9cPYIOT3iuOWaqz/xxmcVyv37siDccLOA==","shasum":"9ee358990aa6e41b173d2323178a59eedaddf415","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.3.0-dev.tgz","fileCount":346,"unpackedSize":574778,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICCJ++jtaH8Wfj4SP84OC9KzsFLprX0rZZPtfLa0HbeTAiEAsvILjXHYtBP8o38LF6svU4P2nSv+6UBA4y4uc5WFjjU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2BCoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQPQ/8DxXtIDOiVKYJ1uujboxopMUmaHXVUqIG+pZhP/1tWGfxri6B\r\n3kxZcQUM4bfv8axAHkBHZhTcx3wU2F52L+zDhlrzPHMUp0vISFCl3j82mtbD\r\nbjGEcXOwJtISUKu9EuNUESZJGdihk3iGdqLDu3yetCm0iZyEhFVI4/udK8eZ\r\n7fsnqxKPA25uIuDhnFVoChFw1pn64UTqGDC28Gy264/PAjj4rXk3AaaS/S88\r\n0YgxcfzE1FArL1iRm/82IYQZShy9zTnGVUs4aPa5lzPPp/wVKGGdQOXVBOG4\r\n0Rj3IArq+vppxAtMivJBiCS1PZBIejkwMfXwOVUOqN2B7CaM9gP2ZWmRRzA0\r\nBjVOWoNvNba4neFmTblxIMvsq5bLPXVgTbdck5GAg+Fr74hELdu7voSCEqJi\r\nPHH0Oejnwa8yMa0ljsFWplRMPgMGpRGWHDq3KTJsUh6rCNih1GoDB1b0GhjU\r\n4+d8Gcc1ZKrW3oSgaSMOE7DSZkXpvvY86hdPi5YYSbQZEfPTBuE7AN5qATQu\r\naMmNtAdTU9jcWNVqZwU91IzT6tg/IxWhGoermLf2JAT0RLAXYAk8ox0d5swH\r\nBCHC+2Tqbt46kuheaQucrCmirD3F/LYVpxQ7V1jbHn32t6Jqbe7jgEgVT10B\r\nZxqJ1wUQAA2qHAStxjL1nyj5+yf/C2ki+SM=\r\n=jKuE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.3.0-dev_1658327208510_0.19458916573696916"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.3.1-dev":{"name":"metahkg-server","version":"3.3.1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.2.0","@sinclair/typebox":"0.24.20","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.6","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.1","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.4","mongodb":"^4.8.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"6ddfac44b98a40bda216eb53b8d39b6acd1fa62a","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/category/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.3.1-dev","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-MYgxNp4s+NCOlXa5+6nZke6WpUBp0FMmOsgO151b96LSKTCQxMf3j6WR9MtGDLeSBE1FmJHn5JmDKkrCIYB+LA==","shasum":"41f9a240a2cd934743a6348bd45decf68d279d8c","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.3.1-dev.tgz","fileCount":346,"unpackedSize":590854,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzEciAVfysXX5jKVUqw+BAdaOTy9Gl6+ZgHXq2tziJnQIgUL1wATGI7osI0g9zjaWo8QYExiQMckV5G+Zi28ZgpDE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2papACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrjWw//Qf2X3cucBZJ8YNrDj/scg44ZtVsORwac7ctiVMHpv7BVcORH\r\nObQzufVsJoG+TqTlITS7imRjy6PvAfXnzt86xTaDXSMCvNzt85Fz0Elhcg8V\r\nxt4diyHPxO/xBsMu7BoTlOU+97fPzBE+t4dSv/gP44vm67iQmy9gBEEpn2QV\r\nnAp4FjKVqRHFIKCL1/y4eXZ4Zm0Hc2YaYTl3QT5j0kdvh3tjCIAcvhpDifmO\r\nR9xaOO/iZ4bPrg+36waJWZ28gDLHEgyJGfJayX4TCQrFyJpSCpV7demA7GA6\r\nnQ5ZXCKVjlrcaSr0cSc8Nbqpk+1suQWqfoXvBtcL20vPndnG5Kg4Sh9xMQhz\r\nSw8VYAUG377b/3NTdRkemJCChaFIorMZfd1h55dWgFtRvIAoTdpLPij2/lbu\r\nXS9I3fIDdAVnOTmJKsbO9DFmV6CvFbCbwCXdJ7mTbOoJXeIr0HDoEQDOgOSg\r\nlgKjKQUlokMIDuT1aCRy940GlAT6zOd6hSyRhozZbin2WxRY4wTXGIWFmi3e\r\nRIhMYNLo6ddgt5Rec9lw4AnKuPh2h0T0usFx2d7nwALy7s1AsKrM6ZznAAIa\r\nkyo6ntt85GeL7bK8+kPGUXpIYBj6JXL1poev/chD81VjHWRix6hvIOSfZtWe\r\nTgpjIsLncfi/MtviQH+BAiR6tS7ZmDpBy1g=\r\n=AsxT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.3.1-dev_1658492585725_0.4844012698843947"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.3.1":{"name":"metahkg-server","version":"3.3.1","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.2.0","@sinclair/typebox":"0.24.20","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.6","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.1","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.4","mongodb":"^4.8.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"cafa959cf1c90f3cc5c0cd07d983d8e077e42b89","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.3.1","_nodeVersion":"18.6.0","_npmVersion":"8.13.2","dist":{"integrity":"sha512-aDoQpalOzTV6AWUK4kxU75R2dXQf75ZcjE/DYoOGtXlS6dL6mlnaFViX4mSc2d3mupXewC8t3Fo+6TYbqc9zXQ==","shasum":"21b25b8e7e8ff53bf0e5f645bd8b7bb4216cc6fb","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.3.1.tgz","fileCount":346,"unpackedSize":596464,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdRE9ekZku3JZFr8+4+bUgmj/XwTWWb1jS/leBX6LV4wIhAM/Pm4Khn6AtfmoZKADHiybuIrgZF8C0bff1ENIYGDi0"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3M/IACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmppVxAAjzjNKGTU5XTNVKHQE3rE48Pq+84vjsE+fvsaRNaAgOBn8e8J\r\nxEyz9jL+AVAJg/C6gjh3TGHxFonGeecBjrbUg+Uyyyn2AhWu+hm6XgcaCFLa\r\n9TkkLCxQGUJJCtJ69X3Y1Iv5j0vDMRyUCL/ZXpu9z3O+jdEAoaszn3Ept3J5\r\nE/bVBy0V75QAzJjvat4oHsMKN5o7uFGuvlI4Z9RWhdXKbChnLyKdT8fex4OS\r\nXHclahOaF5jWyIwcqq3qucug73BkIA/Q97S5hxFFjBxZTxkjpbI1HEbmveqK\r\nPJ+3C8xVUG2cYxwOuFcskNPPmjPnqafWXEhAUG6iE/rAZfr913RKheZEQOPV\r\nwmdMQza1e8jk92kiNqq1FWwbKW4RfPAywVA80BkGtsnaXcYjLBmuB7PdSY5P\r\ndaO26iRLTOhj4QzhQUhPkzupbVpLodmTF7rAt9pX5TrTIktfmKCjKXI0unCB\r\nGTes1x5NVWvMuKZ7eQ9F4OmNRSQkDx/ckIemg18o9mCpMPOnhVEjs/uNKYJP\r\neik5nBrQl5kWs+c9sfV3kYZCcGGkQGCcWd7mqRdnnQohSYa81KeDaTbWFjcF\r\nLf/sMt9NPj9ATH86l23dgqjzp8VHhjhJIzjHfvfki7HgkVfnixFWcvpiJ0yw\r\nSBSf9iCB/9u6SfKSToI0NhibsRwRYAlT+yc=\r\n=BjmU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.3.1_1658638280257_0.27325890130506436"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.4.0-dev":{"name":"metahkg-server","version":"3.4.0-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.2.0","@sinclair/typebox":"0.24.20","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.0.6","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.2.1","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^7.0.4","mongodb":"^4.8.0","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.0","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.30.7","@typescript-eslint/parser":"^5.30.7","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"910a968b7e7644adfd8f7283b3014593f2909263","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/category/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.4.0-dev","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-78J00aJra1+33SRQCqeMde5/eQQLdJ3W+YBREhcpW5fcomNUlDwBB9nWDm3CGBc98gWQbrKArDHLndkwUMdPvg==","shasum":"117cad6a9705c5c0a0a7747c19dcc0924aa2dc18","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.4.0-dev.tgz","fileCount":350,"unpackedSize":598957,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHy5EfaBJXs4wN9MDBwj2luxpGKvTVfVRC18EG4s/w5aAiEA4EE9d1EOPk9YK99Yc5JCxzIX0b3qjW/aQu2oh/AAhvc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi4mwTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpRdw//dA4rFPUkOsxE7o/cO4BJTMHA9FEOXu14cRl/ysFXm6COQIeD\r\nzpF4TeNIMVlRXSS/NuOCUxFdRuvdl2QPl195xMPEz7/KOVER8rOC7s/verW2\r\ncxckMHABb86S5E4AhwM/ompuC2vl+4oiNjB2o4LV76enCdkvV6apNeeLZcY+\r\nEVpkxOY15YwwAR4h9i2IYkyjsdlCeX1Cp6HwkzgBJQQD+YuSgaB11EMEmL30\r\nejwzmfIji2PcDRdEtmG5KgwgTDULxOIF6mrU9XSl1XxKEshY5RSNqUpp/u1b\r\n8pRfXv2I1VqF49EUw/6ukYRg6knn7mlvSnJD28UTiwA9bZJaXVD4F6DRHS+t\r\ntquaWwjZgdCqgzZFasWM+GbzthTiFXAGLwqeaIHLke+dGF4BOCZsWU7hP1nH\r\nQxYt5xbv+mXBTsqVig8xs5z2L9j14r8n/mIZO0NOvL6Sd6w/SQcbkLPLPqzt\r\nOzkp9PfosKY+BLnBTVKajJdvh2uHWPcva1vy9l3CXeklWZDFxn/5KVxufyLI\r\n2JzwQ9ST3dQGcReBdqHAzAcn/mq/srS7XsZmA5p5zQn+E/GOZsa34dQKv8Fs\r\nNTQRTwOFxjGEk/H/aHptpSiyV4Bk0jScE8ycF0+WLAwm9CLwGiaKnjA7odkd\r\nXeJ1IduirdgszgcI5VkspmbYyz0PW9KaR4M=\r\n=tyT7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.4.0-dev_1659005971014_0.41504420102291717"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.4.0":{"name":"metahkg-server","version":"3.4.0","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.3.0","@sinclair/typebox":"0.24.22","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.6.2","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.3.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^8.0.0","mongodb":"^4.8.1","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.1","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.31.0","@typescript-eslint/parser":"^5.31.0","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"07f22bc71ae3c4966fb2b09d8efaf12bb2314635","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.4.0","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-ianHDZUEfVA+mFqbwSkK+cXWsg+tNgwAevmO8DkBmfSpa/H7zDpqv1vxlrmLVUfgB5zCpZyc2v+Kgb76/xJRdg==","shasum":"57f5565b7c96e38c957a7ff80b0cee60617f8ec2","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.4.0.tgz","fileCount":350,"unpackedSize":599970,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCAAWXqm5k6wIHfU0BaG1PqrnRzZKvN3OD44syZbzpRqgIhALrPBIpUwZa1eQ0hoF7iCJ0tOkWifxPK8qj1iEV+H85x"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi471vACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrAyA//VtSs/pAoHTl5GsMmNQ89PahBmU3jAaoyyF7aOAAc0SyzGlsk\r\nnltSUTRziSjwVdGCUmIbbEiKLhPoZ7C26rJ/sE+TjVagjCZJCgQ/Tn+Nyf+r\r\nzo3NmnTp6GrJnDsKntOco6J1q01qDFxLl95UXGLUm20X6SN8OEgWZSG+1kk7\r\nbx6Z3m52V7UReGSHqtZVgRs/OfkQEoSiwLoE4gFxW2bxwBexKML53JyilWZV\r\naeA4BUCwzy09mYdfsJZGQvnyEdR9CP3UmOME6ac1ExhLrOUI5VK7wkFswf8T\r\n1QCn2W12vqnGFsWCQROmXvcDB9eB+MCp905fSAXK7xLJc6MMCGj8PPXUE7Uu\r\nYRcAwLlxf73VA2axsBOle7xiD9DZgdqbJ44UNsZlyinNb2m7wtmfMULUrTOB\r\npodfiEfDe9bu8DypbICRwrhPD2l2UQKF8Nq0RxTKaRWNTuTeBkSSDFflKhwp\r\n4uob3fxHB8549J32SYQ1nkDqPXA6I4XdvJB+wvWmeHHas38tXhtnKb5WWgLc\r\nKmGHV1Fegfe1KMtbJcO2Os1oqxjfrxyHr96OGy4e9l0ldfmluscWbCLW681s\r\no3jZ4P6O4WiAsQr1clncvnx4Uh9ycuUmf0IiYfhnaWJUs37Qy5WalqN3jAHI\r\ne7t+CUoWJqeHBH7HF4yOocAS4VOc3gg9A1Q=\r\n=wc+1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.4.0_1659092334909_0.6491219423299437"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.4.1-dev":{"name":"metahkg-server","version":"3.4.1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.3.0","@sinclair/typebox":"0.24.22","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.6.2","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.3.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^8.0.0","mongodb":"^4.8.1","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.1","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.31.0","@typescript-eslint/parser":"^5.31.0","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"bbba4cdd43da79e0ac146e08497a57d7e2092b8c","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/category/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.4.1-dev","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-F/q+7Dno6m0ImBKqH44VxykZoW+0KfgrmDGQJUzKFQ7WbPbFVqEGxRUD7D9qRclfWenq5T/Noun++a3hGapLvQ==","shasum":"f4aad9b6fc1e47d24efdbc4c8823f83d51636f06","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.4.1-dev.tgz","fileCount":350,"unpackedSize":600162,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFGDUFbOCjBPTMF52RlQS+6SE6bgspJxQH2iCW7SPtH9AiBDL3Ne6Wsyi8AZibntKfM3Mpqkoq7w5qKB/FkkC1tMYQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5CdTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq4eQ//awxFJ53ERI4wcD6jHNspxAbKPazQt0Fe1fudAKfLr7iYog/C\r\nWl5+7LY8lsUmS1Efr55BUOflgpFhiDyAw3Ehlvl44OxM4+SzWecOzvVIjoC3\r\nnpYJIG9yfyHcPdVIHJLB6JjxKlDH7Rxf8LY85gkVpUyWP2j8cLbJeA2T/kzp\r\niJmFTVn2uOJox0s7KHvc7ASYB/JixrpkaqlU2mDQy6FskAJYGZFuoogk7Yy/\r\nWCohAgC2SgDjAtkNHvh/DqTtQ7torT4LjwoENNM3p3sMudjum9L6ZdG5S0o+\r\nsDYBjuDlZAoENK/n1cme6br3E4MiQWI2SJkvwujPmvnbJfQZR8ykD/lg0R9T\r\nHD0J91Z9adSZjIQafz0yeDKeKkUrdO4rYQ9J0UWGDLqQfBXfP7OSx9G1SGVj\r\n8gubo5Mi+sFXJ8Bw3dhC8ljzF1dALYwHXqHycLE014qRnHInW9VqN2huDhtM\r\nidhzFhaM9fAn39C/kVIOeGwTIxwGyPafRCMjeuWpINGUnhcA8DdrwMYNd0Dj\r\nTO9x/KtJuL9IDnMG1t5+OVIPQUJhPV8ZsdSjWUZ2gxm/jX7PHvBqfZAIaoun\r\neGRGiTBrbwS7VJExqCfL5zPNvF/R0osQe8QP2fLhq3uLn2FNhqDaLwRYtgWv\r\n1eO37VV7MubOiNyHGs0AsqiuvxkOYzDGmcg=\r\n=G3M4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.4.1-dev_1659119442741_0.42801107039706743"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.4.1":{"name":"metahkg-server","version":"3.4.1","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.3.0","@sinclair/typebox":"0.24.22","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.6.2","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.3.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^8.0.0","mongodb":"^4.8.1","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.1","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.31.0","@typescript-eslint/parser":"^5.31.0","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"c887d81147bfd4378e02c8fb9be02eb7cd8c83eb","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.4.1","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-U2EZyEPbsuQqbAiEh4sxiHGUYadE0HQtm2ywcuYHAoQITFAkq6JDQ26KA90Hrt8iMKTvKcgAOjunaXvl4el2Wg==","shasum":"e2ea143bbe307cb54c6e8cb25f82cfa0e9a22d9f","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.4.1.tgz","fileCount":350,"unpackedSize":600014,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDl3PweGhVX0dWKP1yhQrUjRX/XDOlb2FH2ZxNMHGdT/QIgOeQ8eoio9VS7zU4WIVnQFBElyXYw+tsQ2zluyMjaJEM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5Cd/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoIiw//UELUToAPMlYm0gZMZHbNAg4AG9xpX1Go5tIWpxnOSG5n/jsf\r\nDSWcBJdKBp3C6ujnIqP5l9VAQhbHN3MJ1JZtlTHTFkIbeKBkh3IEDfbkvQ3M\r\njreZBxvNnc0mlo4W7B8jhubwO8+x7u1bvQVKIkSpMGLRjVsnhZthXZ4W2kWo\r\nOnXysFjpFkzGdJCnbkdnE3y1d/nHIFOo1jh3qgK0QLNgC74+UXBV+hPbG1pg\r\n1buNm+BiQTGQsEPYMPDwTOsUQEFqJ0K2V8v6afqMfN5P32rO7/dgqf8B8bsS\r\nHf67XoGLSJZu3XZR+EY+9FfPgV1RHNJUXJWdvDGorp6QxhJErXsXq1mtioQ9\r\nFmLOH7TNQ3KIjKkEFTadE+8/41TwtVzAUE+dst30XVhEgAsHJCTFT8gfp14z\r\n3xCJLaaDviAbiQIB4oFwKBtUdf1+1jAGhdlVBLZVtzyewUHaTzKzaZ05yCAB\r\nokDjBRb+PjUXA9x208QfVxt4TgA57T6EfgnzRd5nTjdrFUp+3x+AuwEAwGAZ\r\n70T5eg82QP3W+7IhqlRYRPHtj76sx7FjVowfaxhxtfV4YFqLIrNALfTdgn2B\r\n4qvKXbbas1oAaRtGbCdYKp4PkaXHOEo5IJluE6qmJTK7KL1d2D3VswEX3k9l\r\nY+RLNsVBceR9TmGgps6eH2ABu3XGt7T5ufM=\r\n=Ylab\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.4.1_1659119487524_0.6299435224588317"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.4.2":{"name":"metahkg-server","version":"3.4.2","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.3.0","@sinclair/typebox":"0.24.22","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.6.2","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.3.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^8.0.0","mongodb":"^4.8.1","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.1","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.31.0","@typescript-eslint/parser":"^5.31.0","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"6c61bad2ca972e60708509195539b41a50252014","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.4.2","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-3vIln4tH5QcU4yD6k8lCn3K9CWZ4vFvczyxbGbprbhOX2A3+fqaA7KEuBWVpctJb0tXoQLpPA+72MBoFqZecQA==","shasum":"03f14f28256f2b9e366d1df1acbd4eeef64bce8c","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.4.2.tgz","fileCount":350,"unpackedSize":600531,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF5IyLr/xlSUuIvunfaS3hi+shIRrs3No9DaHsv7PqheAiA7a28GXiNSrVCp5khEs1J7OlzJ7Cb6fPOtP5bdybnFpg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5+mAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqe6g/+MH/V3x7AU4HARNC/yrNInp7FId0sHaIecL+EZYMbTkIUsfNl\r\nzTv75sOElozSFa9NJjQbCJ5MurxlaUKOhHX0BmjPuzJgCPNUjF90C1PzFX0e\r\nTCLgUQwyuOaQhoL3j+mnr/GtfUYNB9quxohlwfIGsjDdKpBr8jpn0XyRHyT7\r\ntJGl4jdYM2tIHGiCLdtqX9habQNZax25DbPn81IO5Z98cYRu21izwvPPHv20\r\nyYytgN2fpSGcyqnqCUECWWTol5HgimSJjLZ5zovnaBN9NrdJ8gKtqhsvSE3S\r\nRqBeRN621IQH03IqRqlWGANcLLW+JV3bQkmLE7Ntj8OJnkQcPut/bM0MtDxV\r\nVbkkl0KvUowDObPvrmjHm9h1EdgKhwQKM8aOSmFFXi06RtDSQzbugZlWywDo\r\npc883k8Cj1qIYW0t7AoZVmf+6ZBJ4+FJjV9TtO51w64CBJfte8dDnlZluJoh\r\nfbDuJiAwn5P/SA+1tsfTpBDkceLu+B+A2i5q4qmDQGhWQ968mYdRD5Vbh9dP\r\nJtBv3dtL2LLW6OJBhQHd4Nj2RzMJBtVGxV9sbASj7ZKLkmqYEUu4Y3xgs6dz\r\nYjBcYJ8odoYO5cpuNhq5z2m72500DjFh8j1nrt8SF3VI5IEteqtjkb2JVa96\r\n9zqxR1yj800U1KvCe+cctyemK2D2TS1Oe2Y=\r\n=Ri4s\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.4.2_1659365760188_0.3408597311035586"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.4.2-dev":{"name":"metahkg-server","version":"3.4.2-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.3.0","@sinclair/typebox":"0.24.22","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.6.2","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.3.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^8.0.0","mongodb":"^4.8.1","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.1","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.31.0","@typescript-eslint/parser":"^5.31.0","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"789e9644eb5024ea51a7e667b8f66c9d89ae1898","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/category/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.4.2-dev","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-ELNJmout7EiYdMoU6upr3eEReP3HqrcXEMdLJCp0Q6APHT6OeyZKd30GIrHrEkoXKM+u8vqkyMEp2yRCuBBaEw==","shasum":"393e9d90bba421b0ea350d46e31c69824c6cd875","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.4.2-dev.tgz","fileCount":350,"unpackedSize":600661,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGvYMgzycXfksFGCQUK2mgkWKTR463Jeur/tG9k3K0tTAiBhk9nAL/O2B4I7IpSp8bGfF/33vqXBQUkT1y6wFf3v6g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5+nbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmozlg/+P+IMHc2//ixpgT1ObprwRrTVNYIE7MJH4JxasRMpAjmRc8nL\r\nGMTeSwM5kbiGqf6qTXcxvxBZJGLizPvOPMjX3z6pUkr21/Ov02PKG+jJu5p9\r\nHtyvS4IgPAK1R36ttoB1FV4MALQYkoj+C4dVHO+jr69PwvyJRI8QEQPRfGXT\r\nSJ1E6vyIY51tGmbSnwrkUBy3yFo4pdQn6J2/PoUEpuTm/N8mEoqlrNqsEc9d\r\nLhY9To1kcPccm+LMbNbez11anPk8HTR+IcQkk3Ib8fnCHsRQZ2zgBoHPIJGd\r\n5vJ2M6JoRU4u0AwVubl+yiCu5R5J9JNBeu0VwN5ugc4/j1ng+OQAZgGjOH3v\r\noiGPLgO5sp4576N61oPxqexit4ekKg/eMQ8EJevPz2+NfBDZE5UtmBxPvlMl\r\nmKW0K8TUp3eFdm6wPPvHjXxEfTYLbV1x7KfcuSKrAWmfYwxNvBY7yPBnMAdu\r\nQYfx0ivxmUjbLIYtRacWwCuNeHAAsZiSWOS1YIt9CTsMrFnntzA10EeRAtms\r\nOKqEztkp3FgFMtfCqcfozfxE1fMIyTB3rpEmsaTlTSDcE+Cpa6QQsEWtfzRL\r\nKo1i0wQt+pK87MC9dz3hyDutD3FbQaokXHpUZoHJbl33Z2abQaJx4z3folIp\r\n3OhofS3KIza3kXGvlBZr7obSMUQKPXDatp8=\r\n=yQHl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.4.2-dev_1659365851579_0.6085225982468647"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.4.3-dev":{"name":"metahkg-server","version":"3.4.3-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.3.0","@sinclair/typebox":"0.24.22","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.6.2","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.3.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^8.0.0","mongodb":"^4.8.1","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.1","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.31.0","@typescript-eslint/parser":"^5.31.0","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"6c4d64ec7b38e08a90f429b0a99ddd67514d06bc","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/category/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.4.3-dev","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-t/W0sQmwIJ9m/sEsJQW4mVFEyzTTWQHAR/LiOlcqxPWBcXKlINTVQzF482yjn3MQ/jZsv88IC9pWmkQcnkO6uA==","shasum":"827ba5e81f94fc25351f1cc5dc221b505ddcac3d","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.4.3-dev.tgz","fileCount":350,"unpackedSize":600970,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRlm1TkyWc4ICENE/QUB564E6aXyzXoty3GbnBw1TRVgIhAINBdlR+6TwuMHZnNJwQT98ALoE4bf7i5ANLee2x0zOo"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi5/+yACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo+AQ//VqOqAMtzI3uVu6U2VsXYPh2A8gD3cCuJ+fYR9bUL8TQnvuPT\r\n+CMBygAGxeRyDlRjJShtsCZilC26Ra90A8dh38LY+vJQr0BadRmySdnaxA2j\r\nEzzBB2jZzZQKBJcg4H031P8kzqmlIuYPPSNQngSOHEDUuSm09b4wN/U/GjRN\r\nVhhlA2JyZU1uJGThnvKMwD0396yqmwYGbO8JtM67Vr+HPGvC2Etc6TSgs1m5\r\nA8W29dqe8Hu3uIBHme0wbWX+pee6ugWadB40edv9Xy/4Rnsd6aiTocY1Lqas\r\nRdXMNbQrOzKyDbKMwbexIH383j+89SHbV1Oa9yFovyWPFTGsyh/+4MQuTFxV\r\nuy8Rr/0v2n7Cgc/B+41hCAT655kR7Ii9r1s89Q79JOHaLwoj4RDDs9yqQQfb\r\ndUdVz9lfMsQlPqe9k5PFDimJA4c6Pn8cCAYRwB5hFz/uOROiEROqDKu6124n\r\n3WwRP4UbggGWGt9BUUKEW2attl75tPlWBKy46ePKjSpEuUF+vs4y5FQNsXd4\r\nR9KRShAE8rYGq+rnL4kkAOtNgiKquHjmfIrMdorBaBhnG65/A3G8jfX9gATL\r\nc3+DKM65W+050ZtcfvnegiD3jlWjVeCVVa/L6yAE8FxAG49uP8PLw/PNkjk4\r\nJUPyRuVVApGVaEs0evc/Q2C8ykr+dfS+jhI=\r\n=3vvx\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.4.3-dev_1659371442021_0.5578840198756432"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"3.5.0-dev":{"name":"metahkg-server","version":"3.5.0-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.3.0","@sinclair/typebox":"0.24.22","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.6.2","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.3.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^8.0.0","mongodb":"^4.8.1","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.1","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.31.0","@typescript-eslint/parser":"^5.31.0","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"25d6287d3ce2688fb3d9142bb8ee3b732cd5ac0e","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/category/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@3.5.0-dev","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-jmomYKQQcmp8cC4mnQhD+zbDfedb16TdTpRcXRvxk3Y8+Rl13ewwRs6kySipCqt0prLg1QHzmZQcdrxEozo1uA==","shasum":"a0eebf740d5998159e8a8635276f6963abff12eb","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-3.5.0-dev.tgz","fileCount":354,"unpackedSize":610723,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCh37fi5y7eP68dtG7molXlEV3wbiAMM36QzEy/xCAKHQIhAKDRGvS7uufOwBQhHsLjuBVKfN925lvpvAiJR9Z9UcES"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6VduACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrtFw//ax7WKrGNEjQ0uQtTrzCV2LSJ6ticwIv6BYDxGEQnIovqH8rO\r\nXhYkaUweLgRg9xIJLBNO4OBsDGR6jRkTVjdzgr6coDXyfeqqPDkJkcDRIdue\r\nRbRybFhzeLMdNifFru3mutIIFjxlSVKYLIVQFvWd3wWMSMl2VIRmgjIH+D6s\r\npKyufjxdQwuAOuXNG2HKoAxL97gc0niVm0Zq2B6Aj4fo9+V3C8iQN/kR/idL\r\nrkDVrJMxLTWZZEEeufCeJmatazd7eIvFL7ljPKzA1NT6/97XcavnvlStFGGn\r\nuUHgMaQLsc46DiCRMZti5rLCkMiZuXKFP3+1MzTMkWm36zG1o2THLuatm2Je\r\ngLP77xlqb6VGEH9rTbvzYEBPqLrOH7lUPzozPFzypfjzFZUpeziq6ftG1pAe\r\nSORwiipiDP35Dpm54mrQoxuHe2soM3XHuOqn/WeyukwSiLScu4tLYMGEQ9nj\r\nDNf0wjwPCrgtx+79hImzX5hT9FTJwQlo4PCITGVqGoQGnDAgZTwJ3eDw7lg4\r\nDQEGFMgTXOJJjNMfD2QW96Z3GOoWl18BWCBqSKCmOyEdN5JrpimZgDsoj8lH\r\njbWZXnnQ6OovLYFzFr+/ILy3WjeKfmzuy4aWUYkwaC7J0exQp67lUSikcuUQ\r\n7YjvXBquK2bx/O3bizn5D1AXaBG8RgjJcDw=\r\n=WOj8\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_3.5.0-dev_1659459437867_0.37070229995500625"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"4.0.0-dev":{"name":"metahkg-server","version":"4.0.0-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.3.0","@sinclair/typebox":"0.24.22","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.6.2","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.3.0","fastify-multer":"^2.0.3","form-data":"^4.0.0-dev","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^8.0.0","mongodb":"^4.8.1","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.1","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.31.0","@typescript-eslint/parser":"^5.31.0","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0-dev"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"66fe8f56241428031ba218cf065f5725783df065","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/category/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@4.0.0-dev","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-x66laq8XWQgtCJACj3j21se8xuzR4an83imoN8GflYRyWfzY00g/QedRIr8sa1V0KiVRZubxUZ/v1ot1Boa4WA==","shasum":"a10ea94fb8669c1ac1e80f84f871b38bc08d22a8","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-4.0.0-dev.tgz","fileCount":366,"unpackedSize":613741,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBsoLxopV54bE3C7NOSqerCvWkqMFVQ1kUK1hAX+gSdrAiEA2vLZTw2lodBgdVd1bXeWfdmbU3WikYJ7N1MNy4I/MPE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8RT4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrm0g/+O81RLqdHsMAtcFtTKCSAZPxBjEoLPA3GNMyPAY5EN7752h5/\r\nEPWCCG9ea1ozg+PdYpSqHFOpBqeZdhlSN65waaEb/G6wcTwgoWKAsb7AX8no\r\n65UkIOKaxLYudj7DN3ikEKrEVmJ+3tuZAlb7End+kbhNHj+8kk/oz5+gCEQY\r\nmGWFxHnXJ7/O0HF5WfS26BiNiNQ2foHqHk4QHuS8nqU7l+gIAVNHTMDeVY+w\r\nyjk6KfwuUClIemsPPCSSN7XjQ+rvjgvPtN2SArNAWvyxv0IrJM7dagnehEAL\r\nIo3pAb+Q3vWWfDdbe5fjSgImEt2ATaY7GFKoh7wpqPsMksk9bWwYmw/D6kkC\r\n4pMGbG/zPM24JKDm1xL2q70e2E4TsgMVb9sUKhwjnjOQmW8rcBEivZB9pSL3\r\npL7zYWkMq6xmn5IQV3135B4jzjLTtOiRDLh9G1dXz9I0VMNnN+x7CVDSB9pQ\r\nUmNxMraUTvG6+hfL4Dqb95DXYN5IBCkOOXPh0vS+Z+oFuLUrIhSlSvnp4jWI\r\niTs7/e6/cOPX/LLMALFlLSWRwC4/Glx1ie/2JquNE0HjvO4W73MrASjhPpJ2\r\nyxGuWuAJLWI5oWVqKWfGO9tQAuKdPZw2qYcSo0xG9ndnYZz1+QIAdlP//F67\r\nqJS51jCQ3rLce86fIuPb0xEdzw8NO1I7Q1Y=\r\n=OlPN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_4.0.0-dev_1659966712021_0.8848284338507"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"},"4.0.0-1-dev":{"name":"metahkg-server","version":"4.0.0-1-dev","main":"dist/app.js","author":{"name":"wcyat"},"homepage":"https://metahkg.org","repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"license":"AGPL-3.0-or-later","keywords":["forum","lihkg"],"dependencies":{"@fastify/cors":"^8.0.0","@fastify/multipart":"^7.1.0","@fastify/rate-limit":"^7.3.0","@sinclair/typebox":"0.24.22","@types/bcrypt":"^5.0.0","@types/fs-extra":"^9.0.13","@types/html-to-text":"^8.1.0","@types/jsonwebtoken":"^8.5.8","@types/multer":"^1.4.7","@types/node":"^18.6.2","@types/sanitize-html":"^2.6.2","@types/sharp":"^0.30.4","@types/valid-url":"^1.0.3","ajv":"^8.11.0","ajv-formats":"^2.1.1","axios":"^0.27.2","bcrypt":"^5.0.1","dotenv":"^16.0.1","email-validator":"^2.0.4","fastify":"^4.3.0","fastify-multer":"^2.0.3","form-data":"^4.0.0","fs-extra":"^10.1.0","hash.js":"^1.1.7","html-to-text":"^8.2.0","is-sn-integer":"^0.3.0","isomorphic-dompurify":"^0.20.0","jsonwebtoken":"^8.5.1","mailgun.js":"^8.0.0","mongodb":"^4.8.1","node-html-parser":"^5.3.3","rimraf":"^3.0.2","sanitize-html":"^2.7.1","sharp":"^0.30.7","typescript":"^4.7.4","valid-url":"^1.0.9","wcyat-rg":"^1.0.1"},"devDependencies":{"@types/jest":"^28.1.6","@typescript-eslint/eslint-plugin":"^5.31.0","@typescript-eslint/parser":"^5.31.0","eslint":"^8.20.0","eslint-plugin-import":"^2.26.0","jest":"^28.1.3","nodemon":"^2.0.19","prettier":"^2.7.1","source-map-support":"^0.5.21","ts-jest":"^28.0.7","ts-node":"^10.9.1","tsconfig-paths":"^4.0.0"},"scripts":{"prebuild":"rimraf dist","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start":"node start.js && node dist/main","start:dev":"yarn dev","start:prod":"yarn start","test":"jest --passWithNoTests","test:watch":"jest --watch --passWithNoTests","test:cov":"jest --coverage --passWithNoTests","test:debug":"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand --passWithNoTests","test:e2e":"jest --config ./test/jest-e2e.json --passWithNoTests","start:api":"yarn run start","lint":"eslint --fix src && prettier --write src","deploy":"yarn run build && yarn run start","dev":"node start.js && nodemon ./src/main.ts"},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"types":"./dist/app.d.ts","gitHead":"90f7a91d482997be938d7a767b74bca0223889ce","readme":"# Metahkg server\n\nThis is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).\n\nstable (master): [metahkg.org](https://metahkg.org)\n\ndev build (dev): [dev.metahkg.org](https://dev.metahkg.org)\n\n[![React](https://badges.aleen42.com/src/react.svg)](http://reactjs.org/)\n[![Nodejs](https://badges.aleen42.com/src/node.svg)](https://nodejs.org)\n[![Typescript](https://badges.aleen42.com/src/typescript.svg)](https://www.typescriptlang.org/)\n\n[![Gitlab](https://badges.aleen42.com/src/gitlab.svg)](https://gitlab.com/metahkg/metahkg-server)\n[![Github](https://badges.aleen42.com/src/github.svg)](https://github.com/metahkg/metahkg-server)\n[![License](https://img.shields.io/gitlab/license/metahkg/metahkg-server)](https://gitlab.com/metahkg/metahkg-server/-/tree/master/LICENSE.md)\n\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=active+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![DeepSource](https://deepsource.io/gh/metahkg/metahkg-server.svg/?label=resolved+issues&show_trend=true&token=U57K3_mzxKK3THb0RtJifA_R)](https://deepsource.io/gh/metahkg/metahkg-server/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/7a8bdd4a758c4338abe5d1d5d497a5d4)](https://www.codacy.com/gl/metahkg/metahkg-server/dashboard?utm_source=gitlab.com&amp;utm_medium=referral&amp;utm_content=metahkg/metahkg-server&amp;utm_campaign=Badge_Grade)\n\n## Deploying\n\n### Docker\n\n[Docs](https://docs.metahkg.org/docs/category/deploy-metahkg)\n\n### Manually\n\n**_WARNING:_** This is NOT RECOMMENDED and might be OUTDATED!\n\nFor manual deployment, see DEPLOY.md.\n\n## OpenApi specification\n\nSee [openapi spec](https://gitlab.com/metahkg/openapi-spec).\n\n## Api docs\n\nSee [api](https://docs.metahkg.org/docs/category/api) in [metahkg docs](https://docs.metahkg.org).\n\n## Use as module\n\n### Install\n\n```bash\nyarn add metahkg-server\n```\n\n### Usage\n\n```typescript\nimport MetahkgServer from \"metahkg-server\";\n\n(async () => {\n    await client.connect();\n    await setup();\n\n    const app = await MetahkgServer();\n\n    /**\n     * The port can be modified in .env\n     */\n    await app.listen(3000, \"0.0.0.0\", (err: Error) => {\n        if (err) console.log(err);\n        console.log(`listening at port ${process.env.port || 3200}`);\n    });\n})();\n```\n\n## quick start for dev\n\nensure you have .env in root and have docker installed.\n\ndocker-compose -f docker-compose-dev.yml up --build\n","readmeFilename":"README.md","description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"_id":"metahkg-server@4.0.0-1-dev","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-zXXo5Z3brEx58a9wdbipQx9MgikRpm0YDdXI7cAGPHeCi6telMnSw7IrBCc4PLXzTMtV0OheElVPNqYIcKlE9A==","shasum":"10f5ff4fae32ece36867219c5bab80b6fb222a68","tarball":"https://registry.npmjs.org/metahkg-server/-/metahkg-server-4.0.0-1-dev.tgz","fileCount":274,"unpackedSize":415226,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIER/4Na1gN4KkCNHs5KnfrA1wGeU548n2YCuXANb65+LAiEAjdcIYi5Hyugzk+43gsm7ztWWbrm7Ype9U00ZmCYoWSY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8c07ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpm/xAAk7AKfLzGAAQColIPleHa3dcVxAGD+UQi6TL0HshofzssEfGd\r\nqNavYf3xHdsEW4hmyrqSIvt4q4aPrEQ+/vyn0k31NULc3fm+g2hie5f+H2bR\r\nds388+tq+yA+Jzz2pKSBPokDxBBSRt0WANBq42FF1R+lbh1d1j7YnrHl3BhJ\r\niNVeKLR9pN8ABMEUU+E7uos7ekEdx32hWPdkY/k/B+TosRwqYUbCeL/iucIH\r\n/eQwUi0bPUKPDKIbCyQxkIHDyAoDg5EWNSXG032OSDMiAeCB2rRFMIUuC/76\r\nMVkGWGr4ZZ74ttUtUH4F2hB8yXfErXhH+xoogan9xUl13cVX1TGVPOjNDbau\r\nJoEP7CrWqIvcaukrmmmoDFq7eIKGZMJMqoXnPFcLNZPrr7Woy9GA8hUofkfJ\r\nW9cv6xXflfQ/puTjA+T3DUODbdBWrWlbaD5wtllC3qj09nV0vWnUzhmRq3JW\r\n9kGi4rAoGzWIY2diNTpR/84gxwHsNTYw3S5P7n6NkhON4YULnz+Wb7a9Mywp\r\nhfXZGTGFgBTzUIUT4bwfkOAwwTLmoUzhB8mfQgIuadW/lrL11c3e0W57kn0s\r\n9DJ3xNq4j/YN1DTw1ZZdjFHZYHqJPgRdTxdXXiFitGivbzWspeiTvoU2Ut2c\r\n54Spadx7rbUXsRiqnJze4W1dgLqYpAqLWEE=\r\n=UcqT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"wc-yat","email":"sleep@wcyat.me"},"directories":{},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/metahkg-server_4.0.0-1-dev_1660013883598_0.23545191821531364"},"_hasShrinkwrap":false,"deprecated":"Please use @metahkg/server"}},"time":{"created":"2022-04-09T02:57:22.034Z","0.5.8-rc2":"2022-04-09T02:57:22.226Z","modified":"2022-08-11T15:05:19.362Z","0.5.10-rc1":"2022-04-19T06:50:17.232Z","2.1.0":"2022-06-23T10:36:42.713Z","2.4.0-dev":"2022-06-30T11:12:46.640Z","2.4.0-1-dev":"2022-06-30T14:57:47.622Z","2.4.0-2-dev":"2022-06-30T15:14:11.515Z","2.4.0-3-dev":"2022-06-30T15:15:14.957Z","2.4.0-4-dev":"2022-06-30T15:46:13.167Z","2.4.0":"2022-06-30T15:47:09.519Z","2.4.0-4":"2022-06-30T15:55:28.562Z","2.5.0-dev":"2022-07-01T09:36:29.378Z","2.5.0-1-dev":"2022-07-02T04:09:25.028Z","2.5.0-2-dev":"2022-07-02T08:12:47.699Z","2.5.0-1":"2022-07-02T08:16:29.691Z","2.5.1-dev":"2022-07-02T10:19:21.617Z","2.5.1":"2022-07-02T10:26:37.137Z","2.5.1-1-dev":"2022-07-03T06:51:04.679Z","2.5.2-dev":"2022-07-05T13:19:17.992Z","2.5.2":"2022-07-05T13:25:59.393Z","2.5.3-dev":"2022-07-05T14:17:04.920Z","2.5.3":"2022-07-05T14:24:02.290Z","2.6.0":"2022-07-11T11:04:12.835Z","2.7.0-dev":"2022-07-13T09:19:31.183Z","2.7.0":"2022-07-13T09:26:34.436Z","2.7.1-dev":"2022-07-16T13:48:19.293Z","2.7.1":"2022-07-16T13:54:38.141Z","2.7.2-dev":"2022-07-16T15:32:26.026Z","2.7.2":"2022-07-16T15:39:22.919Z","2.8.0-dev":"2022-07-16T15:44:20.478Z","2.8.0":"2022-07-16T15:50:50.144Z","2.8.1-dev":"2022-07-16T16:02:31.170Z","2.8.1":"2022-07-16T16:09:00.824Z","2.8.2-dev":"2022-07-16T17:51:16.371Z","2.8.2":"2022-07-16T17:58:02.639Z","3.0.0-rc1-dev":"2022-07-19T16:42:16.259Z","3.0.0-rc1":"2022-07-19T16:49:18.597Z","3.0.0-rc2-dev":"2022-07-19T16:54:14.094Z","3.0.0-rc2":"2022-07-19T17:01:00.305Z","3.0.0-rc4-dev":"2022-07-19T18:04:49.922Z","3.0.0-rc4":"2022-07-19T18:11:37.843Z","3.1.0-dev":"2022-07-20T08:13:44.863Z","3.2.0-dev":"2022-07-20T08:52:28.920Z","3.2.1-dev":"2022-07-20T10:23:37.135Z","3.3.0-dev":"2022-07-20T14:26:48.763Z","3.3.1-dev":"2022-07-22T12:23:05.905Z","3.3.1":"2022-07-24T04:51:20.463Z","3.4.0-dev":"2022-07-28T10:59:31.245Z","3.4.0":"2022-07-29T10:58:55.129Z","3.4.1-dev":"2022-07-29T18:30:42.975Z","3.4.1":"2022-07-29T18:31:27.752Z","3.4.2":"2022-08-01T14:56:00.367Z","3.4.2-dev":"2022-08-01T14:57:31.771Z","3.4.3-dev":"2022-08-01T16:30:42.259Z","3.5.0-dev":"2022-08-02T16:57:18.036Z","4.0.0-dev":"2022-08-08T13:51:52.223Z","4.0.0-1-dev":"2022-08-09T02:58:03.811Z"},"maintainers":[{"name":"wc-yat","email":"sleep@wcyat.me"}],"description":"This is the Metahkg backend api. See the [metahkg repository](https://gitlab.com/metahkg/metahkg).","homepage":"https://metahkg.org","keywords":["forum","lihkg"],"repository":{"type":"git","url":"git+https://github.com/metahkg/metahkg-server.git"},"author":{"name":"wcyat"},"bugs":{"url":"https://github.com/metahkg/metahkg-server/issues"},"license":"AGPL-3.0-or-later","readme":"","readmeFilename":""}