alepha 0.15.0 → 0.15.1

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 (222) hide show
  1. package/README.md +43 -98
  2. package/dist/api/audits/index.d.ts +240 -240
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/audits/index.js +2 -2
  5. package/dist/api/audits/index.js.map +1 -1
  6. package/dist/api/files/index.d.ts +185 -185
  7. package/dist/api/files/index.d.ts.map +1 -1
  8. package/dist/api/files/index.js +2 -2
  9. package/dist/api/files/index.js.map +1 -1
  10. package/dist/api/jobs/index.d.ts +245 -245
  11. package/dist/api/jobs/index.d.ts.map +1 -1
  12. package/dist/api/notifications/index.browser.js +4 -4
  13. package/dist/api/notifications/index.browser.js.map +1 -1
  14. package/dist/api/notifications/index.d.ts +74 -74
  15. package/dist/api/notifications/index.d.ts.map +1 -1
  16. package/dist/api/notifications/index.js +4 -4
  17. package/dist/api/notifications/index.js.map +1 -1
  18. package/dist/api/parameters/index.d.ts +221 -221
  19. package/dist/api/parameters/index.d.ts.map +1 -1
  20. package/dist/api/users/index.d.ts +1632 -1631
  21. package/dist/api/users/index.d.ts.map +1 -1
  22. package/dist/api/users/index.js +26 -34
  23. package/dist/api/users/index.js.map +1 -1
  24. package/dist/api/verifications/index.d.ts +132 -132
  25. package/dist/api/verifications/index.d.ts.map +1 -1
  26. package/dist/batch/index.d.ts +122 -122
  27. package/dist/batch/index.d.ts.map +1 -1
  28. package/dist/bucket/index.d.ts +163 -163
  29. package/dist/bucket/index.d.ts.map +1 -1
  30. package/dist/cache/core/index.d.ts +46 -46
  31. package/dist/cache/core/index.d.ts.map +1 -1
  32. package/dist/cache/redis/index.d.ts.map +1 -1
  33. package/dist/cache/redis/index.js +2 -2
  34. package/dist/cache/redis/index.js.map +1 -1
  35. package/dist/cli/index.d.ts +5933 -201
  36. package/dist/cli/index.d.ts.map +1 -1
  37. package/dist/cli/index.js +609 -169
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/command/index.d.ts +296 -296
  40. package/dist/command/index.d.ts.map +1 -1
  41. package/dist/command/index.js +19 -19
  42. package/dist/command/index.js.map +1 -1
  43. package/dist/core/index.browser.js +268 -79
  44. package/dist/core/index.browser.js.map +1 -1
  45. package/dist/core/index.d.ts +768 -694
  46. package/dist/core/index.d.ts.map +1 -1
  47. package/dist/core/index.js +268 -79
  48. package/dist/core/index.js.map +1 -1
  49. package/dist/core/index.native.js +268 -79
  50. package/dist/core/index.native.js.map +1 -1
  51. package/dist/datetime/index.d.ts +44 -44
  52. package/dist/datetime/index.d.ts.map +1 -1
  53. package/dist/email/index.d.ts +25 -25
  54. package/dist/email/index.d.ts.map +1 -1
  55. package/dist/fake/index.d.ts +5409 -5409
  56. package/dist/fake/index.d.ts.map +1 -1
  57. package/dist/fake/index.js +22 -22
  58. package/dist/fake/index.js.map +1 -1
  59. package/dist/file/index.d.ts +435 -435
  60. package/dist/file/index.d.ts.map +1 -1
  61. package/dist/lock/core/index.d.ts +208 -208
  62. package/dist/lock/core/index.d.ts.map +1 -1
  63. package/dist/lock/redis/index.d.ts.map +1 -1
  64. package/dist/logger/index.d.ts +24 -24
  65. package/dist/logger/index.d.ts.map +1 -1
  66. package/dist/logger/index.js +1 -5
  67. package/dist/logger/index.js.map +1 -1
  68. package/dist/mcp/index.d.ts +216 -198
  69. package/dist/mcp/index.d.ts.map +1 -1
  70. package/dist/mcp/index.js +28 -4
  71. package/dist/mcp/index.js.map +1 -1
  72. package/dist/orm/index.browser.js +9 -9
  73. package/dist/orm/index.browser.js.map +1 -1
  74. package/dist/orm/index.bun.js +83 -76
  75. package/dist/orm/index.bun.js.map +1 -1
  76. package/dist/orm/index.d.ts +961 -960
  77. package/dist/orm/index.d.ts.map +1 -1
  78. package/dist/orm/index.js +88 -81
  79. package/dist/orm/index.js.map +1 -1
  80. package/dist/queue/core/index.d.ts +244 -244
  81. package/dist/queue/core/index.d.ts.map +1 -1
  82. package/dist/queue/redis/index.d.ts.map +1 -1
  83. package/dist/redis/index.d.ts +105 -105
  84. package/dist/redis/index.d.ts.map +1 -1
  85. package/dist/retry/index.d.ts +69 -69
  86. package/dist/retry/index.d.ts.map +1 -1
  87. package/dist/router/index.d.ts +6 -6
  88. package/dist/router/index.d.ts.map +1 -1
  89. package/dist/scheduler/index.d.ts +108 -26
  90. package/dist/scheduler/index.d.ts.map +1 -1
  91. package/dist/scheduler/index.js +393 -1
  92. package/dist/scheduler/index.js.map +1 -1
  93. package/dist/security/index.d.ts +532 -209
  94. package/dist/security/index.d.ts.map +1 -1
  95. package/dist/security/index.js +1422 -11
  96. package/dist/security/index.js.map +1 -1
  97. package/dist/server/auth/index.d.ts +1296 -271
  98. package/dist/server/auth/index.d.ts.map +1 -1
  99. package/dist/server/auth/index.js +1249 -18
  100. package/dist/server/auth/index.js.map +1 -1
  101. package/dist/server/cache/index.d.ts +56 -56
  102. package/dist/server/cache/index.d.ts.map +1 -1
  103. package/dist/server/compress/index.d.ts +3 -3
  104. package/dist/server/compress/index.d.ts.map +1 -1
  105. package/dist/server/cookies/index.d.ts +6 -6
  106. package/dist/server/cookies/index.d.ts.map +1 -1
  107. package/dist/server/core/index.d.ts +196 -186
  108. package/dist/server/core/index.d.ts.map +1 -1
  109. package/dist/server/core/index.js +43 -27
  110. package/dist/server/core/index.js.map +1 -1
  111. package/dist/server/cors/index.d.ts +11 -11
  112. package/dist/server/cors/index.d.ts.map +1 -1
  113. package/dist/server/health/index.d.ts.map +1 -1
  114. package/dist/server/helmet/index.d.ts +2 -2
  115. package/dist/server/helmet/index.d.ts.map +1 -1
  116. package/dist/server/links/index.browser.js +9 -1
  117. package/dist/server/links/index.browser.js.map +1 -1
  118. package/dist/server/links/index.d.ts +83 -83
  119. package/dist/server/links/index.d.ts.map +1 -1
  120. package/dist/server/links/index.js +13 -5
  121. package/dist/server/links/index.js.map +1 -1
  122. package/dist/server/metrics/index.d.ts +514 -1
  123. package/dist/server/metrics/index.d.ts.map +1 -1
  124. package/dist/server/metrics/index.js +4462 -4
  125. package/dist/server/metrics/index.js.map +1 -1
  126. package/dist/server/multipart/index.d.ts +6 -6
  127. package/dist/server/multipart/index.d.ts.map +1 -1
  128. package/dist/server/proxy/index.d.ts +102 -102
  129. package/dist/server/proxy/index.d.ts.map +1 -1
  130. package/dist/server/rate-limit/index.d.ts +16 -16
  131. package/dist/server/rate-limit/index.d.ts.map +1 -1
  132. package/dist/server/static/index.d.ts +44 -44
  133. package/dist/server/static/index.d.ts.map +1 -1
  134. package/dist/server/swagger/index.d.ts +47 -47
  135. package/dist/server/swagger/index.d.ts.map +1 -1
  136. package/dist/sms/index.d.ts +11 -11
  137. package/dist/sms/index.d.ts.map +1 -1
  138. package/dist/sms/index.js +3 -3
  139. package/dist/sms/index.js.map +1 -1
  140. package/dist/thread/index.d.ts +71 -71
  141. package/dist/thread/index.d.ts.map +1 -1
  142. package/dist/thread/index.js +2 -2
  143. package/dist/thread/index.js.map +1 -1
  144. package/dist/topic/core/index.d.ts +318 -318
  145. package/dist/topic/core/index.d.ts.map +1 -1
  146. package/dist/topic/redis/index.d.ts +6 -6
  147. package/dist/topic/redis/index.d.ts.map +1 -1
  148. package/dist/vite/index.d.ts +2324 -1719
  149. package/dist/vite/index.d.ts.map +1 -1
  150. package/dist/vite/index.js +123 -475
  151. package/dist/vite/index.js.map +1 -1
  152. package/dist/websocket/index.browser.js +3 -3
  153. package/dist/websocket/index.browser.js.map +1 -1
  154. package/dist/websocket/index.d.ts +275 -275
  155. package/dist/websocket/index.d.ts.map +1 -1
  156. package/dist/websocket/index.js +3 -3
  157. package/dist/websocket/index.js.map +1 -1
  158. package/package.json +9 -9
  159. package/src/api/users/services/SessionService.ts +0 -10
  160. package/src/cli/apps/AlephaCli.ts +2 -2
  161. package/src/cli/apps/AlephaPackageBuilderCli.ts +9 -1
  162. package/src/cli/assets/apiHelloControllerTs.ts +2 -1
  163. package/src/cli/assets/biomeJson.ts +2 -1
  164. package/src/cli/assets/claudeMd.ts +9 -4
  165. package/src/cli/assets/dummySpecTs.ts +2 -1
  166. package/src/cli/assets/editorconfig.ts +2 -1
  167. package/src/cli/assets/mainBrowserTs.ts +2 -1
  168. package/src/cli/assets/mainCss.ts +24 -0
  169. package/src/cli/assets/tsconfigJson.ts +2 -1
  170. package/src/cli/assets/webAppRouterTs.ts +2 -1
  171. package/src/cli/assets/webHelloComponentTsx.ts +6 -2
  172. package/src/cli/atoms/appEntryOptions.ts +13 -0
  173. package/src/cli/atoms/buildOptions.ts +1 -1
  174. package/src/cli/atoms/changelogOptions.ts +1 -1
  175. package/src/cli/commands/build.ts +63 -47
  176. package/src/cli/commands/dev.ts +16 -33
  177. package/src/cli/commands/gen/env.ts +1 -1
  178. package/src/cli/commands/init.ts +17 -8
  179. package/src/cli/commands/lint.ts +1 -1
  180. package/src/cli/defineConfig.ts +9 -0
  181. package/src/cli/index.ts +2 -1
  182. package/src/cli/providers/AppEntryProvider.ts +131 -0
  183. package/src/cli/providers/ViteBuildProvider.ts +82 -0
  184. package/src/cli/providers/ViteDevServerProvider.ts +350 -0
  185. package/src/cli/providers/ViteTemplateProvider.ts +27 -0
  186. package/src/cli/services/AlephaCliUtils.ts +33 -2
  187. package/src/cli/services/PackageManagerUtils.ts +13 -6
  188. package/src/cli/services/ProjectScaffolder.ts +72 -49
  189. package/src/core/Alepha.ts +2 -8
  190. package/src/core/primitives/$module.ts +12 -0
  191. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +257 -0
  192. package/src/core/providers/KeylessJsonSchemaCodec.ts +396 -14
  193. package/src/core/providers/SchemaValidator.spec.ts +236 -0
  194. package/src/logger/providers/PrettyFormatterProvider.ts +0 -9
  195. package/src/mcp/errors/McpError.ts +30 -0
  196. package/src/mcp/index.ts +3 -0
  197. package/src/mcp/transports/SseMcpTransport.ts +16 -6
  198. package/src/orm/providers/DrizzleKitProvider.ts +3 -5
  199. package/src/orm/services/Repository.ts +11 -0
  200. package/src/server/core/index.ts +1 -1
  201. package/src/server/core/providers/BunHttpServerProvider.ts +1 -1
  202. package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
  203. package/src/server/core/providers/NodeHttpServerProvider.ts +71 -22
  204. package/src/server/core/providers/ServerLoggerProvider.ts +2 -2
  205. package/src/server/core/providers/ServerProvider.ts +9 -12
  206. package/src/server/links/atoms/apiLinksAtom.ts +7 -0
  207. package/src/server/links/index.browser.ts +2 -0
  208. package/src/server/links/index.ts +2 -0
  209. package/src/vite/index.ts +3 -2
  210. package/src/vite/tasks/buildClient.ts +0 -1
  211. package/src/vite/tasks/buildServer.ts +68 -21
  212. package/src/vite/tasks/copyAssets.ts +5 -4
  213. package/src/vite/tasks/generateSitemap.ts +64 -23
  214. package/src/vite/tasks/index.ts +0 -2
  215. package/src/vite/tasks/prerenderPages.ts +49 -24
  216. package/src/cli/assets/indexHtml.ts +0 -15
  217. package/src/cli/commands/format.ts +0 -23
  218. package/src/vite/helpers/boot.ts +0 -117
  219. package/src/vite/plugins/viteAlephaDev.ts +0 -177
  220. package/src/vite/tasks/devServer.ts +0 -71
  221. package/src/vite/tasks/runAlepha.ts +0 -270
  222. /package/dist/orm/{chunk-DtkW-qnP.js → chunk-DH6iiROE.js} +0 -0
