@aura-stack/auth 0.1.0-rc.9 → 0.1.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 (116) hide show
  1. package/dist/@types/index.cjs +15 -15
  2. package/dist/@types/index.d.ts +7 -31
  3. package/dist/@types/index.js +1 -1
  4. package/dist/@types/router.d.cjs +1 -1
  5. package/dist/@types/router.d.d.ts +7 -7
  6. package/dist/@types/utility.cjs +15 -15
  7. package/dist/@types/utility.d.ts +6 -6
  8. package/dist/@types/utility.js +1 -1
  9. package/dist/actions/callback/access-token.cjs +143 -143
  10. package/dist/actions/callback/access-token.d.ts +15 -20
  11. package/dist/actions/callback/access-token.js +8 -4
  12. package/dist/actions/callback/callback.cjs +437 -455
  13. package/dist/actions/callback/callback.d.ts +10 -12
  14. package/dist/actions/callback/callback.js +16 -12
  15. package/dist/actions/callback/userinfo.cjs +131 -134
  16. package/dist/actions/callback/userinfo.d.ts +9 -9
  17. package/dist/actions/callback/userinfo.js +10 -6
  18. package/dist/actions/csrfToken/csrfToken.cjs +162 -171
  19. package/dist/actions/csrfToken/csrfToken.d.ts +3 -3
  20. package/dist/actions/csrfToken/csrfToken.js +12 -8
  21. package/dist/actions/index.cjs +746 -773
  22. package/dist/actions/index.d.ts +13 -13
  23. package/dist/actions/index.js +34 -18
  24. package/dist/actions/session/session.cjs +149 -155
  25. package/dist/actions/session/session.d.ts +3 -3
  26. package/dist/actions/session/session.js +11 -7
  27. package/dist/actions/signIn/authorization.cjs +231 -249
  28. package/dist/actions/signIn/authorization.d.ts +12 -18
  29. package/dist/actions/signIn/authorization.js +16 -6
  30. package/dist/actions/signIn/signIn.cjs +396 -423
  31. package/dist/actions/signIn/signIn.d.ts +10 -10
  32. package/dist/actions/signIn/signIn.js +14 -10
  33. package/dist/actions/signOut/signOut.cjs +417 -440
  34. package/dist/actions/signOut/signOut.d.ts +3 -3
  35. package/dist/actions/signOut/signOut.js +15 -11
  36. package/dist/assert.cjs +35 -36
  37. package/dist/assert.d.ts +4 -4
  38. package/dist/assert.js +10 -2
  39. package/dist/chunk-256KIVJL.js +85 -96
  40. package/dist/chunk-42XB3YCW.js +19 -17
  41. package/dist/chunk-6SM22VVJ.js +13 -10
  42. package/dist/chunk-CAKJT3KS.js +84 -69
  43. package/dist/chunk-E3OXBRYF.js +19 -17
  44. package/dist/chunk-EBPE35JT.js +28 -26
  45. package/dist/chunk-FIPU4MLT.js +18 -16
  46. package/dist/chunk-FJUDBLCP.js +50 -43
  47. package/dist/chunk-FKRDCWBF.js +19 -17
  48. package/dist/chunk-GZU3RBTB.js +51 -40
  49. package/dist/chunk-HGJ4TXY4.js +132 -100
  50. package/dist/chunk-HMRKN75I.js +63 -63
  51. package/dist/chunk-IKHPGFCW.js +11 -9
  52. package/dist/chunk-JAPMIE6S.js +7 -5
  53. package/dist/chunk-KRNOMBXQ.js +19 -17
  54. package/dist/chunk-LLR722CL.js +91 -70
  55. package/dist/chunk-RLT4RFKV.js +39 -30
  56. package/dist/chunk-SJPDVKUS.js +107 -88
  57. package/dist/chunk-SMQO5WD7.js +26 -16
  58. package/dist/chunk-STHEPPUZ.js +8 -6
  59. package/dist/chunk-UJJ7R56J.js +47 -37
  60. package/dist/chunk-UTDLUEEG.js +27 -21
  61. package/dist/chunk-VFTYH33W.js +54 -37
  62. package/dist/chunk-XXJKNKGQ.js +33 -23
  63. package/dist/chunk-ZV4BH47P.js +132 -134
  64. package/dist/cookie.cjs +169 -175
  65. package/dist/cookie.d.ts +23 -51
  66. package/dist/cookie.js +34 -34
  67. package/dist/error.cjs +75 -75
  68. package/dist/error.d.ts +30 -30
  69. package/dist/error.js +15 -8
  70. package/dist/headers.cjs +28 -28
  71. package/dist/headers.d.ts +2 -2
  72. package/dist/headers.js +6 -2
  73. package/dist/index-DpfbvTZ_.d.ts +249 -298
  74. package/dist/index.cjs +936 -969
  75. package/dist/index.d.ts +10 -31
  76. package/dist/index.js +70 -50
  77. package/dist/jose.cjs +61 -64
  78. package/dist/jose.d.ts +8 -8
  79. package/dist/jose.js +9 -5
  80. package/dist/oauth/bitbucket.cjs +38 -38
  81. package/dist/oauth/bitbucket.d.ts +7 -7
  82. package/dist/oauth/bitbucket.js +6 -2
  83. package/dist/oauth/discord.cjs +48 -48
  84. package/dist/oauth/discord.d.ts +7 -7
  85. package/dist/oauth/discord.js +6 -2
  86. package/dist/oauth/figma.cjs +39 -39
  87. package/dist/oauth/figma.d.ts +7 -7
  88. package/dist/oauth/figma.js +6 -2
  89. package/dist/oauth/github.cjs +31 -31
  90. package/dist/oauth/github.d.ts +7 -7
  91. package/dist/oauth/github.js +6 -2
  92. package/dist/oauth/gitlab.cjs +39 -39
  93. package/dist/oauth/gitlab.d.ts +7 -7
  94. package/dist/oauth/gitlab.js +6 -2
  95. package/dist/oauth/index.cjs +180 -180
  96. package/dist/oauth/index.d.ts +7 -26
  97. package/dist/oauth/index.js +36 -9
  98. package/dist/oauth/spotify.cjs +39 -39
  99. package/dist/oauth/spotify.d.ts +7 -7
  100. package/dist/oauth/spotify.js +6 -2
  101. package/dist/oauth/x.cjs +39 -39
  102. package/dist/oauth/x.d.ts +7 -7
  103. package/dist/oauth/x.js +6 -2
  104. package/dist/response.cjs +27 -27
  105. package/dist/response.d.ts +2 -2
  106. package/dist/response.js +6 -2
  107. package/dist/schemas.cjs +91 -91
  108. package/dist/schemas.d.ts +93 -126
  109. package/dist/schemas.js +18 -18
  110. package/dist/secure.cjs +95 -98
  111. package/dist/secure.d.ts +17 -17
  112. package/dist/secure.js +18 -4
  113. package/dist/utils.cjs +119 -132
  114. package/dist/utils.d.ts +11 -26
  115. package/dist/utils.js +21 -21
  116. package/package.json +2 -2
