mulguard 1.1.7 → 1.1.9

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 (546) hide show
  1. package/LICENSE +3 -3
  2. package/README.md +21 -582
  3. package/adapters.d.ts +2 -0
  4. package/adapters.d.ts.map +1 -0
  5. package/adapters.js +1 -0
  6. package/index.d.ts +329 -0
  7. package/index.d.ts.map +1 -0
  8. package/index.js +145 -0
  9. package/jwt.d.ts +9 -0
  10. package/jwt.d.ts.map +1 -0
  11. package/jwt.js +8 -0
  12. package/lib/actions.d.ts +13 -0
  13. package/lib/actions.d.ts.map +1 -0
  14. package/lib/actions.js +86 -0
  15. package/lib/client.d.ts +104 -0
  16. package/lib/client.d.ts.map +1 -0
  17. package/lib/client.js +95 -0
  18. package/lib/env.d.ts +12 -0
  19. package/lib/env.d.ts.map +1 -0
  20. package/lib/env.js +38 -0
  21. package/lib/index.d.ts +56 -0
  22. package/lib/index.d.ts.map +1 -0
  23. package/lib/index.js +187 -0
  24. package/lib/types.d.ts +24 -0
  25. package/lib/types.d.ts.map +1 -0
  26. package/lib/types.js +1 -0
  27. package/middleware.d.ts +9 -0
  28. package/middleware.d.ts.map +1 -0
  29. package/middleware.js +12 -0
  30. package/next.d.ts +9 -0
  31. package/next.d.ts.map +1 -0
  32. package/next.js +12 -0
  33. package/package.json +93 -102
  34. package/providers/42-school.d.ts +3 -0
  35. package/providers/42-school.d.ts.map +1 -0
  36. package/providers/42-school.js +2 -0
  37. package/providers/apple.d.ts +3 -0
  38. package/providers/apple.d.ts.map +1 -0
  39. package/providers/apple.js +2 -0
  40. package/providers/asgardeo.d.ts +3 -0
  41. package/providers/asgardeo.d.ts.map +1 -0
  42. package/providers/asgardeo.js +2 -0
  43. package/providers/atlassian.d.ts +3 -0
  44. package/providers/atlassian.d.ts.map +1 -0
  45. package/providers/atlassian.js +2 -0
  46. package/providers/auth0.d.ts +3 -0
  47. package/providers/auth0.d.ts.map +1 -0
  48. package/providers/auth0.js +2 -0
  49. package/providers/authentik.d.ts +3 -0
  50. package/providers/authentik.d.ts.map +1 -0
  51. package/providers/authentik.js +2 -0
  52. package/providers/azure-ad-b2c.d.ts +3 -0
  53. package/providers/azure-ad-b2c.d.ts.map +1 -0
  54. package/providers/azure-ad-b2c.js +2 -0
  55. package/providers/azure-ad.d.ts +3 -0
  56. package/providers/azure-ad.d.ts.map +1 -0
  57. package/providers/azure-ad.js +2 -0
  58. package/providers/azure-devops.d.ts +3 -0
  59. package/providers/azure-devops.d.ts.map +1 -0
  60. package/providers/azure-devops.js +2 -0
  61. package/providers/bankid-no.d.ts +3 -0
  62. package/providers/bankid-no.d.ts.map +1 -0
  63. package/providers/bankid-no.js +2 -0
  64. package/providers/battlenet.d.ts +3 -0
  65. package/providers/battlenet.d.ts.map +1 -0
  66. package/providers/battlenet.js +2 -0
  67. package/providers/beyondidentity.d.ts +3 -0
  68. package/providers/beyondidentity.d.ts.map +1 -0
  69. package/providers/beyondidentity.js +2 -0
  70. package/providers/bitbucket.d.ts +3 -0
  71. package/providers/bitbucket.d.ts.map +1 -0
  72. package/providers/bitbucket.js +2 -0
  73. package/providers/box.d.ts +3 -0
  74. package/providers/box.d.ts.map +1 -0
  75. package/providers/box.js +2 -0
  76. package/providers/boxyhq-saml.d.ts +3 -0
  77. package/providers/boxyhq-saml.d.ts.map +1 -0
  78. package/providers/boxyhq-saml.js +2 -0
  79. package/providers/bungie.d.ts +3 -0
  80. package/providers/bungie.d.ts.map +1 -0
  81. package/providers/bungie.js +2 -0
  82. package/providers/click-up.d.ts +3 -0
  83. package/providers/click-up.d.ts.map +1 -0
  84. package/providers/click-up.js +2 -0
  85. package/providers/cognito.d.ts +3 -0
  86. package/providers/cognito.d.ts.map +1 -0
  87. package/providers/cognito.js +2 -0
  88. package/providers/coinbase.d.ts +3 -0
  89. package/providers/coinbase.d.ts.map +1 -0
  90. package/providers/coinbase.js +2 -0
  91. package/providers/concept2.d.ts +3 -0
  92. package/providers/concept2.d.ts.map +1 -0
  93. package/providers/concept2.js +2 -0
  94. package/providers/credentials.d.ts +3 -0
  95. package/providers/credentials.d.ts.map +1 -0
  96. package/providers/credentials.js +2 -0
  97. package/providers/descope.d.ts +3 -0
  98. package/providers/descope.d.ts.map +1 -0
  99. package/providers/descope.js +2 -0
  100. package/providers/discord.d.ts +3 -0
  101. package/providers/discord.d.ts.map +1 -0
  102. package/providers/discord.js +2 -0
  103. package/providers/dribbble.d.ts +3 -0
  104. package/providers/dribbble.d.ts.map +1 -0
  105. package/providers/dribbble.js +2 -0
  106. package/providers/dropbox.d.ts +3 -0
  107. package/providers/dropbox.d.ts.map +1 -0
  108. package/providers/dropbox.js +2 -0
  109. package/providers/duende-identity-server6.d.ts +3 -0
  110. package/providers/duende-identity-server6.d.ts.map +1 -0
  111. package/providers/duende-identity-server6.js +2 -0
  112. package/providers/email.d.ts +3 -0
  113. package/providers/email.d.ts.map +1 -0
  114. package/providers/email.js +2 -0
  115. package/providers/eventbrite.d.ts +3 -0
  116. package/providers/eventbrite.d.ts.map +1 -0
  117. package/providers/eventbrite.js +2 -0
  118. package/providers/eveonline.d.ts +3 -0
  119. package/providers/eveonline.d.ts.map +1 -0
  120. package/providers/eveonline.js +2 -0
  121. package/providers/facebook.d.ts +3 -0
  122. package/providers/facebook.d.ts.map +1 -0
  123. package/providers/facebook.js +2 -0
  124. package/providers/faceit.d.ts +3 -0
  125. package/providers/faceit.d.ts.map +1 -0
  126. package/providers/faceit.js +2 -0
  127. package/providers/figma.d.ts +3 -0
  128. package/providers/figma.d.ts.map +1 -0
  129. package/providers/figma.js +2 -0
  130. package/providers/forwardemail.d.ts +3 -0
  131. package/providers/forwardemail.d.ts.map +1 -0
  132. package/providers/forwardemail.js +2 -0
  133. package/providers/foursquare.d.ts +3 -0
  134. package/providers/foursquare.d.ts.map +1 -0
  135. package/providers/foursquare.js +2 -0
  136. package/providers/freshbooks.d.ts +3 -0
  137. package/providers/freshbooks.d.ts.map +1 -0
  138. package/providers/freshbooks.js +2 -0
  139. package/providers/frontegg.d.ts +3 -0
  140. package/providers/frontegg.d.ts.map +1 -0
  141. package/providers/frontegg.js +2 -0
  142. package/providers/fusionauth.d.ts +3 -0
  143. package/providers/fusionauth.d.ts.map +1 -0
  144. package/providers/fusionauth.js +2 -0
  145. package/providers/github.d.ts +3 -0
  146. package/providers/github.d.ts.map +1 -0
  147. package/providers/github.js +2 -0
  148. package/providers/gitlab.d.ts +3 -0
  149. package/providers/gitlab.d.ts.map +1 -0
  150. package/providers/gitlab.js +2 -0
  151. package/providers/google.d.ts +3 -0
  152. package/providers/google.d.ts.map +1 -0
  153. package/providers/google.js +2 -0
  154. package/providers/hubspot.d.ts +3 -0
  155. package/providers/hubspot.d.ts.map +1 -0
  156. package/providers/hubspot.js +2 -0
  157. package/providers/huggingface.d.ts +3 -0
  158. package/providers/huggingface.d.ts.map +1 -0
  159. package/providers/huggingface.js +2 -0
  160. package/providers/identity-server4.d.ts +3 -0
  161. package/providers/identity-server4.d.ts.map +1 -0
  162. package/providers/identity-server4.js +2 -0
  163. package/providers/index.d.ts +2 -0
  164. package/providers/index.d.ts.map +1 -0
  165. package/providers/index.js +1 -0
  166. package/providers/instagram.d.ts +3 -0
  167. package/providers/instagram.d.ts.map +1 -0
  168. package/providers/instagram.js +2 -0
  169. package/providers/kakao.d.ts +3 -0
  170. package/providers/kakao.d.ts.map +1 -0
  171. package/providers/kakao.js +2 -0
  172. package/providers/keycloak.d.ts +3 -0
  173. package/providers/keycloak.d.ts.map +1 -0
  174. package/providers/keycloak.js +2 -0
  175. package/providers/kinde.d.ts +3 -0
  176. package/providers/kinde.d.ts.map +1 -0
  177. package/providers/kinde.js +2 -0
  178. package/providers/line.d.ts +3 -0
  179. package/providers/line.d.ts.map +1 -0
  180. package/providers/line.js +2 -0
  181. package/providers/linkedin.d.ts +3 -0
  182. package/providers/linkedin.d.ts.map +1 -0
  183. package/providers/linkedin.js +2 -0
  184. package/providers/logto.d.ts +3 -0
  185. package/providers/logto.d.ts.map +1 -0
  186. package/providers/logto.js +2 -0
  187. package/providers/loops.d.ts +3 -0
  188. package/providers/loops.d.ts.map +1 -0
  189. package/providers/loops.js +2 -0
  190. package/providers/mailchimp.d.ts +3 -0
  191. package/providers/mailchimp.d.ts.map +1 -0
  192. package/providers/mailchimp.js +2 -0
  193. package/providers/mailgun.d.ts +3 -0
  194. package/providers/mailgun.d.ts.map +1 -0
  195. package/providers/mailgun.js +2 -0
  196. package/providers/mailru.d.ts +3 -0
  197. package/providers/mailru.d.ts.map +1 -0
  198. package/providers/mailru.js +2 -0
  199. package/providers/mastodon.d.ts +3 -0
  200. package/providers/mastodon.d.ts.map +1 -0
  201. package/providers/mastodon.js +2 -0
  202. package/providers/mattermost.d.ts +3 -0
  203. package/providers/mattermost.d.ts.map +1 -0
  204. package/providers/mattermost.js +2 -0
  205. package/providers/medium.d.ts +3 -0
  206. package/providers/medium.d.ts.map +1 -0
  207. package/providers/medium.js +2 -0
  208. package/providers/microsoft-entra-id.d.ts +3 -0
  209. package/providers/microsoft-entra-id.d.ts.map +1 -0
  210. package/providers/microsoft-entra-id.js +2 -0
  211. package/providers/naver.d.ts +3 -0
  212. package/providers/naver.d.ts.map +1 -0
  213. package/providers/naver.js +2 -0
  214. package/providers/netlify.d.ts +3 -0
  215. package/providers/netlify.d.ts.map +1 -0
  216. package/providers/netlify.js +2 -0
  217. package/providers/netsuite.d.ts +3 -0
  218. package/providers/netsuite.d.ts.map +1 -0
  219. package/providers/netsuite.js +2 -0
  220. package/providers/nextcloud.d.ts +3 -0
  221. package/providers/nextcloud.d.ts.map +1 -0
  222. package/providers/nextcloud.js +2 -0
  223. package/providers/nodemailer.d.ts +3 -0
  224. package/providers/nodemailer.d.ts.map +1 -0
  225. package/providers/nodemailer.js +2 -0
  226. package/providers/notion.d.ts +3 -0
  227. package/providers/notion.d.ts.map +1 -0
  228. package/providers/notion.js +2 -0
  229. package/providers/okta.d.ts +3 -0
  230. package/providers/okta.d.ts.map +1 -0
  231. package/providers/okta.js +2 -0
  232. package/providers/onelogin.d.ts +3 -0
  233. package/providers/onelogin.d.ts.map +1 -0
  234. package/providers/onelogin.js +2 -0
  235. package/providers/ory-hydra.d.ts +3 -0
  236. package/providers/ory-hydra.d.ts.map +1 -0
  237. package/providers/ory-hydra.js +2 -0
  238. package/providers/osso.d.ts +3 -0
  239. package/providers/osso.d.ts.map +1 -0
  240. package/providers/osso.js +2 -0
  241. package/providers/osu.d.ts +3 -0
  242. package/providers/osu.d.ts.map +1 -0
  243. package/providers/osu.js +2 -0
  244. package/providers/passage.d.ts +3 -0
  245. package/providers/passage.d.ts.map +1 -0
  246. package/providers/passage.js +2 -0
  247. package/providers/passkey.d.ts +3 -0
  248. package/providers/passkey.d.ts.map +1 -0
  249. package/providers/passkey.js +2 -0
  250. package/providers/patreon.d.ts +3 -0
  251. package/providers/patreon.d.ts.map +1 -0
  252. package/providers/patreon.js +2 -0
  253. package/providers/ping-id.d.ts +3 -0
  254. package/providers/ping-id.d.ts.map +1 -0
  255. package/providers/ping-id.js +2 -0
  256. package/providers/pinterest.d.ts +3 -0
  257. package/providers/pinterest.d.ts.map +1 -0
  258. package/providers/pinterest.js +2 -0
  259. package/providers/pipedrive.d.ts +3 -0
  260. package/providers/pipedrive.d.ts.map +1 -0
  261. package/providers/pipedrive.js +2 -0
  262. package/providers/postmark.d.ts +3 -0
  263. package/providers/postmark.d.ts.map +1 -0
  264. package/providers/postmark.js +2 -0
  265. package/providers/reddit.d.ts +3 -0
  266. package/providers/reddit.d.ts.map +1 -0
  267. package/providers/reddit.js +2 -0
  268. package/providers/resend.d.ts +3 -0
  269. package/providers/resend.d.ts.map +1 -0
  270. package/providers/resend.js +2 -0
  271. package/providers/roblox.d.ts +3 -0
  272. package/providers/roblox.d.ts.map +1 -0
  273. package/providers/roblox.js +2 -0
  274. package/providers/salesforce.d.ts +3 -0
  275. package/providers/salesforce.d.ts.map +1 -0
  276. package/providers/salesforce.js +2 -0
  277. package/providers/sendgrid.d.ts +3 -0
  278. package/providers/sendgrid.d.ts.map +1 -0
  279. package/providers/sendgrid.js +2 -0
  280. package/providers/simplelogin.d.ts +3 -0
  281. package/providers/simplelogin.d.ts.map +1 -0
  282. package/providers/simplelogin.js +2 -0
  283. package/providers/slack.d.ts +3 -0
  284. package/providers/slack.d.ts.map +1 -0
  285. package/providers/slack.js +2 -0
  286. package/providers/spotify.d.ts +3 -0
  287. package/providers/spotify.d.ts.map +1 -0
  288. package/providers/spotify.js +2 -0
  289. package/providers/strava.d.ts +3 -0
  290. package/providers/strava.d.ts.map +1 -0
  291. package/providers/strava.js +2 -0
  292. package/providers/threads.d.ts +3 -0
  293. package/providers/threads.d.ts.map +1 -0
  294. package/providers/threads.js +2 -0
  295. package/providers/tiktok.d.ts +3 -0
  296. package/providers/tiktok.d.ts.map +1 -0
  297. package/providers/tiktok.js +2 -0
  298. package/providers/todoist.d.ts +3 -0
  299. package/providers/todoist.d.ts.map +1 -0
  300. package/providers/todoist.js +2 -0
  301. package/providers/trakt.d.ts +3 -0
  302. package/providers/trakt.d.ts.map +1 -0
  303. package/providers/trakt.js +2 -0
  304. package/providers/twitch.d.ts +3 -0
  305. package/providers/twitch.d.ts.map +1 -0
  306. package/providers/twitch.js +2 -0
  307. package/providers/twitter.d.ts +3 -0
  308. package/providers/twitter.d.ts.map +1 -0
  309. package/providers/twitter.js +2 -0
  310. package/providers/united-effects.d.ts +3 -0
  311. package/providers/united-effects.d.ts.map +1 -0
  312. package/providers/united-effects.js +2 -0
  313. package/providers/vipps.d.ts +3 -0
  314. package/providers/vipps.d.ts.map +1 -0
  315. package/providers/vipps.js +2 -0
  316. package/providers/vk.d.ts +3 -0
  317. package/providers/vk.d.ts.map +1 -0
  318. package/providers/vk.js +2 -0
  319. package/providers/webauthn.d.ts +3 -0
  320. package/providers/webauthn.d.ts.map +1 -0
  321. package/providers/webauthn.js +2 -0
  322. package/providers/webex.d.ts +3 -0
  323. package/providers/webex.d.ts.map +1 -0
  324. package/providers/webex.js +2 -0
  325. package/providers/wechat.d.ts +3 -0
  326. package/providers/wechat.d.ts.map +1 -0
  327. package/providers/wechat.js +2 -0
  328. package/providers/wikimedia.d.ts +3 -0
  329. package/providers/wikimedia.d.ts.map +1 -0
  330. package/providers/wikimedia.js +2 -0
  331. package/providers/wordpress.d.ts +3 -0
  332. package/providers/wordpress.d.ts.map +1 -0
  333. package/providers/wordpress.js +2 -0
  334. package/providers/workos.d.ts +3 -0
  335. package/providers/workos.d.ts.map +1 -0
  336. package/providers/workos.js +2 -0
  337. package/providers/yandex.d.ts +3 -0
  338. package/providers/yandex.d.ts.map +1 -0
  339. package/providers/yandex.js +2 -0
  340. package/providers/zitadel.d.ts +3 -0
  341. package/providers/zitadel.d.ts.map +1 -0
  342. package/providers/zitadel.js +2 -0
  343. package/providers/zoho.d.ts +3 -0
  344. package/providers/zoho.d.ts.map +1 -0
  345. package/providers/zoho.js +2 -0
  346. package/providers/zoom.d.ts +3 -0
  347. package/providers/zoom.d.ts.map +1 -0
  348. package/providers/zoom.js +2 -0
  349. package/react.d.ts +102 -0
  350. package/react.d.ts.map +1 -0
  351. package/react.js +361 -0
  352. package/src/adapters.ts +1 -0
  353. package/src/index.ts +430 -0
  354. package/src/jwt.ts +9 -0
  355. package/src/lib/actions.ts +144 -0
  356. package/src/lib/client.ts +245 -0
  357. package/src/lib/env.ts +36 -0
  358. package/src/lib/index.ts +313 -0
  359. package/src/lib/types.ts +30 -0
  360. package/src/middleware.ts +16 -0
  361. package/src/next.ts +16 -0
  362. package/src/providers/42-school.ts +2 -0
  363. package/src/providers/apple.ts +2 -0
  364. package/src/providers/asgardeo.ts +2 -0
  365. package/src/providers/atlassian.ts +2 -0
  366. package/src/providers/auth0.ts +2 -0
  367. package/src/providers/authentik.ts +2 -0
  368. package/src/providers/azure-ad-b2c.ts +2 -0
  369. package/src/providers/azure-ad.ts +2 -0
  370. package/src/providers/azure-devops.ts +2 -0
  371. package/src/providers/bankid-no.ts +2 -0
  372. package/src/providers/battlenet.ts +2 -0
  373. package/src/providers/beyondidentity.ts +2 -0
  374. package/src/providers/bitbucket.ts +2 -0
  375. package/src/providers/box.ts +2 -0
  376. package/src/providers/boxyhq-saml.ts +2 -0
  377. package/src/providers/bungie.ts +2 -0
  378. package/src/providers/click-up.ts +2 -0
  379. package/src/providers/cognito.ts +2 -0
  380. package/src/providers/coinbase.ts +2 -0
  381. package/src/providers/concept2.ts +2 -0
  382. package/src/providers/credentials.ts +2 -0
  383. package/src/providers/descope.ts +2 -0
  384. package/src/providers/discord.ts +2 -0
  385. package/src/providers/dribbble.ts +2 -0
  386. package/src/providers/dropbox.ts +2 -0
  387. package/src/providers/duende-identity-server6.ts +2 -0
  388. package/src/providers/email.ts +2 -0
  389. package/src/providers/eventbrite.ts +2 -0
  390. package/src/providers/eveonline.ts +2 -0
  391. package/src/providers/facebook.ts +2 -0
  392. package/src/providers/faceit.ts +2 -0
  393. package/src/providers/figma.ts +2 -0
  394. package/src/providers/forwardemail.ts +2 -0
  395. package/src/providers/foursquare.ts +2 -0
  396. package/src/providers/freshbooks.ts +2 -0
  397. package/src/providers/frontegg.ts +2 -0
  398. package/src/providers/fusionauth.ts +2 -0
  399. package/src/providers/github.ts +2 -0
  400. package/src/providers/gitlab.ts +2 -0
  401. package/src/providers/google.ts +2 -0
  402. package/src/providers/hubspot.ts +2 -0
  403. package/src/providers/huggingface.ts +2 -0
  404. package/src/providers/identity-server4.ts +2 -0
  405. package/src/providers/index.ts +1 -0
  406. package/src/providers/instagram.ts +2 -0
  407. package/src/providers/kakao.ts +2 -0
  408. package/src/providers/keycloak.ts +2 -0
  409. package/src/providers/kinde.ts +2 -0
  410. package/src/providers/line.ts +2 -0
  411. package/src/providers/linkedin.ts +2 -0
  412. package/src/providers/logto.ts +2 -0
  413. package/src/providers/loops.ts +2 -0
  414. package/src/providers/mailchimp.ts +2 -0
  415. package/src/providers/mailgun.ts +2 -0
  416. package/src/providers/mailru.ts +2 -0
  417. package/src/providers/mastodon.ts +2 -0
  418. package/src/providers/mattermost.ts +2 -0
  419. package/src/providers/medium.ts +2 -0
  420. package/src/providers/microsoft-entra-id.ts +2 -0
  421. package/src/providers/naver.ts +2 -0
  422. package/src/providers/netlify.ts +2 -0
  423. package/src/providers/netsuite.ts +2 -0
  424. package/src/providers/nextcloud.ts +2 -0
  425. package/src/providers/nodemailer.ts +2 -0
  426. package/src/providers/notion.ts +2 -0
  427. package/src/providers/okta.ts +2 -0
  428. package/src/providers/onelogin.ts +2 -0
  429. package/src/providers/ory-hydra.ts +2 -0
  430. package/src/providers/osso.ts +2 -0
  431. package/src/providers/osu.ts +2 -0
  432. package/src/providers/passage.ts +2 -0
  433. package/src/providers/passkey.ts +2 -0
  434. package/src/providers/patreon.ts +2 -0
  435. package/src/providers/ping-id.ts +2 -0
  436. package/src/providers/pinterest.ts +2 -0
  437. package/src/providers/pipedrive.ts +2 -0
  438. package/src/providers/postmark.ts +2 -0
  439. package/src/providers/reddit.ts +2 -0
  440. package/src/providers/resend.ts +2 -0
  441. package/src/providers/roblox.ts +2 -0
  442. package/src/providers/salesforce.ts +2 -0
  443. package/src/providers/sendgrid.ts +2 -0
  444. package/src/providers/simplelogin.ts +2 -0
  445. package/src/providers/slack.ts +2 -0
  446. package/src/providers/spotify.ts +2 -0
  447. package/src/providers/strava.ts +2 -0
  448. package/src/providers/threads.ts +2 -0
  449. package/src/providers/tiktok.ts +2 -0
  450. package/src/providers/todoist.ts +2 -0
  451. package/src/providers/trakt.ts +2 -0
  452. package/src/providers/twitch.ts +2 -0
  453. package/src/providers/twitter.ts +2 -0
  454. package/src/providers/united-effects.ts +2 -0
  455. package/src/providers/vipps.ts +2 -0
  456. package/src/providers/vk.ts +2 -0
  457. package/src/providers/webauthn.ts +2 -0
  458. package/src/providers/webex.ts +2 -0
  459. package/src/providers/wechat.ts +2 -0
  460. package/src/providers/wikimedia.ts +2 -0
  461. package/src/providers/wordpress.ts +2 -0
  462. package/src/providers/workos.ts +2 -0
  463. package/src/providers/yandex.ts +2 -0
  464. package/src/providers/zitadel.ts +2 -0
  465. package/src/providers/zoho.ts +2 -0
  466. package/src/providers/zoom.ts +2 -0
  467. package/src/react.tsx +546 -0
  468. package/src/webauthn.ts +152 -0
  469. package/webauthn.d.ts +9 -0
  470. package/webauthn.d.ts.map +1 -0
  471. package/webauthn.js +92 -0
  472. package/dist/actions-CMtg7FGv.js +0 -1
  473. package/dist/actions-CjQUKaXF.mjs +0 -200
  474. package/dist/client/index.js +0 -1
  475. package/dist/client/index.mjs +0 -484
  476. package/dist/components/AccountPicker.d.ts +0 -11
  477. package/dist/components/OAuthButton.d.ts +0 -11
  478. package/dist/components/PassKeyButton.d.ts +0 -11
  479. package/dist/components/PassKeyRegister.d.ts +0 -10
  480. package/dist/components/TwoFactorSetup.d.ts +0 -8
  481. package/dist/components/TwoFactorVerify.d.ts +0 -9
  482. package/dist/core/account-picker/encryption.d.ts +0 -22
  483. package/dist/core/account-picker/index.d.ts +0 -22
  484. package/dist/core/auth/email-password.d.ts +0 -145
  485. package/dist/core/auth/oauth/index.d.ts +0 -14
  486. package/dist/core/auth/oauth/oauth-handler.d.ts +0 -172
  487. package/dist/core/auth/oauth/pkce.d.ts +0 -168
  488. package/dist/core/auth/oauth/providers.d.ts +0 -198
  489. package/dist/core/auth/oauth/state-store-cookie.d.ts +0 -83
  490. package/dist/core/auth/oauth/state-store-redis.d.ts +0 -25
  491. package/dist/core/auth/oauth/state-store.d.ts +0 -48
  492. package/dist/core/auth/otp.d.ts +0 -184
  493. package/dist/core/auth/passkey.d.ts +0 -35
  494. package/dist/core/auth/password.d.ts +0 -22
  495. package/dist/core/auth/signin-unified.d.ts +0 -33
  496. package/dist/core/auth/two-factor.d.ts +0 -28
  497. package/dist/core/client/index.d.ts +0 -132
  498. package/dist/core/client/token-refresh-manager.d.ts +0 -48
  499. package/dist/core/errors/index.d.ts +0 -269
  500. package/dist/core/index.d.ts +0 -9
  501. package/dist/core/logger/index.d.ts +0 -147
  502. package/dist/core/mulguard/auth-handlers.d.ts +0 -100
  503. package/dist/core/mulguard/defaults.d.ts +0 -58
  504. package/dist/core/mulguard/index.d.ts +0 -9
  505. package/dist/core/mulguard/integration.d.ts +0 -104
  506. package/dist/core/mulguard/oauth-handler.d.ts +0 -93
  507. package/dist/core/mulguard/session-manager.d.ts +0 -94
  508. package/dist/core/security/csrf.d.ts +0 -46
  509. package/dist/core/security/headers.d.ts +0 -24
  510. package/dist/core/security/index.d.ts +0 -132
  511. package/dist/core/security/rate-limit.d.ts +0 -39
  512. package/dist/core/security/security-manager.d.ts +0 -236
  513. package/dist/core/security/validation.d.ts +0 -251
  514. package/dist/core/security/xss.d.ts +0 -20
  515. package/dist/core/session/index.d.ts +0 -35
  516. package/dist/core/session/session-manager.d.ts +0 -235
  517. package/dist/core/types/auth.d.ts +0 -290
  518. package/dist/core/types/errors.d.ts +0 -200
  519. package/dist/core/types/index.d.ts +0 -484
  520. package/dist/core/utils/auth-helpers.d.ts +0 -136
  521. package/dist/core/utils/logger.d.ts +0 -121
  522. package/dist/index/index.js +0 -1
  523. package/dist/index/index.mjs +0 -2736
  524. package/dist/index.d.ts +0 -18
  525. package/dist/mulguard.d.ts +0 -373
  526. package/dist/nextjs/client/hooks.d.ts +0 -122
  527. package/dist/nextjs/client/index.d.ts +0 -13
  528. package/dist/nextjs/client/provider.d.ts +0 -69
  529. package/dist/nextjs/client/server-actions-helper.d.ts +0 -22
  530. package/dist/nextjs/handlers/api.d.ts +0 -10
  531. package/dist/nextjs/handlers/index.d.ts +0 -9
  532. package/dist/nextjs/handlers/route.d.ts +0 -76
  533. package/dist/nextjs/index.d.ts +0 -15
  534. package/dist/nextjs/proxy/index.d.ts +0 -149
  535. package/dist/nextjs/proxy/security.d.ts +0 -9
  536. package/dist/nextjs/server/actions.d.ts +0 -30
  537. package/dist/nextjs/server/auth.d.ts +0 -65
  538. package/dist/nextjs/server/cookies.d.ts +0 -41
  539. package/dist/nextjs/server/index.d.ts +0 -18
  540. package/dist/nextjs/server/oauth-state.d.ts +0 -32
  541. package/dist/nextjs/server/session-helpers.d.ts +0 -24
  542. package/dist/nextjs/server/session.d.ts +0 -144
  543. package/dist/oauth-state-Drwz6fES.js +0 -1
  544. package/dist/oauth-state-pdypStuS.mjs +0 -210
  545. package/dist/server/index.js +0 -1
  546. package/dist/server/index.mjs +0 -29
