{"_id":"@shadimakhoul/ggcoach","_rev":"27-ba806c025d07e755bfc25a5195dcccc5","name":"@shadimakhoul/ggcoach","dist-tags":{"latest":"1.0.26"},"versions":{"1.0.0":{"name":"@shadimakhoul/ggcoach","version":"1.0.0","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.0","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"585f64cc8410620442a78179ba07f8dd52e80b5f","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.0.tgz","fileCount":134,"integrity":"sha512-NFcQaBSeImYYeZVvqBrzIt8/0rNYQvEBpBr9k9gkziMTKTS8VJf8Xn7ynKZ4PQgXvHVIhd56cvBkLXB1yrrE2w==","signatures":[{"sig":"MEQCIEti7hr4wmsMtvtnoTzkzBoBI6zWOCO9BZhMQSKHY3MXAiAyxOGPnxpt3sd17naiam9fje4Ufnahap+Nj5gUl4CJyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10423181},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"3566dc6deea46d241c15a159ccea146a2f16be39","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.0_1771763938760_0.17967516055355492","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@shadimakhoul/ggcoach","version":"1.0.1","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.1","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"89a9644fb85885bcf98115e0bf480d360de0fc1b","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.1.tgz","fileCount":133,"integrity":"sha512-Y/Dz+kPEBlSIBkVqqyXntKdaHXLxs9q3XZsTJ9W3Yswhj4vERzfwfjZRL+s0ICdytikDjZLixJXGoI2XFM3JpQ==","signatures":[{"sig":"MEYCIQDo9p84M8nTZe/7gfpBKlylHtW74axEJPFSUBf/Gk/l1gIhAOEVzKgPGd23Mb0I1d4aXC1P7QTS30tptWE6drz66vRq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10440028},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"e02481f00d6e2203533d410d3bddb300f7d5d0a1","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.1_1771768006476_0.9018640852175808","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@shadimakhoul/ggcoach","version":"1.0.2","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.2","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"d4aba1ee003e8d6ba68c67e51de642bfc7cf36d5","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.2.tgz","fileCount":133,"integrity":"sha512-xiEU4GQGP4MHbYXKiZnTWkk8HPoL+TIsGEKAcCdvX/zO19kAThGx2oPM/EgbmXYZ9hwOUlAwWY3acFcfDttQog==","signatures":[{"sig":"MEYCIQDLxbH1qRFW38DZOkdYg0d3cgBUhXhaGqHYj/hZCnLrcAIhAIkOAxUVfnOqISrKOZd47HBYvm9wJDh4pXXuYu+2aRbw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10440195},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"e02481f00d6e2203533d410d3bddb300f7d5d0a1","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.2_1771811451588_0.5115414282220831","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@shadimakhoul/ggcoach","version":"1.0.3","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.3","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"e3d0194d283d0fe8bdd13f9efd378a0374fdef69","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.3.tgz","fileCount":133,"integrity":"sha512-5gWkKEfMf0i3WEcYiptF79lazXcq1iUHnuuI9HJvp/w8jqqieOB4UM6E65lTQeRcQuNl4IrsE7a5tX8NQVNocQ==","signatures":[{"sig":"MEUCIF6qIJanFOytxVRRcFDj2A+sUg7MYM7wyIQf0RcaCtkhAiEAq7RZ3wCRFBILE4E+eRnHjO9YmnAPI62RtjK2Ka9C2q4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10443043},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.6","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.3_1771815913331_0.38133174466945685","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@shadimakhoul/ggcoach","version":"1.0.4","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.4","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"449f82b9eb1c0654086485ae54aa7eb20cf87982","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.4.tgz","fileCount":27,"integrity":"sha512-TWm8yyNIGBXeUPVaUOwsCnuccbZKNt3NNsuWbAL+/hC3AkM4mskJRoWCFhORqf01S3GNDSfIMSiVBlHqcUVP/A==","signatures":[{"sig":"MEQCIFI+rP+hCKd30OFhhB27EdR9DOhwdp7TqVztCY8reLyCAiBxNG0iwOrj9FDjURLl52+8YM+gRqEtkpK0bj9z3SgFIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178094},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"a6e03c5ed5e6803d4a33daca4f0834b340def729","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.4_1772863495177_0.15350961336657742","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@shadimakhoul/ggcoach","version":"1.0.5","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.5","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"5555d50ed4a4cd2ffd6a5921e8d358d1fc000341","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.5.tgz","fileCount":27,"integrity":"sha512-OmMK+9K5vn/8SqZuT3zw8mi6lQC/c5DOyFuetQZ8vePAzQhSkJ2cGcNv4qI3ocEJIub1+Bkxv4TubGgtFYCEFA==","signatures":[{"sig":"MEUCICrpDsw/qI9CXC/HaeuDGBSTn9ibIKMfYs6N6i7n+XgzAiEA9WQXoKnLrJZ/EcNj1dkNGcXTUwaz+oQPamwMsGdXWgE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178093},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"a6e03c5ed5e6803d4a33daca4f0834b340def729","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.5_1772864068629_0.08564926233936587","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@shadimakhoul/ggcoach","version":"1.0.6","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.6","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"722436a4460d40c117170f35a91ed3ca21b8c0e3","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.6.tgz","fileCount":97,"integrity":"sha512-zdhHVFvfBxvNJOV4M3NcGMwt/KCryyQD7hDT3G/R0jC+o9m1qbKGoQPvdlMSPALGathzgk7/jB+mNcfbfbW94g==","signatures":[{"sig":"MEUCIQD9Tc8Ux1FSqdIUOQI8uvccDnPtUp3FoDkuRcDxUMN9RwIgUs4SrJSrKlERcSqmlYmIk2IKu19iysXulKbmqir3TZY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":368887},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"a6e03c5ed5e6803d4a33daca4f0834b340def729","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.6_1772864968491_0.7103476137090885","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@shadimakhoul/ggcoach","version":"1.0.7","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.7","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"d954fbf551bc3caf7306a7a5418ec978a3759e5b","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.7.tgz","fileCount":105,"integrity":"sha512-j3+ZRLdJu39eDLPYmJSDiZy4ldOG4xSbfuIbXX0Y5PvhDhxfWkR1cfqVCxZrajV4IO2Svi3rR87NveizIPJT1Q==","signatures":[{"sig":"MEUCID5hPZAuj8I1vLYbTsl3SMyGETnTBA8/cqaGUbbE57oIAiEAwHUzSAtBU/YfG5KTLL66rr6TfCVsNvjhiHE8y5Tb98s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":375838},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"a6e03c5ed5e6803d4a33daca4f0834b340def729","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.7_1772887430601_0.2313994480619741","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@shadimakhoul/ggcoach","version":"1.0.8","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.8","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"84ec63346356bab3cc26c4ac08e08043aa105e5e","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.8.tgz","fileCount":105,"integrity":"sha512-vzswJaDgRDhCQr9YkEK2zUFd8MvDnB7iZ+fSA4rPzu5vsUfp70lgEU1KhFPtwYzCR2wG8OMBVfEOoKd/R+/nNQ==","signatures":[{"sig":"MEQCIGkYhOQjxXh+ns3QmzxEIt8LekTwMS/tc7QJwM+lm4JYAiBOdXQTtRKD74DcEXvlWiq/NC4MWpCKVR583J2+rAJlGw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":375740},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"a6e03c5ed5e6803d4a33daca4f0834b340def729","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.8_1772889002770_0.6154404740043646","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@shadimakhoul/ggcoach","version":"1.0.9","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.9","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"4c267a345aa0404c9cd76b097dbe059ff6004a3c","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.9.tgz","fileCount":105,"integrity":"sha512-u40g142HNZ4Lsx8b77+9DZF6YT42/ldiktGww58M3IX+wB26B3/hQ36QPfSaPX+jw76HDH+Cuny6y/KeBRSpBw==","signatures":[{"sig":"MEUCIQCSsPjW6FgslCH3jSfQ/mc7ObrHIOVmeTgu3iGEEe3XJAIgD7oy6PMDOqfM06yaZhifGBMDnb/O0AE7wkXsGMWlYPU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":380402},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"a6e03c5ed5e6803d4a33daca4f0834b340def729","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.9_1772956110555_0.07412217701707813","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"@shadimakhoul/ggcoach","version":"1.0.10","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.10","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"091a60b55f159675c985eed3f22bf4f6b6d91663","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.10.tgz","fileCount":27,"integrity":"sha512-ptbL0D1p5azUcChvQfDHOHnjawwwMgb0KOeSB0K/6ObMhMuseo68XvUL28lQc2QUg5L6JOvnOZnkWyyoUoWW3Q==","signatures":[{"sig":"MEYCIQCdmwn8oItXnVQT15mE5LMEpQkbpxemaqPMQrXZKGVrGwIhAK8AwCNLGZya2AF8tthgmiMqfF4LeTimRd+iTiKWa7Xx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178534},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"5a58521d8e435a125edac7d5c4f29c2ebec6242c","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.10_1772976686037_0.25052340256945027","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"@shadimakhoul/ggcoach","version":"1.0.11","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.11","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"77d3742aa21bc1445f66905c2110210b7ddffc78","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.11.tgz","fileCount":105,"integrity":"sha512-mKkFUsj0XlN0secHwDiCA+fsudj/b3AlxMjYqJBRY5q6NshOegQcBGc/P0+/SdBQbVfkgmneCj7W6q6qhIF6tA==","signatures":[{"sig":"MEYCIQCuO9HLlrp7N1zSaztG/T+StVc2jjm7CbU9Gqr+rnHn4gIhAIEtPE4bM56K3E92Pp/KZUJObsfBrG7iyQVhun6K12SK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":381489},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"82b9cc37669dadd1427f7ef17ab025e4b6417004","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.11_1772977467876_0.6922906804829398","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"@shadimakhoul/ggcoach","version":"1.0.12","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.12","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"7fa6189084ef626c802f301574137011e2c98cd4","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.12.tgz","fileCount":105,"integrity":"sha512-2/I/qYKGTq1CvUOkGmNHnnnBmMFydy/SFBBgxLYAKwi+hcRZ6QyK8FMIA5KbY8FjVtG5oA6KydVDLtZhQIaSHQ==","signatures":[{"sig":"MEYCIQCMdU/y5m24aur90tFa+NwmZhFarUWD18uWSxNynxQj4wIhAPubQ3F0lfkpNc/ESIlQYOg3FamWGHUAIGakBo02dUBf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":381328},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"82b9cc37669dadd1427f7ef17ab025e4b6417004","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.12_1772977650235_0.34405451894032635","host":"s3://npm-registry-packages-npm-production"}},"1.0.13":{"name":"@shadimakhoul/ggcoach","version":"1.0.13","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.13","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"2450fb1d39b07f04da7750b37177292afd75b8e7","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.13.tgz","fileCount":105,"integrity":"sha512-1z/olViza0LHx0ZdC4TtzcfJDFWiNAEpflH9D1dk++0PIY6Byu2x/IrdzHOhz810LrQfUNK/agzCFqI4x9iFNg==","signatures":[{"sig":"MEUCIQDi8NoDhHsXvX6BiDnw9kCXzPB5Ki81lxxOkmiMN0uH3gIgan3w2vu6QzRKFq2skAc4owNIiUAPx64C6zwILW20/bk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":385830},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"96bfd51a3778311ceb8531f962489c3414f3d67f","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.13_1773471729117_0.5804235912961835","host":"s3://npm-registry-packages-npm-production"}},"1.0.14":{"name":"@shadimakhoul/ggcoach","version":"1.0.14","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.14","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"abe382bc1e738af278bf5156223ca2ed79c01f89","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.14.tgz","fileCount":105,"integrity":"sha512-nfpBtEedW7BlDYUc/AMMQPi3eKIOI4qjl0DhrC5h4Uy/dpACeMlR6gcNQ22XCR773NybeUXl6/tvfOTFkYbotA==","signatures":[{"sig":"MEUCIQCQVlfXGLv7UZ9NqkaVWJgFGr9Cl/9k/MpvxpoMOAvfXQIgW54srku+9pjwQwlZCOkVVM0LTEDzGX8Ei+gaDmPNfn8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":389184},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"96bfd51a3778311ceb8531f962489c3414f3d67f","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.14_1773474219615_0.9110012529365321","host":"s3://npm-registry-packages-npm-production"}},"1.0.15":{"name":"@shadimakhoul/ggcoach","version":"1.0.15","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.15","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"b88bf8dd2c6292af1149c4aa8ff131209bb467e2","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.15.tgz","fileCount":105,"integrity":"sha512-pyrQ754KNW+w0QSOQ7Ve1bLBTNwVIJ171lRX8Pajw+XhWG1x6m8Z3Bs/WapeE7413BtvRQpQMr+eB9qCPgZcLA==","signatures":[{"sig":"MEYCIQDmy2rus4iyHZiXIXCRbQkgpKidYuTPpwjE/TedygTLoAIhAIRYZCrVA3lRL1zBIJeBsBO6aYCefo5btWOzUERTXtV9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":389416},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"28ea932dcf4fca4635d02fc7eabcdd001399058c","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.15_1773487048059_0.4774016512255459","host":"s3://npm-registry-packages-npm-production"}},"1.0.16":{"name":"@shadimakhoul/ggcoach","version":"1.0.16","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.16","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"7d8f9fc3de4912141dff713c5be405a6f3de1804","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.16.tgz","fileCount":105,"integrity":"sha512-b364AxK53Mueof1vilwhsZM60zYhf5gusO9OCfJzVRBYLULuckoQo9rgvmCuX+l39S3qB1S3f40x7bjpfer74A==","signatures":[{"sig":"MEYCIQDOgaOMHnfQ0FZXYZYoakZIaDKdZ+XMGcDHsbCiApGlOAIhALK/RxbOVljItnDZb/3s19CwdQIggrpl/BNIl+j+KWMT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":388860},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"feb4e1ccd0df3aaa1c47cb1595b1aa397b58ee7a","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.16_1774276714675_0.009837591673190316","host":"s3://npm-registry-packages-npm-production"}},"1.0.17":{"name":"@shadimakhoul/ggcoach","version":"1.0.17","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.17","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"0f9c6c7db2633f344d3849bda584e840353054ca","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.17.tgz","fileCount":105,"integrity":"sha512-n9+qrStVBrNL8bJr5HujqnsL/QsIUco5KytoluIKM9/iWXSuDl+CvO0D5nHc/Ig5dqvZ/5tlPEqTniEOQMZvsg==","signatures":[{"sig":"MEQCIBJAYQN24D1hUCpY+Noz+9aERcYKjyeQUkBgriHxnnebAiBX+X1G80pCywlcPrs1P6GAYn5VJS7gDpLGaczIdQzdmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":389080},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"feb4e1ccd0df3aaa1c47cb1595b1aa397b58ee7a","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.17_1774279113431_0.515349699071068","host":"s3://npm-registry-packages-npm-production"}},"1.0.18":{"name":"@shadimakhoul/ggcoach","version":"1.0.18","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.18","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"4e58e7e4665b61af2340990a77f1a62922e7c58d","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.18.tgz","fileCount":109,"integrity":"sha512-AIR0anl4CXfDuCaFKnzGKcIFxMZeLHYOiiuoUh8BGwnei3kcip872rHf2ZgMi6OzNwEYtQfSOH/wo/ef8v1GfA==","signatures":[{"sig":"MEQCIH61MjYQOjhe3I0Xx2CLfT639rSH7QuQKTPkzc5US20bAiBNQ+vtTkLK8m36i0AKHsEMjjWabO6NiHbPFw4TLDz2ow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":393113},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"d491002616187fcdeb6b7d720b383312a8c9f3bd","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.18_1775672555672_0.5541850609305281","host":"s3://npm-registry-packages-npm-production"}},"1.0.19":{"name":"@shadimakhoul/ggcoach","version":"1.0.19","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.19","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"379a346aba14ee259dea3980302a0eb11e536618","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.19.tgz","fileCount":109,"integrity":"sha512-JVNqFDjVE6R4jU4xFnW7vs3aeutOHp7TfqkwFBexwxCR0oGbKK9+5H+aXPBut2zSPYGrR+s/zz/cmGPuqy689w==","signatures":[{"sig":"MEYCIQDLcxL2wArsIpZLTsIcBqDAMSvPpdNL82shRS9HRtwuiwIhAMKWYx2Q4eTQ9IVIeXJ7xBizVzkYLvFBF2gjq+IDyUdc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":393975},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"b9b67f91f047b8bfb6c553f222e262375a7a54a6","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.19_1778091536784_0.16599329697258547","host":"s3://npm-registry-packages-npm-production"}},"1.0.20":{"name":"@shadimakhoul/ggcoach","version":"1.0.20","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.20","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"1d567519b493a54c02fb9c60dfc1e7f4a33b30db","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.20.tgz","fileCount":109,"integrity":"sha512-V2s4sheZX2a8BcDkpSRGuM47G30+KEI7K4/l/yd89V9Om8FZYnUxStw6ODvfefLeLLJhPJvFgEtB6+7qftTkjA==","signatures":[{"sig":"MEQCIFwW0zQ3jSh7wy0qKRoYY3mHpjxnorXgxGeseLt101fKAiBH/TfxTtZ/QRsuV8wb0MjQ4Qm4q0L/V40UUTUTL3Ru4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":393975},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"4532beea5dc87e81b57f09fdc428294aab9bdf96","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.20_1778233285063_0.844311818885052","host":"s3://npm-registry-packages-npm-production"}},"1.0.21":{"name":"@shadimakhoul/ggcoach","version":"1.0.21","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.21","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"def587cccca6e24b63d67a78fbd8a35af1cdfea1","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.21.tgz","fileCount":109,"integrity":"sha512-/zk+srAl2KnblC80hwNKK/weW2F8YgWGTvOz1jJcSa9wAsdCHKki2e50HzDQJhn+6jWpo4S1+jIGn/OLADJ05A==","signatures":[{"sig":"MEQCIFEQYS3LcrT867x76tZ0+OWIaiv6HJcwf6IQBf744HnjAiA47SUn1WxToX8hprubfTGDAH5jxV8m5zyxwSXFm1jZNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":394697},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"faebad7ee1e0cc336fa43e15f1c9cc0d8d852008","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.21_1778702842981_0.6450579317500917","host":"s3://npm-registry-packages-npm-production"}},"1.0.22":{"name":"@shadimakhoul/ggcoach","version":"1.0.22","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.22","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"6ca436818dc19fb0018aa2a45d0d90fb1df56af1","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.22.tgz","fileCount":110,"integrity":"sha512-W+d4C3c+UDeImpwdW06Ow4RTxmHD+h2CxEujTVvYcmWGNy0jwJy9vs+yJsr+kijNUK559B2we7fktDlYnyzY5w==","signatures":[{"sig":"MEUCIQD6RBdM782uu1nMfBy303g5qSwprfFuLWjV1LJ21Cqd1gIgFk3Mpho3ATp1AxLDAuBdpCaSV8gj6pICoKhrjXnsuIM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":398707},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"3d486ed6d299ba6b72a624c135a4c5ae122858c6","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.22_1780848150659_0.5327086178206801","host":"s3://npm-registry-packages-npm-production"}},"1.0.23":{"name":"@shadimakhoul/ggcoach","version":"1.0.23","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.23","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"9623884165820da6fac186996ff606d8ebcb303a","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.23.tgz","fileCount":118,"integrity":"sha512-YNvLaH5bQMxUv5eZgKgaHoMgBQmbJJxpDiRy/Vud2rwAjiLfBbbDaqIiah75bK0tIwXNFZV+FkurWDuJoXG/9A==","signatures":[{"sig":"MEQCIHY8GCULEK67EQHaHjKskrRIhDMcW+uYSho5oub+E7crAiAE3jZ24XhmlfyjrVexjOicm6vVgnAfyNV6iIn90gSPPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":411013},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"5b57a5fe34d3d6ae02e174715688b333418b5862","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.23_1784775289527_0.775419485947707","host":"s3://npm-registry-packages-npm-production"}},"1.0.24":{"name":"@shadimakhoul/ggcoach","version":"1.0.24","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.24","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"b7804a530d66b90bbaf2ead264d7b23a0c097bda","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.24.tgz","fileCount":118,"integrity":"sha512-nF1T/7nrNN5YH1gqOmTcFu0I89rcgntW214FclbWm7tqBcUMkGQfYHYwHwOYoJ+yNEurxjUTMSHiICIdAFRkcw==","signatures":[{"sig":"MEQCIEWIS3xYJsnUgMKH7nSvoWxrHTnv/+SuHJr/yEp9Ou78AiAyB3sSzKS1OE8fQ0gN14RrS3yQ0Xg0gKE3SDdz3IxgxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":413170},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"f892942f55aed9133ab9d96d2bef022546dc25bf","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.24_1784776685355_0.2073048431822202","host":"s3://npm-registry-packages-npm-production"}},"1.0.25":{"name":"@shadimakhoul/ggcoach","version":"1.0.25","keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","_id":"@shadimakhoul/ggcoach@1.0.25","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"dist":{"shasum":"7bc38fb97a3364c1d92838b9a9b4c749bd5dc311","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.25.tgz","fileCount":118,"integrity":"sha512-KUlLOOotNeU/VF9WCYM58Kmr4u7eIjuoWx8PK05SYVHahkMy4QRSNPY0sQog6u0HzwdGOXZ42VYJ6Rb5PuQYJw==","signatures":[{"sig":"MEUCIQCYBlph1HOvKlac+CCogPpGny3UyY//H2lk/BL5QCcCXwIgGIURlqf8X6d9tukvr/jUMohDgTC+rF0xCF3IXE7G5sI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":413396},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","gitHead":"21cbce6dda5a6902414ef220c5041657becf5fda","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","lint:fix":"eslint src/**/*.ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"_npmVersion":"11.6.3","description":"Shared utilities and types for GGCoach microservices","directories":{},"_nodeVersion":"22.14.0","dependencies":{"joi":"^17.11.0","zod":"^4.3.6","cors":"^2.8.5","redis":"^4.6.10","dotenv":"^16.3.1","helmet":"^7.1.0","morgan":"^1.10.0","mysql2":"^3.15.3","express":"^4.18.2","winston":"^3.11.0","jsonwebtoken":"^9.0.2","swagger-jsdoc":"^6.2.8","tsconfig-paths":"^4.2.0","express-rate-limit":"^7.1.5","swagger-ui-express":"^5.0.0","express-list-endpoints":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/cors":"^2.8.17","@types/node":"^20.10.6","@types/morgan":"^1.9.9","@types/express":"^4.17.21","@types/jsonwebtoken":"^9.0.2","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6","@types/express-list-endpoints":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ggcoach_1.0.25_1785255141863_0.489147219338242","host":"s3://npm-registry-packages-npm-production"}},"1.0.26":{"name":"@shadimakhoul/ggcoach","version":"1.0.26","description":"Shared utilities and types for GGCoach microservices","main":"./dist/index.js","types":"./dist/index.d.ts","type":"commonjs","scripts":{"build":"tsc","prepublishOnly":"npm run build","dev":"tsc --watch","test":"jest","lint":"eslint src/**/*.ts","lint:fix":"eslint src/**/*.ts --fix"},"dependencies":{"cors":"^2.8.5","dotenv":"^16.3.1","express":"^4.18.2","express-list-endpoints":"^6.0.0","express-rate-limit":"^7.1.5","helmet":"^7.1.0","joi":"^17.11.0","jsonwebtoken":"^9.0.2","morgan":"^1.10.0","mysql2":"^3.15.3","redis":"^4.6.10","swagger-jsdoc":"^6.2.8","swagger-ui-express":"^5.0.0","tsconfig-paths":"^4.2.0","winston":"^3.11.0","zod":"^4.3.6"},"keywords":["shared","utilities","types","microservices"],"author":{"name":"Shadi Makhoul"},"license":"ISC","devDependencies":{"@types/cors":"^2.8.17","@types/express":"^4.17.21","@types/express-list-endpoints":"^6.0.0","@types/jsonwebtoken":"^9.0.2","@types/morgan":"^1.9.9","@types/node":"^20.10.6","@types/swagger-jsdoc":"^6.0.4","@types/swagger-ui-express":"^4.1.6"},"gitHead":"d2d3554c0024cb659938d59698c4740e0ad47805","_id":"@shadimakhoul/ggcoach@1.0.26","_nodeVersion":"22.14.0","_npmVersion":"11.6.3","dist":{"integrity":"sha512-SM74la4hLmzVtx1YKnavRkQolR9O6kh86ZY+XRBi9vblHrLbC2Vhjj3PJtM3y8NR1dU7kh67jC+nsXjjPgt/oA==","shasum":"bd439f01b6a4d0588fde3eda3241220c9f896f41","tarball":"https://registry.npmjs.org/@shadimakhoul/ggcoach/-/ggcoach-1.0.26.tgz","fileCount":118,"unpackedSize":413457,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCkQq+H2siPTVmjdYI5uKGZyhW1kcQB7SOjiNMebX3dUgIhAOk+ubnO/iMYJrInzofpvlHVOBdnQ3cGXt6zKr/YSauq"}]},"_npmUser":{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"},"directories":{},"maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ggcoach_1.0.26_1788605233646_0.859165255976637"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-22T12:38:58.678Z","modified":"2026-09-05T10:47:13.932Z","1.0.0":"2026-02-22T12:38:58.999Z","1.0.1":"2026-02-22T13:46:46.645Z","1.0.2":"2026-02-23T01:50:51.742Z","1.0.3":"2026-02-23T03:05:13.588Z","1.0.4":"2026-03-07T06:04:55.328Z","1.0.5":"2026-03-07T06:14:28.788Z","1.0.6":"2026-03-07T06:29:28.642Z","1.0.7":"2026-03-07T12:43:50.752Z","1.0.8":"2026-03-07T13:10:02.937Z","1.0.9":"2026-03-08T07:48:30.697Z","1.0.10":"2026-03-08T13:31:26.196Z","1.0.11":"2026-03-08T13:44:28.030Z","1.0.12":"2026-03-08T13:47:30.392Z","1.0.13":"2026-03-14T07:02:09.386Z","1.0.14":"2026-03-14T07:43:39.788Z","1.0.15":"2026-03-14T11:17:28.212Z","1.0.16":"2026-03-23T14:38:34.823Z","1.0.17":"2026-03-23T15:18:33.640Z","1.0.18":"2026-04-08T18:22:35.837Z","1.0.19":"2026-05-06T18:18:56.983Z","1.0.20":"2026-05-08T09:41:25.236Z","1.0.21":"2026-05-13T20:07:23.186Z","1.0.22":"2026-06-07T16:02:30.819Z","1.0.23":"2026-07-23T02:54:49.688Z","1.0.24":"2026-07-23T03:18:05.486Z","1.0.25":"2026-07-28T16:12:22.025Z","1.0.26":"2026-09-05T10:47:13.790Z"},"author":{"name":"Shadi Makhoul"},"license":"ISC","keywords":["shared","utilities","types","microservices"],"description":"Shared utilities and types for GGCoach microservices","maintainers":[{"name":"shadimakhoul","email":"shadimakhoul570@gmail.com"}],"readme":"# @shadimakhoul/ggcoach\n\nShared utilities, middleware, and types for Node.js/Express microservices.\n\n## Installation\n\n```bash\nnpm install @shadimakhoul/ggcoach\n```\n\n## Contents\n\n- [JWT](#jwt)\n- [Middleware](#middleware)\n- [Request Validation](#request-validation)\n- [OpenAPI / Swagger](#openapi--swagger)\n- [Config & Bootstrap](#config--bootstrap)\n- [Logger](#logger)\n- [Types](#types)\n\n---\n\n## JWT\n\nGeneric JWT helpers. You define the payload shape; the library handles signing and verification.\n\n```ts\nimport { generateToken, generateRefreshToken, verifyToken, JWTConfig, BaseJWTPayload } from '@shadimakhoul/ggcoach';\n```\n\n### `JWTConfig`\n\n```ts\ninterface JWTConfig {\n  secret: string;\n  expiresIn: string;  // e.g. '1h', '7d'\n  issuer: string;     // e.g. 'my-auth-service'\n  audience: string;   // e.g. 'my-app'\n}\n```\n\n### `BaseJWTPayload`\n\nThe minimum shape required by the library. Extend it with your own fields.\n\n```ts\ninterface BaseJWTPayload {\n  tokenType?: 'access' | 'refresh';\n  tokenVersion?: number;\n}\n```\n\n### Usage\n\n```ts\n// 1. Define your payload\ninterface MyPayload extends BaseJWTPayload {\n  userId: string;\n  role: string;\n}\n\nconst config: JWTConfig = {\n  secret: process.env.JWT_SECRET!,\n  expiresIn: '1h',\n  issuer: 'my-auth-service',\n  audience: 'my-app',\n};\n\n// 2. Issue tokens\nconst accessToken  = generateToken<MyPayload>(config, { userId: '123', role: 'admin' });\nconst refreshToken = generateRefreshToken<MyPayload>(config, { userId: '123', role: 'admin' });\n// tokenType is stamped automatically: 'access' / 'refresh'\n\n// 3. Verify\nconst decoded = verifyToken<MyPayload>(config, accessToken);\n// decoded.tokenType === 'access'\n```\n\n> `verifyToken` throws `Error('Invalid or expired token')` on failure.\n\n---\n\n## Middleware\n\n```ts\nimport {\n  authenticateToken,\n  optionalAuth,\n  requireAdmin,\n  requireSuperAdmin,\n  requireInternalToken,\n  createRateLimiter,\n  authRateLimiter,\n  generalRateLimiter,\n  errorHandler,\n  createCorsOptions,\n  corsMiddleware,\n} from '@shadimakhoul/ggcoach';\n```\n\n### `authenticateToken(JWT_SECRET)`\n\nExpress middleware that reads a `Bearer` token from `Authorization`, verifies it (issuer `ggcoach-auth-service`, audience `ggcoach-app`), checks the token version against Redis, and sets `req.user`. Requires Redis to be initialized (see [Redis](#redis)).\n\n```ts\napp.use(authenticateToken(process.env.JWT_SECRET!));\n```\n\n### `optionalAuth(JWT_SECRET)`\n\nSame as `authenticateToken` but does not reject the request if no token is provided or if it's invalid. `req.user` is set only when a valid token is present.\n\n```ts\napp.use(optionalAuth(process.env.JWT_SECRET!));\n```\n\n### `requireAdmin` / `requireSuperAdmin`\n\nGuards that check `req.user.accountType`. Must be placed after `authenticateToken`.\n\n```ts\nrouter.get('/admin/users', authenticateToken(secret), requireAdmin, handler);\nrouter.post('/admin/promote', authenticateToken(secret), requireSuperAdmin, handler);\n```\n\n### `requireInternalToken(ALLOW_DIRECT_ACCESS, INTERNAL_SERVICE_TOKEN)`\n\nValidates the `x-internal-token` header for service-to-service calls.\n\n```ts\napp.use(requireInternalToken(\n  process.env.ALLOW_DIRECT_ACCESS === 'true',\n  process.env.INTERNAL_SERVICE_TOKEN!,\n));\n```\n\n### Rate limiters\n\n```ts\n// Pre-built limiters\napp.use('/auth', authRateLimiter);     // 5 req / 15 min\napp.use(generalRateLimiter);           // 1000 req / 15 min\n\n// Custom limiter\nconst customLimiter = createRateLimiter(\n  5 * 60 * 1000,  // windowMs\n  20,             // max requests\n);\n```\n\n### `errorHandler`\n\nCentralised Express error handler. Recognises `ECONNREFUSED`/`ETIMEDOUT` socket errors and Sequelize/Joi validation errors, mapping each to an appropriate status code. In `development`, also echoes the stack trace and `x-request-id` header. Register as the last middleware.\n\n```ts\napp.use(errorHandler);\n```\n\n### `createCorsOptions(allowedOrigins?, allowedHosts?)` / `corsMiddleware`\n\nReturns a CORS options object for the `cors` package. Passing no arguments allows all origins. `corsMiddleware` is a ready-to-use instance built from the no-argument defaults.\n\n```ts\n// Allow specific origins and wildcard sub-domains\napp.use(cors(createCorsOptions(\n  ['https://app.example.com'],\n  ['example.com'],            // matches *.example.com\n)));\n```\n\n---\n\n## Request Validation\n\n```ts\nimport { validateRequest, validateRequestZod, validateUploadedFilesZod } from '@shadimakhoul/ggcoach';\n```\n\n### `validateRequest(joiSchema)`\n\nValidates `req.body` against a Joi schema, stripping unknown keys and collecting all errors before responding `400`.\n\n```ts\nrouter.post('/users', validateRequest(createUserJoiSchema), handler);\n```\n\n### `validateRequestZod(zodSchema, target?, contentType?)`\n\nValidates `req.body` (default), `req.params`, or `req.query` against a Zod schema and replaces it with the parsed value.\n\n```ts\nrouter.get('/users/:id', validateRequestZod(idParamSchema, 'params'), handler);\nrouter.post('/users', validateRequestZod(createUserSchema), handler);\n```\n\n### `validateUploadedFilesZod(fileSchema, requestBodySchema?)`\n\nValidates `req.files` (e.g. from `multer`) against a Zod schema. Intended for `multipart/form-data` uploads.\n\n```ts\nrouter.post('/upload', validateUploadedFilesZod(fileArraySchema), handler);\n```\n\n> All three attach schema metadata (`__schema`, `__schemaType`, `__schemaTarget`, `__contentType`) to the middleware function, which [`buildOpenApiSpecFromExpress`](#openapi--swagger) reads to auto-generate request bodies/parameters.\n\n---\n\n## OpenAPI / Swagger\n\n```ts\nimport { buildOpenApiSpecFromExpress, zodToOpenAPI, setupSwagger } from '@shadimakhoul/ggcoach';\n```\n\n### `buildOpenApiSpecFromExpress(app, baseSpec, options?)`\n\nWalks a live Express app's router stack and generates an OpenAPI paths object: routes and methods via `express-list-endpoints`, request bodies/parameters from any `validateRequest*` schemas attached to route handlers, and a `security: [{ bearerAuth: [] }]` requirement on routes guarded by `authenticateToken`, `requireAdmin`, or `requireSuperAdmin`. Generated paths are merged under whatever `paths` already exist on `baseSpec`.\n\n```ts\nconst spec = buildOpenApiSpecFromExpress(app, {\n  openapi: '3.0.0',\n  info: { title: 'My Service', version: '1.0.0' },\n  paths: {},\n}, {\n  tagResolver: (path, method) => (path.startsWith('/admin') ? ['Admin'] : ['Public']),\n});\n```\n\n### `zodToOpenAPI(zodSchema)`\n\nConverts a Zod schema to an OpenAPI-compatible JSON Schema object (normalises `z.toJSONSchema` output — nullable unions, `const`, nested `properties`/`items`/`oneOf`/`anyOf`/`allOf`). Used internally by `buildOpenApiSpecFromExpress`.\n\n### `setupSwagger(port, app, options?)`\n\nServes `swagger.json` and the Swagger UI (pre-themed dark mode) on an Express app.\n\n```ts\nsetupSwagger(3000, app, {\n  getSpec: () => buildOpenApiSpecFromExpress(app, baseSpec),\n  // or a static spec:\n  // spec: mySpec,\n  basePath: '/api-docs',       // default\n});\n```\n\n---\n\n## Config & Bootstrap\n\n### `initExpress(isDevelopment, allowedOrigins?, allowedHosts?)`\n\nCreates a pre-configured Express app with Helmet, CORS, general rate limiting, JSON/urlencoded body parsing (10mb limit), and Morgan logging piped through the shared [logger](#logger).\n\n```ts\nimport { initExpress } from '@shadimakhoul/ggcoach';\n\nconst app = initExpress(\n  process.env.NODE_ENV === 'development',\n  ['https://app.example.com'],\n);\n```\n\n### Redis\n\n```ts\nimport { initializeRedis, getRedisClient, closeRedis, buildRedisUrl } from '@shadimakhoul/ggcoach';\n\nawait initializeRedis(process.env.REDIS_URL!);\nconst client = getRedisClient();\nawait closeRedis();\n```\n\n`initializeRedis(hostOrUrl, username?, password?)` accepts either a full `redis://`/`rediss://` URL or a bare host (in which case it connects on port `16837`). It's a singleton — subsequent calls return the existing open client. `authenticateToken`/`optionalAuth` rely on `getRedisClient()`, so initialize Redis before mounting auth middleware.\n\n`buildRedisUrl(value, user?, password?)` builds a `redis://`/`rediss://` connection string from a host, a Heroku-style Redis hostname (`redis-XXXX.example.com` → port `XXXX`), or an existing URL, injecting credentials only if not already present. Useful for normalising `REDIS_URL`/`REDIS_HOST` env vars before passing them to `initializeRedis`.\n\n```ts\nconst url = buildRedisUrl(process.env.REDIS_HOST, process.env.REDIS_USER, process.env.REDIS_PASSWORD);\nawait initializeRedis(url);\n```\n\n### Secrets bootstrap\n\n```ts\nimport { bootstrapSecrets } from '@shadimakhoul/ggcoach';\n\nawait bootstrapSecrets('my-service', {\n  secretsServiceUrl: process.env.SECRETS_SERVICE_URL!,\n  internalServiceToken: process.env.INTERNAL_SERVICE_TOKEN,\n  dev: process.env.NODE_ENV === 'development',\n  retries: 3,\n  retryDelayMs: 3000,\n});\n```\n\nFetches secrets for `serviceName` from a central secrets service and populates `process.env` for any key not already set. Fails silently (after exhausting `retries`) so a missing/unreachable secrets service doesn't crash startup — pair with `validateEnvVars` to enforce required vars afterward.\n\n### Env validation\n\n```ts\nimport { validateEnvVars } from '@shadimakhoul/ggcoach';\n\nvalidateEnvVars(['JWT_SECRET', 'REDIS_URL', 'DATABASE_URL']);\n```\n\nThrows (by default) if any required env var is missing, logging each missing key at `crit` level first. Pass `throwOnMissing = false` to log a `warn` and return `false` instead of throwing.\n\n---\n\n## Logger\n\nWinston logger pre-configured with console + file transports, custom levels (`alert` > `crit` > `error` > `warn` > `info`), and optional Telegram alerting.\n\n```ts\nimport { logger, initLogger, stream } from '@shadimakhoul/ggcoach';\n\nlogger.info('Server started');\nlogger.warn('Something looks off');\nlogger.error('Something failed', { error });\nlogger.crit('Critical failure', { error });\nlogger.alert('Page someone now');\n```\n\nThe default export `logger` lazily initializes on first use (writing to `./logs/combined.log` and `./logs/error.log`, log level from `LOG_LEVEL` env var, default `info`). Call `initLogger(logsDir?, telegramConfig?)` explicitly if you need a custom logs directory or to configure Telegram before the first log call.\n\n### Telegram alerting\n\nIf `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` are set in the environment, `alert`/`crit`/`error` level logs are automatically forwarded to Telegram — no code changes needed. Per-level chat IDs fall back to `TELEGRAM_CHAT_ID` if unset:\n\n```bash\nTELEGRAM_BOT_TOKEN=...\nTELEGRAM_CHAT_ID=...           # default fallback chat\nTELEGRAM_ALERT_CHAT_ID=...     # optional override for `alert` level\nTELEGRAM_CRIT_CHAT_ID=...      # optional override for `crit` level\nTELEGRAM_ERROR_CHAT_ID=...     # optional override for `error` level\n```\n\nOr configure it explicitly instead of via env vars:\n\n```ts\ninitLogger(undefined, {\n  botToken: process.env.TELEGRAM_BOT_TOKEN!,\n  chatIds: { alert: '...', crit: '...', error: '...' },\n});\n```\n\n### `stream`\n\nAdapter for Morgan (or any logger expecting a `{ write(message) }` stream); used internally by `initExpress`.\n\n---\n\n## Types\n\nKey types exported from the package:\n\n| Type | Description |\n|---|---|\n| `JWTConfig` | Config object for all JWT helpers |\n| `BaseJWTPayload` | Minimum payload shape — extend for your project |\n| `JWTPayload` | ggCoach-specific payload extending `BaseJWTPayload` |\n| `UserAttributes` | Full ggCoach user model shape |\n| `UserCreationAttributes` | `UserAttributes` minus auto-generated fields |\n| `AuthResponse` | Standard auth endpoint response envelope |\n| `AccountType` | Enum: `Client`, `Provider`, `Admin`, `SuperAdmin` |\n| `IApiResponse<T>` | Generic `{ success, data?, message?, error?, meta? }` response envelope |\n| `IAdminUser` | Admin dashboard user shape |\n| `IPermission` | Permission record shape |\n| `IAppRole` | Role record shape (name, permissions, active users count) |\n| `IPaginationQuery` | Standard `page`/`limit`/`sortBy`/`sortOrder`/`search` query shape |\n| `OpenApiSpec`, `OpenApiPaths`, `TagResolver`, `BuildOptions`, `Endpoint`, `SchemaMap` | Supporting types for [`buildOpenApiSpecFromExpress`](#openapi--swagger) |\n\n`Express.Request` is also augmented globally with an optional `user?: JWTPayload` field.\n\n---\n\n## Publishing\n\n```bash\nnpm run build       # compile TypeScript to dist/\nnpm publish         # runs build first via prepublishOnly\n```\n","readmeFilename":"README.md"}