@masheev/better-auth 0.0.0-stage → 1.7.5

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 (465) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +31 -2
  3. package/TYPE-PATCH-NOTICE.md +9 -0
  4. package/TYPE-PATCH-PROVENANCE.json +267 -0
  5. package/dist/_virtual/_rolldown/runtime.mjs +27 -0
  6. package/dist/adapters/drizzle-adapter/index.d.mts +1 -0
  7. package/dist/adapters/drizzle-adapter/index.mjs +2 -0
  8. package/dist/adapters/index.d.mts +26 -0
  9. package/dist/adapters/index.mjs +9 -0
  10. package/dist/adapters/kysely-adapter/index.d.mts +1 -0
  11. package/dist/adapters/kysely-adapter/index.mjs +2 -0
  12. package/dist/adapters/memory-adapter/index.d.mts +1 -0
  13. package/dist/adapters/memory-adapter/index.mjs +2 -0
  14. package/dist/adapters/mongodb-adapter/index.d.mts +1 -0
  15. package/dist/adapters/mongodb-adapter/index.mjs +2 -0
  16. package/dist/adapters/prisma-adapter/index.d.mts +1 -0
  17. package/dist/adapters/prisma-adapter/index.mjs +2 -0
  18. package/dist/api/dispatch.d.mts +34 -0
  19. package/dist/api/dispatch.mjs +275 -0
  20. package/dist/api/index.d.mts +4053 -0
  21. package/dist/api/index.mjs +220 -0
  22. package/dist/api/middlewares/authorization.d.mts +69 -0
  23. package/dist/api/middlewares/authorization.mjs +78 -0
  24. package/dist/api/middlewares/index.d.mts +2 -0
  25. package/dist/api/middlewares/origin-check.d.mts +17 -0
  26. package/dist/api/middlewares/origin-check.mjs +155 -0
  27. package/dist/api/rate-limiter/index.mjs +318 -0
  28. package/dist/api/routes/account.d.mts +413 -0
  29. package/dist/api/routes/account.mjs +619 -0
  30. package/dist/api/routes/callback.d.mts +32 -0
  31. package/dist/api/routes/callback.mjs +261 -0
  32. package/dist/api/routes/email-verification.d.mts +160 -0
  33. package/dist/api/routes/email-verification.mjs +324 -0
  34. package/dist/api/routes/error.d.mts +27 -0
  35. package/dist/api/routes/error.mjs +387 -0
  36. package/dist/api/routes/index.d.mts +12 -0
  37. package/dist/api/routes/ok.d.mts +35 -0
  38. package/dist/api/routes/ok.mjs +27 -0
  39. package/dist/api/routes/password.d.mts +182 -0
  40. package/dist/api/routes/password.mjs +206 -0
  41. package/dist/api/routes/session.d.mts +450 -0
  42. package/dist/api/routes/session.mjs +481 -0
  43. package/dist/api/routes/sign-in.d.mts +186 -0
  44. package/dist/api/routes/sign-in.mjs +368 -0
  45. package/dist/api/routes/sign-out.d.mts +51 -0
  46. package/dist/api/routes/sign-out.mjs +96 -0
  47. package/dist/api/routes/sign-up.d.mts +159 -0
  48. package/dist/api/routes/sign-up.mjs +275 -0
  49. package/dist/api/routes/update-session.d.mts +74 -0
  50. package/dist/api/routes/update-session.mjs +57 -0
  51. package/dist/api/routes/update-user.d.mts +428 -0
  52. package/dist/api/routes/update-user.mjs +522 -0
  53. package/dist/api/state/oauth.d.mts +53 -0
  54. package/dist/api/state/oauth.mjs +38 -0
  55. package/dist/api/state/should-session-refresh.d.mts +12 -0
  56. package/dist/api/state/should-session-refresh.mjs +13 -0
  57. package/dist/api/to-auth-endpoints.mjs +60 -0
  58. package/dist/auth/base.mjs +66 -0
  59. package/dist/auth/full.d.mts +28 -0
  60. package/dist/auth/full.mjs +29 -0
  61. package/dist/auth/minimal.d.mts +10 -0
  62. package/dist/auth/minimal.mjs +11 -0
  63. package/dist/auth/trusted-origins.mjs +106 -0
  64. package/dist/client/broadcast-channel.d.mts +19 -0
  65. package/dist/client/broadcast-channel.mjs +44 -0
  66. package/dist/client/config.d.mts +90 -0
  67. package/dist/client/config.mjs +113 -0
  68. package/dist/client/equality.d.mts +19 -0
  69. package/dist/client/equality.mjs +42 -0
  70. package/dist/client/fetch-plugins.mjs +17 -0
  71. package/dist/client/focus-manager.d.mts +10 -0
  72. package/dist/client/focus-manager.mjs +30 -0
  73. package/dist/client/index.d.mts +35 -0
  74. package/dist/client/index.mjs +22 -0
  75. package/dist/client/lynx/index.d.mts +43 -0
  76. package/dist/client/lynx/index.mjs +22 -0
  77. package/dist/client/lynx/lynx-store.d.mts +46 -0
  78. package/dist/client/lynx/lynx-store.mjs +44 -0
  79. package/dist/client/online-manager.d.mts +11 -0
  80. package/dist/client/online-manager.mjs +33 -0
  81. package/dist/client/parser.d.mts +10 -0
  82. package/dist/client/parser.mjs +70 -0
  83. package/dist/client/path-to-object.d.mts +113 -0
  84. package/dist/client/plugins/index.d.mts +44 -0
  85. package/dist/client/plugins/index.mjs +30 -0
  86. package/dist/client/plugins/infer-plugin.d.mts +16 -0
  87. package/dist/client/plugins/infer-plugin.mjs +11 -0
  88. package/dist/client/proxy.mjs +78 -0
  89. package/dist/client/query.d.mts +23 -0
  90. package/dist/client/query.mjs +124 -0
  91. package/dist/client/react/index.d.mts +44 -0
  92. package/dist/client/react/index.mjs +22 -0
  93. package/dist/client/react/react-store.d.mts +46 -0
  94. package/dist/client/react/react-store.mjs +44 -0
  95. package/dist/client/session-atom.d.mts +11 -0
  96. package/dist/client/session-atom.mjs +178 -0
  97. package/dist/client/session-refresh.d.mts +20 -0
  98. package/dist/client/session-refresh.mjs +131 -0
  99. package/dist/client/solid/index.d.mts +44 -0
  100. package/dist/client/solid/index.mjs +22 -0
  101. package/dist/client/solid/solid-store.mjs +21 -0
  102. package/dist/client/svelte/index.d.mts +44 -0
  103. package/dist/client/svelte/index.mjs +18 -0
  104. package/dist/client/types.d.mts +51 -0
  105. package/dist/client/vanilla.d.mts +42 -0
  106. package/dist/client/vanilla.mjs +18 -0
  107. package/dist/client/vue/index.d.mts +67 -0
  108. package/dist/client/vue/index.mjs +54 -0
  109. package/dist/client/vue/vue-store.mjs +23 -0
  110. package/dist/context/create-context.mjs +235 -0
  111. package/dist/context/helpers.mjs +158 -0
  112. package/dist/context/init-minimal.mjs +17 -0
  113. package/dist/context/init.mjs +19 -0
  114. package/dist/context/secret-utils.mjs +53 -0
  115. package/dist/context/store-capabilities.mjs +12 -0
  116. package/dist/cookies/cache.mjs +33 -0
  117. package/dist/cookies/cookie-utils.d.mts +72 -0
  118. package/dist/cookies/cookie-utils.mjs +203 -0
  119. package/dist/cookies/index.d.mts +124 -0
  120. package/dist/cookies/index.mjs +350 -0
  121. package/dist/cookies/jwt.mjs +44 -0
  122. package/dist/cookies/session-store.d.mts +32 -0
  123. package/dist/cookies/session-store.mjs +183 -0
  124. package/dist/crypto/buffer.d.mts +7 -0
  125. package/dist/crypto/buffer.mjs +16 -0
  126. package/dist/crypto/index.d.mts +32 -0
  127. package/dist/crypto/index.mjs +69 -0
  128. package/dist/crypto/jwt.d.mts +9 -0
  129. package/dist/crypto/jwt.mjs +141 -0
  130. package/dist/crypto/password.d.mts +13 -0
  131. package/dist/crypto/password.mjs +14 -0
  132. package/dist/crypto/random.d.mts +4 -0
  133. package/dist/crypto/random.mjs +5 -0
  134. package/dist/db/adapter-base.d.mts +7 -0
  135. package/dist/db/adapter-base.mjs +25 -0
  136. package/dist/db/adapter-kysely.d.mts +7 -0
  137. package/dist/db/adapter-kysely.mjs +17 -0
  138. package/dist/db/field-converter.d.mts +7 -0
  139. package/dist/db/field-converter.mjs +19 -0
  140. package/dist/db/field.d.mts +41 -0
  141. package/dist/db/get-migration.d.mts +56 -0
  142. package/dist/db/get-migration.mjs +685 -0
  143. package/dist/db/get-schema.d.mts +13 -0
  144. package/dist/db/get-schema.mjs +39 -0
  145. package/dist/db/index.d.mts +10 -0
  146. package/dist/db/index.mjs +35 -0
  147. package/dist/db/internal-adapter.d.mts +14 -0
  148. package/dist/db/internal-adapter.mjs +951 -0
  149. package/dist/db/revoke-unproven-account-access.d.mts +21 -0
  150. package/dist/db/revoke-unproven-account-access.mjs +58 -0
  151. package/dist/db/schema.d.mts +62 -0
  152. package/dist/db/schema.mjs +161 -0
  153. package/dist/db/to-zod.d.mts +35 -0
  154. package/dist/db/to-zod.mjs +23 -0
  155. package/dist/db/verification-token-storage.mjs +25 -0
  156. package/dist/db/with-hooks.d.mts +37 -0
  157. package/dist/db/with-hooks.mjs +255 -0
  158. package/dist/index.d.mts +30 -0
  159. package/dist/index.mjs +17 -0
  160. package/dist/integrations/cookie-plugin-guard.mjs +18 -0
  161. package/dist/integrations/next-js.d.mts +29 -0
  162. package/dist/integrations/next-js.mjs +105 -0
  163. package/dist/integrations/node.d.mts +11 -0
  164. package/dist/integrations/node.mjs +13 -0
  165. package/dist/integrations/solid-start.d.mts +22 -0
  166. package/dist/integrations/solid-start.mjs +15 -0
  167. package/dist/integrations/svelte-kit.d.mts +38 -0
  168. package/dist/integrations/svelte-kit.mjs +57 -0
  169. package/dist/integrations/tanstack-start-solid.d.mts +33 -0
  170. package/dist/integrations/tanstack-start-solid.mjs +57 -0
  171. package/dist/integrations/tanstack-start.d.mts +33 -0
  172. package/dist/integrations/tanstack-start.mjs +57 -0
  173. package/dist/oauth2/account-key.mjs +43 -0
  174. package/dist/oauth2/errors.mjs +49 -0
  175. package/dist/oauth2/index.d.mts +5 -0
  176. package/dist/oauth2/index.mjs +5 -0
  177. package/dist/oauth2/link-account.d.mts +96 -0
  178. package/dist/oauth2/link-account.mjs +329 -0
  179. package/dist/oauth2/state.d.mts +54 -0
  180. package/dist/oauth2/state.mjs +67 -0
  181. package/dist/oauth2/utils.d.mts +11 -0
  182. package/dist/oauth2/utils.mjs +33 -0
  183. package/dist/package.mjs +4 -0
  184. package/dist/plugins/access/access.d.mts +17 -0
  185. package/dist/plugins/access/access.mjs +78 -0
  186. package/dist/plugins/access/index.d.mts +3 -0
  187. package/dist/plugins/access/index.mjs +2 -0
  188. package/dist/plugins/access/types.d.mts +24 -0
  189. package/dist/plugins/additional-fields/client.d.mts +100 -0
  190. package/dist/plugins/additional-fields/client.mjs +11 -0
  191. package/dist/plugins/admin/access/index.d.mts +2 -0
  192. package/dist/plugins/admin/access/index.mjs +2 -0
  193. package/dist/plugins/admin/access/statement.d.mts +51 -0
  194. package/dist/plugins/admin/access/statement.mjs +52 -0
  195. package/dist/plugins/admin/admin.d.mts +911 -0
  196. package/dist/plugins/admin/admin.mjs +89 -0
  197. package/dist/plugins/admin/client.d.mts +81 -0
  198. package/dist/plugins/admin/client.mjs +39 -0
  199. package/dist/plugins/admin/error-codes.d.mts +30 -0
  200. package/dist/plugins/admin/error-codes.mjs +29 -0
  201. package/dist/plugins/admin/has-permission.mjs +12 -0
  202. package/dist/plugins/admin/index.d.mts +3 -0
  203. package/dist/plugins/admin/index.mjs +2 -0
  204. package/dist/plugins/admin/routes.mjs +919 -0
  205. package/dist/plugins/admin/schema.d.mts +40 -0
  206. package/dist/plugins/admin/schema.mjs +33 -0
  207. package/dist/plugins/admin/types.d.mts +88 -0
  208. package/dist/plugins/anonymous/client.d.mts +32 -0
  209. package/dist/plugins/anonymous/client.mjs +21 -0
  210. package/dist/plugins/anonymous/error-codes.d.mts +15 -0
  211. package/dist/plugins/anonymous/error-codes.mjs +14 -0
  212. package/dist/plugins/anonymous/index.d.mts +175 -0
  213. package/dist/plugins/anonymous/index.mjs +219 -0
  214. package/dist/plugins/anonymous/schema.d.mts +15 -0
  215. package/dist/plugins/anonymous/schema.mjs +9 -0
  216. package/dist/plugins/anonymous/types.d.mts +65 -0
  217. package/dist/plugins/bearer/index.d.mts +45 -0
  218. package/dist/plugins/bearer/index.mjs +74 -0
  219. package/dist/plugins/captcha/constants.d.mts +9 -0
  220. package/dist/plugins/captcha/constants.mjs +27 -0
  221. package/dist/plugins/captcha/error-codes.mjs +13 -0
  222. package/dist/plugins/captcha/index.d.mts +27 -0
  223. package/dist/plugins/captcha/index.mjs +79 -0
  224. package/dist/plugins/captcha/types.d.mts +52 -0
  225. package/dist/plugins/captcha/utils.mjs +9 -0
  226. package/dist/plugins/captcha/verify-handlers/captchafox.mjs +27 -0
  227. package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +47 -0
  228. package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +32 -0
  229. package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +27 -0
  230. package/dist/plugins/custom-session/client.d.mts +17 -0
  231. package/dist/plugins/custom-session/client.mjs +7 -0
  232. package/dist/plugins/custom-session/index.d.mts +73 -0
  233. package/dist/plugins/custom-session/index.mjs +65 -0
  234. package/dist/plugins/device-authorization/client.d.mts +17 -0
  235. package/dist/plugins/device-authorization/client.mjs +18 -0
  236. package/dist/plugins/device-authorization/error-codes.mjs +19 -0
  237. package/dist/plugins/device-authorization/index.d.mts +558 -0
  238. package/dist/plugins/device-authorization/index.mjs +87 -0
  239. package/dist/plugins/device-authorization/routes.d.mts +32 -0
  240. package/dist/plugins/device-authorization/routes.mjs +725 -0
  241. package/dist/plugins/device-authorization/schema.d.mts +18 -0
  242. package/dist/plugins/device-authorization/schema.mjs +63 -0
  243. package/dist/plugins/email-otp/client.d.mts +21 -0
  244. package/dist/plugins/email-otp/client.mjs +17 -0
  245. package/dist/plugins/email-otp/error-codes.d.mts +10 -0
  246. package/dist/plugins/email-otp/error-codes.mjs +9 -0
  247. package/dist/plugins/email-otp/index.d.mts +551 -0
  248. package/dist/plugins/email-otp/index.mjs +145 -0
  249. package/dist/plugins/email-otp/otp-token.mjs +55 -0
  250. package/dist/plugins/email-otp/routes.mjs +784 -0
  251. package/dist/plugins/email-otp/types.d.mts +109 -0
  252. package/dist/plugins/email-otp/utils.mjs +17 -0
  253. package/dist/plugins/generic-oauth/error-codes.mjs +8 -0
  254. package/dist/plugins/generic-oauth/index.d.mts +52 -0
  255. package/dist/plugins/generic-oauth/index.mjs +279 -0
  256. package/dist/plugins/generic-oauth/providers/auth0.d.mts +36 -0
  257. package/dist/plugins/generic-oauth/providers/auth0.mjs +49 -0
  258. package/dist/plugins/generic-oauth/providers/gumroad.d.mts +31 -0
  259. package/dist/plugins/generic-oauth/providers/gumroad.mjs +62 -0
  260. package/dist/plugins/generic-oauth/providers/hubspot.d.mts +36 -0
  261. package/dist/plugins/generic-oauth/providers/hubspot.mjs +62 -0
  262. package/dist/plugins/generic-oauth/providers/index.d.mts +10 -0
  263. package/dist/plugins/generic-oauth/providers/keycloak.d.mts +36 -0
  264. package/dist/plugins/generic-oauth/providers/keycloak.mjs +47 -0
  265. package/dist/plugins/generic-oauth/providers/line.d.mts +54 -0
  266. package/dist/plugins/generic-oauth/providers/line.mjs +93 -0
  267. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +39 -0
  268. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +104 -0
  269. package/dist/plugins/generic-oauth/providers/okta.d.mts +36 -0
  270. package/dist/plugins/generic-oauth/providers/okta.mjs +47 -0
  271. package/dist/plugins/generic-oauth/providers/patreon.d.mts +29 -0
  272. package/dist/plugins/generic-oauth/providers/patreon.mjs +61 -0
  273. package/dist/plugins/generic-oauth/providers/slack.d.mts +29 -0
  274. package/dist/plugins/generic-oauth/providers/slack.mjs +63 -0
  275. package/dist/plugins/generic-oauth/providers/yandex.d.mts +29 -0
  276. package/dist/plugins/generic-oauth/providers/yandex.mjs +67 -0
  277. package/dist/plugins/generic-oauth/types.d.mts +268 -0
  278. package/dist/plugins/haveibeenpwned/index.d.mts +63 -0
  279. package/dist/plugins/haveibeenpwned/index.mjs +81 -0
  280. package/dist/plugins/index.d.mts +69 -0
  281. package/dist/plugins/index.mjs +49 -0
  282. package/dist/plugins/jwt/adapter.mjs +68 -0
  283. package/dist/plugins/jwt/client.d.mts +41 -0
  284. package/dist/plugins/jwt/client.mjs +19 -0
  285. package/dist/plugins/jwt/cookie-cache.mjs +77 -0
  286. package/dist/plugins/jwt/index.d.mts +246 -0
  287. package/dist/plugins/jwt/index.mjs +214 -0
  288. package/dist/plugins/jwt/schema.d.mts +33 -0
  289. package/dist/plugins/jwt/schema.mjs +29 -0
  290. package/dist/plugins/jwt/sign.d.mts +128 -0
  291. package/dist/plugins/jwt/sign.mjs +130 -0
  292. package/dist/plugins/jwt/types.d.mts +256 -0
  293. package/dist/plugins/jwt/utils.d.mts +41 -0
  294. package/dist/plugins/jwt/utils.mjs +64 -0
  295. package/dist/plugins/jwt/verify.d.mts +11 -0
  296. package/dist/plugins/jwt/verify.mjs +45 -0
  297. package/dist/plugins/last-login-method/client.d.mts +48 -0
  298. package/dist/plugins/last-login-method/client.mjs +48 -0
  299. package/dist/plugins/last-login-method/index.d.mts +127 -0
  300. package/dist/plugins/last-login-method/index.mjs +98 -0
  301. package/dist/plugins/magic-link/client.d.mts +10 -0
  302. package/dist/plugins/magic-link/client.mjs +11 -0
  303. package/dist/plugins/magic-link/index.d.mts +213 -0
  304. package/dist/plugins/magic-link/index.mjs +208 -0
  305. package/dist/plugins/magic-link/utils.mjs +9 -0
  306. package/dist/plugins/multi-session/client.d.mts +19 -0
  307. package/dist/plugins/multi-session/client.mjs +19 -0
  308. package/dist/plugins/multi-session/error-codes.d.mts +8 -0
  309. package/dist/plugins/multi-session/error-codes.mjs +5 -0
  310. package/dist/plugins/multi-session/index.d.mts +212 -0
  311. package/dist/plugins/multi-session/index.mjs +217 -0
  312. package/dist/plugins/oauth-popup/client.d.mts +82 -0
  313. package/dist/plugins/oauth-popup/client.mjs +203 -0
  314. package/dist/plugins/oauth-popup/constants.d.mts +11 -0
  315. package/dist/plugins/oauth-popup/constants.mjs +11 -0
  316. package/dist/plugins/oauth-popup/error-codes.d.mts +11 -0
  317. package/dist/plugins/oauth-popup/error-codes.mjs +10 -0
  318. package/dist/plugins/oauth-popup/index.d.mts +67 -0
  319. package/dist/plugins/oauth-popup/index.mjs +232 -0
  320. package/dist/plugins/oauth-popup/types.d.mts +30 -0
  321. package/dist/plugins/oauth-proxy/index.d.mts +130 -0
  322. package/dist/plugins/oauth-proxy/index.mjs +407 -0
  323. package/dist/plugins/oauth-proxy/utils.mjs +55 -0
  324. package/dist/plugins/one-tap/client.d.mts +174 -0
  325. package/dist/plugins/one-tap/client.mjs +208 -0
  326. package/dist/plugins/one-tap/index.d.mts +82 -0
  327. package/dist/plugins/one-tap/index.mjs +100 -0
  328. package/dist/plugins/one-time-token/client.d.mts +10 -0
  329. package/dist/plugins/one-time-token/client.mjs +11 -0
  330. package/dist/plugins/one-time-token/index.d.mts +132 -0
  331. package/dist/plugins/one-time-token/index.mjs +107 -0
  332. package/dist/plugins/one-time-token/utils.mjs +9 -0
  333. package/dist/plugins/open-api/generator.d.mts +126 -0
  334. package/dist/plugins/open-api/generator.mjs +557 -0
  335. package/dist/plugins/open-api/index.d.mts +97 -0
  336. package/dist/plugins/open-api/index.mjs +65 -0
  337. package/dist/plugins/open-api/logo.mjs +13 -0
  338. package/dist/plugins/organization/access/index.d.mts +2 -0
  339. package/dist/plugins/organization/access/index.mjs +2 -0
  340. package/dist/plugins/organization/access/statement.d.mts +113 -0
  341. package/dist/plugins/organization/access/statement.mjs +77 -0
  342. package/dist/plugins/organization/adapter.d.mts +815 -0
  343. package/dist/plugins/organization/adapter.mjs +813 -0
  344. package/dist/plugins/organization/call.mjs +15 -0
  345. package/dist/plugins/organization/client.d.mts +375 -0
  346. package/dist/plugins/organization/client.mjs +104 -0
  347. package/dist/plugins/organization/error-codes.d.mts +66 -0
  348. package/dist/plugins/organization/error-codes.mjs +65 -0
  349. package/dist/plugins/organization/has-permission.d.mts +17 -0
  350. package/dist/plugins/organization/has-permission.mjs +34 -0
  351. package/dist/plugins/organization/index.d.mts +6 -0
  352. package/dist/plugins/organization/index.mjs +4 -0
  353. package/dist/plugins/organization/organization.d.mts +420 -0
  354. package/dist/plugins/organization/organization.mjs +886 -0
  355. package/dist/plugins/organization/permission.d.mts +15 -0
  356. package/dist/plugins/organization/permission.mjs +14 -0
  357. package/dist/plugins/organization/routes/crud-access-control.d.mts +511 -0
  358. package/dist/plugins/organization/routes/crud-access-control.mjs +674 -0
  359. package/dist/plugins/organization/routes/crud-invites.d.mts +1154 -0
  360. package/dist/plugins/organization/routes/crud-invites.mjs +602 -0
  361. package/dist/plugins/organization/routes/crud-members.d.mts +1057 -0
  362. package/dist/plugins/organization/routes/crud-members.mjs +518 -0
  363. package/dist/plugins/organization/routes/crud-org.d.mts +918 -0
  364. package/dist/plugins/organization/routes/crud-org.mjs +455 -0
  365. package/dist/plugins/organization/routes/crud-team.d.mts +1238 -0
  366. package/dist/plugins/organization/routes/crud-team.mjs +766 -0
  367. package/dist/plugins/organization/schema.d.mts +390 -0
  368. package/dist/plugins/organization/schema.mjs +65 -0
  369. package/dist/plugins/organization/types.d.mts +691 -0
  370. package/dist/plugins/phone-number/client.d.mts +31 -0
  371. package/dist/plugins/phone-number/client.mjs +19 -0
  372. package/dist/plugins/phone-number/error-codes.d.mts +19 -0
  373. package/dist/plugins/phone-number/error-codes.mjs +18 -0
  374. package/dist/plugins/phone-number/index.d.mts +360 -0
  375. package/dist/plugins/phone-number/index.mjs +57 -0
  376. package/dist/plugins/phone-number/routes.mjs +529 -0
  377. package/dist/plugins/phone-number/schema.d.mts +22 -0
  378. package/dist/plugins/phone-number/schema.mjs +18 -0
  379. package/dist/plugins/phone-number/types.d.mts +116 -0
  380. package/dist/plugins/siwe/client.d.mts +14 -0
  381. package/dist/plugins/siwe/client.mjs +15 -0
  382. package/dist/plugins/siwe/index.d.mts +62 -0
  383. package/dist/plugins/siwe/index.mjs +272 -0
  384. package/dist/plugins/siwe/parse-message.mjs +60 -0
  385. package/dist/plugins/siwe/schema.d.mts +35 -0
  386. package/dist/plugins/siwe/schema.mjs +30 -0
  387. package/dist/plugins/siwe/types.d.mts +43 -0
  388. package/dist/plugins/test-utils/auth-helpers.mjs +33 -0
  389. package/dist/plugins/test-utils/cookie-builder.mjs +55 -0
  390. package/dist/plugins/test-utils/db-helpers.mjs +65 -0
  391. package/dist/plugins/test-utils/factories.mjs +38 -0
  392. package/dist/plugins/test-utils/index.d.mts +73 -0
  393. package/dist/plugins/test-utils/index.mjs +97 -0
  394. package/dist/plugins/test-utils/otp-sink.mjs +21 -0
  395. package/dist/plugins/test-utils/types.d.mts +51 -0
  396. package/dist/plugins/two-factor/backup-codes/index.d.mts +291 -0
  397. package/dist/plugins/two-factor/backup-codes/index.mjs +341 -0
  398. package/dist/plugins/two-factor/client.d.mts +76 -0
  399. package/dist/plugins/two-factor/client.mjs +41 -0
  400. package/dist/plugins/two-factor/constant.mjs +6 -0
  401. package/dist/plugins/two-factor/error-code.d.mts +20 -0
  402. package/dist/plugins/two-factor/error-code.mjs +19 -0
  403. package/dist/plugins/two-factor/index.d.mts +720 -0
  404. package/dist/plugins/two-factor/index.mjs +349 -0
  405. package/dist/plugins/two-factor/otp/index.d.mts +216 -0
  406. package/dist/plugins/two-factor/otp/index.mjs +252 -0
  407. package/dist/plugins/two-factor/schema.d.mts +59 -0
  408. package/dist/plugins/two-factor/schema.mjs +53 -0
  409. package/dist/plugins/two-factor/totp/index.d.mts +219 -0
  410. package/dist/plugins/two-factor/totp/index.mjs +230 -0
  411. package/dist/plugins/two-factor/types.d.mts +111 -0
  412. package/dist/plugins/two-factor/utils.mjs +9 -0
  413. package/dist/plugins/two-factor/verify-two-factor.mjs +205 -0
  414. package/dist/plugins/username/client.d.mts +38 -0
  415. package/dist/plugins/username/client.mjs +17 -0
  416. package/dist/plugins/username/error-codes.d.mts +16 -0
  417. package/dist/plugins/username/error-codes.mjs +15 -0
  418. package/dist/plugins/username/index.d.mts +326 -0
  419. package/dist/plugins/username/index.mjs +312 -0
  420. package/dist/plugins/username/schema.d.mts +50 -0
  421. package/dist/plugins/username/schema.mjs +25 -0
  422. package/dist/social-providers/index.d.mts +1 -0
  423. package/dist/social-providers/index.mjs +2 -0
  424. package/dist/state.d.mts +48 -0
  425. package/dist/state.mjs +149 -0
  426. package/dist/test-utils/headers.d.mts +8 -0
  427. package/dist/test-utils/headers.mjs +17 -0
  428. package/dist/test-utils/http-test-instance.d.mts +413 -0
  429. package/dist/test-utils/http-test-instance.mjs +107 -0
  430. package/dist/test-utils/index.d.mts +4 -0
  431. package/dist/test-utils/index.mjs +4 -0
  432. package/dist/test-utils/test-instance.d.mts +56 -0
  433. package/dist/test-utils/test-instance.mjs +242 -0
  434. package/dist/types/adapter.d.mts +2 -0
  435. package/dist/types/api.d.mts +28 -0
  436. package/dist/types/auth.d.mts +32 -0
  437. package/dist/types/helper.d.mts +26 -0
  438. package/dist/types/index.d.mts +10 -0
  439. package/dist/types/index.mjs +1 -0
  440. package/dist/types/models.d.mts +10 -0
  441. package/dist/types/plugins.d.mts +19 -0
  442. package/dist/utils/boolean.mjs +6 -0
  443. package/dist/utils/constants.mjs +4 -0
  444. package/dist/utils/date.mjs +6 -0
  445. package/dist/utils/hashing.mjs +18 -0
  446. package/dist/utils/hide-metadata.d.mts +6 -0
  447. package/dist/utils/hide-metadata.mjs +4 -0
  448. package/dist/utils/index.d.mts +4 -0
  449. package/dist/utils/is-api-error.d.mts +2 -0
  450. package/dist/utils/is-api-error.mjs +2 -0
  451. package/dist/utils/is-atom.mjs +6 -0
  452. package/dist/utils/is-promise.mjs +6 -0
  453. package/dist/utils/middleware-response.mjs +7 -0
  454. package/dist/utils/password.mjs +32 -0
  455. package/dist/utils/plugin-helper.mjs +14 -0
  456. package/dist/utils/request.mjs +23 -0
  457. package/dist/utils/shim.mjs +22 -0
  458. package/dist/utils/time.d.mts +48 -0
  459. package/dist/utils/time.mjs +98 -0
  460. package/dist/utils/url.d.mts +78 -0
  461. package/dist/utils/url.mjs +238 -0
  462. package/dist/utils/validate-user-info.mjs +44 -0
  463. package/dist/utils/wildcard.mjs +106 -0
  464. package/dist/version.mjs +5 -0
  465. package/package.json +595 -3
