@aura-stack/auth 0.1.0-rc.7 → 0.1.0-rc.8

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 (117) hide show
  1. package/dist/@types/index.cjs +15 -15
  2. package/dist/@types/index.d.ts +31 -7
  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 +20 -15
  11. package/dist/actions/callback/access-token.js +4 -8
  12. package/dist/actions/callback/callback.cjs +455 -437
  13. package/dist/actions/callback/callback.d.ts +12 -10
  14. package/dist/actions/callback/callback.js +12 -16
  15. package/dist/actions/callback/userinfo.cjs +134 -131
  16. package/dist/actions/callback/userinfo.d.ts +9 -9
  17. package/dist/actions/callback/userinfo.js +6 -10
  18. package/dist/actions/csrfToken/csrfToken.cjs +171 -162
  19. package/dist/actions/csrfToken/csrfToken.d.ts +3 -3
  20. package/dist/actions/csrfToken/csrfToken.js +8 -12
  21. package/dist/actions/index.cjs +773 -746
  22. package/dist/actions/index.d.ts +13 -13
  23. package/dist/actions/index.js +18 -34
  24. package/dist/actions/session/session.cjs +155 -149
  25. package/dist/actions/session/session.d.ts +3 -3
  26. package/dist/actions/session/session.js +7 -11
  27. package/dist/actions/signIn/authorization.cjs +249 -231
  28. package/dist/actions/signIn/authorization.d.ts +18 -12
  29. package/dist/actions/signIn/authorization.js +6 -16
  30. package/dist/actions/signIn/signIn.cjs +423 -396
  31. package/dist/actions/signIn/signIn.d.ts +10 -10
  32. package/dist/actions/signIn/signIn.js +10 -14
  33. package/dist/actions/signOut/signOut.cjs +440 -417
  34. package/dist/actions/signOut/signOut.d.ts +3 -3
  35. package/dist/actions/signOut/signOut.js +11 -15
  36. package/dist/assert.cjs +36 -35
  37. package/dist/assert.d.ts +4 -4
  38. package/dist/assert.js +2 -10
  39. package/dist/chunk-256KIVJL.js +96 -85
  40. package/dist/chunk-42XB3YCW.js +17 -19
  41. package/dist/chunk-6SM22VVJ.js +10 -13
  42. package/dist/chunk-CAKJT3KS.js +69 -84
  43. package/dist/chunk-E3OXBRYF.js +17 -19
  44. package/dist/chunk-EBPE35JT.js +26 -28
  45. package/dist/chunk-FIPU4MLT.js +16 -18
  46. package/dist/chunk-FJUDBLCP.js +43 -50
  47. package/dist/chunk-FKRDCWBF.js +17 -19
  48. package/dist/chunk-GZU3RBTB.js +40 -51
  49. package/dist/chunk-HGJ4TXY4.js +100 -132
  50. package/dist/chunk-HMRKN75I.js +63 -63
  51. package/dist/chunk-IKHPGFCW.js +9 -11
  52. package/dist/chunk-JAPMIE6S.js +5 -7
  53. package/dist/chunk-KRNOMBXQ.js +17 -19
  54. package/dist/chunk-LLR722CL.js +70 -91
  55. package/dist/chunk-RLT4RFKV.js +30 -39
  56. package/dist/chunk-SJPDVKUS.js +88 -107
  57. package/dist/chunk-SMQO5WD7.js +16 -26
  58. package/dist/chunk-STHEPPUZ.js +6 -8
  59. package/dist/chunk-UJJ7R56J.js +37 -47
  60. package/dist/chunk-UTDLUEEG.js +25 -0
  61. package/dist/chunk-VFTYH33W.js +37 -54
  62. package/dist/chunk-XXJKNKGQ.js +23 -33
  63. package/dist/chunk-ZV4BH47P.js +134 -132
  64. package/dist/cookie.cjs +175 -169
  65. package/dist/cookie.d.ts +51 -23
  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 +8 -15
  70. package/dist/headers.cjs +28 -28
  71. package/dist/headers.d.ts +2 -2
  72. package/dist/headers.js +2 -6
  73. package/dist/index-DpfbvTZ_.d.ts +298 -249
  74. package/dist/index.cjs +969 -933
  75. package/dist/index.d.ts +31 -10
  76. package/dist/index.js +50 -70
  77. package/dist/jose.cjs +67 -52
  78. package/dist/jose.d.ts +8 -8
  79. package/dist/jose.js +5 -9
  80. package/dist/oauth/bitbucket.cjs +38 -38
  81. package/dist/oauth/bitbucket.d.ts +7 -7
  82. package/dist/oauth/bitbucket.js +2 -6
  83. package/dist/oauth/discord.cjs +48 -48
  84. package/dist/oauth/discord.d.ts +7 -7
  85. package/dist/oauth/discord.js +2 -6
  86. package/dist/oauth/figma.cjs +39 -39
  87. package/dist/oauth/figma.d.ts +7 -7
  88. package/dist/oauth/figma.js +2 -6
  89. package/dist/oauth/github.cjs +31 -31
  90. package/dist/oauth/github.d.ts +7 -7
  91. package/dist/oauth/github.js +2 -6
  92. package/dist/oauth/gitlab.cjs +39 -39
  93. package/dist/oauth/gitlab.d.ts +7 -7
  94. package/dist/oauth/gitlab.js +2 -6
  95. package/dist/oauth/index.cjs +180 -180
  96. package/dist/oauth/index.d.ts +26 -7
  97. package/dist/oauth/index.js +9 -36
  98. package/dist/oauth/spotify.cjs +39 -39
  99. package/dist/oauth/spotify.d.ts +7 -7
  100. package/dist/oauth/spotify.js +2 -6
  101. package/dist/oauth/x.cjs +39 -39
  102. package/dist/oauth/x.d.ts +7 -7
  103. package/dist/oauth/x.js +2 -6
  104. package/dist/response.cjs +27 -27
  105. package/dist/response.d.ts +2 -2
  106. package/dist/response.js +2 -6
  107. package/dist/schemas.cjs +91 -91
  108. package/dist/schemas.d.ts +126 -93
  109. package/dist/schemas.js +18 -18
  110. package/dist/secure.cjs +98 -95
  111. package/dist/secure.d.ts +17 -17
  112. package/dist/secure.js +4 -18
  113. package/dist/utils.cjs +132 -119
  114. package/dist/utils.d.ts +26 -11
  115. package/dist/utils.js +21 -21
  116. package/package.json +1 -1
  117. package/dist/chunk-X7M4CQTN.js +0 -25
