@mulverse/mulguard-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (600) hide show
  1. package/README.md +24 -0
  2. package/adapters.d.ts +522 -0
  3. package/adapters.d.ts.map +1 -0
  4. package/adapters.js +170 -0
  5. package/errors.d.ts +429 -0
  6. package/errors.d.ts.map +1 -0
  7. package/errors.js +473 -0
  8. package/index.d.ts +547 -0
  9. package/index.d.ts.map +1 -0
  10. package/index.js +142 -0
  11. package/jwt.d.ts +132 -0
  12. package/jwt.d.ts.map +1 -0
  13. package/jwt.js +123 -0
  14. package/lib/actions/callback/handle-login.d.ts +35 -0
  15. package/lib/actions/callback/handle-login.d.ts.map +1 -0
  16. package/lib/actions/callback/handle-login.js +275 -0
  17. package/lib/actions/callback/index.d.ts +5 -0
  18. package/lib/actions/callback/index.d.ts.map +1 -0
  19. package/lib/actions/callback/index.js +409 -0
  20. package/lib/actions/callback/oauth/callback.d.ts +36 -0
  21. package/lib/actions/callback/oauth/callback.d.ts.map +1 -0
  22. package/lib/actions/callback/oauth/callback.js +248 -0
  23. package/lib/actions/callback/oauth/checks.d.ts +70 -0
  24. package/lib/actions/callback/oauth/checks.d.ts.map +1 -0
  25. package/lib/actions/callback/oauth/checks.js +188 -0
  26. package/lib/actions/callback/oauth/csrf-token.d.ts +33 -0
  27. package/lib/actions/callback/oauth/csrf-token.d.ts.map +1 -0
  28. package/lib/actions/callback/oauth/csrf-token.js +39 -0
  29. package/lib/actions/index.d.ts +6 -0
  30. package/lib/actions/index.d.ts.map +1 -0
  31. package/lib/actions/index.js +5 -0
  32. package/lib/actions/session.d.ts +5 -0
  33. package/lib/actions/session.d.ts.map +1 -0
  34. package/lib/actions/session.js +127 -0
  35. package/lib/actions/signin/authorization-url.d.ts +12 -0
  36. package/lib/actions/signin/authorization-url.d.ts.map +1 -0
  37. package/lib/actions/signin/authorization-url.js +94 -0
  38. package/lib/actions/signin/index.d.ts +4 -0
  39. package/lib/actions/signin/index.d.ts.map +1 -0
  40. package/lib/actions/signin/index.js +22 -0
  41. package/lib/actions/signin/send-token.d.ts +10 -0
  42. package/lib/actions/signin/send-token.d.ts.map +1 -0
  43. package/lib/actions/signin/send-token.js +98 -0
  44. package/lib/actions/signout.d.ts +11 -0
  45. package/lib/actions/signout.d.ts.map +1 -0
  46. package/lib/actions/signout.js +30 -0
  47. package/lib/actions/webauthn-options.d.ts +8 -0
  48. package/lib/actions/webauthn-options.d.ts.map +1 -0
  49. package/lib/actions/webauthn-options.js +60 -0
  50. package/lib/index.d.ts +2 -0
  51. package/lib/index.d.ts.map +1 -0
  52. package/lib/index.js +70 -0
  53. package/lib/init.d.ts +25 -0
  54. package/lib/init.d.ts.map +1 -0
  55. package/lib/init.js +172 -0
  56. package/lib/pages/error.d.ts +17 -0
  57. package/lib/pages/error.d.ts.map +1 -0
  58. package/lib/pages/error.js +40 -0
  59. package/lib/pages/index.d.ts +42 -0
  60. package/lib/pages/index.d.ts.map +1 -0
  61. package/lib/pages/index.js +136 -0
  62. package/lib/pages/signin.d.ts +10 -0
  63. package/lib/pages/signin.d.ts.map +1 -0
  64. package/lib/pages/signin.js +75 -0
  65. package/lib/pages/signout.d.ts +8 -0
  66. package/lib/pages/signout.d.ts.map +1 -0
  67. package/lib/pages/signout.js +17 -0
  68. package/lib/pages/styles.d.ts +3 -0
  69. package/lib/pages/styles.d.ts.map +1 -0
  70. package/lib/pages/styles.js +381 -0
  71. package/lib/pages/verify-request.d.ts +8 -0
  72. package/lib/pages/verify-request.d.ts.map +1 -0
  73. package/lib/pages/verify-request.js +11 -0
  74. package/lib/symbols.d.ts +50 -0
  75. package/lib/symbols.d.ts.map +1 -0
  76. package/lib/symbols.js +57 -0
  77. package/lib/utils/actions.d.ts +3 -0
  78. package/lib/utils/actions.d.ts.map +1 -0
  79. package/lib/utils/actions.js +14 -0
  80. package/lib/utils/assert.d.ts +14 -0
  81. package/lib/utils/assert.d.ts.map +1 -0
  82. package/lib/utils/assert.js +168 -0
  83. package/lib/utils/callback-url.d.ts +17 -0
  84. package/lib/utils/callback-url.d.ts.map +1 -0
  85. package/lib/utils/callback-url.js +27 -0
  86. package/lib/utils/cookie.d.ts +111 -0
  87. package/lib/utils/cookie.d.ts.map +1 -0
  88. package/lib/utils/cookie.js +205 -0
  89. package/lib/utils/date.d.ts +7 -0
  90. package/lib/utils/date.d.ts.map +1 -0
  91. package/lib/utils/date.js +8 -0
  92. package/lib/utils/email.d.ts +20 -0
  93. package/lib/utils/email.d.ts.map +1 -0
  94. package/lib/utils/email.js +57 -0
  95. package/lib/utils/env.d.ts +9 -0
  96. package/lib/utils/env.d.ts.map +1 -0
  97. package/lib/utils/env.js +96 -0
  98. package/lib/utils/logger.d.ts +18 -0
  99. package/lib/utils/logger.d.ts.map +1 -0
  100. package/lib/utils/logger.js +50 -0
  101. package/lib/utils/merge.d.ts +3 -0
  102. package/lib/utils/merge.d.ts.map +1 -0
  103. package/lib/utils/merge.js +23 -0
  104. package/lib/utils/providers.d.ts +19 -0
  105. package/lib/utils/providers.d.ts.map +1 -0
  106. package/lib/utils/providers.js +149 -0
  107. package/lib/utils/session.d.ts +7 -0
  108. package/lib/utils/session.d.ts.map +1 -0
  109. package/lib/utils/session.js +29 -0
  110. package/lib/utils/web.d.ts +10 -0
  111. package/lib/utils/web.d.ts.map +1 -0
  112. package/lib/utils/web.js +109 -0
  113. package/lib/utils/webauthn-client.d.ts +30 -0
  114. package/lib/utils/webauthn-client.d.ts.map +1 -0
  115. package/lib/utils/webauthn-client.js +197 -0
  116. package/lib/utils/webauthn-utils.d.ts +81 -0
  117. package/lib/utils/webauthn-utils.d.ts.map +1 -0
  118. package/lib/utils/webauthn-utils.js +343 -0
  119. package/lib/vendored/cookie.d.ts +120 -0
  120. package/lib/vendored/cookie.d.ts.map +1 -0
  121. package/lib/vendored/cookie.js +237 -0
  122. package/package.json +118 -0
  123. package/providers/42-school.d.ts +240 -0
  124. package/providers/42-school.d.ts.map +1 -0
  125. package/providers/42-school.js +78 -0
  126. package/providers/apple.d.ts +149 -0
  127. package/providers/apple.d.ts.map +1 -0
  128. package/providers/apple.js +104 -0
  129. package/providers/asgardeo.d.ts +102 -0
  130. package/providers/asgardeo.d.ts.map +1 -0
  131. package/providers/asgardeo.js +93 -0
  132. package/providers/atlassian.d.ts +94 -0
  133. package/providers/atlassian.d.ts.map +1 -0
  134. package/providers/atlassian.js +84 -0
  135. package/providers/auth0.d.ts +116 -0
  136. package/providers/auth0.d.ts.map +1 -0
  137. package/providers/auth0.js +49 -0
  138. package/providers/authentik.d.ts +90 -0
  139. package/providers/authentik.d.ts.map +1 -0
  140. package/providers/authentik.js +65 -0
  141. package/providers/azure-ad-b2c.d.ts +104 -0
  142. package/providers/azure-ad-b2c.d.ts.map +1 -0
  143. package/providers/azure-ad-b2c.js +100 -0
  144. package/providers/azure-ad.d.ts +19 -0
  145. package/providers/azure-ad.d.ts.map +1 -0
  146. package/providers/azure-ad.js +23 -0
  147. package/providers/azure-devops.d.ts +128 -0
  148. package/providers/azure-devops.d.ts.map +1 -0
  149. package/providers/azure-devops.js +158 -0
  150. package/providers/bankid-no.d.ts +134 -0
  151. package/providers/bankid-no.d.ts.map +1 -0
  152. package/providers/bankid-no.js +65 -0
  153. package/providers/battlenet.d.ts +85 -0
  154. package/providers/battlenet.d.ts.map +1 -0
  155. package/providers/battlenet.js +81 -0
  156. package/providers/beyondidentity.d.ts +77 -0
  157. package/providers/beyondidentity.d.ts.map +1 -0
  158. package/providers/beyondidentity.js +84 -0
  159. package/providers/bitbucket.d.ts +89 -0
  160. package/providers/bitbucket.d.ts.map +1 -0
  161. package/providers/bitbucket.js +92 -0
  162. package/providers/box.d.ts +63 -0
  163. package/providers/box.d.ts.map +1 -0
  164. package/providers/box.js +73 -0
  165. package/providers/boxyhq-saml.d.ts +121 -0
  166. package/providers/boxyhq-saml.d.ts.map +1 -0
  167. package/providers/boxyhq-saml.js +127 -0
  168. package/providers/bungie.d.ts +167 -0
  169. package/providers/bungie.d.ts.map +1 -0
  170. package/providers/bungie.js +174 -0
  171. package/providers/click-up.d.ts +75 -0
  172. package/providers/click-up.d.ts.map +1 -0
  173. package/providers/click-up.js +89 -0
  174. package/providers/cognito.d.ts +81 -0
  175. package/providers/cognito.d.ts.map +1 -0
  176. package/providers/cognito.js +73 -0
  177. package/providers/coinbase.d.ts +69 -0
  178. package/providers/coinbase.d.ts.map +1 -0
  179. package/providers/coinbase.js +78 -0
  180. package/providers/concept2.d.ts +81 -0
  181. package/providers/concept2.d.ts.map +1 -0
  182. package/providers/concept2.js +86 -0
  183. package/providers/credentials.d.ts +132 -0
  184. package/providers/credentials.d.ts.map +1 -0
  185. package/providers/credentials.js +74 -0
  186. package/providers/descope.d.ts +91 -0
  187. package/providers/descope.d.ts.map +1 -0
  188. package/providers/descope.js +78 -0
  189. package/providers/discord.d.ts +139 -0
  190. package/providers/discord.d.ts.map +1 -0
  191. package/providers/discord.js +86 -0
  192. package/providers/dribbble.d.ts +88 -0
  193. package/providers/dribbble.d.ts.map +1 -0
  194. package/providers/dribbble.js +85 -0
  195. package/providers/dropbox.d.ts +65 -0
  196. package/providers/dropbox.d.ts.map +1 -0
  197. package/providers/dropbox.js +88 -0
  198. package/providers/duende-identity-server6.d.ts +91 -0
  199. package/providers/duende-identity-server6.d.ts.map +1 -0
  200. package/providers/duende-identity-server6.js +80 -0
  201. package/providers/email.d.ts +41 -0
  202. package/providers/email.d.ts.map +1 -0
  203. package/providers/email.js +18 -0
  204. package/providers/eventbrite.d.ts +78 -0
  205. package/providers/eventbrite.d.ts.map +1 -0
  206. package/providers/eventbrite.js +88 -0
  207. package/providers/eveonline.d.ts +94 -0
  208. package/providers/eveonline.d.ts.map +1 -0
  209. package/providers/eveonline.js +92 -0
  210. package/providers/facebook.d.ts +84 -0
  211. package/providers/facebook.d.ts.map +1 -0
  212. package/providers/facebook.js +93 -0
  213. package/providers/faceit.d.ts +64 -0
  214. package/providers/faceit.d.ts.map +1 -0
  215. package/providers/faceit.js +74 -0
  216. package/providers/figma.d.ts +75 -0
  217. package/providers/figma.d.ts.map +1 -0
  218. package/providers/figma.js +81 -0
  219. package/providers/forwardemail.d.ts +4 -0
  220. package/providers/forwardemail.d.ts.map +1 -0
  221. package/providers/forwardemail.js +32 -0
  222. package/providers/foursquare.d.ts +71 -0
  223. package/providers/foursquare.d.ts.map +1 -0
  224. package/providers/foursquare.js +91 -0
  225. package/providers/freshbooks.d.ts +66 -0
  226. package/providers/freshbooks.d.ts.map +1 -0
  227. package/providers/freshbooks.js +76 -0
  228. package/providers/frontegg.d.ts +95 -0
  229. package/providers/frontegg.d.ts.map +1 -0
  230. package/providers/frontegg.js +88 -0
  231. package/providers/fusionauth.d.ts +279 -0
  232. package/providers/fusionauth.d.ts.map +1 -0
  233. package/providers/fusionauth.js +292 -0
  234. package/providers/github.d.ts +127 -0
  235. package/providers/github.d.ts.map +1 -0
  236. package/providers/github.js +115 -0
  237. package/providers/gitlab.d.ts +115 -0
  238. package/providers/gitlab.d.ts.map +1 -0
  239. package/providers/gitlab.js +75 -0
  240. package/providers/google.d.ts +138 -0
  241. package/providers/google.d.ts.map +1 -0
  242. package/providers/google.js +119 -0
  243. package/providers/hubspot.d.ts +76 -0
  244. package/providers/hubspot.d.ts.map +1 -0
  245. package/providers/hubspot.js +93 -0
  246. package/providers/huggingface.d.ts +216 -0
  247. package/providers/huggingface.d.ts.map +1 -0
  248. package/providers/huggingface.js +101 -0
  249. package/providers/identity-server4.d.ts +69 -0
  250. package/providers/identity-server4.d.ts.map +1 -0
  251. package/providers/identity-server4.js +64 -0
  252. package/providers/index.d.ts +61 -0
  253. package/providers/index.d.ts.map +1 -0
  254. package/providers/index.js +3 -0
  255. package/providers/instagram.d.ts +74 -0
  256. package/providers/instagram.d.ts.map +1 -0
  257. package/providers/instagram.js +87 -0
  258. package/providers/kakao.d.ts +148 -0
  259. package/providers/kakao.d.ts.map +1 -0
  260. package/providers/kakao.js +103 -0
  261. package/providers/keycloak.d.ts +100 -0
  262. package/providers/keycloak.d.ts.map +1 -0
  263. package/providers/keycloak.js +73 -0
  264. package/providers/kinde.d.ts +73 -0
  265. package/providers/kinde.d.ts.map +1 -0
  266. package/providers/kinde.js +51 -0
  267. package/providers/line.d.ts +83 -0
  268. package/providers/line.d.ts.map +1 -0
  269. package/providers/line.js +73 -0
  270. package/providers/linkedin.d.ts +77 -0
  271. package/providers/linkedin.d.ts.map +1 -0
  272. package/providers/linkedin.js +65 -0
  273. package/providers/logto.d.ts +98 -0
  274. package/providers/logto.d.ts.map +1 -0
  275. package/providers/logto.js +81 -0
  276. package/providers/loops.d.ts +40 -0
  277. package/providers/loops.d.ts.map +1 -0
  278. package/providers/loops.js +59 -0
  279. package/providers/mailchimp.d.ts +66 -0
  280. package/providers/mailchimp.d.ts.map +1 -0
  281. package/providers/mailchimp.js +76 -0
  282. package/providers/mailgun.d.ts +55 -0
  283. package/providers/mailgun.d.ts.map +1 -0
  284. package/providers/mailgun.js +74 -0
  285. package/providers/mailru.d.ts +63 -0
  286. package/providers/mailru.d.ts.map +1 -0
  287. package/providers/mailru.js +61 -0
  288. package/providers/mastodon.d.ts +90 -0
  289. package/providers/mastodon.d.ts.map +1 -0
  290. package/providers/mastodon.js +75 -0
  291. package/providers/mattermost.d.ts +132 -0
  292. package/providers/mattermost.d.ts.map +1 -0
  293. package/providers/mattermost.js +83 -0
  294. package/providers/medium.d.ts +68 -0
  295. package/providers/medium.d.ts.map +1 -0
  296. package/providers/medium.js +84 -0
  297. package/providers/microsoft-entra-id.d.ts +428 -0
  298. package/providers/microsoft-entra-id.d.ts.map +1 -0
  299. package/providers/microsoft-entra-id.js +156 -0
  300. package/providers/naver.d.ts +80 -0
  301. package/providers/naver.d.ts.map +1 -0
  302. package/providers/naver.js +79 -0
  303. package/providers/netlify.d.ts +66 -0
  304. package/providers/netlify.d.ts.map +1 -0
  305. package/providers/netlify.js +85 -0
  306. package/providers/netsuite.d.ts +189 -0
  307. package/providers/netsuite.d.ts.map +1 -0
  308. package/providers/netsuite.js +170 -0
  309. package/providers/nextcloud.d.ts +150 -0
  310. package/providers/nextcloud.d.ts.map +1 -0
  311. package/providers/nextcloud.js +99 -0
  312. package/providers/nodemailer.d.ts +27 -0
  313. package/providers/nodemailer.d.ts.map +1 -0
  314. package/providers/nodemailer.js +34 -0
  315. package/providers/notion.d.ts +99 -0
  316. package/providers/notion.d.ts.map +1 -0
  317. package/providers/notion.js +110 -0
  318. package/providers/oauth.d.ts +188 -0
  319. package/providers/oauth.d.ts.map +1 -0
  320. package/providers/oauth.js +1 -0
  321. package/providers/okta.d.ts +99 -0
  322. package/providers/okta.d.ts.map +1 -0
  323. package/providers/okta.js +63 -0
  324. package/providers/onelogin.d.ts +65 -0
  325. package/providers/onelogin.d.ts.map +1 -0
  326. package/providers/onelogin.js +61 -0
  327. package/providers/ory-hydra.d.ts +79 -0
  328. package/providers/ory-hydra.d.ts.map +1 -0
  329. package/providers/ory-hydra.js +67 -0
  330. package/providers/osso.d.ts +79 -0
  331. package/providers/osso.d.ts.map +1 -0
  332. package/providers/osso.js +77 -0
  333. package/providers/osu.d.ts +116 -0
  334. package/providers/osu.d.ts.map +1 -0
  335. package/providers/osu.js +75 -0
  336. package/providers/passage.d.ts +88 -0
  337. package/providers/passage.d.ts.map +1 -0
  338. package/providers/passage.js +75 -0
  339. package/providers/passkey.d.ts +65 -0
  340. package/providers/passkey.d.ts.map +1 -0
  341. package/providers/passkey.js +87 -0
  342. package/providers/patreon.d.ts +73 -0
  343. package/providers/patreon.d.ts.map +1 -0
  344. package/providers/patreon.js +77 -0
  345. package/providers/ping-id.d.ts +57 -0
  346. package/providers/ping-id.d.ts.map +1 -0
  347. package/providers/ping-id.js +40 -0
  348. package/providers/pinterest.d.ts +79 -0
  349. package/providers/pinterest.d.ts.map +1 -0
  350. package/providers/pinterest.js +85 -0
  351. package/providers/pipedrive.d.ts +99 -0
  352. package/providers/pipedrive.d.ts.map +1 -0
  353. package/providers/pipedrive.js +71 -0
  354. package/providers/postmark.d.ts +4 -0
  355. package/providers/postmark.d.ts.map +1 -0
  356. package/providers/postmark.js +36 -0
  357. package/providers/provider-types.d.ts +3 -0
  358. package/providers/provider-types.d.ts.map +1 -0
  359. package/providers/provider-types.js +1 -0
  360. package/providers/reddit.d.ts +88 -0
  361. package/providers/reddit.d.ts.map +1 -0
  362. package/providers/reddit.js +90 -0
  363. package/providers/resend.d.ts +4 -0
  364. package/providers/resend.d.ts.map +1 -0
  365. package/providers/resend.js +32 -0
  366. package/providers/roblox.d.ts +67 -0
  367. package/providers/roblox.d.ts.map +1 -0
  368. package/providers/roblox.js +53 -0
  369. package/providers/salesforce.d.ts +59 -0
  370. package/providers/salesforce.d.ts.map +1 -0
  371. package/providers/salesforce.js +52 -0
  372. package/providers/sendgrid.d.ts +4 -0
  373. package/providers/sendgrid.d.ts.map +1 -0
  374. package/providers/sendgrid.js +35 -0
  375. package/providers/simplelogin.d.ts +87 -0
  376. package/providers/simplelogin.d.ts.map +1 -0
  377. package/providers/simplelogin.js +83 -0
  378. package/providers/slack.d.ts +102 -0
  379. package/providers/slack.d.ts.map +1 -0
  380. package/providers/slack.js +69 -0
  381. package/providers/spotify.d.ts +75 -0
  382. package/providers/spotify.d.ts.map +1 -0
  383. package/providers/spotify.js +73 -0
  384. package/providers/strava.d.ts +68 -0
  385. package/providers/strava.d.ts.map +1 -0
  386. package/providers/strava.js +80 -0
  387. package/providers/threads.d.ts +108 -0
  388. package/providers/threads.d.ts.map +1 -0
  389. package/providers/threads.js +89 -0
  390. package/providers/tiktok.d.ts +248 -0
  391. package/providers/tiktok.d.ts.map +1 -0
  392. package/providers/tiktok.js +195 -0
  393. package/providers/todoist.d.ts +76 -0
  394. package/providers/todoist.d.ts.map +1 -0
  395. package/providers/todoist.js +97 -0
  396. package/providers/trakt.d.ts +93 -0
  397. package/providers/trakt.d.ts.map +1 -0
  398. package/providers/trakt.js +91 -0
  399. package/providers/twitch.d.ts +71 -0
  400. package/providers/twitch.d.ts.map +1 -0
  401. package/providers/twitch.js +96 -0
  402. package/providers/twitter.d.ts +183 -0
  403. package/providers/twitter.d.ts.map +1 -0
  404. package/providers/twitter.js +100 -0
  405. package/providers/united-effects.d.ts +80 -0
  406. package/providers/united-effects.d.ts.map +1 -0
  407. package/providers/united-effects.js +72 -0
  408. package/providers/vipps.d.ts +71 -0
  409. package/providers/vipps.d.ts.map +1 -0
  410. package/providers/vipps.js +33 -0
  411. package/providers/vk.d.ts +334 -0
  412. package/providers/vk.d.ts.map +1 -0
  413. package/providers/vk.js +103 -0
  414. package/providers/webauthn.d.ts +148 -0
  415. package/providers/webauthn.d.ts.map +1 -0
  416. package/providers/webauthn.js +128 -0
  417. package/providers/webex.d.ts +78 -0
  418. package/providers/webex.d.ts.map +1 -0
  419. package/providers/webex.js +73 -0
  420. package/providers/wechat.d.ts +78 -0
  421. package/providers/wechat.d.ts.map +1 -0
  422. package/providers/wechat.js +105 -0
  423. package/providers/wikimedia.d.ts +99 -0
  424. package/providers/wikimedia.d.ts.map +1 -0
  425. package/providers/wikimedia.js +90 -0
  426. package/providers/wordpress.d.ts +65 -0
  427. package/providers/wordpress.d.ts.map +1 -0
  428. package/providers/wordpress.js +71 -0
  429. package/providers/workos.d.ts +154 -0
  430. package/providers/workos.d.ts.map +1 -0
  431. package/providers/workos.js +143 -0
  432. package/providers/yandex.d.ts +131 -0
  433. package/providers/yandex.d.ts.map +1 -0
  434. package/providers/yandex.js +80 -0
  435. package/providers/zitadel.d.ts +117 -0
  436. package/providers/zitadel.d.ts.map +1 -0
  437. package/providers/zitadel.js +95 -0
  438. package/providers/zoho.d.ts +63 -0
  439. package/providers/zoho.d.ts.map +1 -0
  440. package/providers/zoho.js +79 -0
  441. package/providers/zoom.d.ts +93 -0
  442. package/providers/zoom.d.ts.map +1 -0
  443. package/providers/zoom.js +82 -0
  444. package/src/adapters/server-actions-helpers.ts +126 -0
  445. package/src/adapters.ts +603 -0
  446. package/src/errors.ts +551 -0
  447. package/src/index.ts +689 -0
  448. package/src/jwt.ts +283 -0
  449. package/src/lib/actions/callback/handle-login.ts +334 -0
  450. package/src/lib/actions/callback/index.ts +554 -0
  451. package/src/lib/actions/callback/oauth/callback.ts +347 -0
  452. package/src/lib/actions/callback/oauth/checks.ts +258 -0
  453. package/src/lib/actions/callback/oauth/csrf-token.ts +60 -0
  454. package/src/lib/actions/index.ts +5 -0
  455. package/src/lib/actions/session.ts +167 -0
  456. package/src/lib/actions/signin/authorization-url.ts +123 -0
  457. package/src/lib/actions/signin/index.ts +37 -0
  458. package/src/lib/actions/signin/send-token.ts +124 -0
  459. package/src/lib/actions/signout.ts +38 -0
  460. package/src/lib/actions/webauthn-options.ts +100 -0
  461. package/src/lib/index.ts +97 -0
  462. package/src/lib/init.ts +236 -0
  463. package/src/lib/pages/error.tsx +106 -0
  464. package/src/lib/pages/index.ts +181 -0
  465. package/src/lib/pages/signin.tsx +255 -0
  466. package/src/lib/pages/signout.tsx +49 -0
  467. package/src/lib/pages/styles.css +377 -0
  468. package/src/lib/pages/styles.ts +381 -0
  469. package/src/lib/pages/verify-request.tsx +36 -0
  470. package/src/lib/symbols.ts +60 -0
  471. package/src/lib/utils/actions.ts +17 -0
  472. package/src/lib/utils/assert.ts +259 -0
  473. package/src/lib/utils/callback-url.ts +42 -0
  474. package/src/lib/utils/cookie.ts +248 -0
  475. package/src/lib/utils/date.ts +8 -0
  476. package/src/lib/utils/email.ts +65 -0
  477. package/src/lib/utils/env.ts +113 -0
  478. package/src/lib/utils/logger.ts +75 -0
  479. package/src/lib/utils/merge.ts +30 -0
  480. package/src/lib/utils/providers.ts +203 -0
  481. package/src/lib/utils/session.ts +41 -0
  482. package/src/lib/utils/web.ts +151 -0
  483. package/src/lib/utils/webauthn-client.js +229 -0
  484. package/src/lib/utils/webauthn-utils.ts +531 -0
  485. package/src/lib/vendored/cookie.ts +383 -0
  486. package/src/providers/42-school.ts +256 -0
  487. package/src/providers/apple.ts +206 -0
  488. package/src/providers/asgardeo.ts +118 -0
  489. package/src/providers/atlassian.ts +120 -0
  490. package/src/providers/auth0.ts +127 -0
  491. package/src/providers/authentik.ts +100 -0
  492. package/src/providers/azure-ad-b2c.ts +124 -0
  493. package/src/providers/azure-ad.ts +30 -0
  494. package/src/providers/azure-devops.ts +184 -0
  495. package/src/providers/bankid-no.ts +161 -0
  496. package/src/providers/battlenet.ts +107 -0
  497. package/src/providers/beyondidentity.ts +102 -0
  498. package/src/providers/bitbucket.ts +122 -0
  499. package/src/providers/box.ts +87 -0
  500. package/src/providers/boxyhq-saml.ts +148 -0
  501. package/src/providers/bungie.ts +192 -0
  502. package/src/providers/click-up.ts +104 -0
  503. package/src/providers/cognito.ts +94 -0
  504. package/src/providers/coinbase.ts +93 -0
  505. package/src/providers/concept2.ts +108 -0
  506. package/src/providers/credentials.ts +157 -0
  507. package/src/providers/descope.ts +105 -0
  508. package/src/providers/discord.ts +176 -0
  509. package/src/providers/dribbble.ts +122 -0
  510. package/src/providers/dropbox.ts +102 -0
  511. package/src/providers/duende-identity-server6.ts +101 -0
  512. package/src/providers/email.ts +60 -0
  513. package/src/providers/eventbrite.ts +105 -0
  514. package/src/providers/eveonline.ts +117 -0
  515. package/src/providers/facebook.ts +119 -0
  516. package/src/providers/faceit.ts +90 -0
  517. package/src/providers/figma.ts +105 -0
  518. package/src/providers/forwardemail.ts +37 -0
  519. package/src/providers/foursquare.ts +105 -0
  520. package/src/providers/freshbooks.ts +90 -0
  521. package/src/providers/frontegg.ts +111 -0
  522. package/src/providers/fusionauth.ts +336 -0
  523. package/src/providers/github.ts +187 -0
  524. package/src/providers/gitlab.ts +140 -0
  525. package/src/providers/google.ts +152 -0
  526. package/src/providers/hubspot.ts +117 -0
  527. package/src/providers/huggingface.ts +234 -0
  528. package/src/providers/identity-server4.ts +78 -0
  529. package/src/providers/index.ts +115 -0
  530. package/src/providers/instagram.ts +103 -0
  531. package/src/providers/kakao.ts +184 -0
  532. package/src/providers/keycloak.ts +111 -0
  533. package/src/providers/kinde.ts +85 -0
  534. package/src/providers/line.ts +99 -0
  535. package/src/providers/linkedin.ts +91 -0
  536. package/src/providers/logto.ts +122 -0
  537. package/src/providers/loops.ts +79 -0
  538. package/src/providers/mailchimp.ts +90 -0
  539. package/src/providers/mailgun.ts +98 -0
  540. package/src/providers/mailru.ts +75 -0
  541. package/src/providers/mastodon.ts +112 -0
  542. package/src/providers/mattermost.ts +154 -0
  543. package/src/providers/medium.ts +89 -0
  544. package/src/providers/microsoft-entra-id.ts +497 -0
  545. package/src/providers/naver.ts +102 -0
  546. package/src/providers/netlify.ts +90 -0
  547. package/src/providers/netsuite.ts +225 -0
  548. package/src/providers/nextcloud.ts +207 -0
  549. package/src/providers/nodemailer.ts +84 -0
  550. package/src/providers/notion.ts +166 -0
  551. package/src/providers/oauth.ts +310 -0
  552. package/src/providers/okta.ts +111 -0
  553. package/src/providers/onelogin.ts +75 -0
  554. package/src/providers/ory-hydra.ts +93 -0
  555. package/src/providers/osso.ts +91 -0
  556. package/src/providers/osu.ts +138 -0
  557. package/src/providers/passage.ts +103 -0
  558. package/src/providers/passkey.ts +94 -0
  559. package/src/providers/patreon.ts +98 -0
  560. package/src/providers/ping-id.ts +68 -0
  561. package/src/providers/pinterest.ts +106 -0
  562. package/src/providers/pipedrive.ts +120 -0
  563. package/src/providers/postmark.ts +38 -0
  564. package/src/providers/provider-types.ts +107 -0
  565. package/src/providers/reddit.ts +104 -0
  566. package/src/providers/resend.ts +35 -0
  567. package/src/providers/roblox.ts +94 -0
  568. package/src/providers/salesforce.ts +73 -0
  569. package/src/providers/sendgrid.ts +36 -0
  570. package/src/providers/simplelogin.ts +107 -0
  571. package/src/providers/slack.ts +115 -0
  572. package/src/providers/spotify.ts +99 -0
  573. package/src/providers/strava.ts +101 -0
  574. package/src/providers/threads.ts +135 -0
  575. package/src/providers/tiktok.ts +319 -0
  576. package/src/providers/todoist.ts +122 -0
  577. package/src/providers/trakt.ts +120 -0
  578. package/src/providers/twitch.ts +121 -0
  579. package/src/providers/twitter.ts +207 -0
  580. package/src/providers/united-effects.ts +89 -0
  581. package/src/providers/vipps.ts +86 -0
  582. package/src/providers/vk.ts +401 -0
  583. package/src/providers/webauthn.ts +296 -0
  584. package/src/providers/webex.ts +102 -0
  585. package/src/providers/wechat.ts +141 -0
  586. package/src/providers/wikimedia.ts +258 -0
  587. package/src/providers/wordpress.ts +86 -0
  588. package/src/providers/workos.ts +180 -0
  589. package/src/providers/yandex.ts +159 -0
  590. package/src/providers/zitadel.ts +128 -0
  591. package/src/providers/zoho.ts +84 -0
  592. package/src/providers/zoom.ts +119 -0
  593. package/src/types.ts +430 -0
  594. package/src/warnings.ts +21 -0
  595. package/types.d.ts +309 -0
  596. package/types.d.ts.map +1 -0
  597. package/types.js +53 -0
  598. package/warnings.d.ts +17 -0
  599. package/warnings.d.ts.map +1 -0
  600. package/warnings.js +1 -0
