@nitrostack/core 1.0.0

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 (239) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +80 -0
  3. package/dist/auth/api-key.d.ts +118 -0
  4. package/dist/auth/api-key.d.ts.map +1 -0
  5. package/dist/auth/api-key.js +168 -0
  6. package/dist/auth/api-key.js.map +1 -0
  7. package/dist/auth/client.d.ts +151 -0
  8. package/dist/auth/client.d.ts.map +1 -0
  9. package/dist/auth/client.js +330 -0
  10. package/dist/auth/client.js.map +1 -0
  11. package/dist/auth/index.d.ts +31 -0
  12. package/dist/auth/index.d.ts.map +1 -0
  13. package/dist/auth/index.js +46 -0
  14. package/dist/auth/index.js.map +1 -0
  15. package/dist/auth/middleware.d.ts +95 -0
  16. package/dist/auth/middleware.d.ts.map +1 -0
  17. package/dist/auth/middleware.js +260 -0
  18. package/dist/auth/middleware.js.map +1 -0
  19. package/dist/auth/pkce.d.ts +53 -0
  20. package/dist/auth/pkce.d.ts.map +1 -0
  21. package/dist/auth/pkce.js +105 -0
  22. package/dist/auth/pkce.js.map +1 -0
  23. package/dist/auth/quick-setup.d.ts +94 -0
  24. package/dist/auth/quick-setup.d.ts.map +1 -0
  25. package/dist/auth/quick-setup.js +210 -0
  26. package/dist/auth/quick-setup.js.map +1 -0
  27. package/dist/auth/secure-secret.d.ts +136 -0
  28. package/dist/auth/secure-secret.d.ts.map +1 -0
  29. package/dist/auth/secure-secret.js +182 -0
  30. package/dist/auth/secure-secret.js.map +1 -0
  31. package/dist/auth/server-integration.d.ts +97 -0
  32. package/dist/auth/server-integration.d.ts.map +1 -0
  33. package/dist/auth/server-integration.js +182 -0
  34. package/dist/auth/server-integration.js.map +1 -0
  35. package/dist/auth/server-metadata.d.ts +51 -0
  36. package/dist/auth/server-metadata.d.ts.map +1 -0
  37. package/dist/auth/server-metadata.js +106 -0
  38. package/dist/auth/server-metadata.js.map +1 -0
  39. package/dist/auth/simple-jwt.d.ts +174 -0
  40. package/dist/auth/simple-jwt.d.ts.map +1 -0
  41. package/dist/auth/simple-jwt.js +162 -0
  42. package/dist/auth/simple-jwt.js.map +1 -0
  43. package/dist/auth/token-store.d.ts +104 -0
  44. package/dist/auth/token-store.d.ts.map +1 -0
  45. package/dist/auth/token-store.js +205 -0
  46. package/dist/auth/token-store.js.map +1 -0
  47. package/dist/auth/token-validation.d.ts +59 -0
  48. package/dist/auth/token-validation.d.ts.map +1 -0
  49. package/dist/auth/token-validation.js +241 -0
  50. package/dist/auth/token-validation.js.map +1 -0
  51. package/dist/auth/types.d.ts +215 -0
  52. package/dist/auth/types.d.ts.map +1 -0
  53. package/dist/auth/types.js +6 -0
  54. package/dist/auth/types.js.map +1 -0
  55. package/dist/core/apikey-module.d.ts +69 -0
  56. package/dist/core/apikey-module.d.ts.map +1 -0
  57. package/dist/core/apikey-module.js +114 -0
  58. package/dist/core/apikey-module.js.map +1 -0
  59. package/dist/core/app-decorator.d.ts +59 -0
  60. package/dist/core/app-decorator.d.ts.map +1 -0
  61. package/dist/core/app-decorator.js +322 -0
  62. package/dist/core/app-decorator.js.map +1 -0
  63. package/dist/core/builders.d.ts +50 -0
  64. package/dist/core/builders.d.ts.map +1 -0
  65. package/dist/core/builders.js +139 -0
  66. package/dist/core/builders.js.map +1 -0
  67. package/dist/core/component.d.ts +111 -0
  68. package/dist/core/component.d.ts.map +1 -0
  69. package/dist/core/component.js +228 -0
  70. package/dist/core/component.js.map +1 -0
  71. package/dist/core/config-module.d.ts +62 -0
  72. package/dist/core/config-module.d.ts.map +1 -0
  73. package/dist/core/config-module.js +94 -0
  74. package/dist/core/config-module.js.map +1 -0
  75. package/dist/core/decorators/cache.decorator.d.ts +61 -0
  76. package/dist/core/decorators/cache.decorator.d.ts.map +1 -0
  77. package/dist/core/decorators/cache.decorator.js +115 -0
  78. package/dist/core/decorators/cache.decorator.js.map +1 -0
  79. package/dist/core/decorators/health-check.decorator.d.ts +80 -0
  80. package/dist/core/decorators/health-check.decorator.d.ts.map +1 -0
  81. package/dist/core/decorators/health-check.decorator.js +153 -0
  82. package/dist/core/decorators/health-check.decorator.js.map +1 -0
  83. package/dist/core/decorators/rate-limit.decorator.d.ts +63 -0
  84. package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -0
  85. package/dist/core/decorators/rate-limit.decorator.js +129 -0
  86. package/dist/core/decorators/rate-limit.decorator.js.map +1 -0
  87. package/dist/core/decorators.d.ts +190 -0
  88. package/dist/core/decorators.d.ts.map +1 -0
  89. package/dist/core/decorators.js +170 -0
  90. package/dist/core/decorators.js.map +1 -0
  91. package/dist/core/di/container.d.ts +64 -0
  92. package/dist/core/di/container.d.ts.map +1 -0
  93. package/dist/core/di/container.js +105 -0
  94. package/dist/core/di/container.js.map +1 -0
  95. package/dist/core/di/injectable.decorator.d.ts +62 -0
  96. package/dist/core/di/injectable.decorator.d.ts.map +1 -0
  97. package/dist/core/di/injectable.decorator.js +66 -0
  98. package/dist/core/di/injectable.decorator.js.map +1 -0
  99. package/dist/core/errors.d.ts +54 -0
  100. package/dist/core/errors.d.ts.map +1 -0
  101. package/dist/core/errors.js +87 -0
  102. package/dist/core/errors.js.map +1 -0
  103. package/dist/core/events/event-emitter.d.ts +50 -0
  104. package/dist/core/events/event-emitter.d.ts.map +1 -0
  105. package/dist/core/events/event-emitter.js +94 -0
  106. package/dist/core/events/event-emitter.js.map +1 -0
  107. package/dist/core/events/event.decorator.d.ts +48 -0
  108. package/dist/core/events/event.decorator.d.ts.map +1 -0
  109. package/dist/core/events/event.decorator.js +72 -0
  110. package/dist/core/events/event.decorator.js.map +1 -0
  111. package/dist/core/events/log-emitter.d.ts +14 -0
  112. package/dist/core/events/log-emitter.d.ts.map +1 -0
  113. package/dist/core/events/log-emitter.js +20 -0
  114. package/dist/core/events/log-emitter.js.map +1 -0
  115. package/dist/core/filters/exception-filter.decorator.d.ts +40 -0
  116. package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -0
  117. package/dist/core/filters/exception-filter.decorator.js +54 -0
  118. package/dist/core/filters/exception-filter.decorator.js.map +1 -0
  119. package/dist/core/filters/exception-filter.interface.d.ts +39 -0
  120. package/dist/core/filters/exception-filter.interface.d.ts.map +1 -0
  121. package/dist/core/filters/exception-filter.interface.js +2 -0
  122. package/dist/core/filters/exception-filter.interface.js.map +1 -0
  123. package/dist/core/guards/apikey.guard.d.ts +22 -0
  124. package/dist/core/guards/apikey.guard.d.ts.map +1 -0
  125. package/dist/core/guards/apikey.guard.js +11 -0
  126. package/dist/core/guards/apikey.guard.js.map +1 -0
  127. package/dist/core/guards/guard.interface.d.ts +18 -0
  128. package/dist/core/guards/guard.interface.d.ts.map +1 -0
  129. package/dist/core/guards/guard.interface.js +2 -0
  130. package/dist/core/guards/guard.interface.js.map +1 -0
  131. package/dist/core/guards/jwt.guard.d.ts +18 -0
  132. package/dist/core/guards/jwt.guard.d.ts.map +1 -0
  133. package/dist/core/guards/jwt.guard.js +2 -0
  134. package/dist/core/guards/jwt.guard.js.map +1 -0
  135. package/dist/core/guards/oauth.guard.d.ts +35 -0
  136. package/dist/core/guards/oauth.guard.d.ts.map +1 -0
  137. package/dist/core/guards/oauth.guard.js +2 -0
  138. package/dist/core/guards/oauth.guard.js.map +1 -0
  139. package/dist/core/guards/use-guards.decorator.d.ts +25 -0
  140. package/dist/core/guards/use-guards.decorator.d.ts.map +1 -0
  141. package/dist/core/guards/use-guards.decorator.js +32 -0
  142. package/dist/core/guards/use-guards.decorator.js.map +1 -0
  143. package/dist/core/health/health-checks.resource.d.ts +14 -0
  144. package/dist/core/health/health-checks.resource.d.ts.map +1 -0
  145. package/dist/core/health/health-checks.resource.js +29 -0
  146. package/dist/core/health/health-checks.resource.js.map +1 -0
  147. package/dist/core/index.d.ts +57 -0
  148. package/dist/core/index.d.ts.map +1 -0
  149. package/dist/core/index.js +59 -0
  150. package/dist/core/index.js.map +1 -0
  151. package/dist/core/interceptors/interceptor.decorator.d.ts +37 -0
  152. package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -0
  153. package/dist/core/interceptors/interceptor.decorator.js +51 -0
  154. package/dist/core/interceptors/interceptor.decorator.js.map +1 -0
  155. package/dist/core/interceptors/interceptor.interface.d.ts +31 -0
  156. package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -0
  157. package/dist/core/interceptors/interceptor.interface.js +2 -0
  158. package/dist/core/interceptors/interceptor.interface.js.map +1 -0
  159. package/dist/core/jwt-module.d.ts +51 -0
  160. package/dist/core/jwt-module.d.ts.map +1 -0
  161. package/dist/core/jwt-module.js +52 -0
  162. package/dist/core/jwt-module.js.map +1 -0
  163. package/dist/core/logger.d.ts +18 -0
  164. package/dist/core/logger.d.ts.map +1 -0
  165. package/dist/core/logger.js +53 -0
  166. package/dist/core/logger.js.map +1 -0
  167. package/dist/core/middleware/middleware.decorator.d.ts +39 -0
  168. package/dist/core/middleware/middleware.decorator.d.ts.map +1 -0
  169. package/dist/core/middleware/middleware.decorator.js +53 -0
  170. package/dist/core/middleware/middleware.decorator.js.map +1 -0
  171. package/dist/core/middleware/middleware.interface.d.ts +29 -0
  172. package/dist/core/middleware/middleware.interface.d.ts.map +1 -0
  173. package/dist/core/middleware/middleware.interface.js +2 -0
  174. package/dist/core/middleware/middleware.interface.js.map +1 -0
  175. package/dist/core/module.d.ts +93 -0
  176. package/dist/core/module.d.ts.map +1 -0
  177. package/dist/core/module.js +87 -0
  178. package/dist/core/module.js.map +1 -0
  179. package/dist/core/oauth-module.d.ts +123 -0
  180. package/dist/core/oauth-module.d.ts.map +1 -0
  181. package/dist/core/oauth-module.js +324 -0
  182. package/dist/core/oauth-module.js.map +1 -0
  183. package/dist/core/pipes/pipe.decorator.d.ts +64 -0
  184. package/dist/core/pipes/pipe.decorator.d.ts.map +1 -0
  185. package/dist/core/pipes/pipe.decorator.js +85 -0
  186. package/dist/core/pipes/pipe.decorator.js.map +1 -0
  187. package/dist/core/pipes/pipe.interface.d.ts +41 -0
  188. package/dist/core/pipes/pipe.interface.d.ts.map +1 -0
  189. package/dist/core/pipes/pipe.interface.js +2 -0
  190. package/dist/core/pipes/pipe.interface.js.map +1 -0
  191. package/dist/core/prompt.d.ts +46 -0
  192. package/dist/core/prompt.d.ts.map +1 -0
  193. package/dist/core/prompt.js +76 -0
  194. package/dist/core/prompt.js.map +1 -0
  195. package/dist/core/resource.d.ts +47 -0
  196. package/dist/core/resource.d.ts.map +1 -0
  197. package/dist/core/resource.js +90 -0
  198. package/dist/core/resource.js.map +1 -0
  199. package/dist/core/server.d.ts +129 -0
  200. package/dist/core/server.d.ts.map +1 -0
  201. package/dist/core/server.js +617 -0
  202. package/dist/core/server.js.map +1 -0
  203. package/dist/core/tool.d.ts +108 -0
  204. package/dist/core/tool.d.ts.map +1 -0
  205. package/dist/core/tool.js +241 -0
  206. package/dist/core/tool.js.map +1 -0
  207. package/dist/core/transports/discovery-http-server.d.ts +19 -0
  208. package/dist/core/transports/discovery-http-server.d.ts.map +1 -0
  209. package/dist/core/transports/discovery-http-server.js +54 -0
  210. package/dist/core/transports/discovery-http-server.js.map +1 -0
  211. package/dist/core/transports/http-server.d.ts +108 -0
  212. package/dist/core/transports/http-server.d.ts.map +1 -0
  213. package/dist/core/transports/http-server.js +293 -0
  214. package/dist/core/transports/http-server.js.map +1 -0
  215. package/dist/core/transports/streamable-http.d.ts +177 -0
  216. package/dist/core/transports/streamable-http.d.ts.map +1 -0
  217. package/dist/core/transports/streamable-http.js +1287 -0
  218. package/dist/core/transports/streamable-http.js.map +1 -0
  219. package/dist/core/types.d.ts +195 -0
  220. package/dist/core/types.d.ts.map +1 -0
  221. package/dist/core/types.js +2 -0
  222. package/dist/core/types.js.map +1 -0
  223. package/dist/core/widgets/widget-examples.resource.d.ts +17 -0
  224. package/dist/core/widgets/widget-examples.resource.d.ts.map +1 -0
  225. package/dist/core/widgets/widget-examples.resource.js +28 -0
  226. package/dist/core/widgets/widget-examples.resource.js.map +1 -0
  227. package/dist/core/widgets/widget-registry.d.ts +56 -0
  228. package/dist/core/widgets/widget-registry.d.ts.map +1 -0
  229. package/dist/core/widgets/widget-registry.js +75 -0
  230. package/dist/core/widgets/widget-registry.js.map +1 -0
  231. package/dist/testing/index.d.ts +103 -0
  232. package/dist/testing/index.d.ts.map +1 -0
  233. package/dist/testing/index.js +161 -0
  234. package/dist/testing/index.js.map +1 -0
  235. package/dist/ui-next/index.d.ts +31 -0
  236. package/dist/ui-next/index.d.ts.map +1 -0
  237. package/dist/ui-next/index.js +687 -0
  238. package/dist/ui-next/index.js.map +1 -0
  239. package/package.json +89 -0