@@ -0,0 +1,245 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import type { ProviderId, ProviderType } from "@mulverse/mulguard-core/providers"
5
+ import type { LoggerInstance, Session } from "@mulverse/mulguard-core/types"
6
+ import { AuthError } from "@mulverse/mulguard-core/errors"
7
+
8
+ /** @todo */
9
+ class ClientFetchError extends AuthError {}
10
+
11
+ /** @todo */
12
+ export class ClientSessionError extends AuthError {}
13
+
14
+ export interface AuthClientConfig {
15
+ baseUrl: string
16
+ basePath: string
17
+ baseUrlServer: string
18
+ basePathServer: string
19
+ /** Stores last session response */
20
+ _session?: Session | null | undefined
21
+ /** Used for timestamp since last sycned (in seconds) */
22
+ _lastSync: number
23
+ /**
24
+ * Stores the `SessionProvider`'s session update method to be able to
25
+ * trigger session updates from places like `signIn` or `signOut`
26
+ */
27
+ _getSession: (...args: any[]) => any
28
+ }
29
+
30
+ export interface UseSessionOptions<R extends boolean> {
31
+ required: R
32
+ /** Defaults to `signIn` */
33
+ onUnauthenticated?: () => void
34
+ }
35
+
36
+ export interface ClientSafeProvider {
37
+ id: ProviderId
38
+ name: string
39
+ type: ProviderType
40
+ signinUrl: string
41
+ callbackUrl: string
42
+ redirectTo: string
43
+ }
44
+
45
+ export interface SignInOptions<Redirect extends boolean = true>
46
+ extends Record<string, unknown> {
47
+ /** @deprecated Use `redirectTo` instead. */
48
+ callbackUrl?: string
49
+ /**
50
+ * Specify where the user should be redirected to after a successful signin.
51
+ *
52
+ * By default, it is the page the sign-in was initiated from.
53
+ */
54
+ redirectTo?: string
55
+ /**
56
+ * You might want to deal with the signin response on the same page, instead of redirecting to another page.
57
+ * For example, if an error occurs (like wrong credentials given by the user), you might want to show an inline error message on the input field.
58
+ *
59
+ * For this purpose, you can set this to option `redirect: false`.
60
+ */
61
+ redirect?: Redirect
62
+ }
63
+
64
+ export interface SignInResponse {
65
+ error: string | undefined
66
+ code: string | undefined
67
+ status: number
68
+ ok: boolean
69
+ url: string | null
70
+ }
71
+
72
+ /**
73
+ * Match `inputType` of `new URLSearchParams(inputType)`
74
+ * @internal
75
+ */
76
+ export type SignInAuthorizationParams =
77
+ | string
78
+ | string[][]
79
+ | Record<string, string>
80
+ | URLSearchParams
81
+
82
+ /** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1) */
83
+ export interface SignOutResponse {
84
+ url: string
85
+ }
86
+
87
+ export interface SignOutParams<Redirect extends boolean = true> {
88
+ /** @deprecated Use `redirectTo` instead. */
89
+ callbackUrl?: string
90
+ /**
91
+ * If you pass `redirect: false`, the page will not reload.
92
+ * The session will be deleted, and `useSession` is notified, so any indication about the user will be shown as logged out automatically.
93
+ * It can give a very nice experience for the user.
94
+ */
95
+ redirectTo?: string
96
+ /** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1 */
97
+ redirect?: Redirect
98
+ }
99
+
100
+ /**
101
+
102
+ * If you have session expiry times of 30 days (the default) or more, then you probably don't need to change any of the default options.
103
+ *
104
+ * However, if you need to customize the session behavior and/or are using short session expiry times, you can pass options to the provider to customize the behavior of the {@link useSession} hook.
105
+ */
106
+ export interface SessionProviderProps {
107
+ children: React.ReactNode
108
+ session?: Session | null
109
+ baseUrl?: string
110
+ basePath?: string
111
+ /**
112
+ * A time interval (in seconds) after which the session will be re-fetched.
113
+ * If set to `0` (default), the session is not polled.
114
+ */
115
+ refetchInterval?: number
116
+ /**
117
+ * `SessionProvider` automatically refetches the session when the user switches between windows.
118
+ * This option activates this behaviour if set to `true` (default).
119
+ */
120
+ refetchOnWindowFocus?: boolean
121
+ /**
122
+ * Set to `false` to stop polling when the device has no internet access offline (determined by `navigator.onLine`)
123
+ *
124
+ * [`navigator.onLine` documentation](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine)
125
+ */
126
+ refetchWhenOffline?: false
127
+ }
128
+
129
+ // ------------------------ Internal ------------------------
130
+
131
+ /**
132
+ * If passed 'appContext' via getInitialProps() in _app.js
133
+ * then get the req object from ctx and use that for the
134
+ * req value to allow `fetchData` to
135
+ * work seemlessly in getInitialProps() on server side
136
+ * pages *and* in _app.js.
137
+ * @internal
138
+ */
139
+ export async function fetchData<T = any>(
140
+ path: string,
141
+ __NEXTAUTH: AuthClientConfig,
142
+ logger: LoggerInstance,
143
+ req: any = {}
144
+ ): Promise<T | null> {
145
+ const url = `${apiBaseUrl(__NEXTAUTH)}/${path}`
146
+ try {
147
+ const options: RequestInit = {
148
+ headers: {
149
+ "Content-Type": "application/json",
150
+ ...(req?.headers?.cookie ? { cookie: req.headers.cookie } : {}),
151
+ },
152
+ }
153
+
154
+ if (req?.body) {
155
+ options.body = JSON.stringify(req.body)
156
+ options.method = "POST"
157
+ }
158
+
159
+ const res = await fetch(url, options)
160
+ const data = await res.json()
161
+ if (!res.ok) throw data
162
+ return data
163
+ } catch (error) {
164
+ logger.error(new ClientFetchError((error as Error).message, error as any))
165
+ return null
166
+ }
167
+ }
168
+
169
+ /** @internal */
170
+ export function apiBaseUrl(__NEXTAUTH: AuthClientConfig) {
171
+ if (typeof window === "undefined") {
172
+ // Return absolute path when called server side
173
+ return `${__NEXTAUTH.baseUrlServer}${__NEXTAUTH.basePathServer}`
174
+ }
175
+ // Return relative path when called client side
176
+ return __NEXTAUTH.basePath
177
+ }
178
+
179
+ /** @internal */
180
+ export function useOnline() {
181
+ const [isOnline, setIsOnline] = React.useState(
182
+ typeof navigator !== "undefined" ? navigator.onLine : false
183
+ )
184
+
185
+ const setOnline = () => setIsOnline(true)
186
+ const setOffline = () => setIsOnline(false)
187
+
188
+ React.useEffect(() => {
189
+ window.addEventListener("online", setOnline)
190
+ window.addEventListener("offline", setOffline)
191
+
192
+ return () => {
193
+ window.removeEventListener("online", setOnline)
194
+ window.removeEventListener("offline", setOffline)
195
+ }
196
+ }, [])
197
+
198
+ return isOnline
199
+ }
200
+
201
+ /**
202
+ * Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC.
203
+ * @internal
204
+ */
205
+ export function now() {
206
+ return Math.floor(Date.now() / 1000)
207
+ }
208
+
209
+ /**
210
+ * Returns an `URL` like object to make requests/redirects from server-side
211
+ * @internal
212
+ */
213
+ export function parseUrl(url?: string): {
214
+ /** @default "http://localhost:3000" */
215
+ origin: string
216
+ /** @default "localhost:3000" */
217
+ host: string
218
+ /** @default "/api/auth" */
219
+ path: string
220
+ /** @default "http://localhost:3000/api/auth" */
221
+ base: string
222
+ /** @default "http://localhost:3000/api/auth" */
223
+ toString: () => string
224
+ } {
225
+ const defaultUrl = new URL("http://localhost:3000/api/auth")
226
+
227
+ if (url && !url.startsWith("http")) {
228
+ url = `https://${url}`
229
+ }
230
+
231
+ const _url = new URL(url || defaultUrl)
232
+ const path = (_url.pathname === "/" ? defaultUrl.pathname : _url.pathname)
233
+ // Remove trailing slash
234
+ .replace(/\/$/, "")
235
+
236
+ const base = `${_url.origin}${path}`
237
+
238
+ return {
239
+ origin: _url.origin,
240
+ host: _url.host,
241
+ path,
242
+ base,
243
+ toString: () => base,
244
+ }
245
+ }
package/src/lib/env.ts ADDED
@@ -0,0 +1,36 @@
1
+ // @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
2
+ import { NextRequest } from "next/server"
3
+ import type { MulGuardConfig } from "./index.js"
4
+ import { setEnvDefaults as coreSetEnvDefaults } from "@mulverse/mulguard-core"
5
+
6
+ /** If `MULGUARD_URL`, `AUTH_URL`, or `NEXTAUTH_URL` is defined, override the request's URL. */
7
+ export function reqWithEnvURL(req: NextRequest): NextRequest {
8
+ const url = process.env.MULGUARD_URL ?? process.env.AUTH_URL ?? process.env.NEXTAUTH_URL
9
+ if (!url) return req
10
+ const { origin: envOrigin } = new URL(url)
11
+ const { href, origin } = req.nextUrl
12
+ return new NextRequest(href.replace(origin, envOrigin), req)
13
+ }
14
+
15
+ /**
16
+ * MulGuard checks for `MULGUARD_URL` and `MULGUARD_SECRET` first.
17
+ * For backwards compatibility, it also checks for `AUTH_URL`/`AUTH_SECRET` and `NEXTAUTH_URL`/`NEXTAUTH_SECRET`.
18
+ * The `basePath` by default is `/api/auth` instead of `/auth`
19
+ * (which is the default for all other Auth.js integrations).
20
+ */
21
+ export function setEnvDefaults(config: MulGuardConfig) {
22
+ try {
23
+ config.secret ??= process.env.MULGUARD_SECRET ?? process.env.AUTH_SECRET ?? process.env.NEXTAUTH_SECRET
24
+ const url = process.env.MULGUARD_URL ?? process.env.AUTH_URL ?? process.env.NEXTAUTH_URL
25
+ if (!url) return
26
+ const { pathname } = new URL(url)
27
+ if (pathname === "/") return
28
+ config.basePath ||= pathname
29
+ } catch {
30
+ // Catching and swallowing potential URL parsing errors, we'll fall
31
+ // back to `/api/auth` below.
32
+ } finally {
33
+ config.basePath ||= "/api/auth"
34
+ coreSetEnvDefaults(process.env, config, true)
35
+ }
36
+ }
@@ -0,0 +1,313 @@
1
+ import { Auth, createActionURL, type AuthConfig } from "@mulverse/mulguard-core"
2
+ // @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
3
+ import { headers } from "next/headers"
4
+ // @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
5
+ import { NextResponse } from "next/server"
6
+ import { reqWithEnvURL } from "./env.js"
7
+
8
+ import type { AuthAction, Awaitable, Session } from "@mulverse/mulguard-core/types"
9
+ import type {
10
+ GetServerSidePropsContext,
11
+ NextApiRequest,
12
+ NextApiResponse,
13
+ } from "next"
14
+ import type { AppRouteHandlerFn } from "./types.js"
15
+ // @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
16
+ import type { NextFetchEvent, NextMiddleware, NextRequest } from "next/server"
17
+
18
+ /** Configure MulGuard. */
19
+ export interface MulGuardConfig extends Omit<AuthConfig, "raw"> {
20
+ /**
21
+ * Callbacks are asynchronous functions you can use to control what happens when an auth-related action is performed.
22
+ * Callbacks **allow you to implement access controls without a database** or to **integrate with external databases or APIs**.
23
+ */
24
+ callbacks?: AuthConfig["callbacks"] & {
25
+ /**
26
+ * Invoked when a user needs authorization, using [Middleware](https://nextjs.org/docs/advanced-features/middleware).
27
+ *
28
+ * You can override this behavior by returning a {@link NextResponse}.
29
+ *
30
+ * @example
31
+ * ```ts title="app/auth.ts"
32
+ * async authorized({ request, auth }) {
33
+ * const url = request.nextUrl
34
+ *
35
+ * if(request.method === "POST") {
36
+ * const { authToken } = (await request.json()) ?? {}
37
+ * // If the request has a valid auth token, it is authorized
38
+ * const valid = await validateAuthToken(authToken)
39
+ * if(valid) return true
40
+ * return NextResponse.json("Invalid auth token", { status: 401 })
41
+ * }
42
+ *
43
+ * // Logged in users are authenticated, otherwise redirect to login page
44
+ * return !!auth.user
45
+ * }
46
+ * ```
47
+ *
48
+ * :::warning
49
+ * If you are returning a redirect response, make sure that the page you are redirecting to is not protected by this callback,
50
+ * otherwise you could end up in an infinite redirect loop.
51
+ * :::
52
+ */
53
+ authorized?: (params: {
54
+ /** The request to be authorized. */
55
+ request: NextRequest
56
+ /** The authenticated user or token, if any. */
57
+ auth: Session | null
58
+ }) => Awaitable<boolean | NextResponse | Response | undefined>
59
+ }
60
+ }
61
+
62
+ async function getSession(headers: Headers, config: MulGuardConfig) {
63
+ const url = createActionURL(
64
+ "session",
65
+ // @ts-expect-error `x-forwarded-proto` is not nullable, next.js sets it by default
66
+ headers.get("x-forwarded-proto"),
67
+ headers,
68
+ process.env,
69
+ config
70
+ )
71
+ const request = new Request(url, {
72
+ headers: { cookie: headers.get("cookie") ?? "" },
73
+ })
74
+
75
+ return Auth(request, {
76
+ ...config,
77
+ callbacks: {
78
+ ...config.callbacks,
79
+ // Since we are server-side, we don't need to filter out the session data
80
+ // See https://authjs.dev/getting-started/migrating-to-v5#authenticating-server-side
81
+ // TODO: Taint the session data to prevent accidental leakage to the client
82
+ // https://react.dev/reference/react/experimental_taintObjectReference
83
+ async session(...args) {
84
+ const session =
85
+ // If the user defined a custom session callback, use that instead
86
+ (await config.callbacks?.session?.(...args)) ?? {
87
+ ...args[0].session,
88
+ expires:
89
+ args[0].session.expires?.toISOString?.() ??
90
+ args[0].session.expires,
91
+ }
92
+ const user = args[0].user ?? args[0].token
93
+ return { user, ...session } satisfies Session
94
+ },
95
+ },
96
+ }) as Promise<Response>
97
+ }
98
+
99
+ export interface MulGuardRequest extends NextRequest {
100
+ auth: Session | null
101
+ }
102
+
103
+ export type MulGuardMiddleware = (
104
+ request: MulGuardRequest,
105
+ event: NextFetchEvent
106
+ ) => ReturnType<NextMiddleware>
107
+
108
+ export type WithAuthArgs =
109
+ | [MulGuardRequest, any]
110
+ | [MulGuardMiddleware]
111
+ | [AppRouteHandlerFn]
112
+ | [NextApiRequest, NextApiResponse]
113
+ | [GetServerSidePropsContext]
114
+ | []
115
+
116
+ function isReqWrapper(arg: any): arg is MulGuardMiddleware | AppRouteHandlerFn {
117
+ return typeof arg === "function"
118
+ }
119
+
120
+ export function initAuth(
121
+ config:
122
+ | MulGuardConfig
123
+ | ((request: NextRequest | undefined) => Awaitable<MulGuardConfig>),
124
+ onLazyLoad?: (config: MulGuardConfig) => void // To set the default env vars
125
+ ) {
126
+ if (typeof config === "function") {
127
+ return async (...args: WithAuthArgs) => {
128
+ if (!args.length) {
129
+ // React Server Components
130
+ const _headers = await headers()
131
+ const _config = await config(undefined) // Review: Should we pass headers() here instead?
132
+ onLazyLoad?.(_config)
133
+
134
+ return getSession(_headers, _config).then((r) => r.json())
135
+ }
136
+
137
+ if (args[0] instanceof Request) {
138
+ // middleware.ts inline
139
+ // export { auth as default } from "auth"
140
+ const req = args[0]
141
+ const ev = args[1]
142
+ const _config = await config(req)
143
+ onLazyLoad?.(_config)
144
+
145
+ // args[0] is supposed to be NextRequest but the instanceof check is failing.
146
+ return handleAuth([req, ev], _config)
147
+ }
148
+
149
+ if (isReqWrapper(args[0])) {
150
+ // middleware.ts wrapper/route.ts
151
+ // import { auth } from "auth"
152
+ // export default auth((req) => { console.log(req.auth) }})
153
+ const userMiddlewareOrRoute = args[0]
154
+ return async (
155
+ ...args: Parameters<MulGuardMiddleware | AppRouteHandlerFn>
156
+ ) => {
157
+ const _config = await config(args[0])
158
+ onLazyLoad?.(_config)
159
+ return handleAuth(args, _config, userMiddlewareOrRoute)
160
+ }
161
+ }
162
+ // API Routes, getServerSideProps
163
+ const request = "req" in args[0] ? args[0].req : args[0]
164
+ const response: any = "res" in args[0] ? args[0].res : args[1]
165
+ const _config = await config(request)
166
+ onLazyLoad?.(_config)
167
+
168
+ // @ts-expect-error -- request is NextRequest
169
+ return getSession(new Headers(request.headers), _config).then(
170
+ async (authResponse) => {
171
+ const auth = await authResponse.json()
172
+
173
+ for (const cookie of authResponse.headers.getSetCookie())
174
+ if ("headers" in response)
175
+ response.headers.append("set-cookie", cookie)
176
+ else response.appendHeader("set-cookie", cookie)
177
+
178
+ return auth satisfies Session | null
179
+ }
180
+ )
181
+ }
182
+ }
183
+ return (...args: WithAuthArgs) => {
184
+ if (!args.length) {
185
+ // React Server Components
186
+ return Promise.resolve(headers()).then((h: Headers) =>
187
+ getSession(h, config).then((r) => r.json())
188
+ )
189
+ }
190
+ if (args[0] instanceof Request) {
191
+ // middleware.ts inline
192
+ // export { auth as default } from "auth"
193
+ const req = args[0]
194
+ const ev = args[1]
195
+ return handleAuth([req, ev], config)
196
+ }
197
+
198
+ if (isReqWrapper(args[0])) {
199
+ // middleware.ts wrapper/route.ts
200
+ // import { auth } from "auth"
201
+ // export default auth((req) => { console.log(req.auth) }})
202
+ const userMiddlewareOrRoute = args[0]
203
+ return async (
204
+ ...args: Parameters<MulGuardMiddleware | AppRouteHandlerFn>
205
+ ) => {
206
+ return handleAuth(args, config, userMiddlewareOrRoute).then((res) => {
207
+ return res
208
+ })
209
+ }
210
+ }
211
+
212
+ // API Routes, getServerSideProps
213
+ const request = "req" in args[0] ? args[0].req : args[0]
214
+ const response: any = "res" in args[0] ? args[0].res : args[1]
215
+
216
+ return getSession(
217
+ // @ts-expect-error
218
+ new Headers(request.headers),
219
+ config
220
+ ).then(async (authResponse) => {
221
+ const auth = await authResponse.json()
222
+
223
+ for (const cookie of authResponse.headers.getSetCookie())
224
+ if ("headers" in response) response.headers.append("set-cookie", cookie)
225
+ else response.appendHeader("set-cookie", cookie)
226
+
227
+ return auth satisfies Session | null
228
+ })
229
+ }
230
+ }
231
+
232
+ async function handleAuth(
233
+ args: Parameters<NextMiddleware | AppRouteHandlerFn>,
234
+ config: MulGuardConfig,
235
+ userMiddlewareOrRoute?: MulGuardMiddleware | AppRouteHandlerFn
236
+ ) {
237
+ const request = reqWithEnvURL(args[0])
238
+ const sessionResponse = await getSession(request.headers, config)
239
+ const auth = await sessionResponse.json()
240
+
241
+ let authorized: boolean | NextResponse | Response | undefined = true
242
+
243
+ if (config.callbacks?.authorized) {
244
+ authorized = await config.callbacks.authorized({ request, auth })
245
+ }
246
+
247
+ let response: any = NextResponse.next?.()
248
+
249
+ if (authorized instanceof Response) {
250
+ // User returned a custom response, like redirecting to a page or 401, respect it
251
+ response = authorized
252
+
253
+ const redirect = authorized.headers.get("Location")
254
+ const { pathname } = request.nextUrl
255
+ // If the user is redirecting to the same MulGuard action path as the current request,
256
+ // don't allow the redirect to prevent an infinite loop
257
+ if (
258
+ redirect &&
259
+ isSameAuthAction(pathname, new URL(redirect).pathname, config)
260
+ ) {
261
+ authorized = true
262
+ }
263
+ } else if (userMiddlewareOrRoute) {
264
+ // Execute user's middleware/handler with the augmented request
265
+ const augmentedReq = request as MulGuardRequest
266
+ augmentedReq.auth = auth
267
+ response =
268
+ (await userMiddlewareOrRoute(augmentedReq, args[1])) ??
269
+ NextResponse.next()
270
+ } else if (!authorized) {
271
+ const signInPage = config.pages?.signIn ?? `${config.basePath}/signin`
272
+ if (request.nextUrl.pathname !== signInPage) {
273
+ // Redirect to signin page by default if not authorized
274
+ const signInUrl = request.nextUrl.clone()
275
+ signInUrl.pathname = signInPage
276
+ signInUrl.searchParams.set("callbackUrl", request.nextUrl.href)
277
+ response = NextResponse.redirect(signInUrl)
278
+ }
279
+ }
280
+
281
+ const finalResponse = new Response(response?.body, response)
282
+
283
+ // Preserve cookies from the session response
284
+ for (const cookie of sessionResponse.headers.getSetCookie())
285
+ finalResponse.headers.append("set-cookie", cookie)
286
+
287
+ return finalResponse
288
+ }
289
+
290
+ function isSameAuthAction(
291
+ requestPath: string,
292
+ redirectPath: string,
293
+ config: MulGuardConfig
294
+ ) {
295
+ const action = redirectPath.replace(`${requestPath}/`, "") as AuthAction
296
+ const pages = Object.values(config.pages ?? {})
297
+
298
+ return (
299
+ (actions.has(action) || pages.includes(redirectPath)) &&
300
+ redirectPath === requestPath
301
+ )
302
+ }
303
+
304
+ const actions = new Set<AuthAction>([
305
+ "providers",
306
+ "session",
307
+ "csrf",
308
+ "signin",
309
+ "signout",
310
+ "callback",
311
+ "verify-request",
312
+ "error",
313
+ ])
@@ -0,0 +1,30 @@
1
+ // @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
2
+ import type { NextRequest } from "next/server"
3
+
4
+ /**
5
+ * AppRouteHandlerFnContext is the context that is passed to the handler as the
6
+ * second argument.
7
+ */
8
+ export type AppRouteHandlerFnContext = {
9
+ params: Promise<any>
10
+ }
11
+ /**
12
+ * Handler function for app routes. If a non-Response value is returned, an error
13
+ * will be thrown.
14
+ */
15
+ export type AppRouteHandlerFn = (
16
+ /**
17
+ * Incoming request object.
18
+ */
19
+ req: NextRequest,
20
+ /**
21
+ * Context properties on the request (including the parameters if this was a
22
+ * dynamic route).
23
+ */
24
+ ctx: AppRouteHandlerFnContext
25
+ ) => void | Response | Promise<void | Response>
26
+
27
+ export type AppRouteHandlers = Record<
28
+ "GET" | "POST",
29
+ (req: NextRequest) => Promise<Response>
30
+ >
@@ -0,0 +1,16 @@
1
+ /**
2
+ * :::warning Deprecated
3
+ * This module is replaced in v5. Read more at: https://authjs.dev/getting-started/migrating-to-v5#authenticating-server-side
4
+ * :::
5
+ *
6
+ * @module middleware
7
+ */
8
+
9
+ throw new ReferenceError(
10
+ [
11
+ '"mulguard/middleware" is deprecated. If you are not ready to migrate, keep using "next-auth@4".',
12
+ "Read more on https://mulverse.com",
13
+ ].join("\n")
14
+ )
15
+
16
+ export {}
package/src/next.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * :::warning Deprecated
3
+ * This module is replaced in v5. Read more at: https://authjs.dev/getting-started/migrating-to-v5#authenticating-server-side
4
+ * :::
5
+ *
6
+ * @module next
7
+ */
8
+
9
+ throw new ReferenceError(
10
+ [
11
+ '"mulguard/next" is deprecated. If you are not ready to migrate, keep using "next-auth@4".',
12
+ "Read more on https://mulverse.com",
13
+ ].join("\n")
14
+ )
15
+
16
+ export {}
@@ -0,0 +1,2 @@
1
+ export * from "@mulverse/mulguard-core/providers/42-school"
2
+ export { default } from "@mulverse/mulguard-core/providers/42-school"
@@ -0,0 +1,2 @@
1
+ export * from "@mulverse/mulguard-core/providers/apple"
2
+ export { default } from "@mulverse/mulguard-core/providers/apple"
@@ -0,0 +1,2 @@
1
+ export * from "@mulverse/mulguard-core/providers/asgardeo"
2
+ export { default } from "@mulverse/mulguard-core/providers/asgardeo"
@@ -0,0 +1,2 @@
1
+ export * from "@mulverse/mulguard-core/providers/atlassian"
2
+ export { default } from "@mulverse/mulguard-core/providers/atlassian"
@@ -0,0 +1,2 @@
1
+ export * from "@mulverse/mulguard-core/providers/auth0"
2
+ export { default } from "@mulverse/mulguard-core/providers/auth0"
@@ -0,0 +1,2 @@
1
+ export * from "@mulverse/mulguard-core/providers/authentik"
2
+ export { default } from "@mulverse/mulguard-core/providers/authentik"
@@ -0,0 +1,2 @@
1
+ export * from "@mulverse/mulguard-core/providers/azure-ad-b2c"
2
+ export { default } from "@mulverse/mulguard-core/providers/azure-ad-b2c"
@@ -0,0 +1,2 @@
1
+ export * from "@mulverse/mulguard-core/providers/azure-ad"
2
+ export { default } from "@mulverse/mulguard-core/providers/azure-ad"