@@ -1,490 +1,513 @@
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)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
9
+ for (var name in all) __defProp(target, name, { get: all[name], enumerable: true })
10
+ }
12
11
  var __copyProps = (to, from, except, desc) => {
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);
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)
29
31
 
30
32
  // src/actions/signOut/signOut.ts
31
- var signOut_exports = {};
33
+ var signOut_exports = {}
32
34
  __export(signOut_exports, {
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");
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")
38
40
 
39
41
  // src/secure.ts
40
- var import_node_crypto = __toESM(require("crypto"), 1);
42
+ var import_node_crypto = __toESM(require("crypto"), 1)
41
43
 
42
44
  // src/utils.ts
43
- var import_router = require("@aura-stack/router");
45
+ var import_router = require("@aura-stack/router")
44
46
 
45
47
  // src/error.ts
46
48
  var AuthError = class extends Error {
47
- constructor(type, message) {
48
- super(message);
49
- this.type = type;
50
- this.name = "AuthError";
51
- }
52
- };
49
+ constructor(type, message) {
50
+ super(message)
51
+ this.type = type
52
+ this.name = "AuthError"
53
+ }
54
+ }
53
55
  var InvalidCsrfTokenError = class extends AuthError {
54
- constructor(message = "The provided CSRF token is invalid or has expired") {
55
- super("invalid_csrf_token", message);
56
- this.name = "InvalidCsrfTokenError";
57
- }
58
- };
56
+ constructor(message = "The provided CSRF token is invalid or has expired") {
57
+ super("invalid_csrf_token", message)
58
+ this.name = "InvalidCsrfTokenError"
59
+ }
60
+ }
59
61
  var InvalidRedirectToError = class extends AuthError {
60
- constructor(message = "The redirectTo parameter does not match the hosted origin.") {
61
- super("invalid_redirect_to", message);
62
- this.name = "InvalidRedirectToError";
63
- }
64
- };
62
+ constructor(message = "The redirectTo parameter does not match the hosted origin.") {
63
+ super("invalid_redirect_to", message)
64
+ this.name = "InvalidRedirectToError"
65
+ }
66
+ }
65
67
  var isAuthError = (error) => {
66
- return error instanceof AuthError;
67
- };
68
+ return error instanceof AuthError
69
+ }
68
70
  var ERROR_RESPONSE = {
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
- };
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
+ }
87
89
 
88
90
  // src/utils.ts