@@ -2,11 +2,1242 @@ import { $context, $hook, $inject, $module, Alepha, AlephaError, KIND, Primitive
2
2
  import { $cookie, AlephaServerCookies, ServerCookiesProvider } from "alepha/server/cookies";
3
3
  import { DateTimeProvider } from "alepha/datetime";
4
4
  import { InvalidCredentialsError, SecurityError, SecurityProvider, userAccountInfoSchema } from "alepha/security";
5
- import { Configuration, allowInsecureRequests, authorizationCodeGrant, buildAuthorizationUrl, buildEndSessionUrl, calculatePKCECodeChallenge, discovery, randomPKCECodeVerifier, randomState, refreshTokenGrant } from "openid-client";
6
5
  import { $logger } from "alepha/logger";
7
6
  import { $route, BadRequestError } from "alepha/server";
8
7
  import { ServerLinksProvider, apiLinksResponseSchema } from "alepha/server/links";
9
8
 
9
+ //#region ../../../../node_modules/oauth4webapi/build/index.js
10
+ let USER_AGENT$1;
11
+ if (typeof navigator === "undefined" || !navigator.userAgent?.startsWith?.("Mozilla/5.0 ")) USER_AGENT$1 = `oauth4webapi/v3.8.3`;
12
+ function looseInstanceOf(input, expected) {
13
+ if (input == null) return false;
14
+ try {
15
+ return input instanceof expected || Object.getPrototypeOf(input)[Symbol.toStringTag] === expected.prototype[Symbol.toStringTag];
16
+ } catch {
17
+ return false;
18
+ }
19
+ }
20
+ const ERR_INVALID_ARG_VALUE$1 = "ERR_INVALID_ARG_VALUE";
21
+ const ERR_INVALID_ARG_TYPE$1 = "ERR_INVALID_ARG_TYPE";
22
+ function CodedTypeError$1(message, code, cause) {
23
+ const err = new TypeError(message, { cause });
24
+ Object.assign(err, { code });
25
+ return err;
26
+ }
27
+ const allowInsecureRequests$1 = Symbol();
28
+ const clockSkew$1 = Symbol();
29
+ const clockTolerance$1 = Symbol();
30
+ const customFetch$1 = Symbol();
31
+ const modifyAssertion$1 = Symbol();
32
+ const jweDecrypt = Symbol();
33
+ const encoder = new TextEncoder();
34
+ const decoder$1 = new TextDecoder();
35
+ function buf(input) {
36
+ if (typeof input === "string") return encoder.encode(input);
37
+ return decoder$1.decode(input);
38
+ }
39
+ let encodeBase64Url;
40
+ if (Uint8Array.prototype.toBase64) encodeBase64Url = (input) => {
41
+ if (input instanceof ArrayBuffer) input = new Uint8Array(input);
42
+ return input.toBase64({
43
+ alphabet: "base64url",
44
+ omitPadding: true
45
+ });
46
+ };
47
+ else {
48
+ const CHUNK_SIZE = 32768;
49
+ encodeBase64Url = (input) => {
50
+ if (input instanceof ArrayBuffer) input = new Uint8Array(input);
51
+ const arr = [];
52
+ for (let i = 0; i < input.byteLength; i += CHUNK_SIZE) arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));
53
+ return btoa(arr.join("")).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
54
+ };
55
+ }
56
+ let decodeBase64Url;
57
+ if (Uint8Array.fromBase64) decodeBase64Url = (input) => {
58
+ try {
59
+ return Uint8Array.fromBase64(input, { alphabet: "base64url" });
60
+ } catch (cause) {
61
+ throw CodedTypeError$1("The input to be decoded is not correctly encoded.", ERR_INVALID_ARG_VALUE$1, cause);
62
+ }
63
+ };
64
+ else decodeBase64Url = (input) => {
65
+ try {
66
+ const binary = atob(input.replace(/-/g, "+").replace(/_/g, "/").replace(/\s/g, ""));
67
+ const bytes = new Uint8Array(binary.length);
68
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
69
+ return bytes;
70
+ } catch (cause) {
71
+ throw CodedTypeError$1("The input to be decoded is not correctly encoded.", ERR_INVALID_ARG_VALUE$1, cause);
72
+ }
73
+ };
74
+ function b64u(input) {
75
+ if (typeof input === "string") return decodeBase64Url(input);
76
+ return encodeBase64Url(input);
77
+ }
78
+ var UnsupportedOperationError = class extends Error {
79
+ code;
80
+ constructor(message, options) {
81
+ super(message, options);
82
+ this.name = this.constructor.name;
83
+ this.code = UNSUPPORTED_OPERATION;
84
+ Error.captureStackTrace?.(this, this.constructor);
85
+ }
86
+ };
87
+ var OperationProcessingError = class extends Error {
88
+ code;
89
+ constructor(message, options) {
90
+ super(message, options);
91
+ this.name = this.constructor.name;
92
+ if (options?.code) this.code = options?.code;
93
+ Error.captureStackTrace?.(this, this.constructor);
94
+ }
95
+ };
96
+ function OPE(message, code, cause) {
97
+ return new OperationProcessingError(message, {
98
+ code,
99
+ cause
100
+ });
101
+ }
102
+ function isJsonObject(input) {
103
+ if (input === null || typeof input !== "object" || Array.isArray(input)) return false;
104
+ return true;
105
+ }
106
+ function prepareHeaders(input) {
107
+ if (looseInstanceOf(input, Headers)) input = Object.fromEntries(input.entries());
108
+ const headers = new Headers(input ?? {});
109
+ if (USER_AGENT$1 && !headers.has("user-agent")) headers.set("user-agent", USER_AGENT$1);
110
+ if (headers.has("authorization")) throw CodedTypeError$1("\"options.headers\" must not include the \"authorization\" header name", ERR_INVALID_ARG_VALUE$1);
111
+ return headers;
112
+ }
113
+ function signal$1(url, value) {
114
+ if (value !== void 0) {
115
+ if (typeof value === "function") value = value(url.href);
116
+ if (!(value instanceof AbortSignal)) throw CodedTypeError$1("\"options.signal\" must return or be an instance of AbortSignal", ERR_INVALID_ARG_TYPE$1);
117
+ return value;
118
+ }
119
+ }
120
+ function replaceDoubleSlash(pathname) {
121
+ if (pathname.includes("//")) return pathname.replace("//", "/");
122
+ return pathname;
123
+ }
124
+ function prependWellKnown(url, wellKnown, allowTerminatingSlash = false) {
125
+ if (url.pathname === "/") url.pathname = wellKnown;
126
+ else url.pathname = replaceDoubleSlash(`${wellKnown}/${allowTerminatingSlash ? url.pathname : url.pathname.replace(/(\/)$/, "")}`);
127
+ return url;
128
+ }
129
+ function appendWellKnown(url, wellKnown) {
130
+ url.pathname = replaceDoubleSlash(`${url.pathname}/${wellKnown}`);
131
+ return url;
132
+ }
133
+ async function performDiscovery$1(input, urlName, transform, options) {
134
+ if (!(input instanceof URL)) throw CodedTypeError$1(`"${urlName}" must be an instance of URL`, ERR_INVALID_ARG_TYPE$1);
135
+ checkProtocol(input, options?.[allowInsecureRequests$1] !== true);
136
+ const url = transform(new URL(input.href));
137
+ const headers = prepareHeaders(options?.headers);
138
+ headers.set("accept", "application/json");
139
+ return (options?.[customFetch$1] || fetch)(url.href, {
140
+ body: void 0,
141
+ headers: Object.fromEntries(headers.entries()),
142
+ method: "GET",
143
+ redirect: "manual",
144
+ signal: signal$1(url, options?.signal)
145
+ });
146
+ }
147
+ async function discoveryRequest(issuerIdentifier, options) {
148
+ return performDiscovery$1(issuerIdentifier, "issuerIdentifier", (url) => {
149
+ switch (options?.algorithm) {
150
+ case void 0:
151
+ case "oidc":
152
+ appendWellKnown(url, ".well-known/openid-configuration");
153
+ break;
154
+ case "oauth2":
155
+ prependWellKnown(url, ".well-known/oauth-authorization-server");
156
+ break;
157
+ default: throw CodedTypeError$1("\"options.algorithm\" must be \"oidc\" (default), or \"oauth2\"", ERR_INVALID_ARG_VALUE$1);
158
+ }
159
+ return url;
160
+ }, options);
161
+ }
162
+ function assertNumber(input, allow0, it, code, cause) {
163
+ try {
164
+ if (typeof input !== "number" || !Number.isFinite(input)) throw CodedTypeError$1(`${it} must be a number`, ERR_INVALID_ARG_TYPE$1, cause);
165
+ if (input > 0) return;
166
+ if (allow0) {
167
+ if (input !== 0) throw CodedTypeError$1(`${it} must be a non-negative number`, ERR_INVALID_ARG_VALUE$1, cause);
168
+ return;
169
+ }
170
+ throw CodedTypeError$1(`${it} must be a positive number`, ERR_INVALID_ARG_VALUE$1, cause);
171
+ } catch (err) {
172
+ if (code) throw OPE(err.message, code, cause);
173
+ throw err;
174
+ }
175
+ }
176
+ function assertString$1(input, it, code, cause) {
177
+ try {
178
+ if (typeof input !== "string") throw CodedTypeError$1(`${it} must be a string`, ERR_INVALID_ARG_TYPE$1, cause);
179
+ if (input.length === 0) throw CodedTypeError$1(`${it} must not be empty`, ERR_INVALID_ARG_VALUE$1, cause);
180
+ } catch (err) {
181
+ if (code) throw OPE(err.message, code, cause);
182
+ throw err;
183
+ }
184
+ }
185
+ async function processDiscoveryResponse(expectedIssuerIdentifier, response) {
186
+ const expected = expectedIssuerIdentifier;
187
+ if (!(expected instanceof URL) && expected !== _nodiscoverycheck) throw CodedTypeError$1("\"expectedIssuerIdentifier\" must be an instance of URL", ERR_INVALID_ARG_TYPE$1);
188
+ if (!looseInstanceOf(response, Response)) throw CodedTypeError$1("\"response\" must be an instance of Response", ERR_INVALID_ARG_TYPE$1);
189
+ if (response.status !== 200) throw OPE("\"response\" is not a conform Authorization Server Metadata response (unexpected HTTP status code)", RESPONSE_IS_NOT_CONFORM, response);
190
+ assertReadableResponse(response);
191
+ const json = await getResponseJsonBody(response);
192
+ assertString$1(json.issuer, "\"response\" body \"issuer\" property", INVALID_RESPONSE, { body: json });
193
+ if (expected !== _nodiscoverycheck && new URL(json.issuer).href !== expected.href) throw OPE("\"response\" body \"issuer\" property does not match the expected value", JSON_ATTRIBUTE_COMPARISON, {
194
+ expected: expected.href,
195
+ body: json,
196
+ attribute: "issuer"
197
+ });
198
+ return json;
199
+ }
200
+ function assertApplicationJson(response) {
201
+ assertContentType(response, "application/json");
202
+ }
203
+ function notJson(response, ...types) {
204
+ let msg = "\"response\" content-type must be ";
205
+ if (types.length > 2) {
206
+ const last = types.pop();
207
+ msg += `${types.join(", ")}, or ${last}`;
208
+ } else if (types.length === 2) msg += `${types[0]} or ${types[1]}`;
209
+ else msg += types[0];
210
+ return OPE(msg, RESPONSE_IS_NOT_JSON, response);
211
+ }
212
+ function assertContentType(response, contentType) {
213
+ if (getContentType(response) !== contentType) throw notJson(response, contentType);
214
+ }
215
+ function randomBytes() {
216
+ return b64u(crypto.getRandomValues(new Uint8Array(32)));
217
+ }
218
+ function generateRandomCodeVerifier() {
219
+ return randomBytes();
220
+ }
221
+ function generateRandomState() {
222
+ return randomBytes();
223
+ }
224
+ async function calculatePKCECodeChallenge$1(codeVerifier) {
225
+ assertString$1(codeVerifier, "codeVerifier");
226
+ return b64u(await crypto.subtle.digest("SHA-256", buf(codeVerifier)));
227
+ }
228
+ function getClockSkew(client) {
229
+ const skew = client?.[clockSkew$1];
230
+ return typeof skew === "number" && Number.isFinite(skew) ? skew : 0;
231
+ }
232
+ function getClockTolerance(client) {
233
+ const tolerance = client?.[clockTolerance$1];
234
+ return typeof tolerance === "number" && Number.isFinite(tolerance) && Math.sign(tolerance) !== -1 ? tolerance : 30;
235
+ }
236
+ function epochTime() {
237
+ return Math.floor(Date.now() / 1e3);
238
+ }
239
+ function assertAs(as) {
240
+ if (typeof as !== "object" || as === null) throw CodedTypeError$1("\"as\" must be an object", ERR_INVALID_ARG_TYPE$1);
241
+ assertString$1(as.issuer, "\"as.issuer\"");
242
+ }
243
+ function assertClient(client) {
244
+ if (typeof client !== "object" || client === null) throw CodedTypeError$1("\"client\" must be an object", ERR_INVALID_ARG_TYPE$1);
245
+ assertString$1(client.client_id, "\"client.client_id\"");
246
+ }
247
+ function ClientSecretPost$1(clientSecret) {
248
+ assertString$1(clientSecret, "\"clientSecret\"");
249
+ return (_as, client, body, _headers) => {
250
+ body.set("client_id", client.client_id);
251
+ body.set("client_secret", clientSecret);
252
+ };
253
+ }
254
+ function None$1() {
255
+ return (_as, client, body, _headers) => {
256
+ body.set("client_id", client.client_id);
257
+ };
258
+ }
259
+ const URLParse = URL.parse ? (url, base) => URL.parse(url, base) : (url, base) => {
260
+ try {
261
+ return new URL(url, base);
262
+ } catch {
263
+ return null;
264
+ }
265
+ };
266
+ function checkProtocol(url, enforceHttps) {
267
+ if (enforceHttps && url.protocol !== "https:") throw OPE("only requests to HTTPS are allowed", HTTP_REQUEST_FORBIDDEN, url);
268
+ if (url.protocol !== "https:" && url.protocol !== "http:") throw OPE("only HTTP and HTTPS requests are allowed", REQUEST_PROTOCOL_FORBIDDEN, url);
269
+ }
270
+ function validateEndpoint(value, endpoint, useMtlsAlias, enforceHttps) {
271
+ let url;
272
+ if (typeof value !== "string" || !(url = URLParse(value))) throw OPE(`authorization server metadata does not contain a valid ${useMtlsAlias ? `"as.mtls_endpoint_aliases.${endpoint}"` : `"as.${endpoint}"`}`, value === void 0 ? MISSING_SERVER_METADATA : INVALID_SERVER_METADATA, { attribute: useMtlsAlias ? `mtls_endpoint_aliases.${endpoint}` : endpoint });
273
+ checkProtocol(url, enforceHttps);
274
+ return url;
275
+ }
276
+ function resolveEndpoint(as, endpoint, useMtlsAlias, enforceHttps) {
277
+ if (useMtlsAlias && as.mtls_endpoint_aliases && endpoint in as.mtls_endpoint_aliases) return validateEndpoint(as.mtls_endpoint_aliases[endpoint], endpoint, useMtlsAlias, enforceHttps);
278
+ return validateEndpoint(as[endpoint], endpoint, useMtlsAlias, enforceHttps);
279
+ }
280
+ function isDPoPNonceError(err) {
281
+ if (err instanceof WWWAuthenticateChallengeError) {
282
+ const { 0: challenge, length } = err.cause;
283
+ return length === 1 && challenge.scheme === "dpop" && challenge.parameters.error === "use_dpop_nonce";
284
+ }
285
+ if (err instanceof ResponseBodyError) return err.error === "use_dpop_nonce";
286
+ return false;
287
+ }
288
+ var ResponseBodyError = class extends Error {
289
+ cause;
290
+ code;
291
+ error;
292
+ status;
293
+ error_description;
294
+ response;
295
+ constructor(message, options) {
296
+ super(message, options);
297
+ this.name = this.constructor.name;
298
+ this.code = RESPONSE_BODY_ERROR;
299
+ this.cause = options.cause;
300
+ this.error = options.cause.error;
301
+ this.status = options.response.status;
302
+ this.error_description = options.cause.error_description;
303
+ Object.defineProperty(this, "response", {
304
+ enumerable: false,
305
+ value: options.response
306
+ });
307
+ Error.captureStackTrace?.(this, this.constructor);
308
+ }
309
+ };
310
+ var AuthorizationResponseError = class extends Error {
311
+ cause;
312
+ code;
313
+ error;
314
+ error_description;
315
+ constructor(message, options) {
316
+ super(message, options);
317
+ this.name = this.constructor.name;
318
+ this.code = AUTHORIZATION_RESPONSE_ERROR;
319
+ this.cause = options.cause;
320
+ this.error = options.cause.get("error");
321
+ this.error_description = options.cause.get("error_description") ?? void 0;
322
+ Error.captureStackTrace?.(this, this.constructor);
323
+ }
324
+ };
325
+ var WWWAuthenticateChallengeError = class extends Error {
326
+ cause;
327
+ code;
328
+ response;
329
+ status;
330
+ constructor(message, options) {
331
+ super(message, options);
332
+ this.name = this.constructor.name;
333
+ this.code = WWW_AUTHENTICATE_CHALLENGE;
334
+ this.cause = options.cause;
335
+ this.status = options.response.status;
336
+ this.response = options.response;
337
+ Object.defineProperty(this, "response", { enumerable: false });
338
+ Error.captureStackTrace?.(this, this.constructor);
339
+ }
340
+ };
341
+ const tokenMatch = "[a-zA-Z0-9!#$%&\\'\\*\\+\\-\\.\\^_`\\|~]+";
342
+ const token68Match = "[a-zA-Z0-9\\-\\._\\~\\+\\/]+={0,2}";
343
+ const quotedParamMatcher = "(" + tokenMatch + ")\\s*=\\s*\"((?:[^\"\\\\]|\\\\[\\s\\S])*)\"";
344
+ const paramMatcher = "(" + tokenMatch + ")\\s*=\\s*([a-zA-Z0-9!#$%&\\'\\*\\+\\-\\.\\^_`\\|~]+)";
345
+ const schemeRE = new RegExp("^[,\\s]*(" + tokenMatch + ")");
346
+ const quotedParamRE = new RegExp("^[,\\s]*" + quotedParamMatcher + "[,\\s]*(.*)");
347
+ const unquotedParamRE = new RegExp("^[,\\s]*" + paramMatcher + "[,\\s]*(.*)");
348
+ const token68ParamRE = new RegExp("^(" + token68Match + ")(?:$|[,\\s])(.*)");
349
+ function parseWwwAuthenticateChallenges(response) {
350
+ if (!looseInstanceOf(response, Response)) throw CodedTypeError$1("\"response\" must be an instance of Response", ERR_INVALID_ARG_TYPE$1);
351
+ const header = response.headers.get("www-authenticate");
352
+ if (header === null) return;
353
+ const challenges = [];
354
+ let rest = header;
355
+ while (rest) {
356
+ let match = rest.match(schemeRE);
357
+ const scheme = match?.["1"].toLowerCase();
358
+ if (!scheme) return;
359
+ const afterScheme = rest.substring(match[0].length);
360
+ if (afterScheme && !afterScheme.match(/^[\s,]/)) return;
361
+ const spaceMatch = afterScheme.match(/^\s+(.*)$/);
362
+ const hasParameters = !!spaceMatch;
363
+ rest = spaceMatch ? spaceMatch[1] : void 0;
364
+ const parameters = {};
365
+ let token68;
366
+ if (hasParameters) while (rest) {
367
+ let key;
368
+ let value;
369
+ if (match = rest.match(quotedParamRE)) {
370
+ [, key, value, rest] = match;
371
+ if (value.includes("\\")) try {
372
+ value = JSON.parse(`"${value}"`);
373
+ } catch {}
374
+ parameters[key.toLowerCase()] = value;
375
+ continue;
376
+ }
377
+ if (match = rest.match(unquotedParamRE)) {
378
+ [, key, value, rest] = match;
379
+ parameters[key.toLowerCase()] = value;
380
+ continue;
381
+ }
382
+ if (match = rest.match(token68ParamRE)) {
383
+ if (Object.keys(parameters).length) break;
384
+ [, token68, rest] = match;
385
+ break;
386
+ }
387
+ return;
388
+ }
389
+ else rest = afterScheme || void 0;
390
+ const challenge = {
391
+ scheme,
392
+ parameters
393
+ };
394
+ if (token68) challenge.token68 = token68;
395
+ challenges.push(challenge);
396
+ }
397
+ if (!challenges.length) return;
398
+ return challenges;
399
+ }
400
+ async function parseOAuthResponseErrorBody(response) {
401
+ if (response.status > 399 && response.status < 500) {
402
+ assertReadableResponse(response);
403
+ assertApplicationJson(response);
404
+ try {
405
+ const json = await response.clone().json();
406
+ if (isJsonObject(json) && typeof json.error === "string" && json.error.length) return json;
407
+ } catch {}
408
+ }
409
+ }
410
+ async function checkOAuthBodyError(response, expected, label) {
411
+ if (response.status !== expected) {
412
+ checkAuthenticationChallenges(response);
413
+ let err;
414
+ if (err = await parseOAuthResponseErrorBody(response)) {
415
+ await response.body?.cancel();
416
+ throw new ResponseBodyError("server responded with an error in the response body", {
417
+ cause: err,
418
+ response
419
+ });
420
+ }
421
+ throw OPE(`"response" is not a conform ${label} response (unexpected HTTP status code)`, RESPONSE_IS_NOT_CONFORM, response);
422
+ }
423
+ }
424
+ function assertDPoP(option) {
425
+ if (!branded.has(option)) throw CodedTypeError$1("\"options.DPoP\" is not a valid DPoPHandle", ERR_INVALID_ARG_VALUE$1);
426
+ }
427
+ const skipSubjectCheck$1 = Symbol();
428
+ function getContentType(input) {
429
+ return input.headers.get("content-type")?.split(";")[0];
430
+ }
431
+ async function authenticatedRequest(as, client, clientAuthentication, url, body, headers, options) {
432
+ await clientAuthentication(as, client, body, headers);
433
+ headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
434
+ return (options?.[customFetch$1] || fetch)(url.href, {
435
+ body,
436
+ headers: Object.fromEntries(headers.entries()),
437
+ method: "POST",
438
+ redirect: "manual",
439
+ signal: signal$1(url, options?.signal)
440
+ });
441
+ }
442
+ async function tokenEndpointRequest(as, client, clientAuthentication, grantType, parameters, options) {
443
+ const url = resolveEndpoint(as, "token_endpoint", client.use_mtls_endpoint_aliases, options?.[allowInsecureRequests$1] !== true);
444
+ parameters.set("grant_type", grantType);
445
+ const headers = prepareHeaders(options?.headers);
446
+ headers.set("accept", "application/json");
447
+ if (options?.DPoP !== void 0) {
448
+ assertDPoP(options.DPoP);
449
+ await options.DPoP.addProof(url, headers, "POST");
450
+ }
451
+ const response = await authenticatedRequest(as, client, clientAuthentication, url, parameters, headers, options);
452
+ options?.DPoP?.cacheNonce(response, url);
453
+ return response;
454
+ }
455
+ async function refreshTokenGrantRequest(as, client, clientAuthentication, refreshToken, options) {
456
+ assertAs(as);
457
+ assertClient(client);
458
+ assertString$1(refreshToken, "\"refreshToken\"");
459
+ const parameters = new URLSearchParams(options?.additionalParameters);
460
+ parameters.set("refresh_token", refreshToken);
461
+ return tokenEndpointRequest(as, client, clientAuthentication, "refresh_token", parameters, options);
462
+ }
463
+ const idTokenClaims = /* @__PURE__ */ new WeakMap();
464
+ const jwtRefs = /* @__PURE__ */ new WeakMap();
465
+ function getValidatedIdTokenClaims(ref) {
466
+ if (!ref.id_token) return;
467
+ const claims = idTokenClaims.get(ref);
468
+ if (!claims) throw CodedTypeError$1("\"ref\" was already garbage collected or did not resolve from the proper sources", ERR_INVALID_ARG_VALUE$1);
469
+ return claims;
470
+ }
471
+ async function processGenericAccessTokenResponse(as, client, response, additionalRequiredIdTokenClaims, decryptFn, recognizedTokenTypes) {
472
+ assertAs(as);
473
+ assertClient(client);
474
+ if (!looseInstanceOf(response, Response)) throw CodedTypeError$1("\"response\" must be an instance of Response", ERR_INVALID_ARG_TYPE$1);
475
+ await checkOAuthBodyError(response, 200, "Token Endpoint");
476
+ assertReadableResponse(response);
477
+ const json = await getResponseJsonBody(response);
478
+ assertString$1(json.access_token, "\"response\" body \"access_token\" property", INVALID_RESPONSE, { body: json });
479
+ assertString$1(json.token_type, "\"response\" body \"token_type\" property", INVALID_RESPONSE, { body: json });
480
+ json.token_type = json.token_type.toLowerCase();
481
+ if (json.expires_in !== void 0) {
482
+ let expiresIn = typeof json.expires_in !== "number" ? parseFloat(json.expires_in) : json.expires_in;
483
+ assertNumber(expiresIn, true, "\"response\" body \"expires_in\" property", INVALID_RESPONSE, { body: json });
484
+ json.expires_in = expiresIn;
485
+ }
486
+ if (json.refresh_token !== void 0) assertString$1(json.refresh_token, "\"response\" body \"refresh_token\" property", INVALID_RESPONSE, { body: json });
487
+ if (json.scope !== void 0 && typeof json.scope !== "string") throw OPE("\"response\" body \"scope\" property must be a string", INVALID_RESPONSE, { body: json });
488
+ if (json.id_token !== void 0) {
489
+ assertString$1(json.id_token, "\"response\" body \"id_token\" property", INVALID_RESPONSE, { body: json });
490
+ const requiredClaims = [
491
+ "aud",
492
+ "exp",
493
+ "iat",
494
+ "iss",
495
+ "sub"
496
+ ];
497
+ if (client.require_auth_time === true) requiredClaims.push("auth_time");
498
+ if (client.default_max_age !== void 0) {
499
+ assertNumber(client.default_max_age, true, "\"client.default_max_age\"");
500
+ requiredClaims.push("auth_time");
501
+ }
502
+ if (additionalRequiredIdTokenClaims?.length) requiredClaims.push(...additionalRequiredIdTokenClaims);
503
+ const { claims, jwt } = await validateJwt(json.id_token, checkSigningAlgorithm.bind(void 0, client.id_token_signed_response_alg, as.id_token_signing_alg_values_supported, "RS256"), getClockSkew(client), getClockTolerance(client), decryptFn).then(validatePresence.bind(void 0, requiredClaims)).then(validateIssuer.bind(void 0, as)).then(validateAudience.bind(void 0, client.client_id));
504
+ if (Array.isArray(claims.aud) && claims.aud.length !== 1) {
505
+ if (claims.azp === void 0) throw OPE("ID Token \"aud\" (audience) claim includes additional untrusted audiences", JWT_CLAIM_COMPARISON, {
506
+ claims,
507
+ claim: "aud"
508
+ });
509
+ if (claims.azp !== client.client_id) throw OPE("unexpected ID Token \"azp\" (authorized party) claim value", JWT_CLAIM_COMPARISON, {
510
+ expected: client.client_id,
511
+ claims,
512
+ claim: "azp"
513
+ });
514
+ }
515
+ if (claims.auth_time !== void 0) assertNumber(claims.auth_time, true, "ID Token \"auth_time\" (authentication time)", INVALID_RESPONSE, { claims });
516
+ jwtRefs.set(response, jwt);
517
+ idTokenClaims.set(json, claims);
518
+ }
519
+ if (recognizedTokenTypes?.[json.token_type] !== void 0) recognizedTokenTypes[json.token_type](response, json);
520
+ else if (json.token_type !== "dpop" && json.token_type !== "bearer") throw new UnsupportedOperationError("unsupported `token_type` value", { cause: { body: json } });
521
+ return json;
522
+ }
523
+ function checkAuthenticationChallenges(response) {
524
+ let challenges;
525
+ if (challenges = parseWwwAuthenticateChallenges(response)) throw new WWWAuthenticateChallengeError("server responded with a challenge in the WWW-Authenticate HTTP Header", {
526
+ cause: challenges,
527
+ response
528
+ });
529
+ }
530
+ async function processRefreshTokenResponse(as, client, response, options) {
531
+ return processGenericAccessTokenResponse(as, client, response, void 0, options?.[jweDecrypt], options?.recognizedTokenTypes);
532
+ }
533
+ function validateAudience(expected, result) {
534
+ if (Array.isArray(result.claims.aud)) {
535
+ if (!result.claims.aud.includes(expected)) throw OPE("unexpected JWT \"aud\" (audience) claim value", JWT_CLAIM_COMPARISON, {
536
+ expected,
537
+ claims: result.claims,
538
+ claim: "aud"
539
+ });
540
+ } else if (result.claims.aud !== expected) throw OPE("unexpected JWT \"aud\" (audience) claim value", JWT_CLAIM_COMPARISON, {
541
+ expected,
542
+ claims: result.claims,
543
+ claim: "aud"
544
+ });
545
+ return result;
546
+ }
547
+ function validateIssuer(as, result) {
548
+ const expected = as[_expectedIssuer]?.(result) ?? as.issuer;
549
+ if (result.claims.iss !== expected) throw OPE("unexpected JWT \"iss\" (issuer) claim value", JWT_CLAIM_COMPARISON, {
550
+ expected,
551
+ claims: result.claims,
552
+ claim: "iss"
553
+ });
554
+ return result;
555
+ }
556
+ const branded = /* @__PURE__ */ new WeakSet();
557
+ function brand(searchParams) {
558
+ branded.add(searchParams);
559
+ return searchParams;
560
+ }
561
+ const nopkce = Symbol();
562
+ async function authorizationCodeGrantRequest(as, client, clientAuthentication, callbackParameters, redirectUri, codeVerifier, options) {
563
+ assertAs(as);
564
+ assertClient(client);
565
+ if (!branded.has(callbackParameters)) throw CodedTypeError$1("\"callbackParameters\" must be an instance of URLSearchParams obtained from \"validateAuthResponse()\", or \"validateJwtAuthResponse()", ERR_INVALID_ARG_VALUE$1);
566
+ assertString$1(redirectUri, "\"redirectUri\"");
567
+ const code = getURLSearchParameter(callbackParameters, "code");
568
+ if (!code) throw OPE("no authorization code in \"callbackParameters\"", INVALID_RESPONSE);
569
+ const parameters = new URLSearchParams(options?.additionalParameters);
570
+ parameters.set("redirect_uri", redirectUri);
571
+ parameters.set("code", code);
572
+ if (codeVerifier !== nopkce) {
573
+ assertString$1(codeVerifier, "\"codeVerifier\"");
574
+ parameters.set("code_verifier", codeVerifier);
575
+ }
576
+ return tokenEndpointRequest(as, client, clientAuthentication, "authorization_code", parameters, options);
577
+ }
578
+ const jwtClaimNames = {
579
+ aud: "audience",
580
+ c_hash: "code hash",
581
+ client_id: "client id",
582
+ exp: "expiration time",
583
+ iat: "issued at",
584
+ iss: "issuer",
585
+ jti: "jwt id",
586
+ nonce: "nonce",
587
+ s_hash: "state hash",
588
+ sub: "subject",
589
+ ath: "access token hash",
590
+ htm: "http method",
591
+ htu: "http uri",
592
+ cnf: "confirmation",
593
+ auth_time: "authentication time"
594
+ };
595
+ function validatePresence(required, result) {
596
+ for (const claim of required) if (result.claims[claim] === void 0) throw OPE(`JWT "${claim}" (${jwtClaimNames[claim]}) claim missing`, INVALID_RESPONSE, { claims: result.claims });
597
+ return result;
598
+ }
599
+ const expectNoNonce = Symbol();
600
+ const skipAuthTimeCheck = Symbol();
601
+ async function processAuthorizationCodeResponse(as, client, response, options) {
602
+ if (typeof options?.expectedNonce === "string" || typeof options?.maxAge === "number" || options?.requireIdToken) return processAuthorizationCodeOpenIDResponse(as, client, response, options.expectedNonce, options.maxAge, options[jweDecrypt], options.recognizedTokenTypes);
603
+ return processAuthorizationCodeOAuth2Response(as, client, response, options?.[jweDecrypt], options?.recognizedTokenTypes);
604
+ }
605
+ async function processAuthorizationCodeOpenIDResponse(as, client, response, expectedNonce, maxAge, decryptFn, recognizedTokenTypes) {
606
+ const additionalRequiredClaims = [];
607
+ switch (expectedNonce) {
608
+ case void 0:
609
+ expectedNonce = expectNoNonce;
610
+ break;
611
+ case expectNoNonce: break;
612
+ default:
613
+ assertString$1(expectedNonce, "\"expectedNonce\" argument");
614
+ additionalRequiredClaims.push("nonce");
615
+ }
616
+ maxAge ??= client.default_max_age;
617
+ switch (maxAge) {
618
+ case void 0:
619
+ maxAge = skipAuthTimeCheck;
620
+ break;
621
+ case skipAuthTimeCheck: break;
622
+ default:
623
+ assertNumber(maxAge, true, "\"maxAge\" argument");
624
+ additionalRequiredClaims.push("auth_time");
625
+ }
626
+ const result = await processGenericAccessTokenResponse(as, client, response, additionalRequiredClaims, decryptFn, recognizedTokenTypes);
627
+ assertString$1(result.id_token, "\"response\" body \"id_token\" property", INVALID_RESPONSE, { body: result });
628
+ const claims = getValidatedIdTokenClaims(result);
629
+ if (maxAge !== skipAuthTimeCheck) {
630
+ const now = epochTime() + getClockSkew(client);
631
+ const tolerance = getClockTolerance(client);
632
+ if (claims.auth_time + maxAge < now - tolerance) throw OPE("too much time has elapsed since the last End-User authentication", JWT_TIMESTAMP_CHECK, {
633
+ claims,
634
+ now,
635
+ tolerance,
636
+ claim: "auth_time"
637
+ });
638
+ }
639
+ if (expectedNonce === expectNoNonce) {
640
+ if (claims.nonce !== void 0) throw OPE("unexpected ID Token \"nonce\" claim value", JWT_CLAIM_COMPARISON, {
641
+ expected: void 0,
642
+ claims,
643
+ claim: "nonce"
644
+ });
645
+ } else if (claims.nonce !== expectedNonce) throw OPE("unexpected ID Token \"nonce\" claim value", JWT_CLAIM_COMPARISON, {
646
+ expected: expectedNonce,
647
+ claims,
648
+ claim: "nonce"
649
+ });
650
+ return result;
651
+ }
652
+ async function processAuthorizationCodeOAuth2Response(as, client, response, decryptFn, recognizedTokenTypes) {
653
+ const result = await processGenericAccessTokenResponse(as, client, response, void 0, decryptFn, recognizedTokenTypes);
654
+ const claims = getValidatedIdTokenClaims(result);
655
+ if (claims) {
656
+ if (client.default_max_age !== void 0) {
657
+ assertNumber(client.default_max_age, true, "\"client.default_max_age\"");
658
+ const now = epochTime() + getClockSkew(client);
659
+ const tolerance = getClockTolerance(client);
660
+ if (claims.auth_time + client.default_max_age < now - tolerance) throw OPE("too much time has elapsed since the last End-User authentication", JWT_TIMESTAMP_CHECK, {
661
+ claims,
662
+ now,
663
+ tolerance,
664
+ claim: "auth_time"
665
+ });
666
+ }
667
+ if (claims.nonce !== void 0) throw OPE("unexpected ID Token \"nonce\" claim value", JWT_CLAIM_COMPARISON, {
668
+ expected: void 0,
669
+ claims,
670
+ claim: "nonce"
671
+ });
672
+ }
673
+ return result;
674
+ }
675
+ const WWW_AUTHENTICATE_CHALLENGE = "OAUTH_WWW_AUTHENTICATE_CHALLENGE";
676
+ const RESPONSE_BODY_ERROR = "OAUTH_RESPONSE_BODY_ERROR";
677
+ const UNSUPPORTED_OPERATION = "OAUTH_UNSUPPORTED_OPERATION";
678
+ const AUTHORIZATION_RESPONSE_ERROR = "OAUTH_AUTHORIZATION_RESPONSE_ERROR";
679
+ const PARSE_ERROR = "OAUTH_PARSE_ERROR";
680
+ const INVALID_RESPONSE = "OAUTH_INVALID_RESPONSE";
681
+ const RESPONSE_IS_NOT_JSON = "OAUTH_RESPONSE_IS_NOT_JSON";
682
+ const RESPONSE_IS_NOT_CONFORM = "OAUTH_RESPONSE_IS_NOT_CONFORM";
683
+ const HTTP_REQUEST_FORBIDDEN = "OAUTH_HTTP_REQUEST_FORBIDDEN";
684
+ const REQUEST_PROTOCOL_FORBIDDEN = "OAUTH_REQUEST_PROTOCOL_FORBIDDEN";
685
+ const JWT_TIMESTAMP_CHECK = "OAUTH_JWT_TIMESTAMP_CHECK_FAILED";
686
+ const JWT_CLAIM_COMPARISON = "OAUTH_JWT_CLAIM_COMPARISON_FAILED";
687
+ const JSON_ATTRIBUTE_COMPARISON = "OAUTH_JSON_ATTRIBUTE_COMPARISON_FAILED";
688
+ const MISSING_SERVER_METADATA = "OAUTH_MISSING_SERVER_METADATA";
689
+ const INVALID_SERVER_METADATA = "OAUTH_INVALID_SERVER_METADATA";
690
+ function assertReadableResponse(response) {
691
+ if (response.bodyUsed) throw CodedTypeError$1("\"response\" body has been used already", ERR_INVALID_ARG_VALUE$1);
692
+ }
693
+ async function validateJwt(jws, checkAlg, clockSkew, clockTolerance, decryptJwt) {
694
+ let { 0: protectedHeader, 1: payload, length } = jws.split(".");
695
+ if (length === 5) if (decryptJwt !== void 0) {
696
+ jws = await decryptJwt(jws);
697
+ ({0: protectedHeader, 1: payload, length} = jws.split("."));
698
+ } else throw new UnsupportedOperationError("JWE decryption is not configured", { cause: jws });
699
+ if (length !== 3) throw OPE("Invalid JWT", INVALID_RESPONSE, jws);
700
+ let header;
701
+ try {
702
+ header = JSON.parse(buf(b64u(protectedHeader)));
703
+ } catch (cause) {
704
+ throw OPE("failed to parse JWT Header body as base64url encoded JSON", PARSE_ERROR, cause);
705
+ }
706
+ if (!isJsonObject(header)) throw OPE("JWT Header must be a top level object", INVALID_RESPONSE, jws);
707
+ checkAlg(header);
708
+ if (header.crit !== void 0) throw new UnsupportedOperationError("no JWT \"crit\" header parameter extensions are supported", { cause: { header } });
709
+ let claims;
710
+ try {
711
+ claims = JSON.parse(buf(b64u(payload)));
712
+ } catch (cause) {
713
+ throw OPE("failed to parse JWT Payload body as base64url encoded JSON", PARSE_ERROR, cause);
714
+ }
715
+ if (!isJsonObject(claims)) throw OPE("JWT Payload must be a top level object", INVALID_RESPONSE, jws);
716
+ const now = epochTime() + clockSkew;
717
+ if (claims.exp !== void 0) {
718
+ if (typeof claims.exp !== "number") throw OPE("unexpected JWT \"exp\" (expiration time) claim type", INVALID_RESPONSE, { claims });
719
+ if (claims.exp <= now - clockTolerance) throw OPE("unexpected JWT \"exp\" (expiration time) claim value, expiration is past current timestamp", JWT_TIMESTAMP_CHECK, {
720
+ claims,
721
+ now,
722
+ tolerance: clockTolerance,
723
+ claim: "exp"
724
+ });
725
+ }
726
+ if (claims.iat !== void 0) {
727
+ if (typeof claims.iat !== "number") throw OPE("unexpected JWT \"iat\" (issued at) claim type", INVALID_RESPONSE, { claims });
728
+ }
729
+ if (claims.iss !== void 0) {
730
+ if (typeof claims.iss !== "string") throw OPE("unexpected JWT \"iss\" (issuer) claim type", INVALID_RESPONSE, { claims });
731
+ }
732
+ if (claims.nbf !== void 0) {
733
+ if (typeof claims.nbf !== "number") throw OPE("unexpected JWT \"nbf\" (not before) claim type", INVALID_RESPONSE, { claims });
734
+ if (claims.nbf > now + clockTolerance) throw OPE("unexpected JWT \"nbf\" (not before) claim value", JWT_TIMESTAMP_CHECK, {
735
+ claims,
736
+ now,
737
+ tolerance: clockTolerance,
738
+ claim: "nbf"
739
+ });
740
+ }
741
+ if (claims.aud !== void 0) {
742
+ if (typeof claims.aud !== "string" && !Array.isArray(claims.aud)) throw OPE("unexpected JWT \"aud\" (audience) claim type", INVALID_RESPONSE, { claims });
743
+ }
744
+ return {
745
+ header,
746
+ claims,
747
+ jwt: jws
748
+ };
749
+ }
750
+ async function consumeStream(request) {
751
+ if (request.bodyUsed) throw CodedTypeError$1("form_post Request instances must contain a readable body", ERR_INVALID_ARG_VALUE$1, { cause: request });
752
+ return request.text();
753
+ }
754
+ async function formPostResponse(request) {
755
+ if (request.method !== "POST") throw CodedTypeError$1("form_post responses are expected to use the POST method", ERR_INVALID_ARG_VALUE$1, { cause: request });
756
+ if (getContentType(request) !== "application/x-www-form-urlencoded") throw CodedTypeError$1("form_post responses are expected to use the application/x-www-form-urlencoded content-type", ERR_INVALID_ARG_VALUE$1, { cause: request });
757
+ return consumeStream(request);
758
+ }
759
+ function checkSigningAlgorithm(client, issuer, fallback, header) {
760
+ if (client !== void 0) {
761
+ if (typeof client === "string" ? header.alg !== client : !client.includes(header.alg)) throw OPE("unexpected JWT \"alg\" header parameter", INVALID_RESPONSE, {
762
+ header,
763
+ expected: client,
764
+ reason: "client configuration"
765
+ });
766
+ return;
767
+ }
768
+ if (Array.isArray(issuer)) {
769
+ if (!issuer.includes(header.alg)) throw OPE("unexpected JWT \"alg\" header parameter", INVALID_RESPONSE, {
770
+ header,
771
+ expected: issuer,
772
+ reason: "authorization server metadata"
773
+ });
774
+ return;
775
+ }
776
+ if (fallback !== void 0) {
777
+ if (typeof fallback === "string" ? header.alg !== fallback : typeof fallback === "function" ? !fallback(header.alg) : !fallback.includes(header.alg)) throw OPE("unexpected JWT \"alg\" header parameter", INVALID_RESPONSE, {
778
+ header,
779
+ expected: fallback,
780
+ reason: "default value"
781
+ });
782
+ return;
783
+ }
784
+ throw OPE("missing client or server configuration to verify used JWT \"alg\" header parameter", void 0, {
785
+ client,
786
+ issuer,
787
+ fallback
788
+ });
789
+ }
790
+ function getURLSearchParameter(parameters, name) {
791
+ const { 0: value, length } = parameters.getAll(name);
792
+ if (length > 1) throw OPE(`"${name}" parameter must be provided only once`, INVALID_RESPONSE);
793
+ return value;
794
+ }
795
+ const skipStateCheck$1 = Symbol();
796
+ const expectNoState = Symbol();
797
+ function validateAuthResponse(as, client, parameters, expectedState) {
798
+ assertAs(as);
799
+ assertClient(client);
800
+ if (parameters instanceof URL) parameters = parameters.searchParams;
801
+ if (!(parameters instanceof URLSearchParams)) throw CodedTypeError$1("\"parameters\" must be an instance of URLSearchParams, or URL", ERR_INVALID_ARG_TYPE$1);
802
+ if (getURLSearchParameter(parameters, "response")) throw OPE("\"parameters\" contains a JARM response, use validateJwtAuthResponse() instead of validateAuthResponse()", INVALID_RESPONSE, { parameters });
803
+ const iss = getURLSearchParameter(parameters, "iss");
804
+ const state = getURLSearchParameter(parameters, "state");
805
+ if (!iss && as.authorization_response_iss_parameter_supported) throw OPE("response parameter \"iss\" (issuer) missing", INVALID_RESPONSE, { parameters });
806
+ if (iss && iss !== as.issuer) throw OPE("unexpected \"iss\" (issuer) response parameter value", INVALID_RESPONSE, {
807
+ expected: as.issuer,
808
+ parameters
809
+ });
810
+ switch (expectedState) {
811
+ case void 0:
812
+ case expectNoState:
813
+ if (state !== void 0) throw OPE("unexpected \"state\" response parameter encountered", INVALID_RESPONSE, {
814
+ expected: void 0,
815
+ parameters
816
+ });
817
+ break;
818
+ case skipStateCheck$1: break;
819
+ default:
820
+ assertString$1(expectedState, "\"expectedState\" argument");
821
+ if (state !== expectedState) throw OPE(state === void 0 ? "response parameter \"state\" missing" : "unexpected \"state\" response parameter value", INVALID_RESPONSE, {
822
+ expected: expectedState,
823
+ parameters
824
+ });
825
+ }
826
+ if (getURLSearchParameter(parameters, "error")) throw new AuthorizationResponseError("authorization response from the server is an error", { cause: parameters });
827
+ const id_token = getURLSearchParameter(parameters, "id_token");
828
+ const token = getURLSearchParameter(parameters, "token");
829
+ if (id_token !== void 0 || token !== void 0) throw new UnsupportedOperationError("implicit and hybrid flows are not supported");
830
+ return brand(new URLSearchParams(parameters));
831
+ }
832
+ async function getResponseJsonBody(response, check = assertApplicationJson) {
833
+ let json;
834
+ try {
835
+ json = await response.json();
836
+ } catch (cause) {
837
+ check(response);
838
+ throw OPE("failed to parse \"response\" body as JSON", PARSE_ERROR, cause);
839
+ }
840
+ if (!isJsonObject(json)) throw OPE("\"response\" body must be a top level object", INVALID_RESPONSE, { body: json });
841
+ return json;
842
+ }
843
+ const _nodiscoverycheck = Symbol();
844
+ const _expectedIssuer = Symbol();
845
+
846
+ //#endregion
847
+ //#region ../../../../node_modules/openid-client/build/index.js
848
+ let headers;
849
+ let USER_AGENT;
850
+ if (typeof navigator === "undefined" || !navigator.userAgent?.startsWith?.("Mozilla/5.0 ")) {
851
+ USER_AGENT = `openid-client/v6.8.1`;
852
+ headers = { "user-agent": USER_AGENT };
853
+ }
854
+ const int = (config) => {
855
+ return props.get(config);
856
+ };
857
+ let props;
858
+ let tbi;
859
+ function ClientSecretPost(clientSecret) {
860
+ if (clientSecret !== void 0) return ClientSecretPost$1(clientSecret);
861
+ tbi ||= /* @__PURE__ */ new WeakMap();
862
+ return (as, client, body, headers) => {
863
+ let auth;
864
+ if (!(auth = tbi.get(client))) {
865
+ assertString(client.client_secret, "\"metadata.client_secret\"");
866
+ auth = ClientSecretPost$1(client.client_secret);
867
+ tbi.set(client, auth);
868
+ }
869
+ return auth(as, client, body, headers);
870
+ };
871
+ }
872
+ function assertString(input, it) {
873
+ if (typeof input !== "string") throw CodedTypeError(`${it} must be a string`, ERR_INVALID_ARG_TYPE);
874
+ if (input.length === 0) throw CodedTypeError(`${it} must not be empty`, ERR_INVALID_ARG_VALUE);
875
+ }
876
+ function None() {
877
+ return None$1();
878
+ }
879
+ const skipStateCheck = skipStateCheck$1;
880
+ const skipSubjectCheck = skipSubjectCheck$1;
881
+ const customFetch = customFetch$1;
882
+ const modifyAssertion = modifyAssertion$1;
883
+ const clockSkew = clockSkew$1;
884
+ const clockTolerance = clockTolerance$1;
885
+ const ERR_INVALID_ARG_VALUE = "ERR_INVALID_ARG_VALUE";
886
+ const ERR_INVALID_ARG_TYPE = "ERR_INVALID_ARG_TYPE";
887
+ function CodedTypeError(message, code, cause) {
888
+ const err = new TypeError(message, { cause });
889
+ Object.assign(err, { code });
890
+ return err;
891
+ }
892
+ function calculatePKCECodeChallenge(codeVerifier) {
893
+ return calculatePKCECodeChallenge$1(codeVerifier);
894
+ }
895
+ function randomPKCECodeVerifier() {
896
+ return generateRandomCodeVerifier();
897
+ }
898
+ function randomState() {
899
+ return generateRandomState();
900
+ }
901
+ var ClientError = class extends Error {
902
+ code;
903
+ constructor(message, options) {
904
+ super(message, options);
905
+ this.name = this.constructor.name;
906
+ this.code = options?.code;
907
+ Error.captureStackTrace?.(this, this.constructor);
908
+ }
909
+ };
910
+ const decoder = new TextDecoder();
911
+ function e(msg, cause, code) {
912
+ return new ClientError(msg, {
913
+ cause,
914
+ code
915
+ });
916
+ }
917
+ function errorHandler(err) {
918
+ if (err instanceof TypeError || err instanceof ClientError || err instanceof ResponseBodyError || err instanceof AuthorizationResponseError || err instanceof WWWAuthenticateChallengeError) throw err;
919
+ if (err instanceof OperationProcessingError) switch (err.code) {
920
+ case HTTP_REQUEST_FORBIDDEN: throw e("only requests to HTTPS are allowed", err, err.code);
921
+ case REQUEST_PROTOCOL_FORBIDDEN: throw e("only requests to HTTP or HTTPS are allowed", err, err.code);
922
+ case RESPONSE_IS_NOT_CONFORM: throw e("unexpected HTTP response status code", err.cause, err.code);
923
+ case RESPONSE_IS_NOT_JSON: throw e("unexpected response content-type", err.cause, err.code);
924
+ case PARSE_ERROR: throw e("parsing error occured", err, err.code);
925
+ case INVALID_RESPONSE: throw e("invalid response encountered", err, err.code);
926
+ case JWT_CLAIM_COMPARISON: throw e("unexpected JWT claim value encountered", err, err.code);
927
+ case JSON_ATTRIBUTE_COMPARISON: throw e("unexpected JSON attribute value encountered", err, err.code);
928
+ case JWT_TIMESTAMP_CHECK: throw e("JWT timestamp claim value failed validation", err, err.code);
929
+ default: throw e(err.message, err, err.code);
930
+ }
931
+ if (err instanceof UnsupportedOperationError) throw e("unsupported operation", err, err.code);
932
+ if (err instanceof DOMException) switch (err.name) {
933
+ case "OperationError": throw e("runtime operation error", err, UNSUPPORTED_OPERATION);
934
+ case "NotSupportedError": throw e("runtime unsupported operation", err, UNSUPPORTED_OPERATION);
935
+ case "TimeoutError": throw e("operation timed out", err, "OAUTH_TIMEOUT");
936
+ case "AbortError": throw e("operation aborted", err, "OAUTH_ABORT");
937
+ }
938
+ throw new ClientError("something went wrong", { cause: err });
939
+ }
940
+ function handleEntraId(server, as, options) {
941
+ if (server.origin === "https://login.microsoftonline.com" && (!options?.algorithm || options.algorithm === "oidc")) {
942
+ as[kEntraId] = true;
943
+ return true;
944
+ }
945
+ return false;
946
+ }
947
+ function handleB2Clogin(server, options) {
948
+ if (server.hostname.endsWith(".b2clogin.com") && (!options?.algorithm || options.algorithm === "oidc")) return true;
949
+ return false;
950
+ }
951
+ async function discovery(server, clientId, metadata, clientAuthentication, options) {
952
+ const instance = new Configuration(await performDiscovery(server, options), clientId, metadata, clientAuthentication);
953
+ let internals = int(instance);
954
+ if (options?.[customFetch]) internals.fetch = options[customFetch];
955
+ if (options?.timeout) internals.timeout = options.timeout;
956
+ if (options?.execute) for (const extension of options.execute) extension(instance);
957
+ return instance;
958
+ }
959
+ async function performDiscovery(server, options) {
960
+ if (!(server instanceof URL)) throw CodedTypeError("\"server\" must be an instance of URL", ERR_INVALID_ARG_TYPE);
961
+ const resolve = !server.href.includes("/.well-known/");
962
+ const timeout = options?.timeout ?? 30;
963
+ const signal = AbortSignal.timeout(timeout * 1e3);
964
+ const as = await (resolve ? discoveryRequest(server, {
965
+ algorithm: options?.algorithm,
966
+ [customFetch$1]: options?.[customFetch],
967
+ [allowInsecureRequests$1]: options?.execute?.includes(allowInsecureRequests),
968
+ signal,
969
+ headers: new Headers(headers)
970
+ }) : (options?.[customFetch] || fetch)((() => {
971
+ checkProtocol(server, options?.execute?.includes(allowInsecureRequests) ? false : true);
972
+ return server.href;
973
+ })(), {
974
+ headers: Object.fromEntries(new Headers({
975
+ accept: "application/json",
976
+ ...headers
977
+ }).entries()),
978
+ body: void 0,
979
+ method: "GET",
980
+ redirect: "manual",
981
+ signal
982
+ })).then((response) => processDiscoveryResponse(_nodiscoverycheck, response)).catch(errorHandler);
983
+ if (resolve && new URL(as.issuer).href !== server.href) handleEntraId(server, as, options) || handleB2Clogin(server, options) || (() => {
984
+ throw new ClientError("discovered metadata issuer does not match the expected issuer", {
985
+ code: JSON_ATTRIBUTE_COMPARISON,
986
+ cause: {
987
+ expected: server.href,
988
+ body: as,
989
+ attribute: "issuer"
990
+ }
991
+ });
992
+ })();
993
+ return as;
994
+ }
995
+ function getServerHelpers(metadata) {
996
+ return { supportsPKCE: {
997
+ __proto__: null,
998
+ value(method = "S256") {
999
+ return metadata.code_challenge_methods_supported?.includes(method) === true;
1000
+ }
1001
+ } };
1002
+ }
1003
+ function addServerHelpers(metadata) {
1004
+ Object.defineProperties(metadata, getServerHelpers(metadata));
1005
+ }
1006
+ const kEntraId = Symbol();
1007
+ var Configuration = class {
1008
+ constructor(server, clientId, metadata, clientAuthentication) {
1009
+ if (typeof clientId !== "string" || !clientId.length) throw CodedTypeError("\"clientId\" must be a non-empty string", ERR_INVALID_ARG_TYPE);
1010
+ if (typeof metadata === "string") metadata = { client_secret: metadata };
1011
+ if (metadata?.client_id !== void 0 && clientId !== metadata.client_id) throw CodedTypeError("\"clientId\" and \"metadata.client_id\" must be the same", ERR_INVALID_ARG_VALUE);
1012
+ const client = {
1013
+ ...structuredClone(metadata),
1014
+ client_id: clientId
1015
+ };
1016
+ client[clockSkew$1] = metadata?.[clockSkew$1] ?? 0;
1017
+ client[clockTolerance$1] = metadata?.[clockTolerance$1] ?? 30;
1018
+ let auth;
1019
+ if (clientAuthentication) auth = clientAuthentication;
1020
+ else if (typeof client.client_secret === "string" && client.client_secret.length) auth = ClientSecretPost(client.client_secret);
1021
+ else auth = None();
1022
+ let c = Object.freeze(client);
1023
+ const clone = structuredClone(server);
1024
+ if (kEntraId in server) clone[_expectedIssuer] = ({ claims: { tid } }) => server.issuer.replace("{tenantid}", tid);
1025
+ let as = Object.freeze(clone);
1026
+ props ||= /* @__PURE__ */ new WeakMap();
1027
+ props.set(this, {
1028
+ __proto__: null,
1029
+ as,
1030
+ c,
1031
+ auth,
1032
+ tlsOnly: true,
1033
+ jwksCache: {}
1034
+ });
1035
+ }
1036
+ serverMetadata() {
1037
+ const metadata = structuredClone(int(this).as);
1038
+ addServerHelpers(metadata);
1039
+ return metadata;
1040
+ }
1041
+ clientMetadata() {
1042
+ return structuredClone(int(this).c);
1043
+ }
1044
+ get timeout() {
1045
+ return int(this).timeout;
1046
+ }
1047
+ set timeout(value) {
1048
+ int(this).timeout = value;
1049
+ }
1050
+ get [customFetch]() {
1051
+ return int(this).fetch;
1052
+ }
1053
+ set [customFetch](value) {
1054
+ int(this).fetch = value;
1055
+ }
1056
+ };
1057
+ Object.freeze(Configuration.prototype);
1058
+ function getHelpers(response) {
1059
+ let exp = void 0;
1060
+ if (response.expires_in !== void 0) {
1061
+ const now = /* @__PURE__ */ new Date();
1062
+ now.setSeconds(now.getSeconds() + response.expires_in);
1063
+ exp = now.getTime();
1064
+ }
1065
+ return {
1066
+ expiresIn: {
1067
+ __proto__: null,
1068
+ value() {
1069
+ if (exp) {
1070
+ const now = Date.now();
1071
+ if (exp > now) return Math.floor((exp - now) / 1e3);
1072
+ return 0;
1073
+ }
1074
+ }
1075
+ },
1076
+ claims: {
1077
+ __proto__: null,
1078
+ value() {
1079
+ try {
1080
+ return getValidatedIdTokenClaims(this);
1081
+ } catch {
1082
+ return;
1083
+ }
1084
+ }
1085
+ }
1086
+ };
1087
+ }
1088
+ function addHelpers(response) {
1089
+ Object.defineProperties(response, getHelpers(response));
1090
+ }
1091
+ function allowInsecureRequests(config) {
1092
+ int(config).tlsOnly = false;
1093
+ }
1094
+ function stripParams(url) {
1095
+ url = new URL(url);
1096
+ url.search = "";
1097
+ url.hash = "";
1098
+ return url.href;
1099
+ }
1100
+ function webInstanceOf(input, toStringTag) {
1101
+ try {
1102
+ return Object.getPrototypeOf(input)[Symbol.toStringTag] === toStringTag;
1103
+ } catch {
1104
+ return false;
1105
+ }
1106
+ }
1107
+ async function authorizationCodeGrant(config, currentUrl, checks, tokenEndpointParameters, options) {
1108
+ checkConfig(config);
1109
+ if (options?.flag !== retry && !(currentUrl instanceof URL) && !webInstanceOf(currentUrl, "Request")) throw CodedTypeError("\"currentUrl\" must be an instance of URL, or Request", ERR_INVALID_ARG_TYPE);
1110
+ let authResponse;
1111
+ let redirectUri;
1112
+ const { as, c, auth, fetch, tlsOnly, jarm, hybrid, nonRepudiation, timeout, decrypt, implicit } = int(config);
1113
+ if (options?.flag === retry) {
1114
+ authResponse = options.authResponse;
1115
+ redirectUri = options.redirectUri;
1116
+ } else {
1117
+ if (!(currentUrl instanceof URL)) {
1118
+ const request = currentUrl;
1119
+ currentUrl = new URL(currentUrl.url);
1120
+ switch (request.method) {
1121
+ case "GET": break;
1122
+ case "POST":
1123
+ const params = new URLSearchParams(await formPostResponse(request));
1124
+ if (hybrid) currentUrl.hash = params.toString();
1125
+ else for (const [k, v] of params.entries()) currentUrl.searchParams.append(k, v);
1126
+ break;
1127
+ default: throw CodedTypeError("unexpected Request HTTP method", ERR_INVALID_ARG_VALUE);
1128
+ }
1129
+ }
1130
+ redirectUri = stripParams(currentUrl);
1131
+ switch (true) {
1132
+ case !!jarm:
1133
+ authResponse = await jarm(currentUrl, checks?.expectedState);
1134
+ break;
1135
+ case !!hybrid:
1136
+ authResponse = await hybrid(currentUrl, checks?.expectedNonce, checks?.expectedState, checks?.maxAge);
1137
+ break;
1138
+ case !!implicit: throw new TypeError("authorizationCodeGrant() cannot be used by response_type=id_token clients");
1139
+ default: try {
1140
+ authResponse = validateAuthResponse(as, c, currentUrl.searchParams, checks?.expectedState);
1141
+ } catch (err) {
1142
+ errorHandler(err);
1143
+ }
1144
+ }
1145
+ }
1146
+ const response = await authorizationCodeGrantRequest(as, c, auth, authResponse, redirectUri, checks?.pkceCodeVerifier || nopkce, {
1147
+ additionalParameters: tokenEndpointParameters,
1148
+ [customFetch$1]: fetch,
1149
+ [allowInsecureRequests$1]: !tlsOnly,
1150
+ DPoP: options?.DPoP,
1151
+ headers: new Headers(headers),
1152
+ signal: signal(timeout)
1153
+ }).catch(errorHandler);
1154
+ if (typeof checks?.expectedNonce === "string" || typeof checks?.maxAge === "number") checks.idTokenExpected = true;
1155
+ const p = processAuthorizationCodeResponse(as, c, response, {
1156
+ expectedNonce: checks?.expectedNonce,
1157
+ maxAge: checks?.maxAge,
1158
+ requireIdToken: checks?.idTokenExpected,
1159
+ [jweDecrypt]: decrypt
1160
+ });
1161
+ let result;
1162
+ try {
1163
+ result = await p;
1164
+ } catch (err) {
1165
+ if (retryable(err, options)) return authorizationCodeGrant(config, void 0, checks, tokenEndpointParameters, {
1166
+ ...options,
1167
+ flag: retry,
1168
+ authResponse,
1169
+ redirectUri
1170
+ });
1171
+ errorHandler(err);
1172
+ }
1173
+ result.id_token && await nonRepudiation?.(response);
1174
+ addHelpers(result);
1175
+ return result;
1176
+ }
1177
+ async function refreshTokenGrant(config, refreshToken, parameters, options) {
1178
+ checkConfig(config);
1179
+ parameters = new URLSearchParams(parameters);
1180
+ const { as, c, auth, fetch, tlsOnly, nonRepudiation, timeout, decrypt } = int(config);
1181
+ const response = await refreshTokenGrantRequest(as, c, auth, refreshToken, {
1182
+ [customFetch$1]: fetch,
1183
+ [allowInsecureRequests$1]: !tlsOnly,
1184
+ additionalParameters: parameters,
1185
+ DPoP: options?.DPoP,
1186
+ headers: new Headers(headers),
1187
+ signal: signal(timeout)
1188
+ }).catch(errorHandler);
1189
+ const p = processRefreshTokenResponse(as, c, response, { [jweDecrypt]: decrypt });
1190
+ let result;
1191
+ try {
1192
+ result = await p;
1193
+ } catch (err) {
1194
+ if (retryable(err, options)) return refreshTokenGrant(config, refreshToken, parameters, {
1195
+ ...options,
1196
+ flag: retry
1197
+ });
1198
+ errorHandler(err);
1199
+ }
1200
+ result.id_token && await nonRepudiation?.(response);
1201
+ addHelpers(result);
1202
+ return result;
1203
+ }
1204
+ function buildAuthorizationUrl(config, parameters) {
1205
+ checkConfig(config);
1206
+ const { as, c, tlsOnly, hybrid, jarm, implicit } = int(config);
1207
+ const authorizationEndpoint = resolveEndpoint(as, "authorization_endpoint", false, tlsOnly);
1208
+ parameters = new URLSearchParams(parameters);
1209
+ if (!parameters.has("client_id")) parameters.set("client_id", c.client_id);
1210
+ if (!parameters.has("request_uri") && !parameters.has("request")) {
1211
+ if (!parameters.has("response_type")) parameters.set("response_type", hybrid ? "code id_token" : implicit ? "id_token" : "code");
1212
+ if (implicit && !parameters.has("nonce")) throw CodedTypeError("response_type=id_token clients must provide a nonce parameter in their authorization request parameters", ERR_INVALID_ARG_VALUE);
1213
+ if (jarm) parameters.set("response_mode", "jwt");
1214
+ }
1215
+ for (const [k, v] of parameters.entries()) authorizationEndpoint.searchParams.append(k, v);
1216
+ return authorizationEndpoint;
1217
+ }
1218
+ function buildEndSessionUrl(config, parameters) {
1219
+ checkConfig(config);
1220
+ const { as, c, tlsOnly } = int(config);
1221
+ const endSessionEndpoint = resolveEndpoint(as, "end_session_endpoint", false, tlsOnly);
1222
+ parameters = new URLSearchParams(parameters);
1223
+ if (!parameters.has("client_id")) parameters.set("client_id", c.client_id);
1224
+ for (const [k, v] of parameters.entries()) endSessionEndpoint.searchParams.append(k, v);
1225
+ return endSessionEndpoint;
1226
+ }
1227
+ function checkConfig(input) {
1228
+ if (!(input instanceof Configuration)) throw CodedTypeError("\"config\" must be an instance of Configuration", ERR_INVALID_ARG_TYPE);
1229
+ if (Object.getPrototypeOf(input) !== Configuration.prototype) throw CodedTypeError("subclassing Configuration is not allowed", ERR_INVALID_ARG_VALUE);
1230
+ }
1231
+ function signal(timeout) {
1232
+ return timeout ? AbortSignal.timeout(timeout * 1e3) : void 0;
1233
+ }
1234
+ function retryable(err, options) {
1235
+ if (options?.DPoP && options.flag !== retry) return isDPoPNonceError(err);
1236
+ return false;
1237
+ }
1238
+ const retry = Symbol();
1239
+
1240
+ //#endregion
10
1241
  //#region ../../src/server/auth/primitives/$auth.ts
