@pawells/nestjs-auth 1.0.0-dev.3052c75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +602 -0
  3. package/build/LICENSE +21 -0
  4. package/build/README.md +602 -0
  5. package/build/admin/client/client.d.ts +82 -0
  6. package/build/admin/client/client.d.ts.map +1 -0
  7. package/build/admin/client/client.js +157 -0
  8. package/build/admin/client/client.js.map +1 -0
  9. package/build/admin/client/errors/base-error.d.ts +58 -0
  10. package/build/admin/client/errors/base-error.d.ts.map +1 -0
  11. package/build/admin/client/errors/base-error.js +100 -0
  12. package/build/admin/client/errors/base-error.js.map +1 -0
  13. package/build/admin/client/errors/index.d.ts +2 -0
  14. package/build/admin/client/errors/index.d.ts.map +1 -0
  15. package/build/admin/client/errors/index.js +2 -0
  16. package/build/admin/client/errors/index.js.map +1 -0
  17. package/build/admin/client/index.d.ts +6 -0
  18. package/build/admin/client/index.d.ts.map +1 -0
  19. package/build/admin/client/index.js +11 -0
  20. package/build/admin/client/index.js.map +1 -0
  21. package/build/admin/client/services/authentication.service.d.ts +54 -0
  22. package/build/admin/client/services/authentication.service.d.ts.map +1 -0
  23. package/build/admin/client/services/authentication.service.js +99 -0
  24. package/build/admin/client/services/authentication.service.js.map +1 -0
  25. package/build/admin/client/services/base-service.d.ts +39 -0
  26. package/build/admin/client/services/base-service.d.ts.map +1 -0
  27. package/build/admin/client/services/base-service.js +107 -0
  28. package/build/admin/client/services/base-service.js.map +1 -0
  29. package/build/admin/client/services/client.service.d.ts +86 -0
  30. package/build/admin/client/services/client.service.d.ts.map +1 -0
  31. package/build/admin/client/services/client.service.js +193 -0
  32. package/build/admin/client/services/client.service.js.map +1 -0
  33. package/build/admin/client/services/event.service.d.ts +84 -0
  34. package/build/admin/client/services/event.service.d.ts.map +1 -0
  35. package/build/admin/client/services/event.service.js +155 -0
  36. package/build/admin/client/services/event.service.js.map +1 -0
  37. package/build/admin/client/services/federated-identity.service.d.ts +89 -0
  38. package/build/admin/client/services/federated-identity.service.d.ts.map +1 -0
  39. package/build/admin/client/services/federated-identity.service.js +120 -0
  40. package/build/admin/client/services/federated-identity.service.js.map +1 -0
  41. package/build/admin/client/services/group.service.d.ts +52 -0
  42. package/build/admin/client/services/group.service.d.ts.map +1 -0
  43. package/build/admin/client/services/group.service.js +105 -0
  44. package/build/admin/client/services/group.service.js.map +1 -0
  45. package/build/admin/client/services/identity-provider.service.d.ts +47 -0
  46. package/build/admin/client/services/identity-provider.service.d.ts.map +1 -0
  47. package/build/admin/client/services/identity-provider.service.js +86 -0
  48. package/build/admin/client/services/identity-provider.service.js.map +1 -0
  49. package/build/admin/client/services/index.d.ts +11 -0
  50. package/build/admin/client/services/index.d.ts.map +1 -0
  51. package/build/admin/client/services/index.js +11 -0
  52. package/build/admin/client/services/index.js.map +1 -0
  53. package/build/admin/client/services/realm.service.d.ts +41 -0
  54. package/build/admin/client/services/realm.service.d.ts.map +1 -0
  55. package/build/admin/client/services/realm.service.js +80 -0
  56. package/build/admin/client/services/realm.service.js.map +1 -0
  57. package/build/admin/client/services/role.service.d.ts +45 -0
  58. package/build/admin/client/services/role.service.d.ts.map +1 -0
  59. package/build/admin/client/services/role.service.js +92 -0
  60. package/build/admin/client/services/role.service.js.map +1 -0
  61. package/build/admin/client/services/user.service.d.ts +84 -0
  62. package/build/admin/client/services/user.service.d.ts.map +1 -0
  63. package/build/admin/client/services/user.service.js +216 -0
  64. package/build/admin/client/services/user.service.js.map +1 -0
  65. package/build/admin/client/types/config.types.d.ts +59 -0
  66. package/build/admin/client/types/config.types.d.ts.map +1 -0
  67. package/build/admin/client/types/config.types.js +13 -0
  68. package/build/admin/client/types/config.types.js.map +1 -0
  69. package/build/admin/client/types/event.types.d.ts +176 -0
  70. package/build/admin/client/types/event.types.d.ts.map +1 -0
  71. package/build/admin/client/types/event.types.js +2 -0
  72. package/build/admin/client/types/event.types.js.map +1 -0
  73. package/build/admin/client/types/index.d.ts +4 -0
  74. package/build/admin/client/types/index.d.ts.map +1 -0
  75. package/build/admin/client/types/index.js +4 -0
  76. package/build/admin/client/types/index.js.map +1 -0
  77. package/build/admin/client/types/keycloak.types.d.ts +169 -0
  78. package/build/admin/client/types/keycloak.types.d.ts.map +1 -0
  79. package/build/admin/client/types/keycloak.types.js +2 -0
  80. package/build/admin/client/types/keycloak.types.js.map +1 -0
  81. package/build/admin/client/utils/index.d.ts +2 -0
  82. package/build/admin/client/utils/index.d.ts.map +1 -0
  83. package/build/admin/client/utils/index.js +2 -0
  84. package/build/admin/client/utils/index.js.map +1 -0
  85. package/build/admin/client/utils/retry.d.ts +40 -0
  86. package/build/admin/client/utils/retry.d.ts.map +1 -0
  87. package/build/admin/client/utils/retry.js +72 -0
  88. package/build/admin/client/utils/retry.js.map +1 -0
  89. package/build/admin/config/keycloak.config.d.ts +33 -0
  90. package/build/admin/config/keycloak.config.d.ts.map +1 -0
  91. package/build/admin/config/keycloak.config.js +2 -0
  92. package/build/admin/config/keycloak.config.js.map +1 -0
  93. package/build/admin/config/keycloak.defaults.d.ts +11 -0
  94. package/build/admin/config/keycloak.defaults.d.ts.map +1 -0
  95. package/build/admin/config/keycloak.defaults.js +60 -0
  96. package/build/admin/config/keycloak.defaults.js.map +1 -0
  97. package/build/admin/health/keycloak.health.d.ts +13 -0
  98. package/build/admin/health/keycloak.health.d.ts.map +1 -0
  99. package/build/admin/health/keycloak.health.js +54 -0
  100. package/build/admin/health/keycloak.health.js.map +1 -0
  101. package/build/admin/index.d.ts +10 -0
  102. package/build/admin/index.d.ts.map +1 -0
  103. package/build/admin/index.js +9 -0
  104. package/build/admin/index.js.map +1 -0
  105. package/build/admin/keycloak-admin.interfaces.d.ts +45 -0
  106. package/build/admin/keycloak-admin.interfaces.d.ts.map +1 -0
  107. package/build/admin/keycloak-admin.interfaces.js +2 -0
  108. package/build/admin/keycloak-admin.interfaces.js.map +1 -0
  109. package/build/admin/keycloak-admin.module.d.ts +23 -0
  110. package/build/admin/keycloak-admin.module.d.ts.map +1 -0
  111. package/build/admin/keycloak-admin.module.js +101 -0
  112. package/build/admin/keycloak-admin.module.js.map +1 -0
  113. package/build/admin/keycloak.constants.d.ts +16 -0
  114. package/build/admin/keycloak.constants.d.ts.map +1 -0
  115. package/build/admin/keycloak.constants.js +16 -0
  116. package/build/admin/keycloak.constants.js.map +1 -0
  117. package/build/admin/permissions/index.d.ts +2 -0
  118. package/build/admin/permissions/index.d.ts.map +1 -0
  119. package/build/admin/permissions/index.js +2 -0
  120. package/build/admin/permissions/index.js.map +1 -0
  121. package/build/admin/permissions/keycloak-admin.permissions.d.ts +45 -0
  122. package/build/admin/permissions/keycloak-admin.permissions.d.ts.map +1 -0
  123. package/build/admin/permissions/keycloak-admin.permissions.js +68 -0
  124. package/build/admin/permissions/keycloak-admin.permissions.js.map +1 -0
  125. package/build/admin/services/keycloak-admin.service.d.ts +64 -0
  126. package/build/admin/services/keycloak-admin.service.d.ts.map +1 -0
  127. package/build/admin/services/keycloak-admin.service.js +152 -0
  128. package/build/admin/services/keycloak-admin.service.js.map +1 -0
  129. package/build/decorators/auth-decorators.d.ts +217 -0
  130. package/build/decorators/auth-decorators.d.ts.map +1 -0
  131. package/build/decorators/auth-decorators.js +251 -0
  132. package/build/decorators/auth-decorators.js.map +1 -0
  133. package/build/decorators/context-utils.d.ts +101 -0
  134. package/build/decorators/context-utils.d.ts.map +1 -0
  135. package/build/decorators/context-utils.js +178 -0
  136. package/build/decorators/context-utils.js.map +1 -0
  137. package/build/decorators/graphql-auth-decorators.d.ts +144 -0
  138. package/build/decorators/graphql-auth-decorators.d.ts.map +1 -0
  139. package/build/decorators/graphql-auth-decorators.js +152 -0
  140. package/build/decorators/graphql-auth-decorators.js.map +1 -0
  141. package/build/decorators/index.d.ts +5 -0
  142. package/build/decorators/index.d.ts.map +1 -0
  143. package/build/decorators/index.js +4 -0
  144. package/build/decorators/index.js.map +1 -0
  145. package/build/guards/index.d.ts +4 -0
  146. package/build/guards/index.d.ts.map +1 -0
  147. package/build/guards/index.js +4 -0
  148. package/build/guards/index.js.map +1 -0
  149. package/build/guards/jwt-auth.guard.d.ts +52 -0
  150. package/build/guards/jwt-auth.guard.d.ts.map +1 -0
  151. package/build/guards/jwt-auth.guard.js +97 -0
  152. package/build/guards/jwt-auth.guard.js.map +1 -0
  153. package/build/guards/permission.guard.d.ts +37 -0
  154. package/build/guards/permission.guard.d.ts.map +1 -0
  155. package/build/guards/permission.guard.js +73 -0
  156. package/build/guards/permission.guard.js.map +1 -0
  157. package/build/guards/role.guard.d.ts +33 -0
  158. package/build/guards/role.guard.d.ts.map +1 -0
  159. package/build/guards/role.guard.js +69 -0
  160. package/build/guards/role.guard.js.map +1 -0
  161. package/build/index.d.ts +92 -0
  162. package/build/index.d.ts.map +1 -0
  163. package/build/index.js +98 -0
  164. package/build/index.js.map +1 -0
  165. package/build/keycloak/index.d.ts +7 -0
  166. package/build/keycloak/index.d.ts.map +1 -0
  167. package/build/keycloak/index.js +5 -0
  168. package/build/keycloak/index.js.map +1 -0
  169. package/build/keycloak/keycloak.constants.d.ts +2 -0
  170. package/build/keycloak/keycloak.constants.d.ts.map +1 -0
  171. package/build/keycloak/keycloak.constants.js +2 -0
  172. package/build/keycloak/keycloak.constants.js.map +1 -0
  173. package/build/keycloak/keycloak.interfaces.d.ts +12 -0
  174. package/build/keycloak/keycloak.interfaces.d.ts.map +1 -0
  175. package/build/keycloak/keycloak.interfaces.js +2 -0
  176. package/build/keycloak/keycloak.interfaces.js.map +1 -0
  177. package/build/keycloak/keycloak.module.d.ts +56 -0
  178. package/build/keycloak/keycloak.module.d.ts.map +1 -0
  179. package/build/keycloak/keycloak.module.js +104 -0
  180. package/build/keycloak/keycloak.module.js.map +1 -0
  181. package/build/keycloak/keycloak.types.d.ts +60 -0
  182. package/build/keycloak/keycloak.types.d.ts.map +1 -0
  183. package/build/keycloak/keycloak.types.js +2 -0
  184. package/build/keycloak/keycloak.types.js.map +1 -0
  185. package/build/keycloak/services/jwks-cache.service.d.ts +64 -0
  186. package/build/keycloak/services/jwks-cache.service.d.ts.map +1 -0
  187. package/build/keycloak/services/jwks-cache.service.js +176 -0
  188. package/build/keycloak/services/jwks-cache.service.js.map +1 -0
  189. package/build/keycloak/services/keycloak-token-validation.service.d.ts +88 -0
  190. package/build/keycloak/services/keycloak-token-validation.service.d.ts.map +1 -0
  191. package/build/keycloak/services/keycloak-token-validation.service.js +243 -0
  192. package/build/keycloak/services/keycloak-token-validation.service.js.map +1 -0
  193. package/build/package.json +72 -0
  194. package/package.json +93 -0