@@ -0,0 +1,259 @@
1
+ import { defaultCookies } from "./cookie.js"
2
+ import {
3
+ AuthError,
4
+ DuplicateConditionalUI,
5
+ ExperimentalFeatureNotEnabled,
6
+ InvalidCallbackUrl,
7
+ InvalidEndpoints,
8
+ MissingAdapter,
9
+ MissingAdapterMethods,
10
+ MissingAuthorize,
11
+ MissingSecret,
12
+ MissingWebAuthnAutocomplete,
13
+ UnsupportedStrategy,
14
+ UntrustedHost,
15
+ } from "../../errors.js"
16
+
17
+ import type { RequestInternal, SemverString } from "../../types.js"
18
+ import type { WarningCode } from "../../warnings.js"
19
+ import { Adapter } from "../../adapters.js"
20
+ import type { AuthConfig } from "../../index.js"
21
+ import { createServerActionsAdapter } from "../../adapters/server-actions-helpers.js"
22
+
23
+ type ConfigError =
24
+ | InvalidCallbackUrl
25
+ | InvalidEndpoints
26
+ | MissingAdapter
27
+ | MissingAdapterMethods
28
+ | MissingAuthorize
29
+ | MissingSecret
30
+ | UnsupportedStrategy
31
+
32
+ let warned = false
33
+
34
+ function isValidHttpUrl(url: string, baseUrl: string) {
35
+ try {
36
+ return /^https?:/.test(
37
+ new URL(url, url.startsWith("/") ? baseUrl : undefined).protocol
38
+ )
39
+ } catch {
40
+ return false
41
+ }
42
+ }
43
+
44
+ function isSemverString(version: string): version is SemverString {
45
+ return /^v\d+(?:\.\d+){0,2}$/.test(version)
46
+ }
47
+
48
+ let hasCredentials = false
49
+ let hasEmail = false
50
+ let hasWebAuthn = false
51
+
52
+ const emailMethods: (keyof Adapter)[] = [
53
+ "createVerificationToken",
54
+ "useVerificationToken",
55
+ "getUserByEmail",
56
+ ]
57
+
58
+ const sessionMethods: (keyof Adapter)[] = [
59
+ "createUser",
60
+ "getUser",
61
+ "getUserByEmail",
62
+ "getUserByAccount",
63
+ "updateUser",
64
+ "linkAccount",
65
+ "createSession",
66
+ "getSessionAndUser",
67
+ "updateSession",
68
+ "deleteSession",
69
+ ]
70
+
71
+ const webauthnMethods: (keyof Adapter)[] = [
72
+ "createUser",
73
+ "getUser",
74
+ "linkAccount",
75
+ "getAccount",
76
+ "getAuthenticator",
77
+ "createAuthenticator",
78
+ "listAuthenticatorsByUserId",
79
+ "updateAuthenticatorCounter",
80
+ ]
81
+
82
+ /**
83
+ * Verify that the user configured Auth.js correctly.
84
+ * Good place to mention deprecations as well.
85
+ *
86
+ * This is invoked before the init method, so default values are not available yet.
87
+ */
88
+ export function assertConfig(
89
+ request: RequestInternal,
90
+ options: AuthConfig
91
+ ): ConfigError | WarningCode[] {
92
+ const { url } = request
93
+ const warnings: WarningCode[] = []
94
+
95
+ if (!warned && options.debug) warnings.push("debug-enabled")
96
+
97
+ if (!options.trustHost) {
98
+ return new UntrustedHost(`Host must be trusted. URL was: ${request.url}`)
99
+ }
100
+
101
+ if (!options.secret?.length) {
102
+ return new MissingSecret("Please define a `secret`")
103
+ }
104
+
105
+ const callbackUrlParam = request.query?.callbackUrl as string | undefined
106
+
107
+ if (callbackUrlParam && !isValidHttpUrl(callbackUrlParam, url.origin)) {
108
+ return new InvalidCallbackUrl(
109
+ `Invalid callback URL. Received: ${callbackUrlParam}`
110
+ )
111
+ }
112
+
113
+ const { callbackUrl: defaultCallbackUrl } = defaultCookies(
114
+ options.useSecureCookies ?? url.protocol === "https:"
115
+ )
116
+ const callbackUrlCookie =
117
+ request.cookies?.[
118
+ options.cookies?.callbackUrl?.name ?? defaultCallbackUrl.name
119
+ ]
120
+
121
+ if (callbackUrlCookie && !isValidHttpUrl(callbackUrlCookie, url.origin)) {
122
+ return new InvalidCallbackUrl(
123
+ `Invalid callback URL. Received: ${callbackUrlCookie}`
124
+ )
125
+ }
126
+
127
+ // Keep track of webauthn providers that use conditional UI
128
+ let hasConditionalUIProvider = false
129
+
130
+ for (const p of options.providers) {
131
+ const provider = typeof p === "function" ? p() : p
132
+ if (
133
+ (provider.type === "oauth" || provider.type === "oidc") &&
134
+ !(provider.issuer ?? provider.options?.issuer)
135
+ ) {
136
+ const { authorization: a, token: t, userinfo: u } = provider
137
+
138
+ let key
139
+ if (typeof a !== "string" && !a?.url) key = "authorization"
140
+ else if (typeof t !== "string" && !t?.url) key = "token"
141
+ else if (typeof u !== "string" && !u?.url) key = "userinfo"
142
+
143
+ if (key) {
144
+ return new InvalidEndpoints(
145
+ `Provider "${provider.id}" is missing both \`issuer\` and \`${key}\` endpoint config. At least one of them is required`
146
+ )
147
+ }
148
+ }
149
+
150
+ if (provider.type === "credentials") hasCredentials = true
151
+ else if (provider.type === "email") hasEmail = true
152
+ else if (provider.type === "webauthn") {
153
+ hasWebAuthn = true
154
+
155
+ // Validate simpleWebAuthnBrowserVersion
156
+ if (
157
+ provider.simpleWebAuthnBrowserVersion &&
158
+ !isSemverString(provider.simpleWebAuthnBrowserVersion)
159
+ ) {
160
+ return new AuthError(
161
+ `Invalid provider config for "${provider.id}": simpleWebAuthnBrowserVersion "${provider.simpleWebAuthnBrowserVersion}" must be a valid semver string.`
162
+ )
163
+ }
164
+
165
+ if (provider.enableConditionalUI) {
166
+ // Make sure only one webauthn provider has "enableConditionalUI" set to true
167
+ if (hasConditionalUIProvider) {
168
+ return new DuplicateConditionalUI(
169
+ `Multiple webauthn providers have 'enableConditionalUI' set to True. Only one provider can have this option enabled at a time`
170
+ )
171
+ }
172
+ hasConditionalUIProvider = true
173
+
174
+ // Make sure at least one formField has "webauthn" in its autocomplete param
175
+ const hasWebauthnFormField = Object.values(provider.formFields).some(
176
+ (f) =>
177
+ f.autocomplete && f.autocomplete.toString().indexOf("webauthn") > -1
178
+ )
179
+ if (!hasWebauthnFormField) {
180
+ return new MissingWebAuthnAutocomplete(
181
+ `Provider "${provider.id}" has 'enableConditionalUI' set to True, but none of its formFields have 'webauthn' in their autocomplete param`
182
+ )
183
+ }
184
+ }
185
+ }
186
+ }
187
+
188
+ if (hasCredentials) {
189
+ const dbStrategy = options.session?.strategy === "database"
190
+ const onlyCredentials = !options.providers.some(
191
+ (p) => (typeof p === "function" ? p() : p).type !== "credentials"
192
+ )
193
+ if (dbStrategy && onlyCredentials) {
194
+ return new UnsupportedStrategy(
195
+ "Signing in with credentials only supported if JWT strategy is enabled"
196
+ )
197
+ }
198
+
199
+ const credentialsNoAuthorize = options.providers.some((p) => {
200
+ const provider = typeof p === "function" ? p() : p
201
+ return provider.type === "credentials" && !provider.authorize
202
+ })
203
+ if (credentialsNoAuthorize) {
204
+ return new MissingAuthorize(
205
+ "Must define an authorize() handler to use credentials authentication provider"
206
+ )
207
+ }
208
+ }
209
+
210
+ const { adapter, serverActions, session } = options
211
+
212
+ // Convert serverActions to adapter if provided and no adapter exists
213
+ const effectiveAdapter = adapter || (serverActions ? createServerActionsAdapter(serverActions) : undefined)
214
+
215
+ const requiredMethods: (keyof Adapter)[] = []
216
+
217
+ if (
218
+ hasEmail ||
219
+ session?.strategy === "database" ||
220
+ (!session?.strategy && effectiveAdapter)
221
+ ) {
222
+ if (hasEmail) {
223
+ if (!effectiveAdapter) return new MissingAdapter("Email login requires an adapter or serverActions")
224
+ requiredMethods.push(...emailMethods)
225
+ } else {
226
+ if (!effectiveAdapter)
227
+ return new MissingAdapter("Database session requires an adapter or serverActions")
228
+ requiredMethods.push(...sessionMethods)
229
+ }
230
+ }
231
+
232
+ if (hasWebAuthn) {
233
+ // Log experimental warning
234
+ if (options.experimental?.enableWebAuthn) {
235
+ warnings.push("experimental-webauthn")
236
+ } else {
237
+ return new ExperimentalFeatureNotEnabled(
238
+ "WebAuthn is an experimental feature. To enable it, set `experimental.enableWebAuthn` to `true` in your config"
239
+ )
240
+ }
241
+
242
+ if (!effectiveAdapter) return new MissingAdapter("WebAuthn requires an adapter or serverActions")
243
+ requiredMethods.push(...webauthnMethods)
244
+ }
245
+
246
+ if (effectiveAdapter) {
247
+ const missing = requiredMethods.filter((m) => !(m in effectiveAdapter))
248
+
249
+ if (missing.length) {
250
+ return new MissingAdapterMethods(
251
+ `Required adapter methods were missing: ${missing.join(", ")}`
252
+ )
253
+ }
254
+ }
255
+
256
+ if (!warned) warned = true
257
+
258
+ return warnings
259
+ }
@@ -0,0 +1,42 @@
1
+ import type { InternalOptions } from "../../types.js"
2
+
3
+ interface CreateCallbackUrlParams {
4
+ options: InternalOptions
5
+ /** Try reading value from request body (POST) then from query param (GET) */
6
+ paramValue?: string
7
+ cookieValue?: string
8
+ }
9
+
10
+ /**
11
+ * Get callback URL based on query param / cookie + validation,
12
+ * and add it to `req.options.callbackUrl`.
13
+ */
14
+ export async function createCallbackUrl({
15
+ options,
16
+ paramValue,
17
+ cookieValue,
18
+ }: CreateCallbackUrlParams) {
19
+ const { url, callbacks } = options
20
+
21
+ let callbackUrl = url.origin
22
+
23
+ if (paramValue) {
24
+ // If callbackUrl form field or query parameter is passed try to use it if allowed
25
+ callbackUrl = await callbacks.redirect({
26
+ url: paramValue,
27
+ baseUrl: url.origin,
28
+ })
29
+ } else if (cookieValue) {
30
+ // If no callbackUrl specified, try using the value from the cookie if allowed
31
+ callbackUrl = await callbacks.redirect({
32
+ url: cookieValue,
33
+ baseUrl: url.origin,
34
+ })
35
+ }
36
+
37
+ return {
38
+ callbackUrl,
39
+ // Save callback URL in a cookie so that it can be used for subsequent requests in signin/signout/callback flow
40
+ callbackUrlCookie: callbackUrl !== cookieValue ? callbackUrl : undefined,
41
+ }
42
+ }
@@ -0,0 +1,248 @@
1
+ import type {
2
+ CookieOption,
3
+ CookiesOptions,
4
+ LoggerInstance,
5
+ RequestInternal,
6
+ } from "../../types.js"
7
+
8
+ // Uncomment to recalculate the estimated size
9
+ // of an empty session cookie
10
+ // import * as cookie from "../vendored/cookie.js"
11
+ // const { serialize } = cookie
12
+ // console.log(
13
+ // "Cookie estimated to be ",
14
+ // serialize(`__Secure.authjs.session-token.0`, "", {
15
+ // expires: new Date(),
16
+ // httpOnly: true,
17
+ // maxAge: Number.MAX_SAFE_INTEGER,
18
+ // path: "/",
19
+ // sameSite: "strict",
20
+ // secure: true,
21
+ // domain: "example.com",
22
+ // }).length,
23
+ // " bytes"
24
+ // )
25
+
26
+ const ALLOWED_COOKIE_SIZE = 4096
27
+ // Based on commented out section above
28
+ const ESTIMATED_EMPTY_COOKIE_SIZE = 160
29
+ const CHUNK_SIZE = ALLOWED_COOKIE_SIZE - ESTIMATED_EMPTY_COOKIE_SIZE
30
+
31
+ // REVIEW: Is there any way to defer two types of strings?
32
+
33
+ /** Stringified form of `JWT`. Extract the content with `jwt.decode` */
34
+ export type JWTString = string
35
+
36
+ export type SetCookieOptions = Partial<CookieOption["options"]> & {
37
+ expires?: Date | string
38
+ encode?: (val: unknown) => string
39
+ }
40
+
41
+ /**
42
+ * If `options.session.strategy` is set to `jwt`, this is a stringified `JWT`.
43
+ * In case of `strategy: "database"`, this is the `sessionToken` of the session in the database.
44
+ */
45
+ export type SessionToken<T extends "jwt" | "database" = "jwt"> = T extends "jwt"
46
+ ? JWTString
47
+ : string
48
+
49
+ /**
50
+ * Use secure cookies if the site uses HTTPS
51
+ * This being conditional allows cookies to work non-HTTPS development URLs
52
+ * Honour secure cookie option, which sets 'secure' and also adds '__Secure-'
53
+ * prefix, but enable them by default if the site URL is HTTPS; but not for
54
+ * non-HTTPS URLs like http://localhost which are used in development).
55
+ * For more on prefixes see https://googlechrome.github.io/samples/cookie-prefixes/
56
+ *
57
+ * @TODO Review cookie settings (names, options)
58
+ */
59
+ export function defaultCookies(useSecureCookies: boolean) {
60
+ const cookiePrefix = useSecureCookies ? "__Secure-" : ""
61
+ return {
62
+ // default cookie options
63
+ sessionToken: {
64
+ name: `${cookiePrefix}authjs.session-token`,
65
+ options: {
66
+ httpOnly: true,
67
+ sameSite: "lax",
68
+ path: "/",
69
+ secure: useSecureCookies,
70
+ },
71
+ },
72
+ callbackUrl: {
73
+ name: `${cookiePrefix}authjs.callback-url`,
74
+ options: {
75
+ httpOnly: true,
76
+ sameSite: "lax",
77
+ path: "/",
78
+ secure: useSecureCookies,
79
+ },
80
+ },
81
+ csrfToken: {
82
+ // Default to __Host- for CSRF token for additional protection if using useSecureCookies
83
+ // NB: The `__Host-` prefix is stricter than the `__Secure-` prefix.
84
+ name: `${useSecureCookies ? "__Host-" : ""}authjs.csrf-token`,
85
+ options: {
86
+ httpOnly: true,
87
+ sameSite: "lax",
88
+ path: "/",
89
+ secure: useSecureCookies,
90
+ },
91
+ },
92
+ pkceCodeVerifier: {
93
+ name: `${cookiePrefix}authjs.pkce.code_verifier`,
94
+ options: {
95
+ httpOnly: true,
96
+ sameSite: "lax",
97
+ path: "/",
98
+ secure: useSecureCookies,
99
+ maxAge: 60 * 15, // 15 minutes in seconds
100
+ },
101
+ },
102
+ state: {
103
+ name: `${cookiePrefix}authjs.state`,
104
+ options: {
105
+ httpOnly: true,
106
+ sameSite: "lax",
107
+ path: "/",
108
+ secure: useSecureCookies,
109
+ maxAge: 60 * 15, // 15 minutes in seconds
110
+ },
111
+ },
112
+ nonce: {
113
+ name: `${cookiePrefix}authjs.nonce`,
114
+ options: {
115
+ httpOnly: true,
116
+ sameSite: "lax",
117
+ path: "/",
118
+ secure: useSecureCookies,
119
+ },
120
+ },
121
+ webauthnChallenge: {
122
+ name: `${cookiePrefix}authjs.challenge`,
123
+ options: {
124
+ httpOnly: true,
125
+ sameSite: "lax",
126
+ path: "/",
127
+ secure: useSecureCookies,
128
+ maxAge: 60 * 15, // 15 minutes in seconds
129
+ },
130
+ },
131
+ } as const satisfies CookiesOptions
132
+ }
133
+
134
+ export interface Cookie extends CookieOption {
135
+ value: string
136
+ }
137
+
138
+ type Chunks = Record<string, string>
139
+
140
+ export class SessionStore {
141
+ #chunks: Chunks = {}
142
+ #option: CookieOption
143
+ #logger: LoggerInstance | Console
144
+
145
+ constructor(
146
+ option: CookieOption,
147
+ cookies: RequestInternal["cookies"],
148
+ logger: LoggerInstance | Console
149
+ ) {
150
+ this.#logger = logger
151
+ this.#option = option
152
+ if (!cookies) return
153
+
154
+ const { name: sessionCookiePrefix } = option
155
+
156
+ for (const [name, value] of Object.entries(cookies)) {
157
+ if (!name.startsWith(sessionCookiePrefix) || !value) continue
158
+ this.#chunks[name] = value
159
+ }
160
+ }
161
+
162
+ /**
163
+ * The JWT Session or database Session ID
164
+ * constructed from the cookie chunks.
165
+ */
166
+ get value() {
167
+ // Sort the chunks by their keys before joining
168
+ const sortedKeys = Object.keys(this.#chunks).sort((a, b) => {
169
+ const aSuffix = parseInt(a.split(".").pop() || "0")
170
+ const bSuffix = parseInt(b.split(".").pop() || "0")
171
+
172
+ return aSuffix - bSuffix
173
+ })
174
+
175
+ // Use the sorted keys to join the chunks in the correct order
176
+ return sortedKeys.map((key) => this.#chunks[key]).join("")
177
+ }
178
+
179
+ /** Given a cookie, return a list of cookies, chunked to fit the allowed cookie size. */
180
+ #chunk(cookie: Cookie): Cookie[] {
181
+ const chunkCount = Math.ceil(cookie.value.length / CHUNK_SIZE)
182
+
183
+ if (chunkCount === 1) {
184
+ this.#chunks[cookie.name] = cookie.value
185
+ return [cookie]
186
+ }
187
+
188
+ const cookies: Cookie[] = []
189
+ for (let i = 0; i < chunkCount; i++) {
190
+ const name = `${cookie.name}.${i}`
191
+ const value = cookie.value.substr(i * CHUNK_SIZE, CHUNK_SIZE)
192
+ cookies.push({ ...cookie, name, value })
193
+ this.#chunks[name] = value
194
+ }
195
+
196
+ this.#logger.debug("CHUNKING_SESSION_COOKIE", {
197
+ message: `Session cookie exceeds allowed ${ALLOWED_COOKIE_SIZE} bytes.`,
198
+ emptyCookieSize: ESTIMATED_EMPTY_COOKIE_SIZE,
199
+ valueSize: cookie.value.length,
200
+ chunks: cookies.map((c) => c.value.length + ESTIMATED_EMPTY_COOKIE_SIZE),
201
+ })
202
+
203
+ return cookies
204
+ }
205
+
206
+ /** Returns cleaned cookie chunks. */
207
+ #clean(): Record<string, Cookie> {
208
+ const cleanedChunks: Record<string, Cookie> = {}
209
+ for (const name in this.#chunks) {
210
+ delete this.#chunks?.[name]
211
+ cleanedChunks[name] = {
212
+ name,
213
+ value: "",
214
+ options: { ...this.#option.options, maxAge: 0 },
215
+ }
216
+ }
217
+ return cleanedChunks
218
+ }
219
+
220
+ /**
221
+ * Given a cookie value, return new cookies, chunked, to fit the allowed cookie size.
222
+ * If the cookie has changed from chunked to unchunked or vice versa,
223
+ * it deletes the old cookies as well.
224
+ */
225
+ chunk(value: string, options: Partial<Cookie["options"]>): Cookie[] {
226
+ // Assume all cookies should be cleaned by default
227
+ const cookies: Record<string, Cookie> = this.#clean()
228
+
229
+ // Calculate new chunks
230
+ const chunked = this.#chunk({
231
+ name: this.#option.name,
232
+ value,
233
+ options: { ...this.#option.options, ...options },
234
+ })
235
+
236
+ // Update stored chunks / cookies
237
+ for (const chunk of chunked) {
238
+ cookies[chunk.name] = chunk
239
+ }
240
+
241
+ return Object.values(cookies)
242
+ }
243
+
244
+ /** Returns a list of cookies that should be cleaned. */
245
+ clean(): Cookie[] {
246
+ return Object.values(this.#clean())
247
+ }
248
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Takes a number in seconds and returns the date in the future.
3
+ * Optionally takes a second date parameter. In that case
4
+ * the date in the future will be calculated from that date instead of now.
5
+ */
6
+ export function fromDate(time: number, date = Date.now()) {
7
+ return new Date(date + time * 1000)
8
+ }
@@ -0,0 +1,65 @@
1
+ import type { Theme } from "../../types.js"
2
+
3
+ /**
4
+ * Email HTML body
5
+ * Insert invisible space into domains from being turned into a hyperlink by email
6
+ * clients like Outlook and Apple mail, as this is confusing because it seems
7
+ * like they are supposed to click on it to sign in.
8
+ *
9
+ * @note We don't add the email address to avoid needing to escape it, if you do, remember to sanitize it!
10
+ */
11
+ export function html(params: { url: string; host: string; theme: Theme }) {
12
+ const { url, host, theme } = params
13
+
14
+ const escapedHost = host.replace(/\./g, "&#8203;.")
15
+
16
+ const brandColor = theme.brandColor || "#346df1"
17
+
18
+ const buttonText = theme.buttonText || "#fff"
19
+
20
+ const color = {
21
+ background: "#f9f9f9",
22
+ text: "#444",
23
+ mainBackground: "#fff",
24
+ buttonBackground: brandColor,
25
+ buttonBorder: brandColor,
26
+ buttonText,
27
+ }
28
+
29
+ return `
30
+ <body style="background: ${color.background};">
31
+ <table width="100%" border="0" cellspacing="20" cellpadding="0"
32
+ style="background: ${color.mainBackground}; max-width: 600px; margin: auto; border-radius: 10px;">
33
+ <tr>
34
+ <td align="center"
35
+ style="padding: 10px 0px; font-size: 22px; font-family: Helvetica, Arial, sans-serif; color: ${color.text};">
36
+ Sign in to <strong>${escapedHost}</strong>
37
+ </td>
38
+ </tr>
39
+ <tr>
40
+ <td align="center" style="padding: 20px 0;">
41
+ <table border="0" cellspacing="0" cellpadding="0">
42
+ <tr>
43
+ <td align="center" style="border-radius: 5px;" bgcolor="${color.buttonBackground}"><a href="${url}"
44
+ target="_blank"
45
+ style="font-size: 18px; font-family: Helvetica, Arial, sans-serif; color: ${color.buttonText}; text-decoration: none; border-radius: 5px; padding: 10px 20px; border: 1px solid ${color.buttonBorder}; display: inline-block; font-weight: bold;">Sign
46
+ in</a></td>
47
+ </tr>
48
+ </table>
49
+ </td>
50
+ </tr>
51
+ <tr>
52
+ <td align="center"
53
+ style="padding: 0px 0px 10px 0px; font-size: 16px; line-height: 22px; font-family: Helvetica, Arial, sans-serif; color: ${color.text};">
54
+ If you did not request this email you can safely ignore it.
55
+ </td>
56
+ </tr>
57
+ </table>
58
+ </body>
59
+ `
60
+ }
61
+
62
+ /** Email Text body (fallback for email clients that don't render HTML, e.g. feature phones) */
63
+ export function text({ url, host }: { url: string; host: string }) {
64
+ return `Sign in to ${host}\n${url}\n\n`
65
+ }