@@ -0,0 +1,557 @@
1
+ import { db_exports } from "../../db/index.mjs";
2
+ import { getEndpoints } from "../../api/index.mjs";
3
+ import * as z from "zod";
4
+ //#region src/plugins/open-api/generator.ts
5
+ const OPEN_API_SCHEMA_TYPES = new Set([
6
+ "string",
7
+ "number",
8
+ "boolean",
9
+ "array",
10
+ "object"
11
+ ]);
12
+ function getOpenApiTypeFromZodType(zodType) {
13
+ if (zodType instanceof z.ZodDefault || zodType instanceof z.ZodPrefault) return getOpenApiTypeFromZodType(unwrapZodSchema(zodType));
14
+ const type = zodType.type;
15
+ return OPEN_API_SCHEMA_TYPES.has(type) ? type : "string";
16
+ }
17
+ function getFieldSchema(field) {
18
+ const arrayMatch = typeof field.type === "string" ? /^(string|number)\[\]$/.exec(field.type) : null;
19
+ const schema = arrayMatch ? {
20
+ type: "array",
21
+ items: { type: arrayMatch[1] }
22
+ } : {
23
+ type: field.type === "date" ? "string" : field.type,
24
+ ...field.type === "date" && { format: "date-time" }
25
+ };
26
+ if (field.defaultValue !== void 0) {
27
+ if (typeof field.defaultValue !== "function") schema.default = field.defaultValue;
28
+ }
29
+ if (field.input === false) schema.readOnly = true;
30
+ return schema;
31
+ }
32
+ function asZodSchema(schema) {
33
+ return schema;
34
+ }
35
+ function unwrapZodSchema(zodType) {
36
+ return asZodSchema(zodType.unwrap());
37
+ }
38
+ function getZodDef(zodType) {
39
+ return zodType._def;
40
+ }
41
+ function getZodDescription(zodType) {
42
+ return zodType.description;
43
+ }
44
+ function withDescription(schema, zodType) {
45
+ const description = getZodDescription(zodType);
46
+ return description ? {
47
+ ...schema,
48
+ description
49
+ } : schema;
50
+ }
51
+ function addNullType(schema) {
52
+ if (schema.type) {
53
+ const type = Array.isArray(schema.type) ? schema.type : [schema.type];
54
+ const nullableType = Array.from(new Set([...type, "null"]));
55
+ return {
56
+ ...schema,
57
+ type: nullableType
58
+ };
59
+ }
60
+ return { anyOf: [schema, { type: "null" }] };
61
+ }
62
+ function getZodStringSchemaConstraints(zodType) {
63
+ const minLength = zodType.minLength;
64
+ const maxLength = zodType.maxLength;
65
+ return {
66
+ ...typeof minLength === "number" ? { minLength } : {},
67
+ ...typeof maxLength === "number" ? { maxLength } : {}
68
+ };
69
+ }
70
+ function getZodPipeSchema(zodType) {
71
+ const def = getZodDef(zodType);
72
+ return def.in instanceof z.ZodTransform && def.out instanceof z.ZodType ? def.out : def.in;
73
+ }
74
+ function getParameters(options) {
75
+ const parameters = [];
76
+ if (options.metadata?.openapi?.parameters) parameters.push(...options.metadata.openapi.parameters);
77
+ if (!options.metadata?.openapi?.parameters && options.query instanceof z.ZodObject) Object.entries(options.query.shape).forEach(([key, value]) => {
78
+ if (value instanceof z.ZodType) {
79
+ const parameterSchema = toOpenApiSchema(value);
80
+ parameters.push({
81
+ name: key,
82
+ in: "query",
83
+ schema: parameterSchema
84
+ });
85
+ }
86
+ });
87
+ return parameters;
88
+ }
89
+ function getPathParameters(path, parameters) {
90
+ const existingParameters = new Set(parameters.map((parameter) => `${parameter.in}:${parameter.name}`));
91
+ return path.split("/").filter((part) => part.startsWith(":")).map((part) => part.slice(1)).filter((name) => !existingParameters.has(`path:${name}`)).map((name) => ({
92
+ name,
93
+ in: "path",
94
+ required: true,
95
+ schema: { type: "string" }
96
+ }));
97
+ }
98
+ function getRequestBodySchemaInfo(zodType) {
99
+ return {
100
+ required: !schemaAcceptsUndefined(zodType),
101
+ schema: zodType
102
+ };
103
+ }
104
+ function schemaAcceptsUndefined(zodType) {
105
+ if (zodType instanceof z.ZodOptional || zodType instanceof z.ZodDefault || zodType instanceof z.ZodPrefault || zodType instanceof z.ZodCatch || zodType instanceof z.ZodAny || zodType instanceof z.ZodUnknown || zodType instanceof z.ZodUndefined || zodType instanceof z.ZodVoid) return true;
106
+ if (zodType instanceof z.ZodNonOptional) return false;
107
+ if (zodType instanceof z.ZodNullable || zodType instanceof z.ZodReadonly) return schemaAcceptsUndefined(unwrapZodSchema(zodType));
108
+ if (zodType instanceof z.ZodPipe) return schemaAcceptsUndefined(getZodPipeSchema(zodType));
109
+ if (zodType instanceof z.ZodUnion) return getZodDef(zodType).options.some((option) => schemaAcceptsUndefined(option));
110
+ if (zodType instanceof z.ZodIntersection) {
111
+ const def = getZodDef(zodType);
112
+ return schemaAcceptsUndefined(def.left) && schemaAcceptsUndefined(def.right);
113
+ }
114
+ return false;
115
+ }
116
+ /**
117
+ * Resolve input optionality exactly as Zod's JSON Schema emitter does.
118
+ *
119
+ * @see https://github.com/colinhacks/zod/blob/v4.5.4/packages/zod/src/v4/core/json-schema-processors.ts#L294-L308
120
+ */
121
+ function getZodInputOptionality(zodType) {
122
+ const def = zodType._zod.def;
123
+ if (def.type === "pipe") {
124
+ const pipeDef = def;
125
+ if (pipeDef.in._zod.traits.has("$ZodTransform")) return getZodInputOptionality(pipeDef.out);
126
+ }
127
+ if (def.type === "catch") return getZodInputOptionality(def.innerType);
128
+ return zodType._zod.optin;
129
+ }
130
+ function isUndefinedOnlySchema(zodType) {
131
+ return zodType instanceof z.ZodUndefined || zodType instanceof z.ZodVoid;
132
+ }
133
+ function isMergeableObjectSchema(schema) {
134
+ const type = schema?.type;
135
+ return !!schema && (type === "object" || Array.isArray(type) && type.includes("object")) && schema.$ref === void 0 && schema.allOf === void 0 && schema.anyOf === void 0;
136
+ }
137
+ function schemaAllowsNull(schema) {
138
+ const type = schema?.type;
139
+ return Array.isArray(type) && type.includes("null");
140
+ }
141
+ function areSchemasEqual(left, right) {
142
+ return JSON.stringify(left) === JSON.stringify(right);
143
+ }
144
+ function areSchemaMembersCompatible(left, right) {
145
+ if (left === void 0 || right === void 0) return true;
146
+ if (typeof left === "boolean" || typeof right === "boolean") return left === right;
147
+ return areSchemasEqual(left, right);
148
+ }
149
+ function mergeObjectSchemas(left, right, description) {
150
+ const properties = { ...left.properties || {} };
151
+ for (const [key, value] of Object.entries(right.properties || {})) {
152
+ if (properties[key] !== void 0 && !areSchemasEqual(properties[key], value)) return;
153
+ properties[key] = value;
154
+ }
155
+ const required = Array.from(new Set([...left.required || [], ...right.required || []]));
156
+ const leftAdditionalProperties = left.additionalProperties;
157
+ const rightAdditionalProperties = right.additionalProperties;
158
+ if (!areSchemaMembersCompatible(leftAdditionalProperties, rightAdditionalProperties)) return;
159
+ const leftPropertyNames = left.propertyNames;
160
+ const rightPropertyNames = right.propertyNames;
161
+ if (!areSchemaMembersCompatible(leftPropertyNames, rightPropertyNames)) return;
162
+ const additionalProperties = leftAdditionalProperties ?? rightAdditionalProperties;
163
+ const propertyNames = leftPropertyNames ?? rightPropertyNames;
164
+ return {
165
+ type: schemaAllowsNull(left) && schemaAllowsNull(right) ? ["object", "null"] : "object",
166
+ ...Object.keys(properties).length > 0 ? { properties } : {},
167
+ ...required.length > 0 ? { required } : {},
168
+ ...additionalProperties !== void 0 ? { additionalProperties } : {},
169
+ ...propertyNames !== void 0 ? { propertyNames } : {},
170
+ ...description ?? left.description ?? right.description ? { description: description ?? left.description ?? right.description } : {}
171
+ };
172
+ }
173
+ function getRequestBody(options) {
174
+ if (options.metadata?.openapi?.requestBody) return options.metadata.openapi.requestBody;
175
+ if (!options.body) return void 0;
176
+ const requestBodySchemaInfo = getRequestBodySchemaInfo(options.body);
177
+ const schema = toOpenApiSchema(requestBodySchemaInfo.schema);
178
+ return {
179
+ required: requestBodySchemaInfo.required,
180
+ content: { "application/json": { schema } }
181
+ };
182
+ }
183
+ /**
184
+ * Paths that accept `user.additionalFields` and plugin user schema fields via
185
+ * `parseUserInput`. Their static OpenAPI request bodies need those fields merged in.
186
+ */
187
+ const USER_INPUT_BODY_PATHS = new Set(["/sign-up/email", "/update-user"]);
188
+ function dbFieldToRequestBodyProperty(field) {
189
+ if (field.type === "date") return {
190
+ type: "string",
191
+ format: "date-time"
192
+ };
193
+ if (field.type === "json") return {};
194
+ if (field.type === "string[]") return {
195
+ type: "array",
196
+ items: { type: "string" }
197
+ };
198
+ if (field.type === "number[]") return {
199
+ type: "array",
200
+ items: { type: "number" }
201
+ };
202
+ if (Array.isArray(field.type)) return {
203
+ type: "string",
204
+ enum: field.type
205
+ };
206
+ const schema = { type: field.type };
207
+ if (field.defaultValue !== void 0 && typeof field.defaultValue !== "function") schema.default = field.defaultValue;
208
+ return schema;
209
+ }
210
+ /**
211
+ * Collect client-writable user fields from `user.additionalFields` and plugin
212
+ * schemas. Mirrors `getFields(..., "input")` used by `parseUserInput`.
213
+ */
214
+ function getUserInputRequestBodyFields(options) {
215
+ let fields = { ...options.user?.additionalFields ?? {} };
216
+ for (const plugin of options.plugins || []) {
217
+ const pluginUserFields = plugin.schema?.user?.fields;
218
+ if (pluginUserFields) fields = {
219
+ ...fields,
220
+ ...pluginUserFields
221
+ };
222
+ }
223
+ const properties = {};
224
+ const required = [];
225
+ for (const [key, field] of Object.entries(fields)) {
226
+ if (!field || field.input === false) continue;
227
+ properties[key] = dbFieldToRequestBodyProperty(field);
228
+ if (field.required === true && field.defaultValue === void 0) required.push(key);
229
+ }
230
+ return {
231
+ properties,
232
+ required
233
+ };
234
+ }
235
+ function applyUserInputFieldsToRequestBody(path, requestBody, options) {
236
+ if (!USER_INPUT_BODY_PATHS.has(path)) return requestBody;
237
+ const { properties: inputProperties, required: inputRequired } = getUserInputRequestBodyFields(options);
238
+ if (Object.keys(inputProperties).length === 0) return requestBody;
239
+ const existingSchema = requestBody?.content?.["application/json"]?.schema;
240
+ const properties = { ...existingSchema?.properties ?? {} };
241
+ for (const [key, value] of Object.entries(inputProperties)) if (properties[key] === void 0) properties[key] = value;
242
+ const required = new Set(existingSchema?.required ?? []);
243
+ if (path === "/sign-up/email") {
244
+ for (const key of inputRequired) if (properties[key] !== void 0) required.add(key);
245
+ }
246
+ return {
247
+ ...requestBody,
248
+ content: { "application/json": { schema: {
249
+ ...existingSchema ?? {},
250
+ type: existingSchema?.type ?? "object",
251
+ properties,
252
+ ...required.size > 0 ? { required: Array.from(required) } : {}
253
+ } } }
254
+ };
255
+ }
256
+ function toOpenApiSchema(zodType) {
257
+ if (zodType instanceof z.ZodOptional) return toOpenApiSchema(unwrapZodSchema(zodType));
258
+ if (zodType instanceof z.ZodNullable) return addNullType(toOpenApiSchema(unwrapZodSchema(zodType)));
259
+ if (zodType instanceof z.ZodDefault || zodType instanceof z.ZodPrefault || zodType instanceof z.ZodNonOptional) return toOpenApiSchema(unwrapZodSchema(zodType));
260
+ if (zodType instanceof z.ZodAny || zodType instanceof z.ZodUnknown) return withDescription({}, zodType);
261
+ if (zodType instanceof z.ZodObject) {
262
+ const shape = zodType.shape;
263
+ if (shape) {
264
+ const properties = {};
265
+ const required = [];
266
+ Object.entries(shape).forEach(([key, value]) => {
267
+ if (value instanceof z.ZodType) {
268
+ properties[key] = toOpenApiSchema(value);
269
+ if (getZodInputOptionality(value) === void 0) required.push(key);
270
+ }
271
+ });
272
+ return withDescription({
273
+ type: "object",
274
+ properties,
275
+ ...required.length > 0 ? { required } : {}
276
+ }, zodType);
277
+ }
278
+ }
279
+ if (zodType instanceof z.ZodRecord) {
280
+ const def = getZodDef(zodType);
281
+ return withDescription({
282
+ type: "object",
283
+ propertyNames: toOpenApiSchema(def.keyType),
284
+ additionalProperties: toOpenApiSchema(def.valueType)
285
+ }, zodType);
286
+ }
287
+ if (zodType instanceof z.ZodIntersection) {
288
+ const def = getZodDef(zodType);
289
+ const leftSchema = toOpenApiSchema(def.left);
290
+ const rightSchema = toOpenApiSchema(def.right);
291
+ if (isMergeableObjectSchema(leftSchema) && isMergeableObjectSchema(rightSchema)) {
292
+ const mergedSchema = mergeObjectSchemas(leftSchema, rightSchema, getZodDescription(zodType));
293
+ if (mergedSchema) return mergedSchema;
294
+ }
295
+ return withDescription({ allOf: [leftSchema, rightSchema] }, zodType);
296
+ }
297
+ if (zodType instanceof z.ZodUnion) {
298
+ const def = getZodDef(zodType);
299
+ const schemas = def.options.filter((option) => !isUndefinedOnlySchema(option)).map((option) => toOpenApiSchema(option));
300
+ if (schemas.length === 0) return withDescription({}, zodType);
301
+ if (schemas.length === 1) {
302
+ const schema = schemas[0];
303
+ if (!schema) return withDescription({}, zodType);
304
+ return withDescription(schema, zodType);
305
+ }
306
+ return withDescription(def.inclusive === false ? { oneOf: schemas } : { anyOf: schemas }, zodType);
307
+ }
308
+ if (zodType instanceof z.ZodArray) return withDescription({
309
+ type: "array",
310
+ items: toOpenApiSchema(getZodDef(zodType).element)
311
+ }, zodType);
312
+ if (zodType instanceof z.ZodLiteral) return withDescription({ enum: Array.from(zodType.values) }, zodType);
313
+ if (zodType instanceof z.ZodEnum) return withDescription({
314
+ type: "string",
315
+ enum: zodType.options
316
+ }, zodType);
317
+ if (zodType instanceof z.ZodPipe) return withDescription(toOpenApiSchema(getZodPipeSchema(zodType)), zodType);
318
+ if (zodType instanceof z.ZodCatch || zodType instanceof z.ZodReadonly) return withDescription(toOpenApiSchema(getZodDef(zodType).innerType), zodType);
319
+ if (zodType instanceof z.ZodNull) return withDescription({ type: "null" }, zodType);
320
+ if (zodType instanceof z.ZodUndefined) return withDescription({}, zodType);
321
+ if (zodType instanceof z.ZodVoid) return withDescription({}, zodType);
322
+ return withDescription({
323
+ type: getOpenApiTypeFromZodType(zodType),
324
+ ...zodType instanceof z.ZodString ? getZodStringSchemaConstraints(zodType) : {}
325
+ }, zodType);
326
+ }
327
+ function getResponse(responses) {
328
+ return {
329
+ "400": {
330
+ content: { "application/json": { schema: {
331
+ type: "object",
332
+ properties: { message: { type: "string" } },
333
+ required: ["message"]
334
+ } } },
335
+ description: "Bad Request. Usually due to missing parameters, or invalid parameters."
336
+ },
337
+ "401": {
338
+ content: { "application/json": { schema: {
339
+ type: "object",
340
+ properties: { message: { type: "string" } },
341
+ required: ["message"]
342
+ } } },
343
+ description: "Unauthorized. Due to missing or invalid authentication."
344
+ },
345
+ "403": {
346
+ content: { "application/json": { schema: {
347
+ type: "object",
348
+ properties: { message: { type: "string" } }
349
+ } } },
350
+ description: "Forbidden. You do not have permission to access this resource or to perform this action."
351
+ },
352
+ "404": {
353
+ content: { "application/json": { schema: {
354
+ type: "object",
355
+ properties: { message: { type: "string" } }
356
+ } } },
357
+ description: "Not Found. The requested resource was not found."
358
+ },
359
+ "429": {
360
+ content: { "application/json": { schema: {
361
+ type: "object",
362
+ properties: { message: { type: "string" } }
363
+ } } },
364
+ description: "Too Many Requests. You have exceeded the rate limit. Try again later."
365
+ },
366
+ "500": {
367
+ content: { "application/json": { schema: {
368
+ type: "object",
369
+ properties: { message: { type: "string" } }
370
+ } } },
371
+ description: "Internal Server Error. This is a problem with the server that you cannot fix."
372
+ },
373
+ ...responses ? structuredClone(responses) : {}
374
+ };
375
+ }
376
+ function toOpenApiPath(path) {
377
+ return path.split("/").map((part) => part.startsWith(":") ? `{${part.slice(1)}}` : part).join("/");
378
+ }
379
+ function getOperationId(operationId, method, usedOperationIds) {
380
+ if (!operationId) return;
381
+ if (!usedOperationIds.has(operationId)) {
382
+ usedOperationIds.add(operationId);
383
+ return operationId;
384
+ }
385
+ const normalizedMethod = method.toUpperCase();
386
+ const methodSuffix = normalizedMethod.charAt(0) + normalizedMethod.slice(1).toLowerCase();
387
+ let candidate = `${operationId}${methodSuffix}`;
388
+ let duplicateIndex = 2;
389
+ while (usedOperationIds.has(candidate)) {
390
+ candidate = `${operationId}${methodSuffix}${duplicateIndex}`;
391
+ duplicateIndex += 1;
392
+ }
393
+ usedOperationIds.add(candidate);
394
+ return candidate;
395
+ }
396
+ function cloneOpenAPIValue(value) {
397
+ if (Array.isArray(value)) return value.map((item) => cloneOpenAPIValue(item));
398
+ if (value instanceof Date) return new Date(value);
399
+ if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, cloneOpenAPIValue(entry)]));
400
+ return value;
401
+ }
402
+ async function generator(ctx, options) {
403
+ const baseEndpoints = getEndpoints(ctx, {
404
+ ...options,
405
+ plugins: []
406
+ });
407
+ const tables = (0, db_exports.getAuthTables)({
408
+ ...options,
409
+ session: {
410
+ ...options.session,
411
+ storeSessionInDatabase: true
412
+ }
413
+ });
414
+ const components = { schemas: { ...Object.entries(tables).reduce((acc, [key, value]) => {
415
+ const modelName = key.charAt(0).toUpperCase() + key.slice(1);
416
+ const fields = value.fields;
417
+ const required = new Set(["id"]);
418
+ const properties = { id: {
419
+ type: "string",
420
+ readOnly: true
421
+ } };
422
+ Object.entries(fields).forEach(([fieldKey, fieldValue]) => {
423
+ if (!fieldValue) return;
424
+ properties[fieldKey] = getFieldSchema(fieldValue);
425
+ if (fieldValue.required && fieldValue.returned !== false) required.add(fieldKey);
426
+ });
427
+ Object.entries(properties).forEach(([key, prop]) => {
428
+ const field = value.fields[key];
429
+ if (field && field.type === "date" && prop.type === "string") prop.format = "date-time";
430
+ });
431
+ acc[modelName] = {
432
+ type: "object",
433
+ properties,
434
+ required: Array.from(required)
435
+ };
436
+ return acc;
437
+ }, {}) } };
438
+ const paths = {};
439
+ const usedOperationIds = /* @__PURE__ */ new Set();
440
+ Object.entries(baseEndpoints.api).forEach(([_, value]) => {
441
+ if (!value.path || ctx.options.disabledPaths?.includes(value.path)) return;
442
+ const options = value.options;
443
+ if (options.metadata?.SERVER_ONLY) return;
444
+ const path = toOpenApiPath(value.path);
445
+ const operationParameters = getParameters(options);
446
+ const parameters = [...operationParameters, ...getPathParameters(value.path, operationParameters)];
447
+ const methods = Array.isArray(options.method) ? options.method : [options.method];
448
+ for (const method of methods.filter((m) => m === "GET" || m === "DELETE")) paths[path] = {
449
+ ...paths[path],
450
+ [method.toLowerCase()]: {
451
+ tags: ["Default", ...options.metadata?.openapi?.tags || []],
452
+ description: options.metadata?.openapi?.description,
453
+ operationId: getOperationId(options.metadata?.openapi?.operationId, method, usedOperationIds),
454
+ security: [{ bearerAuth: [] }],
455
+ parameters: cloneOpenAPIValue(parameters),
456
+ responses: cloneOpenAPIValue(getResponse(options.metadata?.openapi?.responses))
457
+ }
458
+ };
459
+ for (const method of methods.filter((m) => m === "POST" || m === "PATCH" || m === "PUT")) {
460
+ const body = applyUserInputFieldsToRequestBody(value.path, getRequestBody(options), ctx.options);
461
+ paths[path] = {
462
+ ...paths[path],
463
+ [method.toLowerCase()]: {
464
+ tags: ["Default", ...options.metadata?.openapi?.tags || []],
465
+ description: options.metadata?.openapi?.description,
466
+ operationId: getOperationId(options.metadata?.openapi?.operationId, method, usedOperationIds),
467
+ security: [{ bearerAuth: [] }],
468
+ parameters: cloneOpenAPIValue(parameters),
469
+ ...body ? { requestBody: cloneOpenAPIValue(body) } : { requestBody: { content: { "application/json": { schema: {
470
+ type: "object",
471
+ properties: {}
472
+ } } } } },
473
+ responses: cloneOpenAPIValue(getResponse(options.metadata?.openapi?.responses))
474
+ }
475
+ };
476
+ }
477
+ });
478
+ for (const plugin of options.plugins || []) {
479
+ if (plugin.id === "open-api") continue;
480
+ const pluginEndpoints = getEndpoints(ctx, {
481
+ ...options,
482
+ plugins: [plugin]
483
+ });
484
+ const api = Object.keys(pluginEndpoints.api).map((key) => {
485
+ if (baseEndpoints.api[key] === void 0) return pluginEndpoints.api[key];
486
+ return null;
487
+ }).filter((x) => x !== null);
488
+ Object.entries(api).forEach(([key, value]) => {
489
+ if (!value.path || ctx.options.disabledPaths?.includes(value.path)) return;
490
+ const options = value.options;
491
+ if (options.metadata?.SERVER_ONLY) return;
492
+ const path = toOpenApiPath(value.path);
493
+ const operationParameters = getParameters(options);
494
+ const parameters = [...operationParameters, ...getPathParameters(value.path, operationParameters)];
495
+ const methods = Array.isArray(options.method) ? options.method : [options.method];
496
+ for (const method of methods.filter((m) => m === "GET" || m === "DELETE")) paths[path] = {
497
+ ...paths[path],
498
+ [method.toLowerCase()]: {
499
+ tags: options.metadata?.openapi?.tags || [plugin.id.charAt(0).toUpperCase() + plugin.id.slice(1)],
500
+ description: options.metadata?.openapi?.description,
501
+ operationId: getOperationId(options.metadata?.openapi?.operationId, method, usedOperationIds),
502
+ security: [{ bearerAuth: [] }],
503
+ parameters: cloneOpenAPIValue(parameters),
504
+ responses: cloneOpenAPIValue(getResponse(options.metadata?.openapi?.responses))
505
+ }
506
+ };
507
+ for (const method of methods.filter((m) => m === "POST" || m === "PATCH" || m === "PUT")) paths[path] = {
508
+ ...paths[path],
509
+ [method.toLowerCase()]: {
510
+ tags: options.metadata?.openapi?.tags || [plugin.id.charAt(0).toUpperCase() + plugin.id.slice(1)],
511
+ description: options.metadata?.openapi?.description,
512
+ operationId: getOperationId(options.metadata?.openapi?.operationId, method, usedOperationIds),
513
+ security: [{ bearerAuth: [] }],
514
+ parameters: cloneOpenAPIValue(parameters),
515
+ requestBody: cloneOpenAPIValue(getRequestBody(options)),
516
+ responses: cloneOpenAPIValue(getResponse(options.metadata?.openapi?.responses))
517
+ }
518
+ };
519
+ });
520
+ }
521
+ return {
522
+ openapi: "3.1.1",
523
+ info: {
524
+ title: "Better Auth",
525
+ description: "API Reference for your Better Auth Instance",
526
+ version: "1.1.0"
527
+ },
528
+ components: {
529
+ ...components,
530
+ securitySchemes: {
531
+ apiKeyCookie: {
532
+ type: "apiKey",
533
+ in: "cookie",
534
+ name: "apiKeyCookie",
535
+ description: "API Key authentication via cookie"
536
+ },
537
+ bearerAuth: {
538
+ type: "http",
539
+ scheme: "bearer",
540
+ description: "Bearer token authentication"
541
+ }
542
+ }
543
+ },
544
+ security: [{
545
+ apiKeyCookie: [],
546
+ bearerAuth: []
547
+ }],
548
+ servers: [{ url: ctx.baseURL }],
549
+ tags: [{
550
+ name: "Default",
551
+ description: "Default endpoints that are included with Better Auth by default. These endpoints are not part of any plugin."
552
+ }],
553
+ paths
554
+ };
555
+ }
556
+ //#endregion
557
+ export { generator };
@@ -0,0 +1,97 @@
1
+ import { FieldSchema, OpenAPIModelSchema, OpenAPIParameter, OpenAPISchema, Path, generator } from "./generator.mjs";
2
+ import { LiteralString } from "@better-auth/core";
3
+ import * as _$better_call0 from "better-call";
4
+
5
+ //#region src/plugins/open-api/index.d.ts
6
+ declare module "@better-auth/core" {
7
+ interface BetterAuthPluginRegistry<AuthOptions, Options> {
8
+ "open-api": {
9
+ creator: typeof openAPI;
10
+ };
11
+ }
12
+ }
13
+ type ScalarTheme = "alternate" | "default" | "moon" | "purple" | "solarized" | "bluePlanet" | "saturn" | "kepler" | "mars" | "deepSpace" | "laserwave" | "none";
14
+ interface OpenAPIOptions {
15
+ /**
16
+ * The path to the OpenAPI reference page
17
+ *
18
+ * keep in mind that this path will be appended to the base URL `/api/auth` path
19
+ * by default, so if you set this to `/reference`, the full path will be `/api/auth/reference`
20
+ *
21
+ * @default "/reference"
22
+ */
23
+ path?: LiteralString | undefined;
24
+ /**
25
+ * Disable the default reference page that is generated by Scalar
26
+ *
27
+ * @default false
28
+ */
29
+ disableDefaultReference?: boolean | undefined;
30
+ /**
31
+ * Theme of the OpenAPI reference page.
32
+ *
33
+ * @default "default"
34
+ */
35
+ theme?: ScalarTheme | undefined;
36
+ /**
37
+ * A 'nonce' string to be attached to inline scripts
38
+ * for Content Security Policy (CSP) compliance.
39
+ * @default undefined
40
+ */
41
+ nonce?: string | undefined;
42
+ }
43
+ declare const openAPI: <O extends OpenAPIOptions>(options?: O | undefined) => {
44
+ id: "open-api";
45
+ version: string;
46
+ endpoints: {
47
+ generateOpenAPISchema: _$better_call0.StrictEndpoint<"/open-api/generate-schema", {
48
+ method: "GET";
49
+ }, {
50
+ openapi: string;
51
+ info: {
52
+ title: string;
53
+ description: string;
54
+ version: string;
55
+ };
56
+ components: {
57
+ securitySchemes: {
58
+ apiKeyCookie: {
59
+ type: string;
60
+ in: string;
61
+ name: string;
62
+ description: string;
63
+ };
64
+ bearerAuth: {
65
+ type: string;
66
+ scheme: string;
67
+ description: string;
68
+ };
69
+ };
70
+ schemas: {
71
+ [x: string]: OpenAPIModelSchema;
72
+ };
73
+ };
74
+ security: {
75
+ apiKeyCookie: never[];
76
+ bearerAuth: never[];
77
+ }[];
78
+ servers: {
79
+ url: string;
80
+ }[];
81
+ tags: {
82
+ name: string;
83
+ description: string;
84
+ }[];
85
+ paths: Record<string, Path>;
86
+ }>;
87
+ openAPIReference: _$better_call0.StrictEndpoint<LiteralString | "/reference", {
88
+ method: "GET";
89
+ metadata: {
90
+ readonly scope: "server";
91
+ };
92
+ }, Response>;
93
+ };
94
+ options: NoInfer<O>;
95
+ };
96
+ //#endregion
97
+ export { type FieldSchema, type OpenAPIModelSchema, OpenAPIOptions, OpenAPIParameter, OpenAPISchema, type Path, generator, openAPI };