@@ -0,0 +1,243 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var KeycloakTokenValidationService_1;
14
+ import { Injectable, Inject, Optional } from '@nestjs/common';
15
+ import { JwtService } from '@nestjs/jwt';
16
+ import { AppLogger, getErrorMessage, escapeNewlines } from '@pawells/nestjs-shared/common';
17
+ import { KEYCLOAK_MODULE_OPTIONS } from '../keycloak.constants.js';
18
+ import { JwksCacheService } from './jwks-cache.service.js';
19
+ const MS_PER_SECOND = 1000;
20
+ /**
21
+ * Keycloak Token Validation Service
22
+ *
23
+ * Validates JWT tokens issued by Keycloak in two modes:
24
+ * - **Online mode (default)**: Calls Keycloak's token introspection endpoint to validate the token
25
+ * (requires real-time network access to Keycloak)
26
+ * - **Offline mode**: Validates JWTs locally using JWKS (no network call; suitable for high-traffic scenarios)
27
+ *
28
+ * After successful validation, extracts user identity and roles from token claims.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * // Online mode validation
33
+ * const result = await this.validationService.validateToken(token);
34
+ * if (result.valid) {
35
+ * const user = this.validationService.extractUser(result.claims!);
36
+ * }
37
+ *
38
+ * // Offline mode uses JWKS-based verification (faster, no network call)
39
+ * ```
40
+ */
41
+ let KeycloakTokenValidationService = KeycloakTokenValidationService_1 = class KeycloakTokenValidationService {
42
+ logger;
43
+ options;
44
+ jwtService;
45
+ jwksCacheService;
46
+ constructor(options, jwtService, jwksCacheService) {
47
+ this.options = options;
48
+ this.jwtService = jwtService;
49
+ this.jwksCacheService = jwksCacheService;
50
+ this.initializeLogger();
51
+ }
52
+ initializeLogger() {
53
+ try {
54
+ this.logger = new AppLogger(undefined, KeycloakTokenValidationService_1.name);
55
+ }
56
+ catch {
57
+ // Logger unavailable, fall back to console
58
+ }
59
+ }
60
+ /**
61
+ * Validate a JWT token issued by Keycloak
62
+ *
63
+ * Routes to the appropriate validation mode based on configuration:
64
+ * - **Online**: Calls the Keycloak introspection endpoint (requires network access)
65
+ * - **Offline**: Verifies JWT signature using cached JWKS (no network call)
66
+ *
67
+ * Both modes verify token expiration and audience/issuer claims.
68
+ *
69
+ * @param token - The JWT to validate (Bearer token without "Bearer " prefix)
70
+ * @returns Result object with validation status and optional claims on success, or error code on failure
71
+ * @returns `{ valid: true, claims: KeycloakTokenClaims }` on success
72
+ * @returns `{ valid: false, error: string }` on failure (includes error codes like 'token_expired', 'invalid_issuer', etc.)
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * const result = await this.validateToken(jwtToken);
77
+ * if (result.valid && result.claims) {
78
+ * const user = this.extractUser(result.claims);
79
+ * }
80
+ * ```
81
+ */
82
+ async validateToken(token) {
83
+ try {
84
+ const isOfflineMode = this.options.validationMode === 'offline';
85
+ if (isOfflineMode) {
86
+ return await this.validateTokenOffline(token);
87
+ }
88
+ return await this.validateTokenOnline(token);
89
+ }
90
+ catch (error) {
91
+ const errorMessage = getErrorMessage(error);
92
+ this.log('warn', `Token validation failed unexpectedly: ${errorMessage}`);
93
+ return { valid: false, error: 'validation_error' };
94
+ }
95
+ }
96
+ async validateTokenOnline(token) {
97
+ try {
98
+ const introspectionUrl = `${this.options.authServerUrl}/realms/${this.options.realm}/protocol/openid-connect/token/introspect`;
99
+ const body = new URLSearchParams({
100
+ token,
101
+ token_type_hint: 'access_token',
102
+ client_id: this.options.clientId,
103
+ client_secret: this.options.clientSecret ?? '',
104
+ });
105
+ const response = await fetch(introspectionUrl, {
106
+ method: 'POST',
107
+ headers: {
108
+ 'Content-Type': 'application/x-www-form-urlencoded',
109
+ },
110
+ body: body.toString(),
111
+ });
112
+ if (!response.ok) {
113
+ this.log('warn', `Introspection request failed with status ${response.status}`);
114
+ return { valid: false, error: 'introspection_failed' };
115
+ }
116
+ const introspectionResult = await response.json();
117
+ if (introspectionResult.active !== true) {
118
+ return { valid: false, error: 'token_inactive' };
119
+ }
120
+ // Validate audience claim — must match our clientId
121
+ const audiences = Array.isArray(introspectionResult.aud)
122
+ ? introspectionResult.aud
123
+ : [introspectionResult.aud].filter(Boolean);
124
+ if (!audiences.includes(this.options.clientId)) {
125
+ return { valid: false, error: 'invalid_audience' };
126
+ }
127
+ return { valid: true, claims: introspectionResult };
128
+ }
129
+ catch (error) {
130
+ const errorMessage = getErrorMessage(error);
131
+ this.log('warn', `Introspection error: ${errorMessage}`);
132
+ return { valid: false, error: 'introspection_failed' };
133
+ }
134
+ }
135
+ async validateTokenOffline(token) {
136
+ try {
137
+ if (!this.jwksCacheService) {
138
+ return { valid: false, error: 'offline_mode_not_available' };
139
+ }
140
+ // Decode header to get kid
141
+ const decoded = this.jwtService.decode(token, { complete: true });
142
+ if (!decoded?.header?.kid) {
143
+ return { valid: false, error: 'missing_kid' };
144
+ }
145
+ // Get public key from cache
146
+ let publicKey;
147
+ try {
148
+ publicKey = await this.jwksCacheService.getKey(decoded.header.kid);
149
+ }
150
+ catch (error) {
151
+ const errorMessage = getErrorMessage(error);
152
+ this.log('warn', `Failed to get signing key: ${errorMessage}`);
153
+ return { valid: false, error: 'unknown_signing_key' };
154
+ }
155
+ // Verify JWT
156
+ let claims;
157
+ try {
158
+ claims = this.jwtService.verify(token, {
159
+ publicKey,
160
+ algorithms: ['RS256'],
161
+ });
162
+ }
163
+ catch (error) {
164
+ const errorMessage = getErrorMessage(error);
165
+ this.log('warn', `JWT verification failed: ${errorMessage}`);
166
+ return { valid: false, error: 'jwt_verification_failed' };
167
+ }
168
+ // Validate claims
169
+ const now = Math.floor(Date.now() / MS_PER_SECOND);
170
+ if (claims.exp <= now) {
171
+ return { valid: false, error: 'token_expired' };
172
+ }
173
+ const expectedIssuer = this.options.issuer ?? this.options.authServerUrl;
174
+ if (claims.iss !== expectedIssuer) {
175
+ this.log('warn', `Issuer mismatch: expected ${escapeNewlines(expectedIssuer)}, got ${escapeNewlines(claims.iss)}`);
176
+ return { valid: false, error: 'invalid_issuer' };
177
+ }
178
+ const audience = Array.isArray(claims.aud) ? claims.aud : [claims.aud];
179
+ if (!audience.includes(this.options.clientId)) {
180
+ this.log('warn', `Audience mismatch: clientId ${this.options.clientId} not in ${escapeNewlines(audience.join(','))}`);
181
+ return { valid: false, error: 'invalid_audience' };
182
+ }
183
+ return { valid: true, claims };
184
+ }
185
+ catch (error) {
186
+ const errorMessage = getErrorMessage(error);
187
+ this.log('warn', `Offline validation error: ${errorMessage}`);
188
+ return { valid: false, error: 'validation_failed' };
189
+ }
190
+ }
191
+ /**
192
+ * Extract user identity and roles from validated token claims
193
+ *
194
+ * Maps Keycloak token claims to a simplified `KeycloakUser` object.
195
+ * Extracts both realm-level roles (`realm_access.roles`) and client-specific roles
196
+ * (`resource_access[clientId].roles`).
197
+ *
198
+ * @param claims - The validated Keycloak token claims
199
+ * @returns User object with ID, email, username, name, and both realm and client roles
200
+ *
201
+ * @example
202
+ * ```typescript
203
+ * const user = this.extractUser(claims);
204
+ * // {
205
+ * // id: 'user-uuid',
206
+ * // email: 'user@example.com',
207
+ * // username: 'john_doe',
208
+ * // name: 'John Doe',
209
+ * // realmRoles: ['admin', 'user'],
210
+ * // clientRoles: ['read', 'write']
211
+ * // }
212
+ * ```
213
+ */
214
+ extractUser(claims) {
215
+ return {
216
+ id: claims.sub,
217
+ email: claims.email,
218
+ username: claims.preferred_username,
219
+ name: claims.name,
220
+ realmRoles: claims.realm_access?.roles ?? [],
221
+ clientRoles: claims.resource_access?.[this.options.clientId]?.roles ?? [],
222
+ };
223
+ }
224
+ log(level, message) {
225
+ if (this.logger) {
226
+ if (level === 'warn') {
227
+ this.logger.warn(message);
228
+ }
229
+ else {
230
+ this.logger.info(message);
231
+ }
232
+ }
233
+ }
234
+ };
235
+ KeycloakTokenValidationService = KeycloakTokenValidationService_1 = __decorate([
236
+ Injectable(),
237
+ __param(0, Inject(KEYCLOAK_MODULE_OPTIONS)),
238
+ __param(2, Optional()),
239
+ __metadata("design:paramtypes", [Object, JwtService,
240
+ JwksCacheService])
241
+ ], KeycloakTokenValidationService);
242
+ export { KeycloakTokenValidationService };
243
+ //# sourceMappingURL=keycloak-token-validation.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keycloak-token-validation.service.js","sourceRoot":"","sources":["../../../src/keycloak/services/keycloak-token-validation.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@pawells/nestjs-auth",
3
+ "displayName": "@pawells/nestjs-auth",
4
+ "version": "1.0.0-dev.3052c75",
5
+ "description": "NestJS Keycloak integration library — token validation, admin API, and federated identity",
6
+ "type": "module",
7
+ "main": "./build/index.js",
8
+ "types": "./build/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./build/index.d.ts",
12
+ "import": "./build/index.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsc --project tsconfig.build.json",
17
+ "typecheck": "tsc --noEmit",
18
+ "lint": "eslint src/",
19
+ "lint:fix": "eslint src/ --fix",
20
+ "test": "vitest run",
21
+ "test:coverage": "vitest --coverage",
22
+ "pipeline": "yarn typecheck && yarn lint && yarn test && yarn build"
23
+ },
24
+ "peerDependencies": {
25
+ "@nestjs/common": ">=10.0.0",
26
+ "@nestjs/config": ">=3.0.0",
27
+ "@nestjs/core": ">=10.0.0",
28
+ "@nestjs/graphql": ">=12.0.0",
29
+ "@nestjs/jwt": ">=10.0.0",
30
+ "@nestjs/terminus": ">=10.0.0",
31
+ "@nestjs/throttler": ">=5.0.0",
32
+ "@opentelemetry/api": ">=1.0.0",
33
+ "class-transformer": ">=0.5.0",
34
+ "class-validator": ">=0.14.0",
35
+ "compression": ">=1.0.0",
36
+ "csrf-csrf": ">=3.0.0",
37
+ "express": ">=4.0.0",
38
+ "helmet": ">=7.0.0",
39
+ "joi": ">=17.0.0",
40
+ "jwks-rsa": ">=3.0.0",
41
+ "prom-client": ">=15.0.0",
42
+ "rxjs": ">=7.0.0",
43
+ "xss": ">=1.0.0"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "jwks-rsa": {
47
+ "optional": true
48
+ }
49
+ },
50
+ "dependencies": {
51
+ "@pawells/nestjs-shared": "^1.0.0"
52
+ },
53
+ "engines": {
54
+ "node": ">=22.0.0"
55
+ },
56
+ "packageManager": "yarn@4.12.0",
57
+ "author": "Aaron Wells <69355326+PhillipAWells@users.noreply.github.com>",
58
+ "license": "MIT",
59
+ "repository": {
60
+ "type": "git",
61
+ "url": "https://github.com/PhillipAWells/nestjs-common"
62
+ },
63
+ "files": [
64
+ "build/",
65
+ "README.md",
66
+ "LICENSE"
67
+ ],
68
+ "publishConfig": {
69
+ "access": "public"
70
+ },
71
+ "module": "./index.js"
72
+ }
package/package.json ADDED
@@ -0,0 +1,93 @@
1
+ {
2
+ "name": "@pawells/nestjs-auth",
3
+ "displayName": "@pawells/nestjs-auth",
4
+ "version": "1.0.0-dev.3052c75",
5
+ "description": "NestJS Keycloak integration library — token validation, admin API, and federated identity",
6
+ "type": "module",
7
+ "main": "./build/index.js",
8
+ "types": "./build/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./build/index.d.ts",
12
+ "import": "./build/index.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsc --project tsconfig.build.json",
17
+ "typecheck": "tsc --noEmit",
18
+ "lint": "eslint src/",
19
+ "lint:fix": "eslint src/ --fix",
20
+ "test": "vitest run",
21
+ "test:coverage": "vitest --coverage",
22
+ "pipeline": "yarn typecheck && yarn lint && yarn test && yarn build"
23
+ },
24
+ "peerDependencies": {
25
+ "@nestjs/common": ">=10.0.0",
26
+ "@nestjs/config": ">=3.0.0",
27
+ "@nestjs/core": ">=10.0.0",
28
+ "@nestjs/graphql": ">=12.0.0",
29
+ "@nestjs/jwt": ">=10.0.0",
30
+ "@nestjs/terminus": ">=10.0.0",
31
+ "@nestjs/throttler": ">=5.0.0",
32
+ "@opentelemetry/api": ">=1.0.0",
33
+ "class-transformer": ">=0.5.0",
34
+ "class-validator": ">=0.14.0",
35
+ "compression": ">=1.0.0",
36
+ "csrf-csrf": ">=3.0.0",
37
+ "express": ">=4.0.0",
38
+ "helmet": ">=7.0.0",
39
+ "joi": ">=17.0.0",
40
+ "jwks-rsa": ">=3.0.0",
41
+ "prom-client": ">=15.0.0",
42
+ "rxjs": ">=7.0.0",
43
+ "xss": ">=1.0.0"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "jwks-rsa": {
47
+ "optional": true
48
+ }
49
+ },
50
+ "dependencies": {
51
+ "@pawells/nestjs-shared": "^1.0.0"
52
+ },
53
+ "devDependencies": {
54
+ "@nestjs/common": "^11.0.0",
55
+ "@nestjs/config": "^3.3.0",
56
+ "@nestjs/core": "^11.0.0",
57
+ "@nestjs/graphql": "^12.2.0",
58
+ "@nestjs/jwt": "^10.2.0",
59
+ "@nestjs/terminus": "^10.2.3",
60
+ "@nestjs/throttler": "^6.4.0",
61
+ "@opentelemetry/api": "^1.9.0",
62
+ "class-transformer": "^0.5.1",
63
+ "class-validator": "^0.14.1",
64
+ "compression": "^1.7.4",
65
+ "csrf-csrf": "^3.2.0",
66
+ "express": "^4.21.0",
67
+ "graphql": "^16.9.0",
68
+ "helmet": "^8.0.0",
69
+ "joi": "^17.13.0",
70
+ "prom-client": "^15.1.0",
71
+ "reflect-metadata": "^0.2.2",
72
+ "rxjs": "^7.8.0",
73
+ "xss": "^1.0.15"
74
+ },
75
+ "engines": {
76
+ "node": ">=22.0.0"
77
+ },
78
+ "packageManager": "yarn@4.12.0",
79
+ "author": "Aaron Wells <69355326+PhillipAWells@users.noreply.github.com>",
80
+ "license": "MIT",
81
+ "repository": {
82
+ "type": "git",
83
+ "url": "https://github.com/PhillipAWells/nestjs-common"
84
+ },
85
+ "files": [
86
+ "build/",
87
+ "README.md",
88
+ "LICENSE"
89
+ ],
90
+ "publishConfig": {
91
+ "access": "public"
92
+ }
93
+ }