89
91
  var equals = (a, b) => {
90
- if (a === null || b === null || a === void 0 || b === void 0) return false;
91
- return a === b;
92
- };
92
+ if (a === null || b === null || a === void 0 || b === void 0) return false
93
+ return a === b
94
+ }
93
95
  var sanitizeURL = (url2) => {
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;
114
- }
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(/\/+$/, "");
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()
120
135
  }
121
- return sanitized;
122
- } catch {
123
- return url2.trim();
124
- }
125
- };
136
+ }
126
137
  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
- };
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)
145
+ }
146
+ }
136
147
 
137
148
  // src/secure.ts
138
149
  var verifyCSRF = async (jose, cookie, header) => {
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();
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()
149
164
  }
150
- return true;
151
- } catch {
152
- throw new InvalidCsrfTokenError();
153
- }
154
- };
165
+ }
155
166
 
156
167
  // src/headers.ts
157
168
  var cacheControl = {
158
- "Cache-Control": "no-store",
159
- Pragma: "no-cache",
160
- Expires: "0",
161
- Vary: "Cookie"
162
- };
169
+ "Cache-Control": "no-store",
170
+ Pragma: "no-cache",
171
+ Expires: "0",
172
+ Vary: "Cookie",
173
+ }
163
174
 
164
175
  // src/response.ts
165
176
  var AuraResponse = class extends Response {
166
- static json(body, init) {
167
- return Response.json(body, init);
168
- }
169
- };
177
+ static json(body, init) {
178
+ return Response.json(body, init)
179
+ }
180
+ }
170
181
 
171
182
  // src/assert.ts
172
183
  var isRequest = (value) => {
173
- return typeof Request !== "undefined" && value instanceof Request;
174
- };
184
+ return typeof Request !== "undefined" && value instanceof Request
185
+ }
175
186
  var isValidURL = (value) => {
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
- };
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
+ }
180
192
 
181
193
  // src/schemas.ts
182
- var import_v4 = require("zod/v4");
194
+ var import_v4 = require("zod/v4")
183
195
  var OAuthProviderConfigSchema = (0, import_v4.object)({
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
- });
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
+ })
192
204
  var OAuthAuthorization = OAuthProviderConfigSchema.extend({
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
- });
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
+ })
198
210
  var OAuthAuthorizationResponse = (0, import_v4.object)({
199
- state: (0, import_v4.string)(),
200
- code: (0, import_v4.string)()
201
- });
211
+ state: (0, import_v4.string)(),
212
+ code: (0, import_v4.string)(),
213
+ })
202
214
  var OAuthAuthorizationErrorResponse = (0, import_v4.object)({
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
- });
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
+ })
216
228
  var OAuthAccessToken = OAuthProviderConfigSchema.extend({
217
- redirectURI: (0, import_v4.string)(),
218
- code: (0, import_v4.string)(),
219
- codeVerifier: (0, import_v4.string)().min(43).max(128)
220
- });
229
+ redirectURI: (0, import_v4.string)(),
230
+ code: (0, import_v4.string)(),
231
+ codeVerifier: (0, import_v4.string)().min(43).max(128),
232
+ })
221
233
  var OAuthAccessTokenResponse = (0, import_v4.object)({
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
- });
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
+ })
228
240
  var OAuthAccessTokenErrorResponse = (0, import_v4.object)({
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
- });
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
+ })
240
252
  var OAuthErrorResponse = (0, import_v4.object)({
241
- error: (0, import_v4.string)(),
242
- error_description: (0, import_v4.string)().optional()
243
- });
253
+ error: (0, import_v4.string)(),
254
+ error_description: (0, import_v4.string)().optional(),
255
+ })
244
256
 
245
257
  // src/actions/signIn/authorization.ts
246
258
  var getOriginURL = (request, trustedProxyHeaders) => {
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
- };
256
- var createRedirectTo = (request, redirectTo, trustedProxyHeaders) => {
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);
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))
271
270
  }
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);
288
- }
289
- return "/";
290
- } catch (error) {
291
- if (isAuthError(error)) {
292
- throw error;
271
+ }
272
+ 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).")
293
311
  }
294
- throw new AuthError(ERROR_RESPONSE.AUTHORIZATION.INVALID_REQUEST, "Invalid origin (potential CSRF).");
295
- }
296
- };
312
+ }
297
313
 
298
314
  // src/cookie.ts