11
1242
  /**
12
1243
  * Creates an authentication provider primitive for handling user login flows.
@@ -324,13 +1555,13 @@ var ServerAuthProvider = class {
324
1555
  if (tokens) {
325
1556
  const provider = this.provider(tokens);
326
1557
  if (!("realm" in provider.options)) {
327
- const user$1 = await provider.user(tokens);
1558
+ const user = await provider.user(tokens);
328
1559
  return {
329
1560
  api: await this.serverLinksProvider.getUserApiLinks({
330
1561
  authorization: headers.authorization,
331
- user: user$1
1562
+ user
332
1563
  }),
333
- user: user$1
1564
+ user
334
1565
  };
335
1566
  }
336
1567
  }
@@ -441,20 +1672,20 @@ var ServerAuthProvider = class {
441
1672
  const oidc = "oidc" in provider.options && provider.options.oidc;
442
1673
  if (!oauth.serverMetadata().supportsPKCE()) {
443
1674
  const state = randomState();
444
- const parameters$1 = {
1675
+ const parameters = {
445
1676
  redirect_uri,
446
1677
  state
447
1678
  };
448
- if (oidc) parameters$1.nonce = randomState();
449
- if (scope) parameters$1.scope = scope;
1679
+ if (oidc) parameters.nonce = randomState();
1680
+ if (scope) parameters.scope = scope;
450
1681
  this.authorizationCode.set({
451
1682
  state,
452
- nonce: parameters$1.nonce,
1683
+ nonce: parameters.nonce,
453
1684
  redirectUri: query.redirect_uri ?? "/",
454
1685
  provider: query.provider,
455
1686
  realm: query.realm
456
1687
  });
457
- reply.redirect(buildAuthorizationUrl(oauth, parameters$1).toString());
1688
+ reply.redirect(buildAuthorizationUrl(oauth, parameters).toString());
458
1689
  return;
459
1690
  }
460
1691
  const codeVerifier = randomPKCECodeVerifier();
@@ -491,10 +1722,10 @@ var ServerAuthProvider = class {
491
1722
  pkceCodeVerifier: authorizationCode.codeVerifier,
492
1723
  expectedState: authorizationCode.state,
493
1724
  expectedNonce: authorizationCode.nonce
494
- }).then((tokens$1) => ({
1725
+ }).then((tokens) => ({
495
1726
  issued_at: this.dateTimeProvider.now().unix(),
496
1727
  provider: provider.name,
497
- ...tokens$1
1728
+ ...tokens
498
1729
  })).catch((e) => {
499
1730
  this.log.error("Failed to get access token", e);
500
1731
  throw new SecurityError("Failed to get access token", { cause: e });
@@ -569,9 +1800,9 @@ var ServerAuthProvider = class {
569
1800
  provider(opts) {
570
1801
  const name = typeof opts === "string" ? opts : opts.provider;
571
1802
  const realmName = typeof opts === "string" ? void 0 : opts.realm;
572
- const identity = this.identities.find((identity$1) => {
573
- if (identity$1.name !== name) return false;
574
- if (realmName && identity$1.issuer?.name !== realmName) return false;
1803
+ const identity = this.identities.find((identity) => {
1804
+ if (identity.name !== name) return false;
1805
+ if (realmName && identity.issuer?.name !== realmName) return false;
575
1806
  return true;
576
1807
  });
577
1808
  if (!identity) throw new SecurityError(`Auth provider '${name}'${realmName ? ` for realm '${realmName}'` : ""} not found`);
@@ -655,18 +1886,18 @@ const $authGithub = (realm, options = {}) => {
655
1886
  const res = await fetch(`${BASE_URL}/user`, { headers: {
656
1887
  Authorization: `Bearer ${tokens.access_token}`,
657
1888
  "User-Agent": "Alepha"
658
- } }).then((res$1) => res$1.json());
1889
+ } }).then((res) => res.json());
659
1890
  const user = { sub: res.id.toString() };
660
1891
  if (res.email) user.email = res.email;
661
1892
  if (res.name) user.name = res.name.trim();
662
1893
  if (res.avatar_url) user.picture = res.avatar_url;
663
1894
  if (!user.email) {
664
- const res$1 = await fetch(`${BASE_URL}/user/emails`, { headers: {
1895
+ const res = await fetch(`${BASE_URL}/user/emails`, { headers: {
665
1896
  Authorization: `Bearer ${tokens.access_token}`,
666
1897
  "User-Agent": "Alepha"
667
1898
  } });
668
- if (res$1.ok) {
669
- const emails = await res$1.json();
1899
+ if (res.ok) {
1900
+ const emails = await res.json();
670
1901
  user.email = (emails.find((e) => e.primary) ?? emails[0]).email;
671
1902
  }
672
1903
  }