@@ -1,513 +1,490 @@
1
- "use strict"
2
- var __create = Object.create
3
- var __defProp = Object.defineProperty
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor
5
- var __getOwnPropNames = Object.getOwnPropertyNames
6
- var __getProtoOf = Object.getPrototypeOf
7
- var __hasOwnProp = Object.prototype.hasOwnProperty
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
8
  var __export = (target, all) => {
9
- for (var name in all) __defProp(target, name, { get: all[name], enumerable: true })
10
- }
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
11
12
  var __copyProps = (to, from, except, desc) => {
12
- if ((from && typeof from === "object") || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable })
16
- }
17
- return to
18
- }
19
- var __toESM = (mod, isNodeMode, target) => (
20
- (target = mod != null ? __create(__getProtoOf(mod)) : {}),
21
- __copyProps(
22
- // If the importer is in node compatibility mode or this is not an ESM
23
- // file that has been converted to a CommonJS file using a Babel-
24
- // compatible transform (i.e. "__esModule" has not been set), then set
25
- // "default" to the CommonJS "module.exports" for node compatibility.
26
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
- mod
28
- )
29
- )
30
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod)
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
29
 
32
30
  // src/actions/signOut/signOut.ts
33
- var signOut_exports = {}
31
+ var signOut_exports = {};
34
32
  __export(signOut_exports, {
35
- signOutAction: () => signOutAction,
36
- })
37
- module.exports = __toCommonJS(signOut_exports)
38
- var import_zod = __toESM(require("zod"), 1)
39
- var import_router2 = require("@aura-stack/router")
33
+ signOutAction: () => signOutAction
34
+ });
35
+ module.exports = __toCommonJS(signOut_exports);
36
+ var import_zod = __toESM(require("zod"), 1);
37
+ var import_router2 = require("@aura-stack/router");
40
38
 
41
39
  // src/secure.ts
42
- var import_node_crypto = __toESM(require("crypto"), 1)
40
+ var import_node_crypto = __toESM(require("crypto"), 1);
43
41
 
44
42
  // src/utils.ts
45
- var import_router = require("@aura-stack/router")
43
+ var import_router = require("@aura-stack/router");
46
44
 
47
45
  // src/error.ts
48
46
  var AuthError = class extends Error {
49
- constructor(type, message) {
50
- super(message)
51
- this.type = type
52
- this.name = "AuthError"
53
- }
54
- }
47
+ constructor(type, message) {
48
+ super(message);
49
+ this.type = type;
50
+ this.name = "AuthError";
51
+ }
52
+ };
55
53
  var InvalidCsrfTokenError = class extends AuthError {
56
- constructor(message = "The provided CSRF token is invalid or has expired") {
57
- super("invalid_csrf_token", message)
58
- this.name = "InvalidCsrfTokenError"
59
- }
60
- }
54
+ constructor(message = "The provided CSRF token is invalid or has expired") {
55
+ super("invalid_csrf_token", message);
56
+ this.name = "InvalidCsrfTokenError";
57
+ }
58
+ };
61
59
  var InvalidRedirectToError = class extends AuthError {
62
- constructor(message = "The redirectTo parameter does not match the hosted origin.") {
63
- super("invalid_redirect_to", message)
64
- this.name = "InvalidRedirectToError"
65
- }
66
- }
60
+ constructor(message = "The redirectTo parameter does not match the hosted origin.") {
61
+ super("invalid_redirect_to", message);
62
+ this.name = "InvalidRedirectToError";
63
+ }
64
+ };
67
65
  var isAuthError = (error) => {
68
- return error instanceof AuthError
69
- }
66
+ return error instanceof AuthError;
67
+ };
70
68
  var ERROR_RESPONSE = {
71
- AUTHORIZATION: {
72
- INVALID_REQUEST: "invalid_request",
73
- UNAUTHORIZED_CLIENT: "unauthorized_client",
74
- ACCESS_DENIED: "access_denied",
75
- UNSUPPORTED_RESPONSE_TYPE: "unsupported_response_type",
76
- INVALID_SCOPE: "invalid_scope",
77
- SERVER_ERROR: "server_error",
78
- TEMPORARILY_UNAVAILABLE: "temporarily_unavailable",
79
- },
80
- ACCESS_TOKEN: {
81
- INVALID_REQUEST: "invalid_request",
82
- INVALID_CLIENT: "invalid_client",
83
- INVALID_GRANT: "invalid_grant",
84
- UNAUTHORIZED_CLIENT: "unauthorized_client",
85
- UNSUPPORTED_GRANT_TYPE: "unsupported_grant_type",
86
- INVALID_SCOPE: "invalid_scope",
87
- },
88
- }
69
+ AUTHORIZATION: {
70
+ INVALID_REQUEST: "invalid_request",
71
+ UNAUTHORIZED_CLIENT: "unauthorized_client",
72
+ ACCESS_DENIED: "access_denied",
73
+ UNSUPPORTED_RESPONSE_TYPE: "unsupported_response_type",
74
+ INVALID_SCOPE: "invalid_scope",
75
+ SERVER_ERROR: "server_error",
76
+ TEMPORARILY_UNAVAILABLE: "temporarily_unavailable"
77
+ },
78
+ ACCESS_TOKEN: {
79
+ INVALID_REQUEST: "invalid_request",
80
+ INVALID_CLIENT: "invalid_client",
81
+ INVALID_GRANT: "invalid_grant",
82
+ UNAUTHORIZED_CLIENT: "unauthorized_client",
83
+ UNSUPPORTED_GRANT_TYPE: "unsupported_grant_type",
84
+ INVALID_SCOPE: "invalid_scope"
85
+ }
86
+ };
89
87
 