@@ -0,0 +1,151 @@
1
+ import { ProtectedResourceMetadata, AuthorizationServerMetadata, ClientRegistrationRequest, ClientRegistrationResponse, TokenResponse, McpAuthClientConfig } from './types.js';
2
+ import { PKCEParams } from './pkce.js';
3
+ /**
4
+ * OAuth 2.1 Client for MCP
5
+ *
6
+ * Handles:
7
+ * - Protected Resource Metadata discovery (RFC 9728)
8
+ * - Authorization Server Metadata discovery (RFC 8414)
9
+ * - Dynamic Client Registration (RFC 7591)
10
+ * - Authorization Code Flow with PKCE (OAuth 2.1)
11
+ * - Token refresh and revocation
12
+ */
13
+ export declare class OAuth2Client {
14
+ private config;
15
+ constructor(config: McpAuthClientConfig);
16
+ /**
17
+ * Discover Protected Resource Metadata (RFC 9728)
18
+ *
19
+ * Tries:
20
+ * 1. WWW-Authenticate header from 401 response
21
+ * 2. Well-known URI at resource path
22
+ * 3. Well-known URI at root
23
+ *
24
+ * @param resourceUrl - URL of the MCP server
25
+ */
26
+ discoverProtectedResourceMetadata(resourceUrl: string): Promise<ProtectedResourceMetadata>;
27
+ /**
28
+ * Discover Authorization Server Metadata (RFC 8414)
29
+ *
30
+ * Supports both:
31
+ * - OAuth 2.0 Authorization Server Metadata (RFC 8414)
32
+ * - OpenID Connect Discovery 1.0
33
+ *
34
+ * @param issuer - Authorization server issuer URL
35
+ */
36
+ discoverAuthorizationServerMetadata(issuer: string): Promise<AuthorizationServerMetadata>;
37
+ /**
38
+ * Register client dynamically (RFC 7591)
39
+ *
40
+ * @param registrationEndpoint - Client registration endpoint
41
+ * @param metadata - Client metadata
42
+ */
43
+ registerClient(registrationEndpoint: string, metadata: ClientRegistrationRequest): Promise<ClientRegistrationResponse>;
44
+ /**
45
+ * Start authorization flow
46
+ *
47
+ * Generates authorization URL with PKCE parameters
48
+ *
49
+ * @param authzEndpoint - Authorization endpoint
50
+ * @param clientId - OAuth client ID
51
+ * @param redirectUri - Redirect URI
52
+ * @param scope - Requested scopes
53
+ * @param resource - Resource indicator (RFC 8707)
54
+ * @returns Authorization URL and PKCE parameters (store for token exchange)
55
+ */
56
+ startAuthorizationFlow(options: {
57
+ authorizationEndpoint: string;
58
+ clientId: string;
59
+ redirectUri: string;
60
+ scope?: string;
61
+ resource?: string;
62
+ state?: string;
63
+ }): Promise<{
64
+ authUrl: string;
65
+ state: string;
66
+ pkce: PKCEParams;
67
+ }>;
68
+ /**
69
+ * Exchange authorization code for access token
70
+ *
71
+ * @param code - Authorization code from callback
72
+ * @param pkce - PKCE parameters from startAuthorizationFlow
73
+ * @param tokenEndpoint - Token endpoint
74
+ * @param clientId - OAuth client ID
75
+ * @param clientSecret - OAuth client secret (for confidential clients)
76
+ * @param redirectUri - Redirect URI (must match authorization request)
77
+ * @param resource - Resource indicator (RFC 8707)
78
+ */
79
+ exchangeCodeForToken(options: {
80
+ code: string;
81
+ pkce: PKCEParams;
82
+ tokenEndpoint: string;
83
+ clientId: string;
84
+ clientSecret?: string;
85
+ redirectUri: string;
86
+ resource?: string;
87
+ }): Promise<TokenResponse>;
88
+ /**
89
+ * Refresh access token
90
+ *
91
+ * @param refreshToken - Refresh token
92
+ * @param tokenEndpoint - Token endpoint
93
+ * @param clientId - OAuth client ID
94
+ * @param clientSecret - OAuth client secret
95
+ * @param scope - Optional: request different scopes
96
+ * @param resource - Resource indicator (RFC 8707)
97
+ */
98
+ refreshToken(options: {
99
+ refreshToken: string;
100
+ tokenEndpoint: string;
101
+ clientId: string;
102
+ clientSecret?: string;
103
+ scope?: string;
104
+ resource?: string;
105
+ }): Promise<TokenResponse>;
106
+ /**
107
+ * Get client credentials token (for server-to-server)
108
+ *
109
+ * @param tokenEndpoint - Token endpoint
110
+ * @param clientId - OAuth client ID
111
+ * @param clientSecret - OAuth client secret
112
+ * @param scope - Requested scopes
113
+ * @param resource - Resource indicator (RFC 8707)
114
+ */
115
+ getClientCredentialsToken(options: {
116
+ tokenEndpoint: string;
117
+ clientId: string;
118
+ clientSecret: string;
119
+ scope?: string;
120
+ resource?: string;
121
+ }): Promise<TokenResponse>;
122
+ /**
123
+ * Revoke token (access or refresh)
124
+ *
125
+ * @param token - Token to revoke
126
+ * @param revocationEndpoint - Revocation endpoint
127
+ * @param clientId - OAuth client ID
128
+ * @param clientSecret - OAuth client secret
129
+ * @param tokenTypeHint - 'access_token' or 'refresh_token'
130
+ */
131
+ revokeToken(options: {
132
+ token: string;
133
+ revocationEndpoint: string;
134
+ clientId: string;
135
+ clientSecret?: string;
136
+ tokenTypeHint?: 'access_token' | 'refresh_token';
137
+ }): Promise<void>;
138
+ /**
139
+ * Make token request
140
+ */
141
+ private tokenRequest;
142
+ /**
143
+ * Fetch metadata from URL
144
+ */
145
+ private fetchMetadata;
146
+ /**
147
+ * Generate random state for CSRF protection
148
+ */
149
+ private generateState;
150
+ }
151
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,0BAA0B,EAC1B,aAAa,EAIb,mBAAmB,EACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAsB,UAAU,EAAuB,MAAM,WAAW,CAAC;AAGhF;;;;;;;;;GASG;AAEH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIvC;;;;;;;;;OASG;IACG,iCAAiC,CACrC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,CAAC;IAyCrC;;;;;;;;OAQG;IACG,mCAAmC,CACvC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,2BAA2B,CAAC;IAmDvC;;;;;OAKG;IACG,cAAc,CAClB,oBAAoB,EAAE,MAAM,EAC5B,QAAQ,EAAE,yBAAyB,GAClC,OAAO,CAAC,0BAA0B,CAAC;IAqBtC;;;;;;;;;;;OAWG;IACG,sBAAsB,CAAC,OAAO,EAAE;QACpC,qBAAqB,EAAE,MAAM,CAAC;QAC9B,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,UAAU,CAAC;KAClB,CAAC;IA+BF;;;;;;;;;;OAUG;IACG,oBAAoB,CAAC,OAAO,EAAE;QAClC,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,UAAU,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,aAAa,CAAC;IA6B1B;;;;;;;;;OASG;IACG,YAAY,CAAC,OAAO,EAAE;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,aAAa,CAAC;IA8B1B;;;;;;;;OAQG;IACG,yBAAyB,CAAC,OAAO,EAAE;QACvC,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,aAAa,CAAC;IAyB1B;;;;;;;;OAQG;IACG,WAAW,CAAC,OAAO,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,kBAAkB,EAAE,MAAM,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;KAClD,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCjB;;OAEG;YACW,YAAY;IAuB1B;;OAEG;YACW,aAAa;IAa3B;;OAEG;IACH,OAAO,CAAC,aAAa;CAGtB"}
@@ -0,0 +1,330 @@
1
+ import crypto from 'crypto';
2
+ import { generatePKCEParams, validatePKCESupport } from './pkce.js';
3
+ import { parseWWWAuthenticateHeader, getWellKnownMetadataUris } from './server-metadata.js';
4
+ /**
5
+ * OAuth 2.1 Client for MCP
6
+ *
7
+ * Handles:
8
+ * - Protected Resource Metadata discovery (RFC 9728)
9
+ * - Authorization Server Metadata discovery (RFC 8414)
10
+ * - Dynamic Client Registration (RFC 7591)
11
+ * - Authorization Code Flow with PKCE (OAuth 2.1)
12
+ * - Token refresh and revocation
13
+ */
14
+ export class OAuth2Client {
15
+ config;
16
+ constructor(config) {
17
+ this.config = config;
18
+ }
19
+ /**
20
+ * Discover Protected Resource Metadata (RFC 9728)
21
+ *
22
+ * Tries:
23
+ * 1. WWW-Authenticate header from 401 response
24
+ * 2. Well-known URI at resource path
25
+ * 3. Well-known URI at root
26
+ *
27
+ * @param resourceUrl - URL of the MCP server
28
+ */
29
+ async discoverProtectedResourceMetadata(resourceUrl) {
30
+ // Step 1: Try making a request to get 401 with WWW-Authenticate header
31
+ try {
32
+ const response = await fetch(resourceUrl, {
33
+ method: 'GET',
34
+ headers: { Accept: 'application/json' },
35
+ });
36
+ if (response.status === 401) {
37
+ const wwwAuth = response.headers.get('WWW-Authenticate');
38
+ if (wwwAuth) {
39
+ const parsed = parseWWWAuthenticateHeader(wwwAuth);
40
+ if (parsed?.resourceMetadata) {
41
+ // Found metadata URL in header
42
+ return await this.fetchMetadata(parsed.resourceMetadata);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ catch (error) {
48
+ // Ignore errors, try well-known URIs
49
+ }
50
+ // Step 2: Try well-known URIs
51
+ const url = new URL(resourceUrl);
52
+ const wellKnownUris = getWellKnownMetadataUris(url);
53
+ for (const uri of wellKnownUris) {
54
+ try {
55
+ return await this.fetchMetadata(uri);
56
+ }
57
+ catch (error) {
58
+ // Try next URI
59
+ continue;
60
+ }
61
+ }
62
+ throw new Error(`Failed to discover protected resource metadata for ${resourceUrl}. ` +
63
+ 'Server must implement RFC 9728 (Protected Resource Metadata).');
64
+ }
65
+ /**
66
+ * Discover Authorization Server Metadata (RFC 8414)
67
+ *
68
+ * Supports both:
69
+ * - OAuth 2.0 Authorization Server Metadata (RFC 8414)
70
+ * - OpenID Connect Discovery 1.0
71
+ *
72
+ * @param issuer - Authorization server issuer URL
73
+ */
74
+ async discoverAuthorizationServerMetadata(issuer) {
75
+ const issuerUrl = new URL(issuer);
76
+ const wellKnownUrls = [];
77
+ // For issuer URLs with path components
78
+ if (issuerUrl.pathname && issuerUrl.pathname !== '/') {
79
+ const path = issuerUrl.pathname;
80
+ // OAuth 2.0 with path insertion
81
+ wellKnownUrls.push(`${issuerUrl.origin}/.well-known/oauth-authorization-server${path}`);
82
+ // OpenID Connect with path insertion
83
+ wellKnownUrls.push(`${issuerUrl.origin}/.well-known/openid-configuration${path}`);
84
+ // OpenID Connect with path appending
85
+ wellKnownUrls.push(`${issuer}/.well-known/openid-configuration`);
86
+ }
87
+ else {
88
+ // For issuer URLs without path components
89
+ wellKnownUrls.push(`${issuerUrl.origin}/.well-known/oauth-authorization-server`);
90
+ wellKnownUrls.push(`${issuerUrl.origin}/.well-known/openid-configuration`);
91
+ }
92
+ // Try each URL
93
+ for (const url of wellKnownUrls) {
94
+ try {
95
+ const metadata = await this.fetchMetadata(url);
96
+ // Validate PKCE support (REQUIRED by OAuth 2.1)
97
+ if (!validatePKCESupport(metadata.code_challenge_methods_supported)) {
98
+ throw new Error('Authorization server does not support PKCE (S256). ' +
99
+ 'OAuth 2.1 requires PKCE support. Cannot proceed.');
100
+ }
101
+ return metadata;
102
+ }
103
+ catch (error) {
104
+ // Try next URL
105
+ continue;
106
+ }
107
+ }
108
+ throw new Error(`Failed to discover authorization server metadata for ${issuer}. ` +
109
+ 'Server must implement RFC 8414 or OpenID Connect Discovery.');
110
+ }
111
+ /**
112
+ * Register client dynamically (RFC 7591)
113
+ *
114
+ * @param registrationEndpoint - Client registration endpoint
115
+ * @param metadata - Client metadata
116
+ */
117
+ async registerClient(registrationEndpoint, metadata) {
118
+ const response = await fetch(registrationEndpoint, {
119
+ method: 'POST',
120
+ headers: {
121
+ 'Content-Type': 'application/json',
122
+ 'Accept': 'application/json',
123
+ },
124
+ body: JSON.stringify(metadata),
125
+ });
126
+ if (!response.ok) {
127
+ const error = await response.json().catch(() => ({}));
128
+ throw new Error(`Client registration failed: ${response.status} - ${error.error_description || error.error || 'Unknown error'}`);
129
+ }
130
+ const result = await response.json();
131
+ return result;
132
+ }
133
+ /**
134
+ * Start authorization flow
135
+ *
136
+ * Generates authorization URL with PKCE parameters
137
+ *
138
+ * @param authzEndpoint - Authorization endpoint
139
+ * @param clientId - OAuth client ID
140
+ * @param redirectUri - Redirect URI
141
+ * @param scope - Requested scopes
142
+ * @param resource - Resource indicator (RFC 8707)
143
+ * @returns Authorization URL and PKCE parameters (store for token exchange)
144
+ */
145
+ async startAuthorizationFlow(options) {
146
+ // Generate PKCE parameters (S256 required by OAuth 2.1)
147
+ const pkce = generatePKCEParams('S256');
148
+ // Generate state for CSRF protection
149
+ const state = options.state || this.generateState();
150
+ // Build authorization URL
151
+ const params = new URLSearchParams({
152
+ response_type: 'code',
153
+ client_id: options.clientId,
154
+ redirect_uri: options.redirectUri,
155
+ state,
156
+ code_challenge: pkce.code_challenge,
157
+ code_challenge_method: pkce.code_challenge_method,
158
+ });
159
+ if (options.scope) {
160
+ params.append('scope', options.scope);
161
+ }
162
+ if (options.resource) {
163
+ // RFC 8707 - Resource Indicators
164
+ params.append('resource', options.resource);
165
+ }
166
+ const authUrl = `${options.authorizationEndpoint}?${params.toString()}`;
167
+ return { authUrl, state, pkce };
168
+ }
169
+ /**
170
+ * Exchange authorization code for access token
171
+ *
172
+ * @param code - Authorization code from callback
173
+ * @param pkce - PKCE parameters from startAuthorizationFlow
174
+ * @param tokenEndpoint - Token endpoint
175
+ * @param clientId - OAuth client ID
176
+ * @param clientSecret - OAuth client secret (for confidential clients)
177
+ * @param redirectUri - Redirect URI (must match authorization request)
178
+ * @param resource - Resource indicator (RFC 8707)
179
+ */
180
+ async exchangeCodeForToken(options) {
181
+ const params = new URLSearchParams({
182
+ grant_type: 'authorization_code',
183
+ code: options.code,
184
+ redirect_uri: options.redirectUri,
185
+ client_id: options.clientId,
186
+ code_verifier: options.pkce.code_verifier,
187
+ });
188
+ if (options.resource) {
189
+ params.append('resource', options.resource);
190
+ }
191
+ const headers = {
192
+ 'Content-Type': 'application/x-www-form-urlencoded',
193
+ 'Accept': 'application/json',
194
+ };
195
+ // Client authentication
196
+ if (options.clientSecret) {
197
+ const credentials = Buffer.from(`${options.clientId}:${options.clientSecret}`).toString('base64');
198
+ headers['Authorization'] = `Basic ${credentials}`;
199
+ }
200
+ return await this.tokenRequest(options.tokenEndpoint, params, headers);
201
+ }
202
+ /**
203
+ * Refresh access token
204
+ *
205
+ * @param refreshToken - Refresh token
206
+ * @param tokenEndpoint - Token endpoint
207
+ * @param clientId - OAuth client ID
208
+ * @param clientSecret - OAuth client secret
209
+ * @param scope - Optional: request different scopes
210
+ * @param resource - Resource indicator (RFC 8707)
211
+ */
212
+ async refreshToken(options) {
213
+ const params = new URLSearchParams({
214
+ grant_type: 'refresh_token',
215
+ refresh_token: options.refreshToken,
216
+ client_id: options.clientId,
217
+ });
218
+ if (options.scope) {
219
+ params.append('scope', options.scope);
220
+ }
221
+ if (options.resource) {
222
+ params.append('resource', options.resource);
223
+ }
224
+ const headers = {
225
+ 'Content-Type': 'application/x-www-form-urlencoded',
226
+ 'Accept': 'application/json',
227
+ };
228
+ if (options.clientSecret) {
229
+ const credentials = Buffer.from(`${options.clientId}:${options.clientSecret}`).toString('base64');
230
+ headers['Authorization'] = `Basic ${credentials}`;
231
+ }
232
+ return await this.tokenRequest(options.tokenEndpoint, params, headers);
233
+ }
234
+ /**
235
+ * Get client credentials token (for server-to-server)
236
+ *
237
+ * @param tokenEndpoint - Token endpoint
238
+ * @param clientId - OAuth client ID
239
+ * @param clientSecret - OAuth client secret
240
+ * @param scope - Requested scopes
241
+ * @param resource - Resource indicator (RFC 8707)
242
+ */
243
+ async getClientCredentialsToken(options) {
244
+ const params = new URLSearchParams({
245
+ grant_type: 'client_credentials',
246
+ client_id: options.clientId,
247
+ });
248
+ if (options.scope) {
249
+ params.append('scope', options.scope);
250
+ }
251
+ if (options.resource) {
252
+ params.append('resource', options.resource);
253
+ }
254
+ const headers = {
255
+ 'Content-Type': 'application/x-www-form-urlencoded',
256
+ 'Accept': 'application/json',
257
+ 'Authorization': `Basic ${Buffer.from(`${options.clientId}:${options.clientSecret}`).toString('base64')}`,
258
+ };
259
+ return await this.tokenRequest(options.tokenEndpoint, params, headers);
260
+ }
261
+ /**
262
+ * Revoke token (access or refresh)
263
+ *
264
+ * @param token - Token to revoke
265
+ * @param revocationEndpoint - Revocation endpoint
266
+ * @param clientId - OAuth client ID
267
+ * @param clientSecret - OAuth client secret
268
+ * @param tokenTypeHint - 'access_token' or 'refresh_token'
269
+ */
270
+ async revokeToken(options) {
271
+ const params = new URLSearchParams({
272
+ token: options.token,
273
+ client_id: options.clientId,
274
+ });
275
+ if (options.tokenTypeHint) {
276
+ params.append('token_type_hint', options.tokenTypeHint);
277
+ }
278
+ const headers = {
279
+ 'Content-Type': 'application/x-www-form-urlencoded',
280
+ };
281
+ if (options.clientSecret) {
282
+ const credentials = Buffer.from(`${options.clientId}:${options.clientSecret}`).toString('base64');
283
+ headers['Authorization'] = `Basic ${credentials}`;
284
+ }
285
+ const response = await fetch(options.revocationEndpoint, {
286
+ method: 'POST',
287
+ headers,
288
+ body: params.toString(),
289
+ });
290
+ if (!response.ok) {
291
+ throw new Error(`Token revocation failed: ${response.status} ${response.statusText}`);
292
+ }
293
+ }
294
+ /**
295
+ * Make token request
296
+ */
297
+ async tokenRequest(endpoint, params, headers) {
298
+ const response = await fetch(endpoint, {
299
+ method: 'POST',
300
+ headers,
301
+ body: params.toString(),
302
+ });
303
+ const data = await response.json();
304
+ if (!response.ok) {
305
+ const error = data;
306
+ throw new Error(`Token request failed: ${error.error} - ${error.error_description || 'Unknown error'}`);
307
+ }
308
+ return data;
309
+ }
310
+ /**
311
+ * Fetch metadata from URL
312
+ */
313
+ async fetchMetadata(url) {
314
+ const response = await fetch(url, {
315
+ method: 'GET',
316
+ headers: { Accept: 'application/json' },
317
+ });
318
+ if (!response.ok) {
319
+ throw new Error(`Failed to fetch metadata from ${url}: ${response.status}`);
320
+ }
321
+ return await response.json();
322
+ }
323
+ /**
324
+ * Generate random state for CSRF protection
325
+ */
326
+ generateState() {
327
+ return crypto.randomBytes(16).toString('hex');
328
+ }
329
+ }
330
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * NitroStack Authentication Module
3
+ *
4
+ * Multiple authentication options:
5
+ * 1. Simple JWT - For 70% of use cases (internal tools, APIs)
6
+ * 2. API Keys - For simple scenarios (service-to-service)
7
+ * 3. OAuth 2.1 - For enterprise/SaaS (full compliance)
8
+ *
9
+ * Standards:
10
+ * - OAuth 2.1 (IETF draft-ietf-oauth-v2-1-13)
11
+ * - RFC 9728 - Protected Resource Metadata
12
+ * - RFC 8414 - Authorization Server Metadata
13
+ * - RFC 7591 - Dynamic Client Registration
14
+ * - RFC 8707 - Resource Indicators (Token Audience Binding)
15
+ * - RFC 7636 - PKCE
16
+ * - RFC 7662 - Token Introspection
17
+ * - RFC 6750 - Bearer Token Usage
18
+ */
19
+ export { SecretValue, isSecretValue, unwrapSecret, type SecretString, type FromValueOptions, } from './secure-secret.js';
20
+ export { createSimpleJWTAuth, generateJWT, verifyJWT, decodeJWT, type SimpleJWTConfig, type JWTPayload, type StandardJWTClaims, type CustomJWTClaims, type GenerateJWTOptions, } from './simple-jwt.js';
21
+ export { createAPIKeyAuth, generateAPIKey, hashAPIKey, isValidAPIKeyFormat, generateAPIKeyWithMetadata, validateAPIKeyWithMetadata, type APIKeyConfig, type APIKeyWithMetadata, } from './api-key.js';
22
+ export { setupJWTAuth, setupAPIKeyAuth, setupOAuthAuth, generateTestCredentials, printAuthSetupInstructions, validateAuthEnv, } from './quick-setup.js';
23
+ export * from './types.js';
24
+ export * from './pkce.js';
25
+ export * from './server-metadata.js';
26
+ export * from './token-validation.js';
27
+ export { createAuthMiddleware, requireScopes, optionalAuth, RequireScopes, isAuthenticated, hasScope, hasAnyScope, hasAllScopes, } from './middleware.js';
28
+ export { OAuth2Client } from './client.js';
29
+ export { TokenStore, MemoryTokenStore, FileTokenStore, createDefaultTokenStore, isTokenExpired, calculateExpiration, tokenResponseToStored, } from './token-store.js';
30
+ export { configureServerAuth, createScopeGuards, createMCPScopeGuards, getStandardMCPScopes, validateAuthConfig, } from './server-integration.js';
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EACL,WAAW,EACX,aAAa,EACb,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,SAAS,EACT,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAK1B,cAAc,YAAY,CAAC;AAG3B,cAAc,WAAW,CAAC;AAG1B,cAAc,sBAAsB,CAAC;AAGrC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,EACf,QAAQ,EACR,WAAW,EACX,YAAY,GACb,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * NitroStack Authentication Module
3
+ *
4
+ * Multiple authentication options:
5
+ * 1. Simple JWT - For 70% of use cases (internal tools, APIs)
6
+ * 2. API Keys - For simple scenarios (service-to-service)
7
+ * 3. OAuth 2.1 - For enterprise/SaaS (full compliance)
8
+ *
9
+ * Standards:
10
+ * - OAuth 2.1 (IETF draft-ietf-oauth-v2-1-13)
11
+ * - RFC 9728 - Protected Resource Metadata
12
+ * - RFC 8414 - Authorization Server Metadata
13
+ * - RFC 7591 - Dynamic Client Registration
14
+ * - RFC 8707 - Resource Indicators (Token Audience Binding)
15
+ * - RFC 7636 - PKCE
16
+ * - RFC 7662 - Token Introspection
17
+ * - RFC 6750 - Bearer Token Usage
18
+ */
19
+ // ==================== SECURE SECRET HANDLING ====================
20
+ // Secure secret value wrapper (prevents hardcoding secrets)
21
+ export { SecretValue, isSecretValue, unwrapSecret, } from './secure-secret.js';
22
+ // ==================== SIMPLE AUTH (Recommended for most users) ====================
23
+ // Simple JWT Auth (no OAuth complexity!)
24
+ export { createSimpleJWTAuth, generateJWT, verifyJWT, decodeJWT, } from './simple-jwt.js';
25
+ // API Key Auth (simplest option)
26
+ export { createAPIKeyAuth, generateAPIKey, hashAPIKey, isValidAPIKeyFormat, generateAPIKeyWithMetadata, validateAPIKeyWithMetadata, } from './api-key.js';
27
+ // Quick Setup Helpers (1-liner auth!)
28
+ export { setupJWTAuth, setupAPIKeyAuth, setupOAuthAuth, generateTestCredentials, printAuthSetupInstructions, validateAuthEnv, } from './quick-setup.js';
29
+ // ==================== OAUTH 2.1 (Advanced users) ====================
30
+ // Types
31
+ export * from './types.js';
32
+ // PKCE utilities
33
+ export * from './pkce.js';
34
+ // Server metadata
35
+ export * from './server-metadata.js';
36
+ // Token validation
37
+ export * from './token-validation.js';
38
+ // Middleware (for servers)
39
+ export { createAuthMiddleware, requireScopes, optionalAuth, RequireScopes, isAuthenticated, hasScope, hasAnyScope, hasAllScopes, } from './middleware.js';
40
+ // OAuth client (for clients)
41
+ export { OAuth2Client } from './client.js';
42
+ // Token storage
43
+ export { MemoryTokenStore, FileTokenStore, createDefaultTokenStore, isTokenExpired, calculateExpiration, tokenResponseToStored, } from './token-store.js';
44
+ // Server integration helpers
45
+ export { configureServerAuth, createScopeGuards, createMCPScopeGuards, getStandardMCPScopes, validateAuthConfig, } from './server-integration.js';
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,mEAAmE;AAEnE,4DAA4D;AAC5D,OAAO,EACL,WAAW,EACX,aAAa,EACb,YAAY,GAGb,MAAM,oBAAoB,CAAC;AAE5B,qFAAqF;AAErF,yCAAyC;AACzC,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,SAAS,EACT,SAAS,GAMV,MAAM,iBAAiB,CAAC;AAEzB,iCAAiC;AACjC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,GAG3B,MAAM,cAAc,CAAC;AAEtB,sCAAsC;AACtC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,uEAAuE;AAEvE,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,iBAAiB;AACjB,cAAc,WAAW,CAAC;AAE1B,kBAAkB;AAClB,cAAc,sBAAsB,CAAC;AAErC,mBAAmB;AACnB,cAAc,uBAAuB,CAAC;AAEtC,2BAA2B;AAC3B,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,EACf,QAAQ,EACR,WAAW,EACX,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,6BAA6B;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,gBAAgB;AAChB,OAAO,EAEL,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,6BAA6B;AAC7B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC"}