299
- var import_cookie = require("cookie");
300
- var import_cookie2 = require("cookie");
301
- var COOKIE_NAME = "aura-auth";
315
+ var import_cookie = require("cookie")
316
+ var import_cookie2 = require("cookie")
317
+ var COOKIE_NAME = "aura-auth"
302
318
  var defaultCookieOptions = {
303
- httpOnly: true,
304
- sameSite: "lax",
305
- path: "/",
306
- maxAge: 60 * 60 * 24 * 15
307
- };
319
+ httpOnly: true,
320
+ sameSite: "lax",
321
+ path: "/",
322
+ maxAge: 60 * 60 * 24 * 15,
323
+ }
308
324
  var defaultStandardCookieConfig = {
309
- secure: false,
310
- httpOnly: true,
311
- prefix: ""
312
- };
325
+ secure: false,
326
+ httpOnly: true,
327
+ prefix: "",
328
+ }
313
329
  var defaultSecureCookieConfig = {
314
- secure: true,
315
- prefix: "__Secure-"
316
- };
330
+ secure: true,
331
+ prefix: "__Secure-",
332
+ }
317
333
  var defaultHostCookieConfig = {
318
- secure: true,
319
- prefix: "__Host-",
320
- path: "/",
321
- domain: void 0
322
- };
334
+ secure: true,
335
+ prefix: "__Host-",
336
+ path: "/",
337
+ domain: void 0,
338
+ }
323
339
  var expiredCookieOptions = {
324
- ...defaultCookieOptions,
325
- expires: /* @__PURE__ */ new Date(0),
326
- maxAge: 0
327
- };
328
- var defineDefaultCookieOptions = (options2) => {
329
- return {
330
- name: options2?.name ?? COOKIE_NAME,
331
- prefix: options2?.prefix ?? (options2?.secure ? "__Secure-" : ""),
332
340
  ...defaultCookieOptions,
333
- ...options2
334
- };
335
- };
341
+ expires: /* @__PURE__ */ new Date(0),
342
+ maxAge: 0,
343
+ }
344
+ var defineDefaultCookieOptions = (options2) => {
345
+ return {
346
+ name: options2?.name ?? COOKIE_NAME,
347
+ prefix: options2?.prefix ?? (options2?.secure ? "__Secure-" : ""),
348
+ ...defaultCookieOptions,
349
+ ...options2,
350
+ }
351
+ }
336
352
  var setCookie = (cookieName, value, options2) => {
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
- };
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
+ }
344
360
  var getCookie = (petition, cookie, options2, optional = false) => {
345
- const cookies = isRequest(petition) ? petition.headers.get("Cookie") : petition.headers.getSetCookie().join("; ");
346
- if (!cookies) {
347
- if (optional) {
348
- return "";
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")
349
367
  }
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 "";
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`)
358
376
  }
359
- throw new AuthError("invalid_request", `Cookie "${cookie}" not found. There is no active session`);
360
- }
361
- return value;
362
- };
377
+ return value
378
+ }
363
379
  var secureCookieOptions = (request, cookieOptions, trustedProxyHeaders) => {
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
- );
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
+ )
380
390
  }
381
- if (options2?.sameSite == "none") {
382
- console.warn("[WARNING]: SameSite=None without a secure connection can be blocked by browsers.");
391
+ if (cookieOptions.options?.domain === "*") {
392
+ console.warn("[WARNING]: Cookie 'Domain' is set to '*', which is insecure. Avoid wildcard domains.")
383
393
  }
384
- if (process.env.NODE_ENV === "production") {
385
- console.warn("[WARNING]: In production, ensure cookies are served over HTTPS to maintain security.");
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
+ }
386
414
  }
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
- };
415
+ return cookieOptions.strategy === "host"
416
+ ? {
417
+ ...defaultCookieOptions,
418
+ ...cookieOptions.options,
419
+ ...defaultHostCookieConfig,
420
+ name,
421
+ }
422
+ : { ...defaultCookieOptions, ...cookieOptions.options, ...defaultSecureCookieConfig, name }
423
+ }
402
424
  var expireCookie = (name, options2) => {
403
- return setCookie(name, "", { ...options2, ...expiredCookieOptions });
404
- };
425
+ return setCookie(name, "", { ...options2, ...expiredCookieOptions })
426
+ }
405
427
 
406
428
  // src/actions/signOut/signOut.ts
407
429
  var config = (0, import_router2.createEndpointConfig)({
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
- });
415
- var signOutAction = (0, import_router2.createEndpoint)(
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
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(),
442
434
  }),
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
- );
435
+ },
436
+ })
437
+ 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
+ )
487
509
  // Annotate the CommonJS export names for ESM import in node:
488
- 0 && (module.exports = {
489
- signOutAction
490
- });
510
+ 0 &&
511
+ (module.exports = {
512
+ signOutAction,
513
+ })