90
88
  // src/utils.ts
91
89
  var equals = (a, b) => {
92
- if (a === null || b === null || a === void 0 || b === void 0) return false
93
- return a === b
94
- }
90
+ if (a === null || b === null || a === void 0 || b === void 0) return false;
91
+ return a === b;
92
+ };
95
93
  var sanitizeURL = (url2) => {
96
- try {
97
- let decodedURL = decodeURIComponent(url2).trim()
98
- const protocolMatch = decodedURL.match(/^([a-zA-Z][a-zA-Z0-9+.-]*:\/\/)/)
99
- let protocol = ""
100
- let rest = decodedURL
101
- if (protocolMatch) {
102
- protocol = protocolMatch[1]
103
- rest = decodedURL.slice(protocol.length)
104
- const slashIndex = rest.indexOf("/")
105
- if (slashIndex === -1) {
106
- return protocol + rest
107
- }
108
- const domain = rest.slice(0, slashIndex)
109
- let path = rest
110
- .slice(slashIndex)
111
- .replace(/\/\.\.\//g, "/")
112
- .replace(/\/\.\.$/, "")
113
- .replace(/\.{2,}/g, "")
114
- .replace(/\/{2,}/g, "/")
115
- if (path !== "/" && path.endsWith("/")) {
116
- path = path.replace(/\/+$/, "/")
117
- } else if (path !== "/") {
118
- path = path.replace(/\/+$/, "")
119
- }
120
- return protocol + domain + path
121
- }
122
- let sanitized = decodedURL
123
- .replace(/\/\.\.\//g, "/")
124
- .replace(/\/\.\.$/, "")
125
- .replace(/\.{2,}/g, "")
126
- .replace(/\/{2,}/g, "/")
127
- if (sanitized !== "/" && sanitized.endsWith("/")) {
128
- sanitized = sanitized.replace(/\/+$/, "/")
129
- } else if (sanitized !== "/") {
130
- sanitized = sanitized.replace(/\/+$/, "")
131
- }
132
- return sanitized
133
- } catch {
134
- return url2.trim()
94
+ try {
95
+ let decodedURL = decodeURIComponent(url2).trim();
96
+ const protocolMatch = decodedURL.match(/^([a-zA-Z][a-zA-Z0-9+.-]*:\/\/)/);
97
+ let protocol = "";
98
+ let rest = decodedURL;
99
+ if (protocolMatch) {
100
+ protocol = protocolMatch[1];
101
+ rest = decodedURL.slice(protocol.length);
102
+ const slashIndex = rest.indexOf("/");
103
+ if (slashIndex === -1) {
104
+ return protocol + rest;
105
+ }
106
+ const domain = rest.slice(0, slashIndex);
107
+ let path = rest.slice(slashIndex).replace(/\/\.\.\//g, "/").replace(/\/\.\.$/, "").replace(/\.{2,}/g, "").replace(/\/{2,}/g, "/");
108
+ if (path !== "/" && path.endsWith("/")) {
109
+ path = path.replace(/\/+$/, "/");
110
+ } else if (path !== "/") {
111
+ path = path.replace(/\/+$/, "");
112
+ }
113
+ return protocol + domain + path;
135
114
  }
136
- }
137
- var getNormalizedOriginPath = (path) => {
138
- try {
139
- const url2 = new URL(path)
140
- url2.hash = ""
141
- url2.search = ""
142
- return `${url2.origin}${url2.pathname}`
143
- } catch {
144
- return sanitizeURL(path)
115
+ let sanitized = decodedURL.replace(/\/\.\.\//g, "/").replace(/\/\.\.$/, "").replace(/\.{2,}/g, "").replace(/\/{2,}/g, "/");
116
+ if (sanitized !== "/" && sanitized.endsWith("/")) {
117
+ sanitized = sanitized.replace(/\/+$/, "/");
118
+ } else if (sanitized !== "/") {
119
+ sanitized = sanitized.replace(/\/+$/, "");
145
120
  }
146
- }
121
+ return sanitized;
122
+ } catch {
123
+ return url2.trim();
124
+ }
125
+ };
126
+ var getNormalizedOriginPath = (path) => {
127
+ try {
128
+ const url2 = new URL(path);
129
+ url2.hash = "";
130
+ url2.search = "";
131
+ return `${url2.origin}${url2.pathname}`;
132
+ } catch {
133
+ return sanitizeURL(path);
134
+ }
135
+ };
147
136
 
148
137
  // src/secure.ts
149
138
  var verifyCSRF = async (jose, cookie, header) => {
150
- try {
151
- const { token: cookieToken } = await jose.verifyJWS(cookie)
152
- const { token: headerToken } = await jose.verifyJWS(header)
153
- const cookieBuffer = Buffer.from(cookieToken)
154
- const headerBuffer = Buffer.from(headerToken)
155
- if (!equals(headerBuffer.length, cookieBuffer.length)) {
156
- throw new InvalidCsrfTokenError()
157
- }
158
- if (!import_node_crypto.default.timingSafeEqual(cookieBuffer, headerBuffer)) {
159
- throw new InvalidCsrfTokenError()
160
- }
161
- return true
162
- } catch {
163
- throw new InvalidCsrfTokenError()
139
+ try {
140
+ const { token: cookieToken } = await jose.verifyJWS(cookie);
141
+ const { token: headerToken } = await jose.verifyJWS(header);
142
+ const cookieBuffer = Buffer.from(cookieToken);
143
+ const headerBuffer = Buffer.from(headerToken);
144
+ if (!equals(headerBuffer.length, cookieBuffer.length)) {
145
+ throw new InvalidCsrfTokenError();
146
+ }
147
+ if (!import_node_crypto.default.timingSafeEqual(cookieBuffer, headerBuffer)) {
148
+ throw new InvalidCsrfTokenError();
164
149
  }
165
- }
150
+ return true;
151
+ } catch {
152
+ throw new InvalidCsrfTokenError();
153
+ }
154
+ };
166
155
 
167
156
  // src/headers.ts
168
157
  var cacheControl = {
169
- "Cache-Control": "no-store",
170
- Pragma: "no-cache",
171
- Expires: "0",
172
- Vary: "Cookie",
173
- }
158
+ "Cache-Control": "no-store",
159
+ Pragma: "no-cache",
160
+ Expires: "0",
161
+ Vary: "Cookie"
162
+ };
174
163
 
175
164
  // src/response.ts
176
165
  var AuraResponse = class extends Response {
177
- static json(body, init) {
178
- return Response.json(body, init)
179
- }
180
- }
166
+ static json(body, init) {
167
+ return Response.json(body, init);
168
+ }
169
+ };
181
170
 
182
171
  // src/assert.ts
183
172
  var isRequest = (value) => {
184
- return typeof Request !== "undefined" && value instanceof Request
185
- }
173
+ return typeof Request !== "undefined" && value instanceof Request;
174
+ };
186
175
  var isValidURL = (value) => {
187
- if (value.includes("\r\n") || value.includes("\n") || value.includes("\r")) return false
188
- const regex =
189
- /^https?:\/\/(?:[a-zA-Z0-9._-]+|localhost|\[[0-9a-fA-F:]+\])(?::\d{1,5})?(?:\/[a-zA-Z0-9._~!$&'()*+,;=:@-]*)*\/?$/
190
- return regex.test(value)
191
- }
176
+ if (value.includes("\r\n") || value.includes("\n") || value.includes("\r")) return false;
177
+ const regex = /^https?:\/\/(?:[a-zA-Z0-9._-]+|localhost|\[[0-9a-fA-F:]+\])(?::\d{1,5})?(?:\/[a-zA-Z0-9._~!$&'()*+,;=:@-]*)*\/?$/;
178
+ return regex.test(value);
179
+ };
192
180
 
193
181
  // src/schemas.ts
194
- var import_v4 = require("zod/v4")
182
+ var import_v4 = require("zod/v4");
195
183
  var OAuthProviderConfigSchema = (0, import_v4.object)({
196
- authorizeURL: (0, import_v4.url)(),
197
- accessToken: (0, import_v4.url)(),
198
- scope: (0, import_v4.string)().optional(),
199
- userInfo: (0, import_v4.url)(),
200
- responseType: (0, import_v4.enum)(["code", "token", "id_token"]),
201
- clientId: (0, import_v4.string)(),
202
- clientSecret: (0, import_v4.string)(),
203
- })
184
+ authorizeURL: (0, import_v4.url)(),
185
+ accessToken: (0, import_v4.url)(),
186
+ scope: (0, import_v4.string)().optional(),
187
+ userInfo: (0, import_v4.url)(),
188
+ responseType: (0, import_v4.enum)(["code", "token", "id_token"]),
189
+ clientId: (0, import_v4.string)(),
190
+ clientSecret: (0, import_v4.string)()
191
+ });
204
192
  var OAuthAuthorization = OAuthProviderConfigSchema.extend({
205
- redirectURI: (0, import_v4.string)(),
206
- state: (0, import_v4.string)(),
207
- codeChallenge: (0, import_v4.string)(),
208
- codeChallengeMethod: (0, import_v4.enum)(["plain", "S256"]),
209
- })
193
+ redirectURI: (0, import_v4.string)(),
194
+ state: (0, import_v4.string)(),
195
+ codeChallenge: (0, import_v4.string)(),
196
+ codeChallengeMethod: (0, import_v4.enum)(["plain", "S256"])
197
+ });
210
198
  var OAuthAuthorizationResponse = (0, import_v4.object)({
211
- state: (0, import_v4.string)(),
212
- code: (0, import_v4.string)(),
213
- })
199
+ state: (0, import_v4.string)(),
200
+ code: (0, import_v4.string)()
201
+ });
214
202
  var OAuthAuthorizationErrorResponse = (0, import_v4.object)({
215
- error: (0, import_v4.enum)([
216
- "invalid_request",
217
- "unauthorized_client",
218
- "access_denied",
219
- "unsupported_response_type",
220
- "invalid_scope",
221
- "server_error",
222
- "temporarily_unavailable",
223
- ]),
224
- error_description: (0, import_v4.string)().optional(),
225
- error_uri: (0, import_v4.string)().optional(),
226
- state: (0, import_v4.string)(),
227
- })
203
+ error: (0, import_v4.enum)([
204
+ "invalid_request",
205
+ "unauthorized_client",
206
+ "access_denied",
207
+ "unsupported_response_type",
208
+ "invalid_scope",
209
+ "server_error",
210
+ "temporarily_unavailable"
211
+ ]),
212
+ error_description: (0, import_v4.string)().optional(),
213
+ error_uri: (0, import_v4.string)().optional(),
214
+ state: (0, import_v4.string)()
215
+ });
228
216
  var OAuthAccessToken = OAuthProviderConfigSchema.extend({
229
- redirectURI: (0, import_v4.string)(),
230
- code: (0, import_v4.string)(),
231
- codeVerifier: (0, import_v4.string)().min(43).max(128),
232
- })
217
+ redirectURI: (0, import_v4.string)(),
218
+ code: (0, import_v4.string)(),
219
+ codeVerifier: (0, import_v4.string)().min(43).max(128)
220
+ });
233
221
  var OAuthAccessTokenResponse = (0, import_v4.object)({
234
- access_token: (0, import_v4.string)(),
235
- token_type: (0, import_v4.string)(),
236
- expires_in: (0, import_v4.number)().optional(),
237
- refresh_token: (0, import_v4.string)().optional(),
238
- scope: (0, import_v4.string)().optional(),
239
- })
222
+ access_token: (0, import_v4.string)(),
223
+ token_type: (0, import_v4.string)(),
224
+ expires_in: (0, import_v4.number)().optional(),
225
+ refresh_token: (0, import_v4.string)().optional(),
226
+ scope: (0, import_v4.string)().optional()
227
+ });
240
228
  var OAuthAccessTokenErrorResponse = (0, import_v4.object)({
241
- error: (0, import_v4.enum)([
242
- "invalid_request",
243
- "invalid_client",
244
- "invalid_grant",
245
- "unauthorized_client",
246
- "unsupported_grant_type",
247
- "invalid_scope",
248
- ]),
249
- error_description: (0, import_v4.string)().optional(),
250
- error_uri: (0, import_v4.string)().optional(),
251
- })
229
+ error: (0, import_v4.enum)([
230
+ "invalid_request",
231
+ "invalid_client",
232
+ "invalid_grant",
233
+ "unauthorized_client",
234
+ "unsupported_grant_type",
235
+ "invalid_scope"
236
+ ]),
237
+ error_description: (0, import_v4.string)().optional(),
238
+ error_uri: (0, import_v4.string)().optional()
239
+ });
252
240
  var OAuthErrorResponse = (0, import_v4.object)({
253
- error: (0, import_v4.string)(),
254
- error_description: (0, import_v4.string)().optional(),
255
- })
241
+ error: (0, import_v4.string)(),
242
+ error_description: (0, import_v4.string)().optional()
243
+ });
256
244
 
