{"_id":"@emeritus-engineering/growth-platform-core","_rev":"6-a3df614b3f7480366c0f49e1865f2004","name":"@emeritus-engineering/growth-platform-core","dist-tags":{"latest":"1.0.0"},"versions":{"0.1.0":{"name":"@emeritus-engineering/growth-platform-core","version":"0.1.0","license":"Proprietary","_id":"@emeritus-engineering/growth-platform-core@0.1.0","maintainers":[{"name":"omprakash.kannusami","email":"om.prakashkannusami@emeritus.org"},{"name":"sbehak","email":"santiago.behak@Emeritus.org"},{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},{"name":"harsha_emeritus","email":"harshavardhanan.kg@emeritus.org"}],"dist":{"shasum":"dd6519a5bbe37b7bc5b8a49a45000b39f95cc214","tarball":"https://registry.npmjs.org/@emeritus-engineering/growth-platform-core/-/growth-platform-core-0.1.0.tgz","fileCount":28,"integrity":"sha512-4ppcWs3TG0dF7LoDHPCZg8hPIhx8vbp+s0U1sScA0YSTJlCwmwBOnJZtRBostVACEW46NleUINuT2YqvM636xQ==","signatures":[{"sig":"MEYCIQDTCPHjnfUsZzU+ZwcgdPIgNKKVvRvlI9JyMxgPzjHnyQIhALjkS5ZiAlPYaYvB1CLdgdPDCpLEQ5TWxAvEN2bpPq2I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":564272},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.18.0"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.js","require":"./dist/index.cjs"},"./auth":{"types":{"import":"./dist/auth/index.d.ts","require":"./dist/auth/index.d.cts"},"import":"./dist/auth/index.js","require":"./dist/auth/index.cjs"},"./white-label":{"types":{"import":"./dist/white-label/index.d.ts","require":"./dist/white-label/index.d.cts"},"import":"./dist/white-label/index.js","require":"./dist/white-label/index.cjs"},"./rate-limiter":{"types":{"import":"./dist/rate-limiter/index.d.ts","require":"./dist/rate-limiter/index.d.cts"},"import":"./dist/rate-limiter/index.js","require":"./dist/rate-limiter/index.cjs"}},"gitHead":"5a17771823aa6ad80b17533face5304b3d60b7f7","scripts":{"build":"npm run sync:white-label && tsup && node ../../../scripts/copy-white-label-dist.mjs","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build","sync:white-label":"node ../../../scripts/sync-white-label-data.mjs"},"_npmUser":{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},"_npmVersion":"11.11.0","description":"Modular Growth Platform utilities: rate limiting, Keycloak auth, and white-label theme data.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"jose":"^6.2.3"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","axios":"^1.7.0","typescript":"^5.9.0","@types/node":"^20.19.0","@nestjs/core":"^11.1.16","@nestjs/axios":"^4.0.1","@nestjs/common":"^11.1.16","@nestjs/config":"^4.0.3","reflect-metadata":"^0.2.2","@nestjs/throttler":"^6.5.0"},"peerDependencies":{"rxjs":"^7.0.0","axios":"^1.0.0","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/axios":"^4.0.0","@nestjs/common":"^10.0.0 || ^11.0.0","@nestjs/config":"^3.0.0 || ^4.0.0","reflect-metadata":"^0.2.0","@nestjs/throttler":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/growth-platform-core_0.1.0_1778662554021_0.275145247825626","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@emeritus-engineering/growth-platform-core","version":"0.1.1","license":"Proprietary","_id":"@emeritus-engineering/growth-platform-core@0.1.1","maintainers":[{"name":"omprakash.kannusami","email":"om.prakashkannusami@emeritus.org"},{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},{"name":"aditya_vyas","email":"aditya.vyas@emeritus.org"}],"dist":{"shasum":"26b1eeb673447b23d62b119df9fe97491da25c60","tarball":"https://registry.npmjs.org/@emeritus-engineering/growth-platform-core/-/growth-platform-core-0.1.1.tgz","fileCount":28,"integrity":"sha512-KseFtFDT4QqVrnoom4WB0f4l+pvKrqumYojSpI8L90NNbwhQNce6IkyxYlGknSDnT+rFuIHU1Z4JkiFV69+rQQ==","signatures":[{"sig":"MEUCIQDqiVHPVF+aseVw91uLJ57arSJp7m2oVPAHQPBPNsF42QIgV8Ho3T/3Esna/QTgj3vPB0JLe3ysy0WhewKOjXai8LA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":769794},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.18.0"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.js","require":"./dist/index.cjs"},"./auth":{"types":{"import":"./dist/auth/index.d.ts","require":"./dist/auth/index.d.cts"},"import":"./dist/auth/index.js","require":"./dist/auth/index.cjs"},"./white-label":{"types":{"import":"./dist/white-label/index.d.ts","require":"./dist/white-label/index.d.cts"},"import":"./dist/white-label/index.js","require":"./dist/white-label/index.cjs"},"./rate-limiter":{"types":{"import":"./dist/rate-limiter/index.d.ts","require":"./dist/rate-limiter/index.d.cts"},"import":"./dist/rate-limiter/index.js","require":"./dist/rate-limiter/index.cjs"}},"gitHead":"23cf6df4f895c1a5aa66db4cbdf8db56b4a5d732","scripts":{"build":"npm run sync:white-label && tsup && node ../../../scripts/copy-white-label-dist.mjs","clean":"rm -rf dist","prepublishOnly":"yarn clean && yarn build","sync:white-label":"node ../../../scripts/sync-white-label-data.mjs"},"_npmUser":{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},"_npmVersion":"11.12.1","description":"Modular Growth Platform utilities: rate limiting, Keycloak auth, and white-label theme data.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jose":"^6.2.3"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","axios":"^1.7.0","@swc/core":"^1.15.40","typescript":"^5.9.0","@types/node":"^20.19.0","@nestjs/core":"^11.1.16","@nestjs/axios":"^4.0.1","@nestjs/common":"^11.1.16","@nestjs/config":"^4.0.3","reflect-metadata":"^0.2.2","@nestjs/throttler":"^6.5.0"},"peerDependencies":{"rxjs":"^7.0.0","axios":"^1.0.0","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/axios":"^4.0.0","@nestjs/common":"^10.0.0 || ^11.0.0","@nestjs/config":"^3.0.0 || ^4.0.0","reflect-metadata":"^0.2.0","@nestjs/throttler":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/growth-platform-core_0.1.1_1779777089865_0.7674544559538803","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@emeritus-engineering/growth-platform-core","version":"0.1.2","license":"Proprietary","_id":"@emeritus-engineering/growth-platform-core@0.1.2","maintainers":[{"name":"omprakash.kannusami","email":"om.prakashkannusami@emeritus.org"},{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},{"name":"aditya_vyas","email":"aditya.vyas@emeritus.org"}],"dist":{"shasum":"3a4c56a2d5718fa2fa0f4c57318ccd908bc1f39a","tarball":"https://registry.npmjs.org/@emeritus-engineering/growth-platform-core/-/growth-platform-core-0.1.2.tgz","fileCount":28,"integrity":"sha512-RIakbzGPvdeCo4Nme6QTRMaSZWOJ9X6J0TWoFe/cPUSK6Z2Mv5+ZdxTPJYvMf1X0LLx4OBq+qXecXDR2m4oO0g==","signatures":[{"sig":"MEUCIGaAgN9eMohh4njVtl3TQfQ8H3Jjxj+iIt+t/p6f6j0TAiEA7qLad0PjS4oNWG9lvlHodjqljkt0udql480wmaq1V9s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":784531},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.18.0"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.js","require":"./dist/index.cjs"},"./auth":{"types":{"import":"./dist/auth/index.d.ts","require":"./dist/auth/index.d.cts"},"import":"./dist/auth/index.js","require":"./dist/auth/index.cjs"},"./white-label":{"types":{"import":"./dist/white-label/index.d.ts","require":"./dist/white-label/index.d.cts"},"import":"./dist/white-label/index.js","require":"./dist/white-label/index.cjs"},"./rate-limiter":{"types":{"import":"./dist/rate-limiter/index.d.ts","require":"./dist/rate-limiter/index.d.cts"},"import":"./dist/rate-limiter/index.js","require":"./dist/rate-limiter/index.cjs"}},"gitHead":"c46e8b35376ce16676af2699bacac28eac4ba74e","scripts":{"build":"npm run sync:white-label && tsup && node ../../../scripts/copy-white-label-dist.mjs","clean":"rm -rf dist","prepublishOnly":"yarn clean && yarn build","sync:white-label":"node ../../../scripts/sync-white-label-data.mjs"},"_npmUser":{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},"_npmVersion":"11.12.1","description":"Modular Growth Platform utilities: rate limiting, Keycloak auth, and white-label theme data.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"jose":"^6.2.3"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","axios":"^1.7.0","@swc/core":"^1.15.40","typescript":"^5.9.0","@types/node":"^20.19.0","@nestjs/core":"^11.1.16","@nestjs/axios":"^4.0.1","@nestjs/common":"^11.1.16","@nestjs/config":"^4.0.3","reflect-metadata":"^0.2.2","@nestjs/throttler":"^6.5.0"},"peerDependencies":{"rxjs":"^7.0.0","axios":"^1.0.0","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/axios":"^4.0.0","@nestjs/common":"^10.0.0 || ^11.0.0","@nestjs/config":"^3.0.0 || ^4.0.0","reflect-metadata":"^0.2.0","@nestjs/throttler":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/growth-platform-core_0.1.2_1779783968994_0.7899400862105181","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@emeritus-engineering/growth-platform-core","version":"0.1.3","license":"Proprietary","_id":"@emeritus-engineering/growth-platform-core@0.1.3","maintainers":[{"name":"omprakash.kannusami","email":"om.prakashkannusami@emeritus.org"},{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},{"name":"aditya_vyas","email":"aditya.vyas@emeritus.org"}],"dist":{"shasum":"7e58a7ae8ec8ea1b6e92df7140fbbb20c7838fb2","tarball":"https://registry.npmjs.org/@emeritus-engineering/growth-platform-core/-/growth-platform-core-0.1.3.tgz","fileCount":28,"integrity":"sha512-l+6g8ddFt9zhwMVY3bdNUAddVEOCqQzH30lrJYsy75jLQ7TZYMMtkLI2LL+QXhm1j27uljvplzb9eatMzOeR/g==","signatures":[{"sig":"MEQCIAqlK/dDZYJ2DTrUTjhj6kHtLwYZKM98CbZ1ENfhGFq0AiBKceMUCQ1HY77STo1AUA0bHBp+rTeK0tUvxFCYTFCD9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":785769},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.18.0"},"exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.js","require":"./dist/index.cjs"},"./auth":{"types":{"import":"./dist/auth/index.d.ts","require":"./dist/auth/index.d.cts"},"import":"./dist/auth/index.js","require":"./dist/auth/index.cjs"},"./white-label":{"types":{"import":"./dist/white-label/index.d.ts","require":"./dist/white-label/index.d.cts"},"import":"./dist/white-label/index.js","require":"./dist/white-label/index.cjs"},"./rate-limiter":{"types":{"import":"./dist/rate-limiter/index.d.ts","require":"./dist/rate-limiter/index.d.cts"},"import":"./dist/rate-limiter/index.js","require":"./dist/rate-limiter/index.cjs"}},"gitHead":"79f7d60e719e7110ec77c46510fab8602cdd235c","scripts":{"build":"npm run sync:white-label && tsup && node ../../../scripts/copy-white-label-dist.mjs","clean":"rm -rf dist","prepublishOnly":"yarn clean && yarn build","sync:white-label":"node ../../../scripts/sync-white-label-data.mjs"},"_npmUser":{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},"_npmVersion":"11.16.0","description":"Modular Growth Platform utilities: rate limiting, Keycloak auth, and white-label theme data.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"jose":"^6.2.3"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","axios":"^1.7.0","@swc/core":"^1.15.40","typescript":"^5.9.0","@types/node":"^20.19.0","@nestjs/core":"^11.1.16","@nestjs/axios":"^4.0.1","@nestjs/common":"^11.1.16","@nestjs/config":"^4.0.3","reflect-metadata":"^0.2.2","@nestjs/throttler":"^6.5.0"},"peerDependencies":{"rxjs":"^7.0.0","axios":"^1.0.0","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/axios":"^4.0.0","@nestjs/common":"^10.0.0 || ^11.0.0","@nestjs/config":"^3.0.0 || ^4.0.0","reflect-metadata":"^0.2.0","@nestjs/throttler":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/growth-platform-core_0.1.3_1785752652027_0.9307266372038385","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@emeritus-engineering/growth-platform-core","version":"1.0.0","description":"Modular Growth Platform utilities: rate limiting, Keycloak auth, and white-label theme data.","license":"Proprietary","type":"module","sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":{"import":"./dist/index.d.ts","require":"./dist/index.d.cts"},"import":"./dist/index.js","require":"./dist/index.cjs"},"./rate-limiter":{"types":{"import":"./dist/rate-limiter/index.d.ts","require":"./dist/rate-limiter/index.d.cts"},"import":"./dist/rate-limiter/index.js","require":"./dist/rate-limiter/index.cjs"},"./auth":{"types":{"import":"./dist/auth/index.d.ts","require":"./dist/auth/index.d.cts"},"import":"./dist/auth/index.js","require":"./dist/auth/index.cjs"},"./white-label":{"types":{"import":"./dist/white-label/index.d.ts","require":"./dist/white-label/index.d.cts"},"import":"./dist/white-label/index.js","require":"./dist/white-label/index.cjs"}},"scripts":{"sync:white-label":"node ../../../scripts/sync-white-label-data.mjs","build":"npm run sync:white-label && tsup && node ../../../scripts/copy-white-label-dist.mjs","clean":"rm -rf dist","prepublishOnly":"yarn clean && yarn build","release":"semantic-release"},"peerDependencies":{"@nestjs/axios":"^4.0.0","@nestjs/common":"^10.0.0 || ^11.0.0","@nestjs/config":"^3.0.0 || ^4.0.0","@nestjs/core":"^10.0.0 || ^11.0.0","@nestjs/throttler":"^6.0.0","axios":"^1.0.0","reflect-metadata":"^0.2.0","rxjs":"^7.0.0"},"devDependencies":{"@types/node":"^20.19.0","@nestjs/axios":"^4.0.1","@nestjs/common":"^11.1.16","@nestjs/config":"^4.0.3","@nestjs/core":"^11.1.16","@nestjs/throttler":"^6.5.0","@swc/core":"^1.15.40","axios":"^1.7.0","reflect-metadata":"^0.2.2","rxjs":"^7.8.0","@semantic-release/changelog":"^6.0.3","@semantic-release/git":"^10.0.1","conventional-changelog-conventionalcommits":"^8.0.0","semantic-release":"^24.2.3","tsup":"^8.5.0","typescript":"^5.9.0"},"engines":{"node":">=18.18.0"},"dependencies":{"jose":"^6.2.3"},"_id":"@emeritus-engineering/growth-platform-core@1.0.0","gitHead":"b94391be7f05810f98d09c1fd0a742e39ea2a73c","_nodeVersion":"24.18.0","_npmVersion":"10.9.9","dist":{"integrity":"sha512-7+3nmF1EYuwBwW9RzrehBE6M7bkChfFc8cWUsAKDo+ZrX+/0t3zdLrzgQB4ZjVtsm2v7D14YB3woHNhbXQIzEw==","shasum":"50389b7764d7fbb1768cee8a26a01754be611a41","tarball":"https://registry.npmjs.org/@emeritus-engineering/growth-platform-core/-/growth-platform-core-1.0.0.tgz","fileCount":28,"unpackedSize":787368,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDqDON4YbpoXBaoxH53U8PRAn6JvD3b86OAcC1kXhKMaAiBSBZEGebbd/vztdMU5qv7vCmHMDBcg/MjvoqWDK5OeEQ=="}]},"_npmUser":{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},"directories":{},"maintainers":[{"name":"omprakash.kannusami","email":"om.prakashkannusami@emeritus.org"},{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},{"name":"aditya_vyas","email":"aditya.vyas@emeritus.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/growth-platform-core_1.0.0_1785753759336_0.12160015941789637"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-13T08:55:53.787Z","modified":"2026-08-03T10:42:39.752Z","0.1.0":"2026-05-13T08:55:54.217Z","0.1.1":"2026-05-26T06:31:30.046Z","0.1.2":"2026-05-26T08:26:09.191Z","0.1.3":"2026-08-03T10:24:12.214Z","1.0.0":"2026-08-03T10:42:39.520Z"},"license":"Proprietary","description":"Modular Growth Platform utilities: rate limiting, Keycloak auth, and white-label theme data.","maintainers":[{"name":"omprakash.kannusami","email":"om.prakashkannusami@emeritus.org"},{"name":"malarvizhi_anandaselvakumar","email":"malarvizhi.anandaselvakumar@emeritus.org"},{"name":"aditya_vyas","email":"aditya.vyas@emeritus.org"}],"readme":"# @emeritus-engineering/growth-platform-core\n\nNestJS package for Growth Platform Core auth, rate limiting, and white-label theme data.\n\n## Install\n\n```bash\nyarn add @emeritus-engineering/growth-platform-core\n```\n\nPeer dependencies:\n\n```text\n@nestjs/common\n@nestjs/core\n@nestjs/config\n@nestjs/throttler\n@nestjs/axios\naxios\nrxjs\nreflect-metadata\n```\n\n## Imports\n\n```ts\nimport {\n  KeycloakAuthModule,\n  KeycloakAuthGuard,\n  RolesGuard,\n  Roles,\n  Public,\n  Role\n} from '@emeritus-engineering/growth-platform-core/auth'\n\nimport {\n  RateLimiterModule,\n  RateLimitGuard,\n  ApiThrottleMiddleware,\n  API_THROTTLE_REDIS_CLIENT\n} from '@emeritus-engineering/growth-platform-core/rate-limiter'\n\nimport {\n  WHITE,\n  WhiteLabelColorValue,\n  getWhiteLabelTheme\n} from '@emeritus-engineering/growth-platform-core/white-label'\n```\n\nThe package root re-exports the same symbols for convenience; subpath imports are preferred for tree-shaking.\n\n## Keycloak Auth\n\n### Introspection mode (default)\n\n```ts\nKeycloakAuthModule.forRoot({\n  validationMode: 'introspection',\n  keycloakBaseUrl: process.env.KEYCLOAK_BASE_URL,\n  keycloakRealm: process.env.KEYCLOAK_REALM,\n  clients: [{ clientId: 'growth-api', clientSecret: process.env.KEYCLOAK_GROWTH_SECRET! }],\n  authBypassHeaders: [\n    { headerName: 'x-internal-api-key', expectedValueConfigKey: 'INTERNAL_API_SECRET' }\n  ]\n})\n```\n\n### JWKS mode\n\n```ts\nKeycloakAuthModule.forRoot({\n  validationMode: 'jwks',\n  keycloakBaseUrl: process.env.KEYCLOAK_BASE_URL,\n  keycloakRealm: process.env.KEYCLOAK_REALM,\n  audience: 'growth-api'\n  // jwksUrl / issuer optional; built from baseUrl + realm when omitted\n})\n```\n\nSet `verifyIssuer: false` (or `KEYCLOAK_VERIFY_ISSUER=false`) to disable the `iss` claim check while keeping signature, expiry, and audience checks. Default is `true`.\n\n`@nestjs/jose` is loaded dynamically; no extra peer dependency required (the package depends on `jose` directly).\n\n### Async config from `ConfigService`\n\n```ts\nKeycloakAuthModule.forRootAsync({\n  imports: [ConfigModule],\n  inject: [ConfigService],\n  useFactory: (config: ConfigService) => ({\n    validationMode: config.get('KEYCLOAK_VALIDATION_MODE', 'introspection'),\n    keycloakBaseUrl: config.getOrThrow('KEYCLOAK_BASE_URL'),\n    keycloakRealm: config.getOrThrow('KEYCLOAK_REALM'),\n    isAuthDisabled: config.get<boolean>('IS_KEYCLOAK_AUTH_DISABLED', false)\n  })\n})\n```\n\n`configKeys` lets you map non-default env names; see `KeycloakAuthConfigKeys` in the public types.\n\n## Rate Limiting\n\n### Nest ThrottlerModule wrapper\n\n```ts\nRateLimiterModule.forRoot({\n  throttlers: [{ name: 'default', ttl: 60_000, limit: 100 }]\n})\n```\n\nProvides `RateLimitGuard` (alias for `ThrottlerGuard`) and `RateLimiterService` (imperative storage access).\n\n### Growth-style API throttle middleware\n\n```ts\nRateLimiterModule.forApiThrottle({\n  configKey: 'API_THROTTLE_CONFIG',\n  redisClientProvider: {\n    provide: API_THROTTLE_REDIS_CLIENT,\n    useExisting: RedisService\n  }\n})\n```\n\nApply `ApiThrottleMiddleware` with Nest's `MiddlewareConsumer`:\n\n```ts\nconfigure(consumer: MiddlewareConsumer) {\n  consumer.apply(ApiThrottleMiddleware).forRoutes('*')\n}\n```\n\nSet `API_THROTTLE_CONFIG` (JSON in env or object via `config`) with this shape:\n\n```json\n{\n  \"enableRateLimit\": true,\n  \"global\": { \"limit\": 100, \"cooldown\": 60 },\n  \"excludeIps\": [\"127.0.0.1\"],\n  \"excludedPaths\": [\"/health\"],\n  \"apiLimits\": {\n    \"/growth/api/v1/programs/:id\": { \"limit\": 10, \"cooldown\": 60 }\n  },\n  \"dynamicRules\": [\n    { \"headerKey\": \"x-client-type\", \"value\": \"partner\", \"limit\": 20, \"cooldown\": 60 }\n  ]\n}\n```\n\n`cooldown` is in seconds. Limit breaches throw `ApiRateLimitExceededError` (HTTP 429 with diagnostic metadata).\n\nThe Redis client provided to `API_THROTTLE_REDIS_CLIENT` must implement `hget`, `hset`, `hdel`, `hgetall`, and `multi`.\n\n## White-label\n\n```ts\nconst emeritusTheme = getWhiteLabelTheme('emeritus')\nconst white = WHITE\nconst allThemes = WhiteLabelColorValue\n```\n\n## Build\n\n```bash\nnpm install\nnpm run build\n```\n\nOutputs ESM + CJS bundles under `dist/`. Decorator metadata (required for Nest DI) is emitted via `tsup`'s swc plugin (`@swc/core` is a dev dependency).\n","readmeFilename":"README.md"}