diff --git a/.env b/.env index a44565e..2c27bd4 100644 --- a/.env +++ b/.env @@ -1,6 +1,7 @@ ## App configuration ## NODE_ENV=development PORT=5000 +LOGS_ENABLED=true ## App information overrides ## # By default, these are read from package.json # diff --git a/.eslintrc.js b/.eslintrc.js index 0942694..fbcdfc4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -71,6 +71,8 @@ module.exports = { 'plugin:sonarjs/recommended', 'plugin:import/recommended', 'plugin:import/typescript', + 'plugin:import/errors', + 'plugin:import/warnings', 'plugin:promise/recommended', 'plugin:optimize-regex/recommended', 'plugin:prettier/recommended', diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3d4a11..1d2106d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,10 @@ on: - main pull_request: +concurrency: + group: ci-${{ github.workflow }} + cancel-in-progress: true + jobs: validate: name: ✅ Validate project diff --git a/CHANGELOG.md b/CHANGELOG.md index a3c7629..9d66cab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ All notable changes to this project will be documented in this file. +## [2.5.0](https://github.com/borjapazr/express-typescript-skeleton/compare/v2.4.0...v2.5.0) (2023-05-12) + +### Features + +- **logger:** add env variable to disable logs ([bb0b097](https://github.com/borjapazr/express-typescript-skeleton/commit/bb0b097cbd27f80c7b5c9ca4cf62f3b194ea661f)) + +### Performance Improvements + +- **logger:** migrate from pino streams to pino transports ([44495f2](https://github.com/borjapazr/express-typescript-skeleton/commit/44495f2b52d66ff3e917d79dd3634f8506fcb157)) + +### Others + +- **ci:** add concurrency settings to ci workflow ([52bd15e](https://github.com/borjapazr/express-typescript-skeleton/commit/52bd15e42ae357dda9ffe832893d561b62f34166)) +- **deps:** update dependencies ([b5b45e1](https://github.com/borjapazr/express-typescript-skeleton/commit/b5b45e15e3d8fdc9de6a87d8465a2c01bed73eb0)) + ## [2.4.0](https://github.com/borjapazr/express-typescript-skeleton/compare/v2.3.2...v2.4.0) (2023-05-10) ### Features diff --git a/TODO.md b/TODO.md index 3d9c10d..0bbd92a 100644 --- a/TODO.md +++ b/TODO.md @@ -3,7 +3,6 @@ ### Todo - [ ] 👋 Improve project onboarding by configuring all steps in Codetour -- [ ] https://infosecwriteups.com/api-security-for-developers-58f971bcc2c1 ### In Progress diff --git a/package-lock.json b/package-lock.json index 47df5c5..5c3274c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,29 +1,29 @@ { "name": "express-typescript-skeleton", - "version": "2.4.0", + "version": "2.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "express-typescript-skeleton", - "version": "2.4.0", + "version": "2.5.0", "license": "MIT", "dependencies": { "@ngneat/falso": "^6.4.0", "@prisma/client": "^4.14.0", - "@tsed/ajv": "^7.27.2", - "@tsed/common": "^7.27.2", - "@tsed/components-scan": "^7.27.2", - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/exceptions": "^7.27.2", - "@tsed/json-mapper": "^7.27.2", + "@tsed/ajv": "^7.28.0", + "@tsed/common": "^7.28.0", + "@tsed/components-scan": "^7.28.0", + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/exceptions": "^7.28.0", + "@tsed/json-mapper": "^7.28.0", "@tsed/logger": "^6.5.0", - "@tsed/openspec": "^7.27.2", - "@tsed/platform-express": "^7.27.2", - "@tsed/prisma": "^7.27.2", - "@tsed/schema": "^7.27.2", - "@tsed/swagger": "^7.27.2", + "@tsed/openspec": "^7.28.0", + "@tsed/platform-express": "^7.28.0", + "@tsed/prisma": "^7.28.0", + "@tsed/schema": "^7.28.0", + "@tsed/swagger": "^7.28.0", "@types/pino": "^7.0.5", "ajv": "^8.12.0", "argon2": "^0.30.3", @@ -79,7 +79,7 @@ "@types/luxon": "^3.3.0", "@types/method-override": "^0.0.32", "@types/multer": "^1.4.7", - "@types/node": "^20.1.2", + "@types/node": "^20.1.3", "@types/node-emoji": "^1.8.2", "@types/source-map-support": "^0.5.6", "@types/supertest": "^2.0.12", @@ -2724,19 +2724,19 @@ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" }, "node_modules/@tsed/ajv": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/ajv/-/ajv-7.27.2.tgz", - "integrity": "sha512-osTrSZfxq/w1qThWC2CZvi4QkTv6hBFzq1SjE5+YTdoQA3PlYLs8s2Mo0FoaM2BprTPrN4CJkKyS5ihTYQ52Jg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/ajv/-/ajv-7.28.0.tgz", + "integrity": "sha512-gTpw646WECxOZijmGrrRe6b+TSwWM9grYnWLuFGHwWTlU8iV1WT0LXz6BwGbWVm3Ty9VvaLlUbryWeduku/5SQ==", "dependencies": { "ajv-errors": "3.0.0", "ajv-formats": "2.1.1", "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/exceptions": "^7.27.2", - "@tsed/schema": "^7.27.2", + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/exceptions": "^7.28.0", + "@tsed/schema": "^7.28.0", "ajv": ">=8.9.0", "ajv-errors": ">=3.0.0" }, @@ -2772,9 +2772,9 @@ "dev": true }, "node_modules/@tsed/common": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/common/-/common-7.27.2.tgz", - "integrity": "sha512-7d0SVVERvG7RRKaih/LXVNieAHg0KDEsQfPYyUo8cL4RpwEfPbqM7wl958dHNbCq8zSbNQ1FWXG/21va+EEBww==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/common/-/common-7.28.0.tgz", + "integrity": "sha512-jN/EaTQiuUzd06/FbnCsE1BV5oa7iaKyr16F0FTtECWEg8+dZLpKgmIpG5dkP9DMnPRuXT5LehFZb4TSvYLxqQ==", "funding": [ { "type": "github", @@ -2786,20 +2786,20 @@ } ], "dependencies": { - "@tsed/core": "7.27.2", - "@tsed/di": "7.27.2", - "@tsed/exceptions": "7.27.2", - "@tsed/json-mapper": "7.27.2", + "@tsed/core": "7.28.0", + "@tsed/di": "7.28.0", + "@tsed/exceptions": "7.28.0", + "@tsed/json-mapper": "7.28.0", "@tsed/logger": ">=6.2.2", "@tsed/logger-file": ">=6.2.2", - "@tsed/platform-exceptions": "7.27.2", - "@tsed/platform-log-middleware": "7.27.2", - "@tsed/platform-middlewares": "7.27.2", - "@tsed/platform-params": "7.27.2", - "@tsed/platform-response-filter": "7.27.2", - "@tsed/platform-router": "7.27.2", - "@tsed/platform-views": "7.27.2", - "@tsed/schema": "7.27.2", + "@tsed/platform-exceptions": "7.28.0", + "@tsed/platform-log-middleware": "7.28.0", + "@tsed/platform-middlewares": "7.28.0", + "@tsed/platform-params": "7.28.0", + "@tsed/platform-response-filter": "7.28.0", + "@tsed/platform-router": "7.28.0", + "@tsed/platform-views": "7.28.0", + "@tsed/schema": "7.28.0", "@types/json-schema": "7.0.11", "accepts": "^1.3.8", "tslib": "2.5.0", @@ -2827,11 +2827,11 @@ } }, "node_modules/@tsed/components-scan": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/components-scan/-/components-scan-7.27.2.tgz", - "integrity": "sha512-kUm2g+B6alKlUg6zXcKAM1/5vtdYl16fbfLiw6FMLo2b5t1LVt/vIQoHBWN5uV93S+NKdjuIazQPXjnu1oldqw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/components-scan/-/components-scan-7.28.0.tgz", + "integrity": "sha512-yltPDufrQCUHfonkYLQUajmkqvewBsY+6mKs1B9edt4xDpHQGbqI0Doa/JFPAiL+/WTfLOzhuqiZqkilT8mIPg==", "dependencies": { - "@tsed/normalize-path": "7.27.2", + "@tsed/normalize-path": "7.28.0", "globby": "11.0.3", "tslib": "2.5.0" }, @@ -2845,25 +2845,25 @@ } }, "node_modules/@tsed/core": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/core/-/core-7.27.2.tgz", - "integrity": "sha512-w8TY5M7FrUo/kkLPc/VxfZJNHySc7r/TTNiNoOU5rS4XoB5365gxHFQNGBFVkWqNSWu28MZXrOTGcoVNm5PlgA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/core/-/core-7.28.0.tgz", + "integrity": "sha512-ytaftfdMizN7YC0HVHn8d2rBECVGM0qGfDeh+5ogcqRUxAk5bfzwvUwQt9cVFWBJfuJZvK12CQqLQImZvbAJug==", "dependencies": { "reflect-metadata": "^0.1.13", "tslib": "2.5.0" } }, "node_modules/@tsed/di": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/di/-/di-7.27.2.tgz", - "integrity": "sha512-NqhpJEDaXmdQU/g75BLsXvbpTvXYeg9OJcy7BiPXiAxfgVVqSw8j9skXU2ellw8aNI2tILKq/CWks+yUw651nA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/di/-/di-7.28.0.tgz", + "integrity": "sha512-Z/34ua2xYf200JG03QV+UPyTwj/z/x0utf/yx/2HTjNN8/PKSzCyTbZXMTPG81yZNyZBbaabGO0YmRyKDtVmJA==", "dependencies": { "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", + "@tsed/core": "^7.28.0", "@tsed/logger": ">=6.2.2", - "@tsed/schema": "^7.27.2" + "@tsed/schema": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/core": { @@ -2878,9 +2878,9 @@ } }, "node_modules/@tsed/engines": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/engines/-/engines-7.27.2.tgz", - "integrity": "sha512-vyJHNTqko5cczRyMaLzkikhyv0JrOLLl2eY1fGxuZbu19kW02hBE6iQ5AnjRP1mW4n87yM1C2t6qjUwq1lvT9g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/engines/-/engines-7.28.0.tgz", + "integrity": "sha512-NjbEcs3pa1ss2/JS7EbHM10YrcttY1gvHQzNISPP/A++43WS3pYg+R6dHj5cL7rwmBqJ15klUJ2+RenpH+tQIA==", "dependencies": { "filedirname": "^2.7.0", "fs-extra": "10.0.1", @@ -2901,28 +2901,28 @@ } }, "node_modules/@tsed/exceptions": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/exceptions/-/exceptions-7.27.2.tgz", - "integrity": "sha512-OMl34ke+7ndoRRtQFOlfgR4dHDGtEjABp94xGnpVV4OPczz+70RI0YpU96cFqG7hdpUYxuYS4qEaYi1kjNZvAg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/exceptions/-/exceptions-7.28.0.tgz", + "integrity": "sha512-C/YOONFZr97FVJpcE6P8v3QAtgSuPBQWe6UXTNzvofofXoj4NSwpaLCsY9yZYTUGq89KLNL9YEqbq0eJd4nccA==", "dependencies": { "change-case": "4.1.2", "statuses": ">=2.0.1", "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2" + "@tsed/core": "^7.28.0" } }, "node_modules/@tsed/json-mapper": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/json-mapper/-/json-mapper-7.27.2.tgz", - "integrity": "sha512-TmzxB4UkeQsSTGeD2y2KDJwA+CvfQfKT7IHGEbP1eAqnjTzBZIzkXM0lfOuXkkYLOcStfVfnRJQgOOZtihUh4w==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/json-mapper/-/json-mapper-7.28.0.tgz", + "integrity": "sha512-OUdrNk/GCGQTLUPjvXxPjzHtosi35Dj5ZLMQ1xEBnSed266549uId0tMC6SBXb403Tsf1bVQe9rJcMjGOpLymg==", "dependencies": { "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", - "@tsed/schema": "^7.27.2" + "@tsed/core": "^7.28.0", + "@tsed/schema": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/core": { @@ -2967,31 +2967,31 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "node_modules/@tsed/normalize-path": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/normalize-path/-/normalize-path-7.27.2.tgz", - "integrity": "sha512-nV3p3c1NT48fPUOqRD4ACSnxv96R+WtoSUikk74Y4HB58AkdZDDEB+3Bhy6JJlkmLs41uH4f79cJykBTCW5dMg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/normalize-path/-/normalize-path-7.28.0.tgz", + "integrity": "sha512-9cI6H8dwnapX1c1bAyF9VFzyfQ70bmWfkkP3INRKulp7TlvxQtzd4KTPAZb3VnOzrjpGuz1H4/OK3oVtZBLmzA==", "dependencies": { "normalize-path": "3.0.0", "tslib": "2.5.0" } }, "node_modules/@tsed/openspec": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/openspec/-/openspec-7.27.2.tgz", - "integrity": "sha512-yGLQoOAZvmPGV/uNsqixw77YgWzmTaEEY5YbOwaiMhD/zFuLG7Uc/7aU6NwmAIxqRAfjvgBKAVvr+HhiOlE/Sw==" + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/openspec/-/openspec-7.28.0.tgz", + "integrity": "sha512-5NHH5OQ9SsUESB7jC560VkM3kw9lnZkcrQTV8uZ3gy4NeddXLIdj4vwtPzqylEex1vPy8QJ8LBT3QHU89+MohA==" }, "node_modules/@tsed/platform-exceptions": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-exceptions/-/platform-exceptions-7.27.2.tgz", - "integrity": "sha512-ukl5M5T0BDir2bM560DrQ9o4M+TBRFCnhSmZBS6BTdApCIkpjsgL+GBQZPfMabPuQUPSssiE1KefF1ph5ul58Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-exceptions/-/platform-exceptions-7.28.0.tgz", + "integrity": "sha512-X2G+HJT2LTj/hiDBb8fL+JNyuRIcpok7lYlTKPkMEH/G98ra2Ifi4R2TwogvpCXFbjDhDb9iwKjZ+lWakNIIEA==", "dependencies": { "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/exceptions": "^7.27.2", - "@tsed/schema": "^7.27.2" + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/exceptions": "^7.28.0", + "@tsed/schema": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/core": { @@ -3009,23 +3009,23 @@ } }, "node_modules/@tsed/platform-express": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-express/-/platform-express-7.27.2.tgz", - "integrity": "sha512-HjPcQBtM7ww/Y99SYaPaWJXcxzjgoUsMCg4TfaamzE0nsS8LZISPAoB1JhL0uZe+4jqs3VPRGPd0YretAOxsYA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-express/-/platform-express-7.28.0.tgz", + "integrity": "sha512-lFbSEu0JCMufeIMuGghXYB4p3l3aSMBUZjNGdwJUgREKkFQbomfAOFjliL9xsQcpLTAuR94fv/bImJY0PYfE8g==", "dependencies": { "express": "^4.18.1", "multer": "^1.4.5-lts.1", "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/common": "^7.27.2", - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/json-mapper": "^7.27.2", + "@tsed/common": "^7.28.0", + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/json-mapper": "^7.28.0", "@tsed/logger": ">=6.2.2", - "@tsed/openspec": "^7.27.2", - "@tsed/platform-views": "^7.27.2", - "@tsed/schema": "^7.27.2", + "@tsed/openspec": "^7.28.0", + "@tsed/platform-views": "^7.28.0", + "@tsed/schema": "^7.28.0", "@types/multer": "^1.4.5", "body-parser": "^1.19.0", "multer": "^1.4.5-lts.1" @@ -3058,16 +3058,16 @@ } }, "node_modules/@tsed/platform-log-middleware": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-log-middleware/-/platform-log-middleware-7.27.2.tgz", - "integrity": "sha512-343u8Fk2Bqh0Bt3wD4nk9YvUIQIZXDuM2JS+iagkkqrij4/iZF4xRp1QoGsJCGVlWyF5/XcJlVGAge/cyUKZ3A==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-log-middleware/-/platform-log-middleware-7.28.0.tgz", + "integrity": "sha512-Z9bFYq5TftQEGspQom+MHgsu1blVMZx+cTeNG0hZcNLD0CNylJ+JYgakfLcHtVmLyOIsbxAYgpCxMXa/5cITrw==", "dependencies": { "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/di": "^7.27.2", - "@tsed/platform-middlewares": "^7.27.2", - "@tsed/platform-params": "^7.27.2" + "@tsed/di": "^7.28.0", + "@tsed/platform-middlewares": "^7.28.0", + "@tsed/platform-params": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/di": { @@ -3082,16 +3082,16 @@ } }, "node_modules/@tsed/platform-middlewares": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-middlewares/-/platform-middlewares-7.27.2.tgz", - "integrity": "sha512-A2ZLGkbvtvZI4+xNkK6pMC1kVWqREhTzzvxX4rqXmk9gM7kxNJ5HZa854livwEG/pyH/+pHzuDupxQjfUE797g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-middlewares/-/platform-middlewares-7.28.0.tgz", + "integrity": "sha512-U3FncBRazTMvfWR4+gGNMcTxDsodjEJ9gSlg8IQgIfNRv4DtZvRMZ/+oPVKD9AScpkIP41S7jR37APmghq+G4g==", "dependencies": { "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/schema": "^7.27.2" + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/schema": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/core": { @@ -3106,18 +3106,18 @@ } }, "node_modules/@tsed/platform-params": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-params/-/platform-params-7.27.2.tgz", - "integrity": "sha512-WFmO+VwwWaSFBuG+S55VFNxbXxewZpt1I5CVXxCoRiXU1GSrkfS1vYVjlZOo3+gzQ1vX0xb061gdxav/aNxl0w==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-params/-/platform-params-7.28.0.tgz", + "integrity": "sha512-tUwt8nAFGi4onzQ05xIVvmpeP4kaqH3TALh7UhToprg7X9BCtyFelRQ2m5QeUzXCzgeTpIfVEgHJPEwyXFoF2Q==", "dependencies": { "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/exceptions": "^7.27.2", - "@tsed/json-mapper": "^7.27.2", - "@tsed/schema": "^7.27.2" + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/exceptions": "^7.28.0", + "@tsed/json-mapper": "^7.28.0", + "@tsed/schema": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/core": { @@ -3138,18 +3138,18 @@ } }, "node_modules/@tsed/platform-response-filter": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-response-filter/-/platform-response-filter-7.27.2.tgz", - "integrity": "sha512-GzJZ4G8j0CUZ4dgUsDyQcmOwrELq95tcS9NDiCCnn6O7QpjJ/ddqmGVA0/DRWLc8z3XbRw3DyhAo+yeVFA/RJQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-response-filter/-/platform-response-filter-7.28.0.tgz", + "integrity": "sha512-TRBJ1X2k78xmezUv/8zUxPnOCr5tNyHI6CVZCT/7hWAmLkdvgtUJNqgZC0EjYBip1kCS65Znh5ORmSSk4nv3Rg==", "dependencies": { "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/exceptions": "^7.27.2", - "@tsed/json-mapper": "^7.27.2", - "@tsed/schema": "^7.27.2" + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/exceptions": "^7.28.0", + "@tsed/json-mapper": "^7.28.0", + "@tsed/schema": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/core": { @@ -3170,19 +3170,19 @@ } }, "node_modules/@tsed/platform-router": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-router/-/platform-router-7.27.2.tgz", - "integrity": "sha512-ioqV+7rnWRauqHhpYMZpZG3E+9Rpf3VtvqJkdrRQSeLGNsimmozy+QCvZlgJaqs3pSyjUuaZWt+zx+uCSiwWEw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-router/-/platform-router-7.28.0.tgz", + "integrity": "sha512-LZffapJd+fb3t1U/ntfLPWX67bcRorJT6GsfNjt5TAjWz/H4gbo6txQ2O4aSEUUlJlHOctuB/f4iNxJmxo0IGg==", "dependencies": { "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/exceptions": "^7.27.2", - "@tsed/json-mapper": "^7.27.2", - "@tsed/platform-params": "^7.27.2", - "@tsed/schema": "^7.27.2" + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/exceptions": "^7.28.0", + "@tsed/json-mapper": "^7.28.0", + "@tsed/platform-params": "^7.28.0", + "@tsed/schema": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/core": { @@ -3206,20 +3206,20 @@ } }, "node_modules/@tsed/platform-views": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-views/-/platform-views-7.27.2.tgz", - "integrity": "sha512-ND1UuYjI3PvZFl38EBDuiBv0CoZIBI4ECIZp4CMWLyUC+nkXrUZCcSWQS07hHpLkOyd8eDFRI9WE/hiJOrhScw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-views/-/platform-views-7.28.0.tgz", + "integrity": "sha512-ym8lf4hYRhqX3e8Wm8kz00bTB5UdSyzhI44h+hfxXohH9wwiVdzvgsqxurNCkjtoylWTFcjI+jSNP5v81NiSYg==", "dependencies": { - "@tsed/engines": "7.27.2", + "@tsed/engines": "7.28.0", "ejs": "^3.1.5", "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/engines": "^7.27.2", - "@tsed/exceptions": "^7.27.2", - "@tsed/schema": "^7.27.2" + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/engines": "^7.28.0", + "@tsed/exceptions": "^7.28.0", + "@tsed/schema": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/core": { @@ -3237,9 +3237,9 @@ } }, "node_modules/@tsed/prisma": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/prisma/-/prisma-7.27.2.tgz", - "integrity": "sha512-MPJODRbzxlHot+Ub+bWHhwZCJHoAT7aFyHfZQn8gwRIF9ZSStMh/3Anim5CSvIMe//HW9Xb3jgEpda+54HM/4A==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/prisma/-/prisma-7.28.0.tgz", + "integrity": "sha512-o2pncbwSuSBeb4ulDstg4y92NItryjfD7/4nNRzfnwHZOm8v8LFf4ONkjeR05mFeiaWzkHLaQb+HLzxMuq0vOg==", "dependencies": { "@prisma/generator-helper": "^4.0.0", "@prisma/internals": "^4.0.0", @@ -3254,10 +3254,10 @@ }, "peerDependencies": { "@prisma/client": ">=4.0.0", - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/json-mapper": "^7.27.2", - "@tsed/schema": "^7.27.2" + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/json-mapper": "^7.28.0", + "@tsed/schema": "^7.28.0" } }, "node_modules/@tsed/prisma/node_modules/fs-extra": { @@ -3274,11 +3274,11 @@ } }, "node_modules/@tsed/schema": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/schema/-/schema-7.27.2.tgz", - "integrity": "sha512-Nk0J06lXefzzg5pOc2azUQTxjszs984XlddwOPHBpjgbNqvh2f7iWCtT6zglcyBTFAkNYTgTmul0gM+nasDChA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/schema/-/schema-7.28.0.tgz", + "integrity": "sha512-LWuud4ZmXBq9a+g6LwtqnjeUv8AXJ65/2CYKvQGt4Sbze8ykk1JBXNa70/A4lkuk8GrzLE/H+J6qhMzAiQFpJw==", "dependencies": { - "@tsed/openspec": "7.27.2", + "@tsed/openspec": "7.28.0", "change-case": "^4.1.2", "fs-extra": "^10.0.1", "json-schema": "0.4.0", @@ -3287,8 +3287,8 @@ "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/core": "^7.27.2", - "@tsed/openspec": "^7.27.2" + "@tsed/core": "^7.28.0", + "@tsed/openspec": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/core": { @@ -3313,12 +3313,12 @@ } }, "node_modules/@tsed/swagger": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/swagger/-/swagger-7.27.2.tgz", - "integrity": "sha512-jw7gjpZ7yV1t3ivISqo/1S1Wh1blXlGETYPJ0bKQQYZ9c2OS8lOBX/+if7cdssf0UQUs9FiwjDm1pLj+GEI/+Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/swagger/-/swagger-7.28.0.tgz", + "integrity": "sha512-0/K0cptFAtToYYni5D00qEkk40Zo2oXshbV2XA7lthmZV10lzDMGe0/iBXOyeJlLnHeZyhoFplrFJFrfYQUP+g==", "dependencies": { - "@tsed/normalize-path": "7.27.2", - "@tsed/openspec": "7.27.2", + "@tsed/normalize-path": "7.28.0", + "@tsed/openspec": "7.28.0", "filedirname": "^2.7.0", "fs-extra": "10.0.1", "micromatch": "4.0.5", @@ -3326,7 +3326,7 @@ "tslib": "2.5.0" }, "peerDependencies": { - "@tsed/common": "^7.27.2" + "@tsed/common": "^7.28.0" }, "peerDependenciesMeta": { "@tsed/common": { @@ -3655,9 +3655,9 @@ } }, "node_modules/@types/node": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", - "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==" + "version": "20.1.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.3.tgz", + "integrity": "sha512-NP2yfZpgmf2eDRPmgGq+fjGjSwFgYbihA8/gK+ey23qT9RkxsgNTZvGOEpXgzIGqesTYkElELLgtKoMQTys5vA==" }, "node_modules/@types/node-emoji": { "version": "1.8.2", @@ -20843,9 +20843,9 @@ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" }, "@tsed/ajv": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/ajv/-/ajv-7.27.2.tgz", - "integrity": "sha512-osTrSZfxq/w1qThWC2CZvi4QkTv6hBFzq1SjE5+YTdoQA3PlYLs8s2Mo0FoaM2BprTPrN4CJkKyS5ihTYQ52Jg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/ajv/-/ajv-7.28.0.tgz", + "integrity": "sha512-gTpw646WECxOZijmGrrRe6b+TSwWM9grYnWLuFGHwWTlU8iV1WT0LXz6BwGbWVm3Ty9VvaLlUbryWeduku/5SQ==", "requires": { "ajv-errors": "3.0.0", "ajv-formats": "2.1.1", @@ -20871,24 +20871,24 @@ } }, "@tsed/common": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/common/-/common-7.27.2.tgz", - "integrity": "sha512-7d0SVVERvG7RRKaih/LXVNieAHg0KDEsQfPYyUo8cL4RpwEfPbqM7wl958dHNbCq8zSbNQ1FWXG/21va+EEBww==", - "requires": { - "@tsed/core": "7.27.2", - "@tsed/di": "7.27.2", - "@tsed/exceptions": "7.27.2", - "@tsed/json-mapper": "7.27.2", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/common/-/common-7.28.0.tgz", + "integrity": "sha512-jN/EaTQiuUzd06/FbnCsE1BV5oa7iaKyr16F0FTtECWEg8+dZLpKgmIpG5dkP9DMnPRuXT5LehFZb4TSvYLxqQ==", + "requires": { + "@tsed/core": "7.28.0", + "@tsed/di": "7.28.0", + "@tsed/exceptions": "7.28.0", + "@tsed/json-mapper": "7.28.0", "@tsed/logger": ">=6.2.2", "@tsed/logger-file": ">=6.2.2", - "@tsed/platform-exceptions": "7.27.2", - "@tsed/platform-log-middleware": "7.27.2", - "@tsed/platform-middlewares": "7.27.2", - "@tsed/platform-params": "7.27.2", - "@tsed/platform-response-filter": "7.27.2", - "@tsed/platform-router": "7.27.2", - "@tsed/platform-views": "7.27.2", - "@tsed/schema": "7.27.2", + "@tsed/platform-exceptions": "7.28.0", + "@tsed/platform-log-middleware": "7.28.0", + "@tsed/platform-middlewares": "7.28.0", + "@tsed/platform-params": "7.28.0", + "@tsed/platform-response-filter": "7.28.0", + "@tsed/platform-router": "7.28.0", + "@tsed/platform-views": "7.28.0", + "@tsed/schema": "7.28.0", "@types/json-schema": "7.0.11", "accepts": "^1.3.8", "tslib": "2.5.0", @@ -20903,36 +20903,36 @@ } }, "@tsed/components-scan": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/components-scan/-/components-scan-7.27.2.tgz", - "integrity": "sha512-kUm2g+B6alKlUg6zXcKAM1/5vtdYl16fbfLiw6FMLo2b5t1LVt/vIQoHBWN5uV93S+NKdjuIazQPXjnu1oldqw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/components-scan/-/components-scan-7.28.0.tgz", + "integrity": "sha512-yltPDufrQCUHfonkYLQUajmkqvewBsY+6mKs1B9edt4xDpHQGbqI0Doa/JFPAiL+/WTfLOzhuqiZqkilT8mIPg==", "requires": { - "@tsed/normalize-path": "7.27.2", + "@tsed/normalize-path": "7.28.0", "globby": "11.0.3", "tslib": "2.5.0" } }, "@tsed/core": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/core/-/core-7.27.2.tgz", - "integrity": "sha512-w8TY5M7FrUo/kkLPc/VxfZJNHySc7r/TTNiNoOU5rS4XoB5365gxHFQNGBFVkWqNSWu28MZXrOTGcoVNm5PlgA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/core/-/core-7.28.0.tgz", + "integrity": "sha512-ytaftfdMizN7YC0HVHn8d2rBECVGM0qGfDeh+5ogcqRUxAk5bfzwvUwQt9cVFWBJfuJZvK12CQqLQImZvbAJug==", "requires": { "reflect-metadata": "^0.1.13", "tslib": "2.5.0" } }, "@tsed/di": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/di/-/di-7.27.2.tgz", - "integrity": "sha512-NqhpJEDaXmdQU/g75BLsXvbpTvXYeg9OJcy7BiPXiAxfgVVqSw8j9skXU2ellw8aNI2tILKq/CWks+yUw651nA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/di/-/di-7.28.0.tgz", + "integrity": "sha512-Z/34ua2xYf200JG03QV+UPyTwj/z/x0utf/yx/2HTjNN8/PKSzCyTbZXMTPG81yZNyZBbaabGO0YmRyKDtVmJA==", "requires": { "tslib": "2.5.0" } }, "@tsed/engines": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/engines/-/engines-7.27.2.tgz", - "integrity": "sha512-vyJHNTqko5cczRyMaLzkikhyv0JrOLLl2eY1fGxuZbu19kW02hBE6iQ5AnjRP1mW4n87yM1C2t6qjUwq1lvT9g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/engines/-/engines-7.28.0.tgz", + "integrity": "sha512-NjbEcs3pa1ss2/JS7EbHM10YrcttY1gvHQzNISPP/A++43WS3pYg+R6dHj5cL7rwmBqJ15klUJ2+RenpH+tQIA==", "requires": { "filedirname": "^2.7.0", "fs-extra": "10.0.1", @@ -20952,9 +20952,9 @@ } }, "@tsed/exceptions": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/exceptions/-/exceptions-7.27.2.tgz", - "integrity": "sha512-OMl34ke+7ndoRRtQFOlfgR4dHDGtEjABp94xGnpVV4OPczz+70RI0YpU96cFqG7hdpUYxuYS4qEaYi1kjNZvAg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/exceptions/-/exceptions-7.28.0.tgz", + "integrity": "sha512-C/YOONFZr97FVJpcE6P8v3QAtgSuPBQWe6UXTNzvofofXoj4NSwpaLCsY9yZYTUGq89KLNL9YEqbq0eJd4nccA==", "requires": { "change-case": "4.1.2", "statuses": ">=2.0.1", @@ -20962,9 +20962,9 @@ } }, "@tsed/json-mapper": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/json-mapper/-/json-mapper-7.27.2.tgz", - "integrity": "sha512-TmzxB4UkeQsSTGeD2y2KDJwA+CvfQfKT7IHGEbP1eAqnjTzBZIzkXM0lfOuXkkYLOcStfVfnRJQgOOZtihUh4w==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/json-mapper/-/json-mapper-7.28.0.tgz", + "integrity": "sha512-OUdrNk/GCGQTLUPjvXxPjzHtosi35Dj5ZLMQ1xEBnSed266549uId0tMC6SBXb403Tsf1bVQe9rJcMjGOpLymg==", "requires": { "tslib": "2.5.0" } @@ -21004,31 +21004,31 @@ } }, "@tsed/normalize-path": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/normalize-path/-/normalize-path-7.27.2.tgz", - "integrity": "sha512-nV3p3c1NT48fPUOqRD4ACSnxv96R+WtoSUikk74Y4HB58AkdZDDEB+3Bhy6JJlkmLs41uH4f79cJykBTCW5dMg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/normalize-path/-/normalize-path-7.28.0.tgz", + "integrity": "sha512-9cI6H8dwnapX1c1bAyF9VFzyfQ70bmWfkkP3INRKulp7TlvxQtzd4KTPAZb3VnOzrjpGuz1H4/OK3oVtZBLmzA==", "requires": { "normalize-path": "3.0.0", "tslib": "2.5.0" } }, "@tsed/openspec": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/openspec/-/openspec-7.27.2.tgz", - "integrity": "sha512-yGLQoOAZvmPGV/uNsqixw77YgWzmTaEEY5YbOwaiMhD/zFuLG7Uc/7aU6NwmAIxqRAfjvgBKAVvr+HhiOlE/Sw==" + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/openspec/-/openspec-7.28.0.tgz", + "integrity": "sha512-5NHH5OQ9SsUESB7jC560VkM3kw9lnZkcrQTV8uZ3gy4NeddXLIdj4vwtPzqylEex1vPy8QJ8LBT3QHU89+MohA==" }, "@tsed/platform-exceptions": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-exceptions/-/platform-exceptions-7.27.2.tgz", - "integrity": "sha512-ukl5M5T0BDir2bM560DrQ9o4M+TBRFCnhSmZBS6BTdApCIkpjsgL+GBQZPfMabPuQUPSssiE1KefF1ph5ul58Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-exceptions/-/platform-exceptions-7.28.0.tgz", + "integrity": "sha512-X2G+HJT2LTj/hiDBb8fL+JNyuRIcpok7lYlTKPkMEH/G98ra2Ifi4R2TwogvpCXFbjDhDb9iwKjZ+lWakNIIEA==", "requires": { "tslib": "2.5.0" } }, "@tsed/platform-express": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-express/-/platform-express-7.27.2.tgz", - "integrity": "sha512-HjPcQBtM7ww/Y99SYaPaWJXcxzjgoUsMCg4TfaamzE0nsS8LZISPAoB1JhL0uZe+4jqs3VPRGPd0YretAOxsYA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-express/-/platform-express-7.28.0.tgz", + "integrity": "sha512-lFbSEu0JCMufeIMuGghXYB4p3l3aSMBUZjNGdwJUgREKkFQbomfAOFjliL9xsQcpLTAuR94fv/bImJY0PYfE8g==", "requires": { "express": "^4.18.1", "multer": "^1.4.5-lts.1", @@ -21036,59 +21036,59 @@ } }, "@tsed/platform-log-middleware": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-log-middleware/-/platform-log-middleware-7.27.2.tgz", - "integrity": "sha512-343u8Fk2Bqh0Bt3wD4nk9YvUIQIZXDuM2JS+iagkkqrij4/iZF4xRp1QoGsJCGVlWyF5/XcJlVGAge/cyUKZ3A==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-log-middleware/-/platform-log-middleware-7.28.0.tgz", + "integrity": "sha512-Z9bFYq5TftQEGspQom+MHgsu1blVMZx+cTeNG0hZcNLD0CNylJ+JYgakfLcHtVmLyOIsbxAYgpCxMXa/5cITrw==", "requires": { "tslib": "2.5.0" } }, "@tsed/platform-middlewares": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-middlewares/-/platform-middlewares-7.27.2.tgz", - "integrity": "sha512-A2ZLGkbvtvZI4+xNkK6pMC1kVWqREhTzzvxX4rqXmk9gM7kxNJ5HZa854livwEG/pyH/+pHzuDupxQjfUE797g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-middlewares/-/platform-middlewares-7.28.0.tgz", + "integrity": "sha512-U3FncBRazTMvfWR4+gGNMcTxDsodjEJ9gSlg8IQgIfNRv4DtZvRMZ/+oPVKD9AScpkIP41S7jR37APmghq+G4g==", "requires": { "tslib": "2.5.0" } }, "@tsed/platform-params": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-params/-/platform-params-7.27.2.tgz", - "integrity": "sha512-WFmO+VwwWaSFBuG+S55VFNxbXxewZpt1I5CVXxCoRiXU1GSrkfS1vYVjlZOo3+gzQ1vX0xb061gdxav/aNxl0w==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-params/-/platform-params-7.28.0.tgz", + "integrity": "sha512-tUwt8nAFGi4onzQ05xIVvmpeP4kaqH3TALh7UhToprg7X9BCtyFelRQ2m5QeUzXCzgeTpIfVEgHJPEwyXFoF2Q==", "requires": { "tslib": "2.5.0" } }, "@tsed/platform-response-filter": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-response-filter/-/platform-response-filter-7.27.2.tgz", - "integrity": "sha512-GzJZ4G8j0CUZ4dgUsDyQcmOwrELq95tcS9NDiCCnn6O7QpjJ/ddqmGVA0/DRWLc8z3XbRw3DyhAo+yeVFA/RJQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-response-filter/-/platform-response-filter-7.28.0.tgz", + "integrity": "sha512-TRBJ1X2k78xmezUv/8zUxPnOCr5tNyHI6CVZCT/7hWAmLkdvgtUJNqgZC0EjYBip1kCS65Znh5ORmSSk4nv3Rg==", "requires": { "tslib": "2.5.0" } }, "@tsed/platform-router": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-router/-/platform-router-7.27.2.tgz", - "integrity": "sha512-ioqV+7rnWRauqHhpYMZpZG3E+9Rpf3VtvqJkdrRQSeLGNsimmozy+QCvZlgJaqs3pSyjUuaZWt+zx+uCSiwWEw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-router/-/platform-router-7.28.0.tgz", + "integrity": "sha512-LZffapJd+fb3t1U/ntfLPWX67bcRorJT6GsfNjt5TAjWz/H4gbo6txQ2O4aSEUUlJlHOctuB/f4iNxJmxo0IGg==", "requires": { "tslib": "2.5.0" } }, "@tsed/platform-views": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/platform-views/-/platform-views-7.27.2.tgz", - "integrity": "sha512-ND1UuYjI3PvZFl38EBDuiBv0CoZIBI4ECIZp4CMWLyUC+nkXrUZCcSWQS07hHpLkOyd8eDFRI9WE/hiJOrhScw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/platform-views/-/platform-views-7.28.0.tgz", + "integrity": "sha512-ym8lf4hYRhqX3e8Wm8kz00bTB5UdSyzhI44h+hfxXohH9wwiVdzvgsqxurNCkjtoylWTFcjI+jSNP5v81NiSYg==", "requires": { - "@tsed/engines": "7.27.2", + "@tsed/engines": "7.28.0", "ejs": "^3.1.5", "tslib": "2.5.0" } }, "@tsed/prisma": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/prisma/-/prisma-7.27.2.tgz", - "integrity": "sha512-MPJODRbzxlHot+Ub+bWHhwZCJHoAT7aFyHfZQn8gwRIF9ZSStMh/3Anim5CSvIMe//HW9Xb3jgEpda+54HM/4A==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/prisma/-/prisma-7.28.0.tgz", + "integrity": "sha512-o2pncbwSuSBeb4ulDstg4y92NItryjfD7/4nNRzfnwHZOm8v8LFf4ONkjeR05mFeiaWzkHLaQb+HLzxMuq0vOg==", "requires": { "@prisma/generator-helper": "^4.0.0", "@prisma/internals": "^4.0.0", @@ -21112,11 +21112,11 @@ } }, "@tsed/schema": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/schema/-/schema-7.27.2.tgz", - "integrity": "sha512-Nk0J06lXefzzg5pOc2azUQTxjszs984XlddwOPHBpjgbNqvh2f7iWCtT6zglcyBTFAkNYTgTmul0gM+nasDChA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/schema/-/schema-7.28.0.tgz", + "integrity": "sha512-LWuud4ZmXBq9a+g6LwtqnjeUv8AXJ65/2CYKvQGt4Sbze8ykk1JBXNa70/A4lkuk8GrzLE/H+J6qhMzAiQFpJw==", "requires": { - "@tsed/openspec": "7.27.2", + "@tsed/openspec": "7.28.0", "change-case": "^4.1.2", "fs-extra": "^10.0.1", "json-schema": "0.4.0", @@ -21138,12 +21138,12 @@ } }, "@tsed/swagger": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@tsed/swagger/-/swagger-7.27.2.tgz", - "integrity": "sha512-jw7gjpZ7yV1t3ivISqo/1S1Wh1blXlGETYPJ0bKQQYZ9c2OS8lOBX/+if7cdssf0UQUs9FiwjDm1pLj+GEI/+Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@tsed/swagger/-/swagger-7.28.0.tgz", + "integrity": "sha512-0/K0cptFAtToYYni5D00qEkk40Zo2oXshbV2XA7lthmZV10lzDMGe0/iBXOyeJlLnHeZyhoFplrFJFrfYQUP+g==", "requires": { - "@tsed/normalize-path": "7.27.2", - "@tsed/openspec": "7.27.2", + "@tsed/normalize-path": "7.28.0", + "@tsed/openspec": "7.28.0", "filedirname": "^2.7.0", "fs-extra": "10.0.1", "micromatch": "4.0.5", @@ -21460,9 +21460,9 @@ } }, "@types/node": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", - "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==" + "version": "20.1.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.3.tgz", + "integrity": "sha512-NP2yfZpgmf2eDRPmgGq+fjGjSwFgYbihA8/gK+ey23qT9RkxsgNTZvGOEpXgzIGqesTYkElELLgtKoMQTys5vA==" }, "@types/node-emoji": { "version": "1.8.2", diff --git a/package.json b/package.json index 4e9db6f..e460d26 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "express-typescript-skeleton", - "version": "2.4.0", + "version": "2.5.0", "description": "🔰🦸 Template to start developing a REST API with Node.js (Express), TypeScript, ESLint, Prettier, Husky, Prisma, etc.", "author": { "name": "Borja Paz Rodríguez", @@ -89,7 +89,7 @@ "@types/luxon": "^3.3.0", "@types/method-override": "^0.0.32", "@types/multer": "^1.4.7", - "@types/node": "^20.1.2", + "@types/node": "^20.1.3", "@types/node-emoji": "^1.8.2", "@types/source-map-support": "^0.5.6", "@types/supertest": "^2.0.12", @@ -146,19 +146,19 @@ "dependencies": { "@ngneat/falso": "^6.4.0", "@prisma/client": "^4.14.0", - "@tsed/ajv": "^7.27.2", - "@tsed/common": "^7.27.2", - "@tsed/components-scan": "^7.27.2", - "@tsed/core": "^7.27.2", - "@tsed/di": "^7.27.2", - "@tsed/exceptions": "^7.27.2", - "@tsed/json-mapper": "^7.27.2", + "@tsed/ajv": "^7.28.0", + "@tsed/common": "^7.28.0", + "@tsed/components-scan": "^7.28.0", + "@tsed/core": "^7.28.0", + "@tsed/di": "^7.28.0", + "@tsed/exceptions": "^7.28.0", + "@tsed/json-mapper": "^7.28.0", "@tsed/logger": "^6.5.0", - "@tsed/openspec": "^7.27.2", - "@tsed/platform-express": "^7.27.2", - "@tsed/prisma": "^7.27.2", - "@tsed/schema": "^7.27.2", - "@tsed/swagger": "^7.27.2", + "@tsed/openspec": "^7.28.0", + "@tsed/platform-express": "^7.28.0", + "@tsed/prisma": "^7.28.0", + "@tsed/schema": "^7.28.0", + "@tsed/swagger": "^7.28.0", "@types/pino": "^7.0.5", "ajv": "^8.12.0", "argon2": "^0.30.3", diff --git a/src/domain/shared/logger.ts b/src/domain/shared/logger.ts index 395bf8e..3147972 100644 --- a/src/domain/shared/logger.ts +++ b/src/domain/shared/logger.ts @@ -1,6 +1,6 @@ import { LoggerDomainService } from '@domain/shared/services'; // eslint-disable-next-line hexagonal-architecture/enforce -import { PINO_LOGGER } from '@infrastructure/shared/pino-logger'; +import { PINO_LOGGER } from '@infrastructure/shared/logger/pino-logger'; import { Nullable } from './types'; diff --git a/src/infrastructure/shared/config/infrastructure.config.ts b/src/infrastructure/shared/config/infrastructure.config.ts index 7acd695..54dc648 100644 --- a/src/infrastructure/shared/config/infrastructure.config.ts +++ b/src/infrastructure/shared/config/infrastructure.config.ts @@ -5,6 +5,7 @@ const GlobalConfig = Object.freeze({ IS_TEST: getEnvironmentString('NODE_ENV', 'development') === 'test', IS_DEVELOPMENT: getEnvironmentString('NODE_ENV', 'development') === 'development', IS_PRODUCTION: getEnvironmentString('NODE_ENV', 'development') === 'production', + LOGS_ENABLED: getEnvironmentString('LOGS_ENABLED', 'true') === 'true', LOGS_FOLDER: getEnvironmentString('LOGS_FOLDER', 'logs'), JWT_SECRET: getEnvironmentString('JWT_SECRET', 'jwtSecretPassphrase'), JWT_EXPIRATION: getEnvironmentNumber('JWT_EXPIRATION', 1), diff --git a/src/infrastructure/shared/index.ts b/src/infrastructure/shared/index.ts index 4b239d2..bc20516 100644 --- a/src/infrastructure/shared/index.ts +++ b/src/infrastructure/shared/index.ts @@ -1,3 +1,2 @@ export * from './bootstrap'; export * from './infrastructure-service.decorator'; -export * from './pino-logger'; diff --git a/src/infrastructure/shared/pino-logger.ts b/src/infrastructure/shared/logger/pino-logger.ts similarity index 73% rename from src/infrastructure/shared/pino-logger.ts rename to src/infrastructure/shared/logger/pino-logger.ts index 0230adf..0c7ffcc 100644 --- a/src/infrastructure/shared/pino-logger.ts +++ b/src/infrastructure/shared/logger/pino-logger.ts @@ -1,13 +1,10 @@ import { getContext } from '@tsed/di'; import { NextFunction, Request, Response } from 'express'; -import * as FileStreamRotator from 'file-stream-rotator'; -import pino, { Level, Logger as PinoLoggerType, StreamEntry } from 'pino'; +import pino, { Level, Logger as PinoLoggerType, TransportTargetOptions } from 'pino'; import pinoHttp from 'pino-http'; -import pinoPretty from 'pino-pretty'; import { LoggerDomainService } from '@domain/shared/services/logger.domain-service'; - -import { GlobalConfig } from './config'; +import { GlobalConfig } from '@infrastructure/shared/config'; enum LogLevel { DEBUG = 'debug', @@ -22,7 +19,8 @@ const PinoLoggerConfig = Object.freeze({ LOGS_FOLDER: GlobalConfig.LOGS_FOLDER, LOG_HTTP: true, LOG_HTTP_IN_ALL_MESSAGES: false, - LOG_ROTATION_AUDIT_FILE: 'log-audit.json' + LOG_ROTATION_AUDIT_FILE: 'log-audit.json', + ROTATE_FILE_TRANSPORT_PATH: `${__dirname}/pino-rotate-file.transport` }); class PinoLogger implements LoggerDomainService { @@ -113,42 +111,51 @@ class PinoLogger implements LoggerDomainService { } private configureAndGetDefaultLogger = (): PinoLoggerType => { - const createDestinationWithRotation = (destination: string): any => - FileStreamRotator.getStream({ - filename: `${destination}.%DATE%`, - frequency: 'date', - extension: '.log', - utc: true, - verbose: false, - date_format: 'YYYYMM', - audit_file: `${PinoLoggerConfig.LOGS_FOLDER}/${PinoLoggerConfig.LOG_ROTATION_AUDIT_FILE}` - }); - - const streams: StreamEntry[] = [ - { - level: LogLevel.DEBUG, - stream: GlobalConfig.IS_DEVELOPMENT - ? pinoPretty({ - colorize: true, - messageKey: 'message' - }) - : process.stdout - }, - { level: LogLevel.DEBUG, stream: createDestinationWithRotation(`${PinoLoggerConfig.LOGS_FOLDER}/all`) }, - { level: LogLevel.ERROR, stream: createDestinationWithRotation(`${PinoLoggerConfig.LOGS_FOLDER}/error`) } + const rotateFileTransport = { + level: LogLevel.DEBUG, + target: PinoLoggerConfig.ROTATE_FILE_TRANSPORT_PATH, + options: { + folder: PinoLoggerConfig.LOGS_FOLDER, + filename: 'all', + extension: 'log' + } + }; + + const errorRotateFileTransport = { + level: LogLevel.ERROR, + target: PinoLoggerConfig.ROTATE_FILE_TRANSPORT_PATH, + options: { + folder: PinoLoggerConfig.LOGS_FOLDER, + filename: 'error', + extension: 'log' + } + }; + + const pinoPrettyTransport = { + level: LogLevel.DEBUG, + target: 'pino-pretty', + options: { colorize: true, messageKey: 'message' } + }; + + const standardOutputTransport = { + level: LogLevel.DEBUG, + target: 'pino/file', + options: { destination: 1, append: true } + }; + + const targets: TransportTargetOptions[] = [ + errorRotateFileTransport, + rotateFileTransport, + GlobalConfig.IS_DEVELOPMENT ? pinoPrettyTransport : standardOutputTransport ]; return pino( { + enabled: GlobalConfig.LOGS_ENABLED, level: PinoLoggerConfig.LOG_LEVEL, - formatters: { - level: label => { - return { level: label }; - } - }, messageKey: 'message' }, - pino.multistream(streams, { dedupe: false }) + pino.transport({ targets, dedupe: false }) ); }; } diff --git a/src/infrastructure/shared/logger/pino-rotate-file.transport.ts b/src/infrastructure/shared/logger/pino-rotate-file.transport.ts new file mode 100644 index 0000000..3561d0e --- /dev/null +++ b/src/infrastructure/shared/logger/pino-rotate-file.transport.ts @@ -0,0 +1,24 @@ +import EventEmitter, { once } from 'events'; +import * as FileStreamRotator from 'file-stream-rotator'; + +interface PinoRotateFileOptions { + folder: string; + filename: string; + extension: string; +} + +export default async (options: PinoRotateFileOptions): Promise => { + const stream = FileStreamRotator.getStream({ + filename: `${options.folder}/${options.filename}.%DATE%`, + frequency: 'date', + extension: `.${options.extension}`, + utc: true, + verbose: false, + date_format: 'YYYYMM', + audit_file: `${options.folder}/log-audit.json` + }); + await once(stream, 'open'); + return stream; +}; + +export { PinoRotateFileOptions }; diff --git a/src/presentation/rest/middlewares/logger.middleware.ts b/src/presentation/rest/middlewares/logger.middleware.ts index dfc2d4f..9d7db8f 100644 --- a/src/presentation/rest/middlewares/logger.middleware.ts +++ b/src/presentation/rest/middlewares/logger.middleware.ts @@ -1,7 +1,7 @@ import { Context, Middleware, MiddlewareMethods, Req, Res } from '@tsed/common'; -import { PINO_LOGGER } from '@infrastructure/shared'; import { GlobalConfig } from '@infrastructure/shared/config'; +import { PINO_LOGGER } from '@infrastructure/shared/logger/pino-logger'; @Middleware() class LoggerMiddleware implements MiddlewareMethods {