257
245
  // src/actions/signIn/authorization.ts
258
246
  var getOriginURL = (request, trustedProxyHeaders) => {
259
- const headers = request.headers
260
- if (trustedProxyHeaders) {
261
- const protocol = headers.get("X-Forwarded-Proto") ?? headers.get("Forwarded")?.match(/proto=([^;]+)/i)?.[1] ?? "http"
262
- const host =
263
- headers.get("X-Forwarded-Host") ??
264
- headers.get("Host") ??
265
- headers.get("Forwarded")?.match(/host=([^;]+)/i)?.[1] ??
266
- null
267
- return new URL(`${protocol}://${host}${getNormalizedOriginPath(new URL(request.url).pathname)}`)
268
- } else {
269
- return new URL(getNormalizedOriginPath(request.url))
270
- }
271
- }
247
+ const headers = request.headers;
248
+ if (trustedProxyHeaders) {
249
+ const protocol = headers.get("X-Forwarded-Proto") ?? headers.get("Forwarded")?.match(/proto=([^;]+)/i)?.[1] ?? "http";
250
+ const host = headers.get("X-Forwarded-Host") ?? headers.get("Host") ?? headers.get("Forwarded")?.match(/host=([^;]+)/i)?.[1] ?? null;
251
+ return new URL(`${protocol}://${host}${getNormalizedOriginPath(new URL(request.url).pathname)}`);
252
+ } else {
253
+ return new URL(getNormalizedOriginPath(request.url));
254
+ }
255
+ };
272
256
  var createRedirectTo = (request, redirectTo, trustedProxyHeaders) => {
273
- try {
274
- const headers = request.headers
275
- const origin = headers.get("Origin")
276
- const referer = headers.get("Referer")
277
- let hostedURL = getOriginURL(request, trustedProxyHeaders)
278
- if (redirectTo) {
279
- if (redirectTo.startsWith("/")) {
280
- return sanitizeURL(redirectTo)
281
- }
282
- const redirectToURL = new URL(sanitizeURL(getNormalizedOriginPath(redirectTo)))
283
- if (!isValidURL(redirectTo) || !equals(redirectToURL.origin, hostedURL.origin)) {
284
- throw new InvalidRedirectToError()
285
- }
286
- return sanitizeURL(redirectToURL.pathname)
287
- }
288
- if (referer) {
289
- const refererURL = new URL(sanitizeURL(referer))
290
- if (!isValidURL(referer) || !equals(refererURL.origin, hostedURL.origin)) {
291
- throw new AuthError(
292
- ERROR_RESPONSE.AUTHORIZATION.INVALID_REQUEST,
293
- "The referer of the request does not match the hosted origin."
294
- )
295
- }
296
- return sanitizeURL(refererURL.pathname)
297
- }
298
- if (origin) {
299
- const originURL = new URL(sanitizeURL(getNormalizedOriginPath(origin)))
300
- if (!isValidURL(origin) || !equals(originURL.origin, hostedURL.origin)) {
301
- throw new AuthError(ERROR_RESPONSE.AUTHORIZATION.INVALID_REQUEST, "Invalid origin (potential CSRF).")
302
- }
303
- return sanitizeURL(originURL.pathname)
304
- }
305
- return "/"
306
- } catch (error) {
307
- if (isAuthError(error)) {
308
- throw error
309
- }
310
- throw new AuthError(ERROR_RESPONSE.AUTHORIZATION.INVALID_REQUEST, "Invalid origin (potential CSRF).")
257
+ try {
258
+ const headers = request.headers;
259
+ const origin = headers.get("Origin");
260
+ const referer = headers.get("Referer");
261
+ let hostedURL = getOriginURL(request, trustedProxyHeaders);
262
+ if (redirectTo) {
263
+ if (redirectTo.startsWith("/")) {
264
+ return sanitizeURL(redirectTo);
265
+ }
266
+ const redirectToURL = new URL(sanitizeURL(getNormalizedOriginPath(redirectTo)));
267
+ if (!isValidURL(redirectTo) || !equals(redirectToURL.origin, hostedURL.origin)) {
268
+ throw new InvalidRedirectToError();
269
+ }
270
+ return sanitizeURL(redirectToURL.pathname);
271
+ }
272
+ if (referer) {
273
+ const refererURL = new URL(sanitizeURL(referer));
274
+ if (!isValidURL(referer) || !equals(refererURL.origin, hostedURL.origin)) {
275
+ throw new AuthError(
276
+ ERROR_RESPONSE.AUTHORIZATION.INVALID_REQUEST,
277
+ "The referer of the request does not match the hosted origin."
278
+ );
279
+ }
280
+ return sanitizeURL(refererURL.pathname);
281
+ }
282
+ if (origin) {
283
+ const originURL = new URL(sanitizeURL(getNormalizedOriginPath(origin)));
284
+ if (!isValidURL(origin) || !equals(originURL.origin, hostedURL.origin)) {
285
+ throw new AuthError(ERROR_RESPONSE.AUTHORIZATION.INVALID_REQUEST, "Invalid origin (potential CSRF).");
286
+ }
287
+ return sanitizeURL(originURL.pathname);
311
288
  }
312
- }
289
+ return "/";
290
+ } catch (error) {
291
+ if (isAuthError(error)) {
292
+ throw error;
293
+ }
294
+ throw new AuthError(ERROR_RESPONSE.AUTHORIZATION.INVALID_REQUEST, "Invalid origin (potential CSRF).");
295
+ }
296
+ };
313
297
 
314
298
  // src/cookie.ts
315
- var import_cookie = require("cookie")
316
- var import_cookie2 = require("cookie")
317
- var COOKIE_NAME = "aura-auth"
299
+ var import_cookie = require("cookie");
300
+ var import_cookie2 = require("cookie");
301
+ var COOKIE_NAME = "aura-auth";
318
302
  var defaultCookieOptions = {
319
- httpOnly: true,
320
- sameSite: "lax",
321
- path: "/",
322
- maxAge: 60 * 60 * 24 * 15,
323
- }
303
+ httpOnly: true,
304
+ sameSite: "lax",
305
+ path: "/",
306
+ maxAge: 60 * 60 * 24 * 15
307
+ };
324
308
  var defaultStandardCookieConfig = {
325
- secure: false,
326
- httpOnly: true,
327
- prefix: "",
328
- }
309
+ secure: false,
310
+ httpOnly: true,
311
+ prefix: ""
312
+ };
329
313
  var defaultSecureCookieConfig = {
330
- secure: true,
331
- prefix: "__Secure-",
332
- }
314
+ secure: true,
315
+ prefix: "__Secure-"
316
+ };
333
317
  var defaultHostCookieConfig = {
334
- secure: true,
335
- prefix: "__Host-",
336
- path: "/",
337
- domain: void 0,
338
- }
318
+ secure: true,
319
+ prefix: "__Host-",
320
+ path: "/",
321
+ domain: void 0
322
+ };
339
323
  var expiredCookieOptions = {
340
- ...defaultCookieOptions,
341
- expires: /* @__PURE__ */ new Date(0),
342
- maxAge: 0,
343
- }
324
+ ...defaultCookieOptions,
325
+ expires: /* @__PURE__ */ new Date(0),
326
+ maxAge: 0
327
+ };
344
328
  var defineDefaultCookieOptions = (options2) => {
345
- return {
346
- name: options2?.name ?? COOKIE_NAME,
347
- prefix: options2?.prefix ?? (options2?.secure ? "__Secure-" : ""),
348
- ...defaultCookieOptions,
349
- ...options2,
350
- }
351
- }
329
+ return {
330
+ name: options2?.name ?? COOKIE_NAME,
331
+ prefix: options2?.prefix ?? (options2?.secure ? "__Secure-" : ""),
332
+ ...defaultCookieOptions,
333
+ ...options2
334
+ };
335
+ };
352
336
  var setCookie = (cookieName, value, options2) => {
353
- const { prefix, name } = defineDefaultCookieOptions(options2)
354
- const cookieNameWithPrefix = `${prefix}${name}.${cookieName}`
355
- return (0, import_cookie.serialize)(cookieNameWithPrefix, value, {
356
- ...defaultCookieOptions,
357
- ...options2,
358
- })
359
- }
337
+ const { prefix, name } = defineDefaultCookieOptions(options2);
338
+ const cookieNameWithPrefix = `${prefix}${name}.${cookieName}`;
339
+ return (0, import_cookie.serialize)(cookieNameWithPrefix, value, {
340
+ ...defaultCookieOptions,
341
+ ...options2
342
+ });
343
+ };
360
344
  var getCookie = (petition, cookie, options2, optional = false) => {
361
- const cookies = isRequest(petition) ? petition.headers.get("Cookie") : petition.headers.getSetCookie().join("; ")
362
- if (!cookies) {
363
- if (optional) {
364
- return ""
365
- }
366
- throw new AuthError("invalid_request", "No cookies found. There is no active session")
345
+ const cookies = isRequest(petition) ? petition.headers.get("Cookie") : petition.headers.getSetCookie().join("; ");
346
+ if (!cookies) {
347
+ if (optional) {
348
+ return "";
367
349
  }
368
- const { name, prefix } = defineDefaultCookieOptions(options2)
369
- const parsedCookies = (0, import_cookie.parse)(cookies)
370
- const value = parsedCookies[`${prefix}${name}.${cookie}`]
371
- if (value === void 0) {
372
- if (optional) {
373
- return ""
374
- }
375
- throw new AuthError("invalid_request", `Cookie "${cookie}" not found. There is no active session`)
350
+ throw new AuthError("invalid_request", "No cookies found. There is no active session");
351
+ }
352
+ const { name, prefix } = defineDefaultCookieOptions(options2);
353
+ const parsedCookies = (0, import_cookie.parse)(cookies);
354
+ const value = parsedCookies[`${prefix}${name}.${cookie}`];
355
+ if (value === void 0) {
356
+ if (optional) {
357
+ return "";
376
358
  }
377
- return value
378
- }
359
+ throw new AuthError("invalid_request", `Cookie "${cookie}" not found. There is no active session`);
360
+ }
361
+ return value;
362
+ };
379
363
  var secureCookieOptions = (request, cookieOptions, trustedProxyHeaders) => {
380
- const name = cookieOptions.name ?? COOKIE_NAME
381
- const isSecure = trustedProxyHeaders
382
- ? request.url.startsWith("https://") ||
383
- request.headers.get("X-Forwarded-Proto") === "https" ||
384
- request.headers.get("Forwarded")?.includes("proto=https")
385
- : request.url.startsWith("https://")
386
- if (!cookieOptions.options?.httpOnly) {
387
- console.warn(
388
- "[WARNING]: Cookie is configured without HttpOnly. This allows JavaScript access via document.cookie and increases XSS risk."
389
- )
364
+ const name = cookieOptions.name ?? COOKIE_NAME;
365
+ const isSecure = trustedProxyHeaders ? request.url.startsWith("https://") || request.headers.get("X-Forwarded-Proto") === "https" || request.headers.get("Forwarded")?.includes("proto=https") : request.url.startsWith("https://");
366
+ if (!cookieOptions.options?.httpOnly) {
367
+ console.warn(
368
+ "[WARNING]: Cookie is configured without HttpOnly. This allows JavaScript access via document.cookie and increases XSS risk."
369
+ );
370
+ }
371
+ if (cookieOptions.options?.domain === "*") {
372
+ console.warn("[WARNING]: Cookie 'Domain' is set to '*', which is insecure. Avoid wildcard domains.");
373
+ }
374
+ if (!isSecure) {
375
+ const options2 = cookieOptions.options;
376
+ if (options2?.secure) {
377
+ console.warn(
378
+ "[WARNING]: The 'Secure' attribute will be disabled for this cookie. Serve over HTTPS to enforce Secure cookies."
379
+ );
390
380
  }
391
- if (cookieOptions.options?.domain === "*") {
392
- console.warn("[WARNING]: Cookie 'Domain' is set to '*', which is insecure. Avoid wildcard domains.")
381
+ if (options2?.sameSite == "none") {
382
+ console.warn("[WARNING]: SameSite=None without a secure connection can be blocked by browsers.");
393
383
  }
394
- if (!isSecure) {
395
- const options2 = cookieOptions.options
396
- if (options2?.secure) {
397
- console.warn(
398
- "[WARNING]: The 'Secure' attribute will be disabled for this cookie. Serve over HTTPS to enforce Secure cookies."
399
- )
400
- }
401
- if (options2?.sameSite == "none") {
402
- console.warn("[WARNING]: SameSite=None without a secure connection can be blocked by browsers.")
403
- }
404
- if (process.env.NODE_ENV === "production") {
405
- console.warn("[WARNING]: In production, ensure cookies are served over HTTPS to maintain security.")
406
- }
407
- return {
408
- ...defaultCookieOptions,
409
- ...cookieOptions.options,
410
- sameSite: options2?.sameSite === "none" ? "lax" : (options2?.sameSite ?? "lax"),
411
- ...defaultStandardCookieConfig,
412
- name,
413
- }
384
+ if (process.env.NODE_ENV === "production") {
385
+ console.warn("[WARNING]: In production, ensure cookies are served over HTTPS to maintain security.");
414
386
  }
415
- return cookieOptions.strategy === "host"
416
- ? {
417
- ...defaultCookieOptions,
418
- ...cookieOptions.options,
419
- ...defaultHostCookieConfig,
420
- name,
421
- }
422
- : { ...defaultCookieOptions, ...cookieOptions.options, ...defaultSecureCookieConfig, name }
423
- }
387
+ return {
388
+ ...defaultCookieOptions,
389
+ ...cookieOptions.options,
390
+ sameSite: options2?.sameSite === "none" ? "lax" : options2?.sameSite ?? "lax",
391
+ ...defaultStandardCookieConfig,
392
+ name
393
+ };
394
+ }
395
+ return cookieOptions.strategy === "host" ? {
396
+ ...defaultCookieOptions,
397
+ ...cookieOptions.options,
398
+ ...defaultHostCookieConfig,
399
+ name
400
+ } : { ...defaultCookieOptions, ...cookieOptions.options, ...defaultSecureCookieConfig, name };
401
+ };
424
402
  var expireCookie = (name, options2) => {
425
- return setCookie(name, "", { ...options2, ...expiredCookieOptions })
426
- }
403
+ return setCookie(name, "", { ...options2, ...expiredCookieOptions });
404
+ };
427
405
 
428
406
  // src/actions/signOut/signOut.ts
429
407
  var config = (0, import_router2.createEndpointConfig)({
430
- schemas: {
431
- searchParams: import_zod.default.object({
432
- token_type_hint: import_zod.default.literal("session_token"),
433
- redirectTo: import_zod.default.string().optional(),
434
- }),
435
- },
436
- })
408
+ schemas: {
409
+ searchParams: import_zod.default.object({
410
+ token_type_hint: import_zod.default.literal("session_token"),
411
+ redirectTo: import_zod.default.string().optional()
412
+ })
413
+ }
414
+ });
437
415
  var signOutAction = (0, import_router2.createEndpoint)(
438
- "POST",
439
- "/signOut",
440
- async (ctx) => {
441
- const {
442
- request,
443
- headers,
444
- searchParams: { redirectTo },
445
- context: { cookies, jose, trustedProxyHeaders },
446
- } = ctx
447
- try {
448
- const cookiesOptions = secureCookieOptions(request, cookies, trustedProxyHeaders)
449
- const session = getCookie(request, "sessionToken", cookiesOptions)
450
- const csrfToken = getCookie(request, "csrfToken", {
451
- ...cookiesOptions,
452
- prefix: cookiesOptions.secure ? "__Host-" : "",
453
- })
454
- const header = headers.get("X-CSRF-Token")
455
- if (!header || !session || !csrfToken) {
456
- throw new Error("Missing CSRF token or session token")
457
- }
458
- await verifyCSRF(jose, csrfToken, header)
459
- await jose.decodeJWT(session)
460
- const normalizedOriginPath = getNormalizedOriginPath(request.url)
461
- const location = createRedirectTo(
462
- new Request(normalizedOriginPath, {
463
- headers,
464
- }),
465
- redirectTo
466
- )
467
- const responseHeaders = new Headers(cacheControl)
468
- responseHeaders.append("Set-Cookie", expireCookie("sessionToken", cookiesOptions))
469
- responseHeaders.append(
470
- "Set-Cookie",
471
- expireCookie("csrfToken", { ...cookiesOptions, prefix: cookiesOptions.secure ? "__Host-" : "" })
472
- )
473
- responseHeaders.append("Location", location)
474
- return Response.json(
475
- { message: "Signed out successfully" },
476
- { status: import_router2.statusCode.ACCEPTED, headers: responseHeaders }
477
- )
478
- } catch (error) {
479
- if (error instanceof InvalidCsrfTokenError) {
480
- return AuraResponse.json(
481
- {
482
- error: "invalid_csrf_token",
483
- error_description: "The provided CSRF token is invalid or has expired",
484
- },
485
- { status: import_router2.statusCode.UNAUTHORIZED }
486
- )
487
- }
488
- if (error instanceof InvalidRedirectToError) {
489
- const { type, message } = error
490
- return AuraResponse.json(
491
- {
492
- error: type,
493
- error_description: message,
494
- },
495
- { status: import_router2.statusCode.BAD_REQUEST }
496
- )
497
- }
498
- return AuraResponse.json(
499
- {
500
- error: "invalid_session_token",
501
- error_description: "The provided sessionToken is invalid or has already expired",
502
- },
503
- { status: import_router2.statusCode.UNAUTHORIZED }
504
- )
505
- }
506
- },
507
- config
508
- )
416
+ "POST",
417
+ "/signOut",
418
+ async (ctx) => {
419
+ const {
420
+ request,
421
+ headers,
422
+ searchParams: { redirectTo },
423
+ context: { cookies, jose, trustedProxyHeaders }
424
+ } = ctx;
425
+ try {
426
+ const cookiesOptions = secureCookieOptions(request, cookies, trustedProxyHeaders);
427
+ const session = getCookie(request, "sessionToken", cookiesOptions);
428
+ const csrfToken = getCookie(request, "csrfToken", {
429
+ ...cookiesOptions,
430
+ prefix: cookiesOptions.secure ? "__Host-" : ""
431
+ });
432
+ const header = headers.get("X-CSRF-Token");
433
+ if (!header || !session || !csrfToken) {
434
+ throw new Error("Missing CSRF token or session token");
435
+ }
436
+ await verifyCSRF(jose, csrfToken, header);
437
+ await jose.decodeJWT(session);
438
+ const normalizedOriginPath = getNormalizedOriginPath(request.url);
439
+ const location = createRedirectTo(
440
+ new Request(normalizedOriginPath, {
441
+ headers
442
+ }),
443
+ redirectTo
444
+ );
445
+ const responseHeaders = new Headers(cacheControl);
446
+ responseHeaders.append("Set-Cookie", expireCookie("sessionToken", cookiesOptions));
447
+ responseHeaders.append(
448
+ "Set-Cookie",
449
+ expireCookie("csrfToken", { ...cookiesOptions, prefix: cookiesOptions.secure ? "__Host-" : "" })
450
+ );
451
+ responseHeaders.append("Location", location);
452
+ return Response.json(
453
+ { message: "Signed out successfully" },
454
+ { status: import_router2.statusCode.ACCEPTED, headers: responseHeaders }
455
+ );
456
+ } catch (error) {
457
+ if (error instanceof InvalidCsrfTokenError) {
458
+ return AuraResponse.json(
459
+ {
460
+ error: "invalid_csrf_token",
461
+ error_description: "The provided CSRF token is invalid or has expired"
462
+ },
463
+ { status: import_router2.statusCode.UNAUTHORIZED }
464
+ );
465
+ }
466
+ if (error instanceof InvalidRedirectToError) {
467
+ const { type, message } = error;
468
+ return AuraResponse.json(
469
+ {
470
+ error: type,
471
+ error_description: message
472
+ },
473
+ { status: import_router2.statusCode.BAD_REQUEST }
474
+ );
475
+ }
476
+ return AuraResponse.json(
477
+ {
478
+ error: "invalid_session_token",
479
+ error_description: "The provided sessionToken is invalid or has already expired"
480
+ },
481
+ { status: import_router2.statusCode.UNAUTHORIZED }
482
+ );
483
+ }
484
+ },
485
+ config
486
+ );
509
487
  // Annotate the CommonJS export names for ESM import in node:
510
- 0 &&
511
- (module.exports = {
512
- signOutAction,
513
- })
488
+ 0 && (module.exports = {
489
+ signOutAction
490
+ });