@nextsparkjs/core 0.1.0-beta.185 → 0.1.0-beta.187

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 (518) hide show
  1. package/dist/components/app/guards/DeveloperGuard.d.ts.map +1 -1
  2. package/dist/components/app/guards/DeveloperGuard.js +8 -4
  3. package/dist/components/app/guards/SuperAdminGuard.d.ts.map +1 -1
  4. package/dist/components/app/guards/SuperAdminGuard.js +8 -4
  5. package/dist/components/app/layouts/PublicFooter.d.ts.map +1 -1
  6. package/dist/components/app/layouts/PublicFooter.js +2 -2
  7. package/dist/components/app/layouts/PublicNavbar.d.ts.map +1 -1
  8. package/dist/components/app/layouts/PublicNavbar.js +2 -2
  9. package/dist/components/app/misc/ThemeToggle.d.ts.map +1 -1
  10. package/dist/components/app/misc/ThemeToggle.js +4 -1
  11. package/dist/components/auth/DevKeyring.d.ts.map +1 -1
  12. package/dist/components/auth/DevKeyring.js +10 -2
  13. package/dist/components/auth/SessionCookieRefresher.d.ts +21 -0
  14. package/dist/components/auth/SessionCookieRefresher.d.ts.map +1 -0
  15. package/dist/components/auth/SessionCookieRefresher.js +11 -0
  16. package/dist/components/auth/forms/LoginForm.d.ts.map +1 -1
  17. package/dist/components/auth/forms/LoginForm.js +300 -6
  18. package/dist/components/auth/index.d.ts +1 -0
  19. package/dist/components/auth/index.d.ts.map +1 -1
  20. package/dist/components/auth/index.js +2 -0
  21. package/dist/components/billing/InvoicesTable.d.ts.map +1 -1
  22. package/dist/components/billing/InvoicesTable.js +4 -3
  23. package/dist/components/dashboard/block-editor/dynamic-form.d.ts.map +1 -1
  24. package/dist/components/dashboard/layouts/AuthGuard.d.ts.map +1 -1
  25. package/dist/components/dashboard/layouts/AuthGuard.js +2 -2
  26. package/dist/components/dashboard/layouts/DashboardAuthLayout.d.ts.map +1 -1
  27. package/dist/components/dashboard/layouts/DashboardAuthLayout.js +2 -2
  28. package/dist/components/dashboard/layouts/DashboardAuthSkeleton.d.ts +17 -0
  29. package/dist/components/dashboard/layouts/DashboardAuthSkeleton.d.ts.map +1 -0
  30. package/dist/components/dashboard/layouts/DashboardAuthSkeleton.js +52 -0
  31. package/dist/components/dashboard/layouts/Sidebar.d.ts.map +1 -1
  32. package/dist/components/dashboard/layouts/Sidebar.js +2 -3
  33. package/dist/components/dashboard/layouts/TopNavbar.js +2 -2
  34. package/dist/components/dashboard/layouts/index.d.ts +1 -0
  35. package/dist/components/dashboard/layouts/index.d.ts.map +1 -1
  36. package/dist/components/dashboard/layouts/index.js +2 -0
  37. package/dist/components/devtools/api-explorer/ApiExplorer.js +4 -4
  38. package/dist/components/entities/EntityFieldRenderer.d.ts.map +1 -1
  39. package/dist/components/entities/EntityFieldRenderer.js +3 -0
  40. package/dist/components/entities/EntityTable.d.ts.map +1 -1
  41. package/dist/components/entities/EntityTable.js +2 -1
  42. package/dist/components/entities/wrappers/EntityFormWrapper.d.ts.map +1 -1
  43. package/dist/components/entities/wrappers/EntityFormWrapper.js +7 -2
  44. package/dist/components/patterns/pages/PatternEditPage.d.ts +5 -1
  45. package/dist/components/patterns/pages/PatternEditPage.d.ts.map +1 -1
  46. package/dist/components/patterns/pages/PatternEditPage.js +16 -5
  47. package/dist/components/patterns/pages/PatternsCreatePage.d.ts +2 -1
  48. package/dist/components/patterns/pages/PatternsCreatePage.d.ts.map +1 -1
  49. package/dist/components/patterns/pages/PatternsCreatePage.js +17 -5
  50. package/dist/components/ui/combobox.d.ts +8 -1
  51. package/dist/components/ui/combobox.d.ts.map +1 -1
  52. package/dist/components/ui/combobox.js +37 -44
  53. package/dist/components/ui/country-select.d.ts +3 -1
  54. package/dist/components/ui/country-select.d.ts.map +1 -1
  55. package/dist/components/ui/country-select.js +3 -1
  56. package/dist/components/ui/currency-select.d.ts +3 -1
  57. package/dist/components/ui/currency-select.d.ts.map +1 -1
  58. package/dist/components/ui/currency-select.js +3 -1
  59. package/dist/components/ui/sheet.d.ts +5 -0
  60. package/dist/components/ui/sheet.d.ts.map +1 -1
  61. package/dist/components/ui/sheet.js +46 -26
  62. package/dist/components/ui/timezone-select.d.ts +3 -1
  63. package/dist/components/ui/timezone-select.d.ts.map +1 -1
  64. package/dist/components/ui/timezone-select.js +3 -1
  65. package/dist/contexts/TeamContext.d.ts +6 -0
  66. package/dist/contexts/TeamContext.d.ts.map +1 -1
  67. package/dist/contexts/TeamContext.js +8 -1
  68. package/dist/emails/otp-verification.d.ts.map +1 -1
  69. package/dist/emails/reset-password.d.ts.map +1 -1
  70. package/dist/emails/team-invitation.d.ts.map +1 -1
  71. package/dist/emails/team-invitation.js +3 -2
  72. package/dist/emails/verify-email.d.ts.map +1 -1
  73. package/dist/hooks/index.d.ts +1 -0
  74. package/dist/hooks/index.d.ts.map +1 -1
  75. package/dist/hooks/index.js +1 -0
  76. package/dist/hooks/useAuth.d.ts +29 -0
  77. package/dist/hooks/useAuth.d.ts.map +1 -1
  78. package/dist/hooks/useAuth.js +24 -0
  79. package/dist/hooks/useEnsureUserMetadata.d.ts +22 -0
  80. package/dist/hooks/useEnsureUserMetadata.d.ts.map +1 -1
  81. package/dist/hooks/useEnsureUserMetadata.js +18 -5
  82. package/dist/hooks/useSessionCookieRefresh.d.ts +35 -0
  83. package/dist/hooks/useSessionCookieRefresh.d.ts.map +1 -0
  84. package/dist/hooks/useSessionCookieRefresh.js +49 -0
  85. package/dist/lib/api/api-error.d.ts +3 -1
  86. package/dist/lib/api/api-error.d.ts.map +1 -1
  87. package/dist/lib/api/api-error.js +4 -2
  88. package/dist/lib/api/auth/dual-auth.d.ts +38 -3
  89. package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
  90. package/dist/lib/api/auth/dual-auth.js +42 -7
  91. package/dist/lib/api/auth/permissions.d.ts +7 -2
  92. package/dist/lib/api/auth/permissions.d.ts.map +1 -1
  93. package/dist/lib/api/auth/permissions.js +2 -2
  94. package/dist/lib/api/auth/scope-policy.d.ts +71 -0
  95. package/dist/lib/api/auth/scope-policy.d.ts.map +1 -0
  96. package/dist/lib/api/auth/scope-policy.js +53 -0
  97. package/dist/lib/api/auth.d.ts +15 -0
  98. package/dist/lib/api/auth.d.ts.map +1 -1
  99. package/dist/lib/api/auth.js +17 -4
  100. package/dist/lib/api/entities.js +2 -1
  101. package/dist/lib/api/entity/audit-log.d.ts +35 -0
  102. package/dist/lib/api/entity/audit-log.d.ts.map +1 -0
  103. package/dist/lib/api/entity/audit-log.js +35 -0
  104. package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
  105. package/dist/lib/api/entity/generic-handler.js +333 -138
  106. package/dist/lib/api/entity-handler.js +2 -2
  107. package/dist/lib/api/helpers.d.ts +29 -4
  108. package/dist/lib/api/helpers.d.ts.map +1 -1
  109. package/dist/lib/api/helpers.js +30 -6
  110. package/dist/lib/api/keys.d.ts +16 -0
  111. package/dist/lib/api/keys.d.ts.map +1 -1
  112. package/dist/lib/api/keys.js +19 -1
  113. package/dist/lib/api/routes/patterns-usages.d.ts.map +1 -1
  114. package/dist/lib/api/routes/patterns-usages.js +3 -11
  115. package/dist/lib/auth/auth-methods.d.ts +52 -0
  116. package/dist/lib/auth/auth-methods.d.ts.map +1 -0
  117. package/dist/lib/auth/auth-methods.js +63 -0
  118. package/dist/lib/auth/registration-guard-plugin.d.ts.map +1 -1
  119. package/dist/lib/auth/registration-helpers.d.ts +9 -0
  120. package/dist/lib/auth/registration-helpers.d.ts.map +1 -1
  121. package/dist/lib/auth/registration-helpers.js +8 -2
  122. package/dist/lib/auth/security-notifications/device-fingerprint.d.ts +52 -0
  123. package/dist/lib/auth/security-notifications/device-fingerprint.d.ts.map +1 -0
  124. package/dist/lib/auth/security-notifications/device-fingerprint.js +42 -0
  125. package/dist/lib/auth/security-notifications/dispatcher.d.ts +37 -0
  126. package/dist/lib/auth/security-notifications/dispatcher.d.ts.map +1 -0
  127. package/dist/lib/auth/security-notifications/dispatcher.js +157 -0
  128. package/dist/lib/auth/security-notifications/index.d.ts +20 -0
  129. package/dist/lib/auth/security-notifications/index.d.ts.map +1 -0
  130. package/dist/lib/auth/security-notifications/index.js +22 -0
  131. package/dist/lib/auth/security-notifications/registry.d.ts +36 -0
  132. package/dist/lib/auth/security-notifications/registry.d.ts.map +1 -0
  133. package/dist/lib/auth/security-notifications/registry.js +26 -0
  134. package/dist/lib/auth/security-notifications/templates/email-changed.d.ts +12 -0
  135. package/dist/lib/auth/security-notifications/templates/email-changed.d.ts.map +1 -0
  136. package/dist/lib/auth/security-notifications/templates/email-changed.js +43 -0
  137. package/dist/lib/auth/security-notifications/templates/new-device-login.d.ts +7 -0
  138. package/dist/lib/auth/security-notifications/templates/new-device-login.d.ts.map +1 -0
  139. package/dist/lib/auth/security-notifications/templates/new-device-login.js +46 -0
  140. package/dist/lib/auth/security-notifications/templates/password-changed.d.ts +7 -0
  141. package/dist/lib/auth/security-notifications/templates/password-changed.d.ts.map +1 -0
  142. package/dist/lib/auth/security-notifications/templates/password-changed.js +35 -0
  143. package/dist/lib/auth/security-notifications/templates/shared.d.ts +36 -0
  144. package/dist/lib/auth/security-notifications/templates/shared.d.ts.map +1 -0
  145. package/dist/lib/auth/security-notifications/templates/shared.js +68 -0
  146. package/dist/lib/auth/security-notifications/types.d.ts +74 -0
  147. package/dist/lib/auth/security-notifications/types.d.ts.map +1 -0
  148. package/dist/lib/auth/session-config.d.ts +37 -0
  149. package/dist/lib/auth/session-config.d.ts.map +1 -0
  150. package/dist/lib/auth/session-config.js +59 -0
  151. package/dist/lib/auth/session-refresh.d.ts +46 -0
  152. package/dist/lib/auth/session-refresh.d.ts.map +1 -0
  153. package/dist/lib/auth/session-refresh.js +11 -0
  154. package/dist/lib/auth-client.d.ts +1639 -0
  155. package/dist/lib/auth-client.d.ts.map +1 -0
  156. package/dist/lib/auth-client.js +13 -1
  157. package/dist/lib/auth.d.ts.map +1 -1
  158. package/dist/lib/auth.js +45 -11
  159. package/dist/lib/billing/gateways/factory.d.ts +8 -3
  160. package/dist/lib/billing/gateways/factory.d.ts.map +1 -1
  161. package/dist/lib/billing/gateways/factory.js +37 -23
  162. package/dist/lib/billing/stripe-webhook.d.ts.map +1 -1
  163. package/dist/lib/billing/stripe-webhook.js +2 -1
  164. package/dist/lib/config/app.config.d.ts.map +1 -1
  165. package/dist/lib/config/app.config.js +71 -0
  166. package/dist/lib/config/config-sync.d.ts +1 -4
  167. package/dist/lib/config/config-sync.d.ts.map +1 -1
  168. package/dist/lib/config/config-sync.js +6 -2
  169. package/dist/lib/config/types.d.ts +130 -0
  170. package/dist/lib/config/types.d.ts.map +1 -1
  171. package/dist/lib/email/templates.d.ts +3 -3
  172. package/dist/lib/email/templates.d.ts.map +1 -1
  173. package/dist/lib/entities/api-generator.js +5 -5
  174. package/dist/lib/entities/entity-hooks.d.ts +9 -1
  175. package/dist/lib/entities/entity-hooks.d.ts.map +1 -1
  176. package/dist/lib/entities/entity-hooks.js +77 -4
  177. package/dist/lib/entities/schema-generator.d.ts.map +1 -1
  178. package/dist/lib/entities/schema-generator.js +20 -4
  179. package/dist/lib/entities/serialization.d.ts +2 -2
  180. package/dist/lib/entities/serialization.d.ts.map +1 -1
  181. package/dist/lib/entities/serialization.js +3 -2
  182. package/dist/lib/entities/types.d.ts +20 -0
  183. package/dist/lib/entities/types.d.ts.map +1 -1
  184. package/dist/lib/locale.d.ts.map +1 -1
  185. package/dist/lib/locale.js +4 -1
  186. package/dist/lib/mcp/audit.d.ts +8 -4
  187. package/dist/lib/mcp/audit.d.ts.map +1 -1
  188. package/dist/lib/plugins/hook-system.d.ts +13 -0
  189. package/dist/lib/plugins/hook-system.d.ts.map +1 -1
  190. package/dist/lib/plugins/hook-system.js +32 -2
  191. package/dist/lib/scheduled-actions/handlers/index.d.ts +1 -0
  192. package/dist/lib/scheduled-actions/handlers/index.d.ts.map +1 -1
  193. package/dist/lib/scheduled-actions/handlers/index.js +3 -1
  194. package/dist/lib/scheduled-actions/handlers/security-notification.d.ts +26 -0
  195. package/dist/lib/scheduled-actions/handlers/security-notification.d.ts.map +1 -0
  196. package/dist/lib/scheduled-actions/handlers/security-notification.js +54 -0
  197. package/dist/lib/selectors/core-selectors.d.ts +12 -0
  198. package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
  199. package/dist/lib/selectors/domains/auth.selectors.d.ts +12 -0
  200. package/dist/lib/selectors/domains/auth.selectors.d.ts.map +1 -1
  201. package/dist/lib/selectors/domains/auth.selectors.js +14 -1
  202. package/dist/lib/selectors/selectors.d.ts +24 -0
  203. package/dist/lib/selectors/selectors.d.ts.map +1 -1
  204. package/dist/lib/services/api-docs.service.d.ts +5 -1
  205. package/dist/lib/services/api-docs.service.d.ts.map +1 -1
  206. package/dist/lib/services/api-presets.service.d.ts +6 -1
  207. package/dist/lib/services/api-presets.service.d.ts.map +1 -1
  208. package/dist/lib/services/feature.service.d.ts +58 -4
  209. package/dist/lib/services/feature.service.d.ts.map +1 -1
  210. package/dist/lib/services/generic-entity.service.d.ts.map +1 -1
  211. package/dist/lib/services/generic-entity.service.js +16 -32
  212. package/dist/lib/services/membership.service.d.ts +10 -2
  213. package/dist/lib/services/membership.service.d.ts.map +1 -1
  214. package/dist/lib/services/membership.service.js +37 -16
  215. package/dist/lib/services/permission.service.d.ts +10 -4
  216. package/dist/lib/services/permission.service.d.ts.map +1 -1
  217. package/dist/lib/services/plugin.service.d.ts +1 -1
  218. package/dist/lib/services/plugin.service.d.ts.map +1 -1
  219. package/dist/lib/services/subscription.service.d.ts.map +1 -1
  220. package/dist/lib/services/subscription.service.js +2 -1
  221. package/dist/lib/services/team-member.service.d.ts +15 -3
  222. package/dist/lib/services/team-member.service.d.ts.map +1 -1
  223. package/dist/lib/services/team-member.service.js +27 -6
  224. package/dist/lib/services/team.service.d.ts.map +1 -1
  225. package/dist/lib/teams/permissions.d.ts +3 -1
  226. package/dist/lib/teams/permissions.d.ts.map +1 -1
  227. package/dist/lib/teams/permissions.js +6 -0
  228. package/dist/lib/teams/schema.d.ts.map +1 -1
  229. package/dist/lib/teams/schema.js +3 -0
  230. package/dist/lib/template-resolver.d.ts +3 -3
  231. package/dist/lib/theme/forced-theme.d.ts +34 -0
  232. package/dist/lib/theme/forced-theme.d.ts.map +1 -0
  233. package/dist/lib/theme/forced-theme.js +27 -0
  234. package/dist/lib/theme/get-default-theme-mode.d.ts +3 -0
  235. package/dist/lib/theme/get-default-theme-mode.d.ts.map +1 -1
  236. package/dist/lib/theme/get-default-theme-mode.js +5 -3
  237. package/dist/lib/utils/cors.d.ts +13 -0
  238. package/dist/lib/utils/cors.d.ts.map +1 -1
  239. package/dist/lib/utils/cors.js +20 -0
  240. package/dist/messages/de/auth.json +25 -2
  241. package/dist/messages/de/index.d.ts +83 -0
  242. package/dist/messages/de/index.d.ts.map +1 -1
  243. package/dist/messages/de/index.js +2 -0
  244. package/dist/messages/de/index.ts +2 -0
  245. package/dist/messages/de/navigation.json +3 -1
  246. package/dist/messages/en/auth.json +25 -2
  247. package/dist/messages/en/index.d.ts +83 -0
  248. package/dist/messages/en/index.d.ts.map +1 -1
  249. package/dist/messages/en/index.js +2 -0
  250. package/dist/messages/en/index.ts +2 -0
  251. package/dist/messages/en/navigation.json +3 -1
  252. package/dist/messages/es/auth.json +25 -2
  253. package/dist/messages/es/index.d.ts +83 -0
  254. package/dist/messages/es/index.d.ts.map +1 -1
  255. package/dist/messages/es/index.js +2 -0
  256. package/dist/messages/es/index.ts +2 -0
  257. package/dist/messages/es/navigation.json +3 -1
  258. package/dist/messages/fr/auth.json +25 -2
  259. package/dist/messages/fr/index.d.ts +83 -0
  260. package/dist/messages/fr/index.d.ts.map +1 -1
  261. package/dist/messages/fr/index.js +2 -0
  262. package/dist/messages/fr/index.ts +2 -0
  263. package/dist/messages/fr/navigation.json +3 -1
  264. package/dist/messages/it/auth.json +25 -2
  265. package/dist/messages/it/index.d.ts +83 -0
  266. package/dist/messages/it/index.d.ts.map +1 -1
  267. package/dist/messages/it/index.js +2 -0
  268. package/dist/messages/it/index.ts +2 -0
  269. package/dist/messages/it/navigation.json +3 -1
  270. package/dist/messages/pt/auth.json +25 -2
  271. package/dist/messages/pt/index.d.ts +83 -0
  272. package/dist/messages/pt/index.d.ts.map +1 -1
  273. package/dist/messages/pt/index.js +2 -0
  274. package/dist/messages/pt/index.ts +2 -0
  275. package/dist/messages/pt/navigation.json +3 -1
  276. package/dist/migrations/005_api_audit_log.sql +2 -1
  277. package/dist/migrations/025_api_audit_log_nullable_api_key.sql +12 -0
  278. package/dist/migrations/026_login_events.sql +91 -0
  279. package/dist/migrations/027_rls_bypass_developer_and_system_admin_team.sql +197 -0
  280. package/dist/nextspark-registries.d.ts +580 -236
  281. package/dist/providers/DashboardProviders.d.ts +12 -3
  282. package/dist/providers/DashboardProviders.d.ts.map +1 -1
  283. package/dist/providers/DashboardProviders.js +6 -2
  284. package/dist/providers/theme-provider.d.ts +19 -2
  285. package/dist/providers/theme-provider.d.ts.map +1 -1
  286. package/dist/providers/theme-provider.js +6 -2
  287. package/dist/templates/app/(auth)/signup/page.tsx +8 -0
  288. package/dist/templates/app/(public)/[...slug]/page.tsx +9 -14
  289. package/dist/templates/app/api/auth/[...all]/route.ts +23 -1
  290. package/dist/templates/app/api/health/route.ts +4 -2
  291. package/dist/templates/app/api/internal/user-metadata/route.ts +5 -3
  292. package/dist/templates/app/api/mcp/route.ts +4 -1
  293. package/dist/templates/app/api/superadmin/subscriptions/route.ts +2 -1
  294. package/dist/templates/app/api/superadmin/teams/[teamId]/route.ts +4 -3
  295. package/dist/templates/app/api/superadmin/users/[userId]/route.ts +10 -3
  296. package/dist/templates/app/api/v1/api-keys/[id]/route.ts +50 -71
  297. package/dist/templates/app/api/v1/api-keys/route.ts +21 -43
  298. package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +14 -14
  299. package/dist/templates/app/api/v1/billing/cancel/route.ts +7 -6
  300. package/dist/templates/app/api/v1/billing/change-plan/route.ts +5 -4
  301. package/dist/templates/app/api/v1/billing/check-action/route.ts +6 -4
  302. package/dist/templates/app/api/v1/billing/checkout/route.ts +7 -5
  303. package/dist/templates/app/api/v1/billing/plans/route.ts +8 -12
  304. package/dist/templates/app/api/v1/billing/portal/route.ts +7 -5
  305. package/dist/templates/app/api/v1/billing/webhooks/polar/route.ts +1 -1
  306. package/dist/templates/app/api/v1/devtools/blocks/route.ts +5 -4
  307. package/dist/templates/app/api/v1/devtools/features/route.ts +5 -4
  308. package/dist/templates/app/api/v1/devtools/flows/route.ts +5 -4
  309. package/dist/templates/app/api/v1/devtools/scheduled-actions/route.ts +9 -7
  310. package/dist/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +5 -4
  311. package/dist/templates/app/api/v1/devtools/testing/route.ts +5 -4
  312. package/dist/templates/app/api/v1/media/[id]/route.ts +13 -25
  313. package/dist/templates/app/api/v1/media/[id]/tags/route.ts +17 -25
  314. package/dist/templates/app/api/v1/media/check-duplicates/route.ts +5 -7
  315. package/dist/templates/app/api/v1/media/route.ts +5 -9
  316. package/dist/templates/app/api/v1/media/upload/route.ts +9 -21
  317. package/dist/templates/app/api/v1/media-tags/route.ts +9 -13
  318. package/dist/templates/app/api/v1/patterns/[id]/usages/route.ts +11 -19
  319. package/dist/templates/app/api/v1/post-categories/[id]/route.ts +9 -7
  320. package/dist/templates/app/api/v1/post-categories/route.ts +5 -4
  321. package/dist/templates/app/api/v1/team-invitations/[token]/accept/route.ts +16 -18
  322. package/dist/templates/app/api/v1/team-invitations/[token]/decline/route.ts +15 -17
  323. package/dist/templates/app/api/v1/team-invitations/[token]/route.ts +8 -8
  324. package/dist/templates/app/api/v1/team-invitations/route.ts +9 -11
  325. package/dist/templates/app/api/v1/teams/[teamId]/invitations/route.ts +41 -32
  326. package/dist/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +15 -16
  327. package/dist/templates/app/api/v1/teams/[teamId]/invoices/route.ts +14 -15
  328. package/dist/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +32 -36
  329. package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +33 -33
  330. package/dist/templates/app/api/v1/teams/[teamId]/route.ts +35 -41
  331. package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +5 -3
  332. package/dist/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +10 -6
  333. package/dist/templates/app/api/v1/teams/route.ts +33 -27
  334. package/dist/templates/app/api/v1/teams/switch/route.ts +11 -13
  335. package/dist/templates/app/api/v1/theme/[...path]/route.ts +23 -2
  336. package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +32 -77
  337. package/dist/templates/app/api/v1/users/[id]/route.ts +35 -68
  338. package/dist/templates/app/api/v1/users/route.ts +21 -25
  339. package/dist/templates/app/dashboard/layout.tsx +2 -6
  340. package/dist/templates/app/layout.ppr.tsx +15 -15
  341. package/dist/templates/app/layout.tsx +46 -20
  342. package/dist/templates/contents/themes/starter/config/app.config.ts +19 -0
  343. package/dist/templates/contents/themes/starter/config/theme.config.ts +6 -0
  344. package/dist/templates/contents/themes/starter/styles/globals.css +6 -2
  345. package/dist/templates/proxy.ts +46 -10
  346. package/dist/templates/tsconfig.json +4 -0
  347. package/dist/types/theme.d.ts +9 -0
  348. package/dist/types/theme.d.ts.map +1 -1
  349. package/migrations/005_api_audit_log.sql +2 -1
  350. package/migrations/025_api_audit_log_nullable_api_key.sql +12 -0
  351. package/migrations/026_login_events.sql +91 -0
  352. package/migrations/027_rls_bypass_developer_and_system_admin_team.sql +197 -0
  353. package/package.json +14 -11
  354. package/scripts/build/registry/__tests__/scope-registry.test.mjs +18 -0
  355. package/scripts/build/registry/generators/scope-registry.mjs +9 -2
  356. package/templates/app/(auth)/signup/page.tsx +8 -0
  357. package/templates/app/(public)/[...slug]/page.tsx +9 -14
  358. package/templates/app/api/auth/[...all]/route.ts +23 -1
  359. package/templates/app/api/health/route.ts +4 -2
  360. package/templates/app/api/internal/user-metadata/route.ts +5 -3
  361. package/templates/app/api/mcp/route.ts +4 -1
  362. package/templates/app/api/superadmin/subscriptions/route.ts +2 -1
  363. package/templates/app/api/superadmin/teams/[teamId]/route.ts +4 -3
  364. package/templates/app/api/superadmin/users/[userId]/route.ts +10 -3
  365. package/templates/app/api/v1/api-keys/[id]/route.ts +50 -71
  366. package/templates/app/api/v1/api-keys/route.ts +21 -43
  367. package/templates/app/api/v1/auth/signup-with-invite/route.ts +14 -14
  368. package/templates/app/api/v1/billing/cancel/route.ts +7 -6
  369. package/templates/app/api/v1/billing/change-plan/route.ts +5 -4
  370. package/templates/app/api/v1/billing/check-action/route.ts +6 -4
  371. package/templates/app/api/v1/billing/checkout/route.ts +7 -5
  372. package/templates/app/api/v1/billing/plans/route.ts +8 -12
  373. package/templates/app/api/v1/billing/portal/route.ts +7 -5
  374. package/templates/app/api/v1/billing/webhooks/polar/route.ts +1 -1
  375. package/templates/app/api/v1/devtools/blocks/route.ts +5 -4
  376. package/templates/app/api/v1/devtools/features/route.ts +5 -4
  377. package/templates/app/api/v1/devtools/flows/route.ts +5 -4
  378. package/templates/app/api/v1/devtools/scheduled-actions/route.ts +9 -7
  379. package/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +5 -4
  380. package/templates/app/api/v1/devtools/testing/route.ts +5 -4
  381. package/templates/app/api/v1/media/[id]/route.ts +13 -25
  382. package/templates/app/api/v1/media/[id]/tags/route.ts +17 -25
  383. package/templates/app/api/v1/media/check-duplicates/route.ts +5 -7
  384. package/templates/app/api/v1/media/route.ts +5 -9
  385. package/templates/app/api/v1/media/upload/route.ts +9 -21
  386. package/templates/app/api/v1/media-tags/route.ts +9 -13
  387. package/templates/app/api/v1/patterns/[id]/usages/route.ts +11 -19
  388. package/templates/app/api/v1/post-categories/[id]/route.ts +9 -7
  389. package/templates/app/api/v1/post-categories/route.ts +5 -4
  390. package/templates/app/api/v1/team-invitations/[token]/accept/route.ts +16 -18
  391. package/templates/app/api/v1/team-invitations/[token]/decline/route.ts +15 -17
  392. package/templates/app/api/v1/team-invitations/[token]/route.ts +8 -8
  393. package/templates/app/api/v1/team-invitations/route.ts +9 -11
  394. package/templates/app/api/v1/teams/[teamId]/invitations/route.ts +41 -32
  395. package/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +15 -16
  396. package/templates/app/api/v1/teams/[teamId]/invoices/route.ts +14 -15
  397. package/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +32 -36
  398. package/templates/app/api/v1/teams/[teamId]/members/route.ts +33 -33
  399. package/templates/app/api/v1/teams/[teamId]/route.ts +35 -41
  400. package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +5 -3
  401. package/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +10 -6
  402. package/templates/app/api/v1/teams/route.ts +33 -27
  403. package/templates/app/api/v1/teams/switch/route.ts +11 -13
  404. package/templates/app/api/v1/theme/[...path]/route.ts +23 -2
  405. package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +32 -77
  406. package/templates/app/api/v1/users/[id]/route.ts +35 -68
  407. package/templates/app/api/v1/users/route.ts +21 -25
  408. package/templates/app/dashboard/layout.tsx +2 -6
  409. package/templates/app/layout.ppr.tsx +15 -15
  410. package/templates/app/layout.tsx +46 -20
  411. package/templates/contents/themes/starter/config/app.config.ts +19 -0
  412. package/templates/contents/themes/starter/config/theme.config.ts +6 -0
  413. package/templates/contents/themes/starter/styles/globals.css +6 -2
  414. package/templates/proxy.ts +46 -10
  415. package/templates/tsconfig.json +4 -0
  416. package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +23 -0
  417. package/tests/jest/__mocks__/next-server.js +24 -0
  418. package/dist/components/teams/TeamSwitchModal.d.js +0 -0
  419. package/dist/components/ui/accordion.d.js +0 -0
  420. package/dist/components/ui/avatar.d.js +0 -0
  421. package/dist/components/ui/badge.d.js +0 -0
  422. package/dist/components/ui/button.d.js +0 -0
  423. package/dist/components/ui/card.d.js +0 -0
  424. package/dist/components/ui/dialog.d.js +0 -0
  425. package/dist/components/ui/dropdown-menu.d.js +0 -0
  426. package/dist/components/ui/input.d.js +0 -0
  427. package/dist/components/ui/progress.d.js +0 -0
  428. package/dist/components/ui/scroll-area.d.js +0 -0
  429. package/dist/components/ui/select.d.js +0 -0
  430. package/dist/components/ui/separator.d.js +0 -0
  431. package/dist/components/ui/table.d.js +0 -0
  432. package/dist/components/ui/textarea.d.js +0 -0
  433. package/dist/contexts/TeamContext.d.js +0 -0
  434. package/dist/hooks/useAuth.d.js +0 -0
  435. package/dist/hooks/useLastAuthMethod.d.js +0 -0
  436. package/dist/hooks/useOrigin.d.js +0 -0
  437. package/dist/lib/api/auth/dual-auth.d.js +0 -0
  438. package/dist/lib/api/auth.d.js +0 -0
  439. package/dist/lib/api/cache.d.js +0 -0
  440. package/dist/lib/api/keys.d.js +0 -0
  441. package/dist/lib/auth-client.d.js +0 -0
  442. package/dist/lib/auth-context.d.js +0 -0
  443. package/dist/lib/auth.d.js +0 -0
  444. package/dist/lib/billing/config-types.d.js +0 -0
  445. package/dist/lib/billing/enforcement.d.js +0 -0
  446. package/dist/lib/billing/helpers.d.js +0 -0
  447. package/dist/lib/billing/jobs.d.js +0 -0
  448. package/dist/lib/billing/types.d.js +0 -0
  449. package/dist/lib/blocks/loader.d.js +0 -0
  450. package/dist/lib/config/app.config.d.js +0 -0
  451. package/dist/lib/config/config-loader.d.js +0 -0
  452. package/dist/lib/config/config-sync.d.js +0 -0
  453. package/dist/lib/config/config-types.d.js +0 -0
  454. package/dist/lib/config/config-utils.d.js +0 -0
  455. package/dist/lib/config/dashboard-types.d.js +0 -0
  456. package/dist/lib/config/dashboard.config.d.js +0 -0
  457. package/dist/lib/config/icon-map.d.js +0 -0
  458. package/dist/lib/config/index.d.js +0 -7
  459. package/dist/lib/config/nextspark-types.d.js +0 -0
  460. package/dist/lib/config/roles-merge.d.js +0 -0
  461. package/dist/lib/config/types.d.js +0 -0
  462. package/dist/lib/db.d.js +0 -0
  463. package/dist/lib/email/factory.d.js +0 -0
  464. package/dist/lib/email/index.d.js +0 -3
  465. package/dist/lib/email/providers/console.d.js +0 -0
  466. package/dist/lib/email/providers/resend.d.js +0 -0
  467. package/dist/lib/email/templates.d.js +0 -0
  468. package/dist/lib/email/types.d.js +0 -0
  469. package/dist/lib/entities/types.d.js +0 -0
  470. package/dist/lib/permissions/system.d.js +0 -0
  471. package/dist/lib/permissions/types.d.js +0 -0
  472. package/dist/lib/plugins/hook-system.d.js +0 -0
  473. package/dist/lib/scheduled-actions/cleanup.d.js +0 -0
  474. package/dist/lib/scheduled-actions/index.d.js +0 -19
  475. package/dist/lib/scheduled-actions/initializer.d.js +0 -1
  476. package/dist/lib/scheduled-actions/processor.d.js +0 -0
  477. package/dist/lib/scheduled-actions/registry.d.js +0 -0
  478. package/dist/lib/scheduled-actions/scheduler.d.js +0 -0
  479. package/dist/lib/scheduled-actions/types.d.js +0 -0
  480. package/dist/lib/services/api-routes.service.d.js +0 -0
  481. package/dist/lib/services/entity-type.service.d.js +0 -0
  482. package/dist/lib/services/index.d.js +0 -40
  483. package/dist/lib/services/invoice.service.d.js +0 -0
  484. package/dist/lib/services/membership.service.d.js +0 -0
  485. package/dist/lib/services/meta.service.d.js +0 -0
  486. package/dist/lib/services/middleware.service.d.js +0 -0
  487. package/dist/lib/services/namespace.service.d.js +0 -0
  488. package/dist/lib/services/permission.service.d.js +0 -0
  489. package/dist/lib/services/plan.service.d.js +0 -0
  490. package/dist/lib/services/plugin.service.d.js +0 -0
  491. package/dist/lib/services/route-handler.service.d.js +0 -0
  492. package/dist/lib/services/scope.service.d.js +0 -0
  493. package/dist/lib/services/subscription.service.d.js +0 -0
  494. package/dist/lib/services/team-member.service.d.js +0 -0
  495. package/dist/lib/services/team.service.d.js +0 -0
  496. package/dist/lib/services/theme.service.d.js +0 -0
  497. package/dist/lib/services/usage.service.d.js +0 -0
  498. package/dist/lib/services/user-flags.service.d.js +0 -0
  499. package/dist/lib/services/user.service.d.js +0 -0
  500. package/dist/lib/teams/helpers.d.js +0 -0
  501. package/dist/lib/teams/permissions.d.js +0 -0
  502. package/dist/lib/teams/types.d.js +0 -0
  503. package/dist/lib/utils/config-merge.d.js +0 -0
  504. package/dist/lib/utils/file-logger.d.js +0 -0
  505. package/dist/lib/utils.d.js +0 -0
  506. package/dist/styles/classes.json +0 -1093
  507. package/dist/styles/ui.css +0 -2
  508. package/dist/types/auth.d.js +0 -0
  509. package/dist/types/blocks.d.js +0 -0
  510. package/dist/types/meta.types.d.js +0 -0
  511. package/dist/types/plugin.d.js +0 -0
  512. package/dist/types/testing.types.d.js +0 -0
  513. package/dist/types/theme.d.js +0 -0
  514. package/dist/types/user.types.d.js +0 -0
  515. package/scripts/build/build-ui-css.mjs +0 -351
  516. /package/dist/{components/app/layouts/PublicFooter.d.js → lib/auth/security-notifications/types.js} +0 -0
  517. /package/dist/{components/app/layouts/PublicNavbar.d.js → nextspark-registries.d.js} +0 -0
  518. /package/dist/{components/app/misc/ThemeToggle.d.js → types/use-intl-react-shim.d.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"DeveloperGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/DeveloperGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAiGzE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAGxC"}
1
+ {"version":3,"file":"DeveloperGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/DeveloperGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAgHzE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC"}
@@ -2,7 +2,7 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useSession } from "../../../lib/auth-client.js";
4
4
  import { useRouter } from "next/navigation";
5
- import { useEffect } from "react";
5
+ import { useEffect, useState } from "react";
6
6
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../../ui/card.js";
7
7
  import { AlertTriangle, ArrowLeft } from "lucide-react";
8
8
  import { Button } from "../../ui/button.js";
@@ -12,13 +12,17 @@ function DeveloperGuard({ children, fallback }) {
12
12
  const { data: session, isPending } = useSession();
13
13
  const router = useRouter();
14
14
  const t = useTranslations();
15
+ const [mounted, setMounted] = useState(false);
16
+ useEffect(() => {
17
+ setMounted(true);
18
+ }, []);
15
19
  useEffect(() => {
16
20
  var _a2;
17
- if (!isPending && session && ((_a2 = session.user) == null ? void 0 : _a2.role) !== "developer") {
21
+ if (mounted && !isPending && session && ((_a2 = session.user) == null ? void 0 : _a2.role) !== "developer") {
18
22
  router.push("/dashboard?error=access_denied");
19
23
  }
20
- }, [session, isPending, router]);
21
- if (isPending) {
24
+ }, [mounted, session, isPending, router]);
25
+ if (!mounted || isPending) {
22
26
  return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsxs("div", { className: "animate-pulse", children: [
23
27
  /* @__PURE__ */ jsx("div", { className: "h-8 bg-muted rounded w-48 mb-4" }),
24
28
  /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-32" })
@@ -1 +1 @@
1
- {"version":3,"file":"SuperAdminGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/SuperAdminGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CA8F3E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAG3C"}
1
+ {"version":3,"file":"SuperAdminGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/SuperAdminGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAyG3E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAIzC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C"}
@@ -2,7 +2,7 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useSession } from "../../../lib/auth-client.js";
4
4
  import { useRouter } from "next/navigation";
5
- import { useEffect } from "react";
5
+ import { useEffect, useState } from "react";
6
6
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../../ui/card.js";
7
7
  import { AlertTriangle, ArrowLeft } from "lucide-react";
8
8
  import { Button } from "../../ui/button.js";
@@ -12,13 +12,17 @@ function SuperAdminGuard({ children, fallback }) {
12
12
  const { data: session, isPending } = useSession();
13
13
  const router = useRouter();
14
14
  const t = useTranslations();
15
+ const [mounted, setMounted] = useState(false);
16
+ useEffect(() => {
17
+ setMounted(true);
18
+ }, []);
15
19
  useEffect(() => {
16
20
  var _a2, _b2;
17
- if (!isPending && session && ((_a2 = session.user) == null ? void 0 : _a2.role) !== "superadmin" && ((_b2 = session.user) == null ? void 0 : _b2.role) !== "developer") {
21
+ if (mounted && !isPending && session && ((_a2 = session.user) == null ? void 0 : _a2.role) !== "superadmin" && ((_b2 = session.user) == null ? void 0 : _b2.role) !== "developer") {
18
22
  router.push("/dashboard?error=access_denied");
19
23
  }
20
- }, [session, isPending, router]);
21
- if (isPending) {
24
+ }, [mounted, session, isPending, router]);
25
+ if (!mounted || isPending) {
22
26
  return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsxs("div", { className: "animate-pulse", children: [
23
27
  /* @__PURE__ */ jsx("div", { className: "h-8 bg-muted rounded w-48 mb-4" }),
24
28
  /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-32" })
@@ -1 +1 @@
1
- {"version":3,"file":"PublicFooter.d.ts","sourceRoot":"","sources":["../../../../src/components/app/layouts/PublicFooter.tsx"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,4CA0J3B"}
1
+ {"version":3,"file":"PublicFooter.d.ts","sourceRoot":"","sources":["../../../../src/components/app/layouts/PublicFooter.tsx"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,4CAyJ3B"}
@@ -3,11 +3,11 @@ import Link from "next/link";
3
3
  import { Separator } from "../../ui/separator.js";
4
4
  import { useTranslations } from "next-intl";
5
5
  import { sel } from "../../../lib/test/index.js";
6
+ import { APP_NAME } from "../../../lib/config/index.js";
6
7
  function PublicFooter() {
7
8
  const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
8
9
  const t = useTranslations("footer");
9
- const tCommon = useTranslations("common");
10
- const appName = tCommon("appName");
10
+ const appName = APP_NAME;
11
11
  const footerLinks = {
12
12
  product: [
13
13
  { name: "features", href: "/features" },
@@ -1 +1 @@
1
- {"version":3,"file":"PublicNavbar.d.ts","sourceRoot":"","sources":["../../../../src/components/app/layouts/PublicNavbar.tsx"],"names":[],"mappings":"AAYA,wBAAgB,YAAY,4CA0J3B"}
1
+ {"version":3,"file":"PublicNavbar.d.ts","sourceRoot":"","sources":["../../../../src/components/app/layouts/PublicNavbar.tsx"],"names":[],"mappings":"AAaA,wBAAgB,YAAY,4CAyJ3B"}
@@ -8,13 +8,13 @@ import { Menu, X } from "lucide-react";
8
8
  import { useState } from "react";
9
9
  import { sel } from "../../../lib/test/index.js";
10
10
  import { useTranslations } from "next-intl";
11
+ import { APP_NAME } from "../../../lib/config/index.js";
11
12
  function PublicNavbar() {
12
13
  const { user, isLoading } = useAuth();
13
14
  const [isMenuOpen, setIsMenuOpen] = useState(false);
14
15
  const tNav = useTranslations("navigation");
15
16
  const tHome = useTranslations("home");
16
- const tCommon = useTranslations("common");
17
- const appName = tCommon("appName");
17
+ const appName = APP_NAME;
18
18
  const navigationItems = [
19
19
  { name: "features", href: "/features" },
20
20
  { name: "pricing", href: "/pricing" },
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeToggle.d.ts","sourceRoot":"","sources":["../../../../src/components/app/misc/ThemeToggle.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,WAAW,4CAmH1B"}
1
+ {"version":3,"file":"ThemeToggle.d.ts","sourceRoot":"","sources":["../../../../src/components/app/misc/ThemeToggle.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,WAAW,4CA4H1B"}
@@ -14,7 +14,7 @@ import { createAriaLabel, sel } from "../../../lib/test/index.js";
14
14
  import { useTranslations } from "next-intl";
15
15
  import { useAuth } from "../../../hooks/useAuth.js";
16
16
  function ThemeToggle() {
17
- const { setTheme, theme } = useTheme();
17
+ const { setTheme, theme, forcedTheme } = useTheme();
18
18
  const { user } = useAuth();
19
19
  const [mounted, setMounted] = useState(false);
20
20
  const [statusMessage, setStatusMessage] = useState("");
@@ -50,6 +50,9 @@ function ThemeToggle() {
50
50
  }
51
51
  }
52
52
  }, [setTheme, t, user]);
53
+ if (forcedTheme) {
54
+ return null;
55
+ }
53
56
  if (!mounted) {
54
57
  return /* @__PURE__ */ jsxs(
55
58
  Button,
@@ -1 +1 @@
1
- {"version":3,"file":"DevKeyring.d.ts","sourceRoot":"","sources":["../../../src/components/auth/DevKeyring.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,wBAAwB,CAAA;AAE9E,UAAU,eAAe;IACvB,0CAA0C;IAC1C,MAAM,EAAE,gBAAgB,CAAA;CACzB;AA2GD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,eAAe,2CA+HrD"}
1
+ {"version":3,"file":"DevKeyring.d.ts","sourceRoot":"","sources":["../../../src/components/auth/DevKeyring.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,wBAAwB,CAAA;AAE9E,UAAU,eAAe;IACvB,0CAA0C;IAC1C,MAAM,EAAE,gBAAgB,CAAA;CACzB;AA2GD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,eAAe,2CAwIrD"}
@@ -88,11 +88,19 @@ function DevKeyring({ config }) {
88
88
  if (!(config == null ? void 0 : config.enabled) || !((_a = config.users) == null ? void 0 : _a.length)) return null;
89
89
  const fillForm = useCallback((email, password) => {
90
90
  const showEmailButton = document.querySelector('[data-cy="login-show-email"]');
91
+ const usePasswordToggle = () => {
92
+ var _a2;
93
+ return (_a2 = document.querySelector('[data-cy="login-use-password"]')) == null ? void 0 : _a2.click();
94
+ };
91
95
  if (showEmailButton) {
92
96
  showEmailButton.click();
93
- setTimeout(() => fillInputs(email, password), 100);
97
+ setTimeout(() => {
98
+ usePasswordToggle();
99
+ setTimeout(() => fillInputs(email, password), 50);
100
+ }, 100);
94
101
  } else {
95
- fillInputs(email, password);
102
+ usePasswordToggle();
103
+ setTimeout(() => fillInputs(email, password), 50);
96
104
  }
97
105
  setIsOpen(false);
98
106
  }, []);
@@ -0,0 +1,21 @@
1
+ import { type UseSessionCookieRefreshOptions } from '../../hooks/useSessionCookieRefresh';
2
+ /**
3
+ * Drop-in client component that keeps the session cookie renewed for
4
+ * installed PWAs / long-lived tabs. Renders nothing.
5
+ *
6
+ * The root layout template mounts it once; it re-issues the session cookie
7
+ * through Better Auth's `get-session` Route Handler on app open, when the tab
8
+ * becomes visible again and when the device comes back online. See
9
+ * `useSessionCookieRefresh` for the options and `lib/auth/session-refresh.ts`
10
+ * for why render-time session reads cannot do this themselves.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // app/layout.tsx
15
+ * <SessionCookieRefresher />
16
+ * // or, for a theme with 90-day sessions that only wants a daily check:
17
+ * <SessionCookieRefresher minIntervalMs={24 * 60 * 60 * 1000} />
18
+ * ```
19
+ */
20
+ export declare function SessionCookieRefresher(props?: UseSessionCookieRefreshOptions): any;
21
+ //# sourceMappingURL=SessionCookieRefresher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionCookieRefresher.d.ts","sourceRoot":"","sources":["../../../src/components/auth/SessionCookieRefresher.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,qCAAqC,CAAA;AAE5C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,GAAE,8BAAmC,OAGhF"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import {
3
+ useSessionCookieRefresh
4
+ } from "../../hooks/useSessionCookieRefresh.js";
5
+ function SessionCookieRefresher(props = {}) {
6
+ useSessionCookieRefresh(props);
7
+ return null;
8
+ }
9
+ export {
10
+ SessionCookieRefresher
11
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"LoginForm.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/forms/LoginForm.tsx"],"names":[],"mappings":"AAqGA,wBAAgB,SAAS,4CA6YxB"}
1
+ {"version":3,"file":"LoginForm.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/forms/LoginForm.tsx"],"names":[],"mappings":"AAmIA,wBAAgB,SAAS,4CAisBxB"}
@@ -16,16 +16,28 @@ import { Checkbox } from "../../ui/checkbox.js";
16
16
  import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "../../ui/card.js";
17
17
  import { Separator } from "../../ui/separator.js";
18
18
  import { LastUsedBadge } from "../../ui/last-used-badge.js";
19
- import { Mail, Lock, Loader2, AlertCircle, Users } from "lucide-react";
19
+ import { Mail, Lock, Loader2, AlertCircle, Users, KeyRound } from "lucide-react";
20
20
  import { GoogleIcon } from "../../ui/google-icon.js";
21
21
  import { sel } from "../../../lib/test/index.js";
22
22
  import { useTranslations } from "next-intl";
23
23
  import { AuthTranslationPreloader } from "../../../lib/i18n/AuthTranslationPreloader.js";
24
24
  import { DevKeyring } from "../DevKeyring.js";
25
25
  import { DEV_CONFIG, PUBLIC_AUTH_CONFIG } from "../../../lib/config/config-sync.js";
26
+ import { getPrimaryEmailMethod } from "../../../lib/auth/auth-methods.js";
26
27
  function getErrorMessageFromCode(error, t, context) {
27
28
  const authError = error;
28
29
  const errorCode = authError.code || getErrorCodeFromMessage(error.message);
30
+ if (context === "otp") {
31
+ const lower = (error.message || "").toLowerCase();
32
+ if (lower.includes("expired")) return t("login.errors.otpExpired", { defaultValue: error.message });
33
+ if (lower.includes("too many") || lower.includes("rate") || lower.includes("attempts")) {
34
+ return t("login.errors.otpTooMany", { defaultValue: error.message });
35
+ }
36
+ if (lower.includes("invalid") || lower.includes("otp") || lower.includes("code")) {
37
+ return t("login.errors.otpInvalid", { defaultValue: error.message });
38
+ }
39
+ return error.message || t("login.messages.otpVerifyFailed");
40
+ }
29
41
  const baseKey = context === "email" ? "login.errors" : "login.errors.google";
30
42
  switch (errorCode) {
31
43
  case "INVALID_CREDENTIALS":
@@ -82,22 +94,48 @@ function buildLoginSchema(t) {
82
94
  password: z.string().min(6, t("login.errors.passwordTooShort", { defaultValue: "Password must be at least 6 characters" }))
83
95
  });
84
96
  }
97
+ const OTP_CODE_LENGTH = 6;
98
+ function buildOtpEmailSchema(t) {
99
+ return z.string().trim().email({ message: t("login.errors.invalidEmail", { defaultValue: "Invalid email" }) });
100
+ }
101
+ function buildOtpCodeSchema(t) {
102
+ return z.string().trim().regex(new RegExp(`^\\d{${OTP_CODE_LENGTH}}$`), {
103
+ message: t("login.errors.otpInvalidCode", { defaultValue: `Enter the ${OTP_CODE_LENGTH}-digit code` })
104
+ });
105
+ }
85
106
  function LoginForm() {
86
107
  var _a, _b, _c;
87
108
  const registrationMode = PUBLIC_AUTH_CONFIG.registration.mode;
88
109
  const googleEnabled = PUBLIC_AUTH_CONFIG.providers.google.enabled;
89
- const signupVisible = registrationMode === "open" || registrationMode === "domain-open";
110
+ const methods = PUBLIC_AUTH_CONFIG.methods;
111
+ const otpEnabled = methods.includes("email-otp");
90
112
  const devKeyringActive = process.env.NODE_ENV !== "production" && !!((_b = (_a = DEV_CONFIG) == null ? void 0 : _a.devKeyring) == null ? void 0 : _b.enabled);
91
- const emailLoginAllowed = registrationMode !== "domain-restricted" || devKeyringActive;
113
+ const passwordEnabled = methods.includes("email-password") || devKeyringActive;
114
+ const signupVisible = (registrationMode === "open" || registrationMode === "domain-open") && methods.includes("email-password");
115
+ const emailLoginAllowed = (registrationMode !== "domain-restricted" || devKeyringActive) && (otpEnabled || passwordEnabled);
116
+ const primaryEmailMode = (() => {
117
+ const primary = getPrimaryEmailMethod(methods);
118
+ if (primary === "email-otp" && otpEnabled) return "otp";
119
+ if (primary === "email-password") return "password";
120
+ return otpEnabled ? "otp" : "password";
121
+ })();
92
122
  const [loadingProvider, setLoadingProvider] = useState(null);
93
123
  const [error, setError] = useState(null);
94
124
  const [statusMessage, setStatusMessage] = useState("");
95
125
  const [showEmailForm, setShowEmailForm] = useState(!googleEnabled);
126
+ const [emailMode, setEmailMode] = useState(primaryEmailMode);
127
+ const [otpStep, setOtpStep] = useState("email");
128
+ const [otpEmail, setOtpEmail] = useState("");
129
+ const [otpCode, setOtpCode] = useState("");
130
+ const [otpEmailError, setOtpEmailError] = useState(null);
131
+ const [otpCodeError, setOtpCodeError] = useState(null);
96
132
  const isProcessingRef = useRef(false);
97
- const { signIn, googleSignIn } = useAuth();
133
+ const { signIn, googleSignIn, sendOtp, signInWithOtp } = useAuth();
98
134
  const { lastMethod, isReady } = useLastAuthMethod();
99
135
  const t = useTranslations("auth");
100
136
  const loginSchema = useMemo(() => buildLoginSchema(t), [t]);
137
+ const otpEmailSchema = useMemo(() => buildOtpEmailSchema(t), [t]);
138
+ const otpCodeSchema = useMemo(() => buildOtpCodeSchema(t), [t]);
101
139
  const searchParams = useSearchParams();
102
140
  const inviteEmail = searchParams.get("email");
103
141
  const fromInvite = searchParams.get("fromInvite") === "true";
@@ -105,8 +143,75 @@ function LoginForm() {
105
143
  useEffect(() => {
106
144
  if (fromInvite && inviteEmail) {
107
145
  setShowEmailForm(true);
146
+ setOtpEmail(inviteEmail);
108
147
  }
109
148
  }, [fromInvite, inviteEmail]);
149
+ const switchEmailMode = useCallback((mode) => {
150
+ setEmailMode(mode);
151
+ setError(null);
152
+ setOtpEmailError(null);
153
+ setOtpCodeError(null);
154
+ setOtpStep("email");
155
+ setOtpCode("");
156
+ }, []);
157
+ const handleSendOtp = useCallback(async (event) => {
158
+ var _a2;
159
+ event == null ? void 0 : event.preventDefault();
160
+ if (loadingProvider) return;
161
+ const parsed = otpEmailSchema.safeParse(otpEmail);
162
+ if (!parsed.success) {
163
+ setOtpEmailError(((_a2 = parsed.error.issues[0]) == null ? void 0 : _a2.message) ?? t("login.errors.invalidEmail"));
164
+ return;
165
+ }
166
+ setOtpEmailError(null);
167
+ setOtpCodeError(null);
168
+ setError(null);
169
+ setLoadingProvider("email");
170
+ setStatusMessage(t("login.messages.otpSending"));
171
+ try {
172
+ await sendOtp(parsed.data);
173
+ setOtpEmail(parsed.data);
174
+ setOtpCode("");
175
+ setOtpStep("code");
176
+ setStatusMessage(t("login.messages.otpSent"));
177
+ } catch (err) {
178
+ const error2 = err instanceof Error ? err : new Error(t("login.messages.otpSendFailed"));
179
+ const errorMessage = error2.message || t("login.messages.otpSendFailed");
180
+ setError(errorMessage);
181
+ setStatusMessage(t("login.messages.signInError", { error: errorMessage }));
182
+ } finally {
183
+ setLoadingProvider(null);
184
+ }
185
+ }, [loadingProvider, otpEmail, otpEmailSchema, sendOtp, t]);
186
+ const handleVerifyOtp = useCallback(async (event) => {
187
+ var _a2;
188
+ event == null ? void 0 : event.preventDefault();
189
+ if (loadingProvider) return;
190
+ const parsed = otpCodeSchema.safeParse(otpCode);
191
+ if (!parsed.success) {
192
+ setOtpCodeError(((_a2 = parsed.error.issues[0]) == null ? void 0 : _a2.message) ?? t("login.errors.otpInvalidCode"));
193
+ return;
194
+ }
195
+ setOtpCodeError(null);
196
+ setError(null);
197
+ setLoadingProvider("email");
198
+ setStatusMessage(t("login.messages.otpVerifying"));
199
+ try {
200
+ await signInWithOtp({
201
+ email: otpEmail,
202
+ otp: parsed.data,
203
+ redirectTo: callbackUrl || void 0
204
+ });
205
+ setStatusMessage(t("login.messages.signInSuccess"));
206
+ } catch (err) {
207
+ const error2 = err instanceof Error ? err : new Error(t("login.messages.otpVerifyFailed"));
208
+ const errorMessage = getErrorMessageFromCode(error2, t, "otp");
209
+ setError(errorMessage);
210
+ setStatusMessage(t("login.messages.signInError", { error: errorMessage }));
211
+ } finally {
212
+ setLoadingProvider(null);
213
+ }
214
+ }, [loadingProvider, otpCode, otpCodeSchema, otpEmail, signInWithOtp, callbackUrl, t]);
110
215
  const {
111
216
  register,
112
217
  handleSubmit,
@@ -258,11 +363,189 @@ function LoginForm() {
258
363
  }
259
364
  ) }),
260
365
  showEmailForm && emailLoginAllowed && /* @__PURE__ */ jsxs(Fragment, { children: [
261
- /* @__PURE__ */ jsxs("div", { className: "relative my-6", children: [
366
+ googleEnabled && /* @__PURE__ */ jsxs("div", { className: "relative my-6", children: [
262
367
  /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center", children: /* @__PURE__ */ jsx(Separator, { className: "w-full" }) }),
263
368
  /* @__PURE__ */ jsx("div", { className: "relative flex justify-center text-xs uppercase", children: /* @__PURE__ */ jsx("span", { className: "bg-background px-2 text-muted-foreground", children: t("login.form.orContinueWith") }) })
264
369
  ] }),
265
- /* @__PURE__ */ jsxs(
370
+ emailMode === "otp" && otpEnabled && /* @__PURE__ */ jsxs(
371
+ "form",
372
+ {
373
+ onSubmit: otpStep === "email" ? handleSendOtp : handleVerifyOtp,
374
+ className: "space-y-4",
375
+ "aria-labelledby": "login-heading",
376
+ noValidate: true,
377
+ "data-cy": sel("auth.login.otpForm"),
378
+ children: [
379
+ otpStep === "email" ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
380
+ /* @__PURE__ */ jsx(Label, { htmlFor: "otp-email", children: t("login.form.email") }),
381
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
382
+ /* @__PURE__ */ jsx(Mail, { className: "absolute left-3 top-3 h-4 w-4 text-muted-foreground", "aria-hidden": "true" }),
383
+ /* @__PURE__ */ jsx(
384
+ Input,
385
+ {
386
+ id: "otp-email",
387
+ type: "email",
388
+ autoComplete: "email",
389
+ inputMode: "email",
390
+ value: otpEmail,
391
+ onChange: (e) => setOtpEmail(e.target.value),
392
+ placeholder: t("login.form.emailPlaceholder"),
393
+ className: `pl-9 ${fromInvite ? "bg-muted cursor-not-allowed" : ""}`,
394
+ readOnly: fromInvite,
395
+ "aria-required": "true",
396
+ "aria-describedby": otpEmailError ? "otp-email-error" : "otp-email-help",
397
+ "aria-invalid": otpEmailError ? "true" : "false",
398
+ "data-cy": sel("auth.login.otpEmailInput")
399
+ }
400
+ )
401
+ ] }),
402
+ /* @__PURE__ */ jsx("p", { id: "otp-email-help", className: "text-xs text-muted-foreground", children: t("login.form.otp.emailHelp") }),
403
+ otpEmailError && /* @__PURE__ */ jsx(
404
+ "p",
405
+ {
406
+ id: "otp-email-error",
407
+ className: "text-sm text-destructive",
408
+ role: "alert",
409
+ "aria-live": "assertive",
410
+ "data-cy": sel("auth.login.otpEmailError"),
411
+ children: otpEmailError
412
+ }
413
+ )
414
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
415
+ /* @__PURE__ */ jsxs(Alert, { "data-cy": sel("auth.login.otpSentNotice"), children: [
416
+ /* @__PURE__ */ jsx(Mail, { className: "h-4 w-4", "aria-hidden": "true" }),
417
+ /* @__PURE__ */ jsx(AlertDescription, { children: t("login.form.otp.codeSent", { email: otpEmail }) })
418
+ ] }),
419
+ /* @__PURE__ */ jsx(Label, { htmlFor: "otp-code", children: t("login.form.otp.codeLabel") }),
420
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
421
+ /* @__PURE__ */ jsx(KeyRound, { className: "absolute left-3 top-3 h-4 w-4 text-muted-foreground", "aria-hidden": "true" }),
422
+ /* @__PURE__ */ jsx(
423
+ Input,
424
+ {
425
+ id: "otp-code",
426
+ type: "text",
427
+ inputMode: "numeric",
428
+ autoComplete: "one-time-code",
429
+ pattern: "[0-9]*",
430
+ maxLength: OTP_CODE_LENGTH,
431
+ value: otpCode,
432
+ onChange: (e) => setOtpCode(e.target.value.replace(/\D/g, "").slice(0, OTP_CODE_LENGTH)),
433
+ placeholder: t("login.form.otp.codePlaceholder"),
434
+ className: "pl-9 tracking-widest",
435
+ autoFocus: true,
436
+ "aria-required": "true",
437
+ "aria-describedby": otpCodeError ? "otp-code-error" : void 0,
438
+ "aria-invalid": otpCodeError ? "true" : "false",
439
+ "data-cy": sel("auth.login.otpCodeInput")
440
+ }
441
+ )
442
+ ] }),
443
+ otpCodeError && /* @__PURE__ */ jsx(
444
+ "p",
445
+ {
446
+ id: "otp-code-error",
447
+ className: "text-sm text-destructive",
448
+ role: "alert",
449
+ "aria-live": "assertive",
450
+ "data-cy": sel("auth.login.otpCodeError"),
451
+ children: otpCodeError
452
+ }
453
+ )
454
+ ] }),
455
+ error && /* @__PURE__ */ jsxs(
456
+ Alert,
457
+ {
458
+ variant: "destructive",
459
+ role: "alert",
460
+ "aria-live": "assertive",
461
+ "data-cy": sel("auth.login.errorAlert"),
462
+ children: [
463
+ /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4", "aria-hidden": "true" }),
464
+ /* @__PURE__ */ jsx(AlertDescription, { children: error })
465
+ ]
466
+ }
467
+ ),
468
+ otpStep === "email" ? /* @__PURE__ */ jsx(
469
+ Button,
470
+ {
471
+ type: "submit",
472
+ disabled: !!loadingProvider,
473
+ className: "w-full",
474
+ "data-cy": sel("auth.login.otpSend"),
475
+ children: loadingProvider === "email" ? /* @__PURE__ */ jsxs(Fragment, { children: [
476
+ /* @__PURE__ */ jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin", "aria-hidden": "true" }),
477
+ t("login.form.otp.sendingCode")
478
+ ] }) : t("login.form.otp.sendCode")
479
+ }
480
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
481
+ /* @__PURE__ */ jsx(
482
+ Button,
483
+ {
484
+ type: "submit",
485
+ disabled: !!loadingProvider,
486
+ className: "w-full",
487
+ "data-cy": sel("auth.login.otpSubmit"),
488
+ children: loadingProvider === "email" ? /* @__PURE__ */ jsxs(Fragment, { children: [
489
+ /* @__PURE__ */ jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin", "aria-hidden": "true" }),
490
+ t("login.form.otp.verifyingCode")
491
+ ] }) : t("login.form.otp.verifyCode")
492
+ }
493
+ ),
494
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-sm", children: [
495
+ /* @__PURE__ */ jsx(
496
+ "button",
497
+ {
498
+ type: "button",
499
+ onClick: () => void handleSendOtp(),
500
+ disabled: !!loadingProvider,
501
+ className: "text-primary hover:underline focus:outline-none focus:ring-2 focus:ring-accent disabled:opacity-50 min-h-[44px] inline-flex items-center",
502
+ "data-cy": sel("auth.login.otpResend"),
503
+ children: t("login.form.otp.resendCode")
504
+ }
505
+ ),
506
+ /* @__PURE__ */ jsx(
507
+ "button",
508
+ {
509
+ type: "button",
510
+ onClick: () => {
511
+ setOtpStep("email");
512
+ setOtpCode("");
513
+ setOtpCodeError(null);
514
+ setError(null);
515
+ },
516
+ disabled: !!loadingProvider,
517
+ className: "text-muted-foreground hover:text-primary focus:outline-none focus:ring-2 focus:ring-accent disabled:opacity-50 min-h-[44px] inline-flex items-center",
518
+ "data-cy": sel("auth.login.otpChangeEmail"),
519
+ children: t("login.form.otp.changeEmail")
520
+ }
521
+ )
522
+ ] })
523
+ ] }),
524
+ passwordEnabled && /* @__PURE__ */ jsx("div", { className: "text-center", children: /* @__PURE__ */ jsx(
525
+ "button",
526
+ {
527
+ type: "button",
528
+ onClick: () => switchEmailMode("password"),
529
+ disabled: !!loadingProvider,
530
+ className: "text-sm text-muted-foreground hover:text-primary focus:outline-none focus:ring-2 focus:ring-accent min-h-[44px] inline-flex items-center",
531
+ "data-cy": sel("auth.login.usePassword"),
532
+ children: t("login.form.usePassword")
533
+ }
534
+ ) }),
535
+ googleEnabled && /* @__PURE__ */ jsx("div", { className: "text-center", children: /* @__PURE__ */ jsx(
536
+ "button",
537
+ {
538
+ type: "button",
539
+ onClick: () => setShowEmailForm(false),
540
+ className: "text-sm text-muted-foreground hover:text-primary focus:outline-none focus:ring-2 focus:ring-accent min-h-[44px] inline-flex items-center",
541
+ "data-cy": sel("auth.login.hideEmail"),
542
+ children: t("login.form.backToGoogle", { defaultValue: "Back to main options" })
543
+ }
544
+ ) })
545
+ ]
546
+ }
547
+ ),
548
+ (emailMode === "password" || !otpEnabled) && passwordEnabled && /* @__PURE__ */ jsxs(
266
549
  "form",
267
550
  {
268
551
  onSubmit: handleSubmit(onSubmit),
@@ -411,6 +694,17 @@ function LoginForm() {
411
694
  }
412
695
  ),
413
696
  /* @__PURE__ */ jsx("div", { id: "submit-help", className: "sr-only", children: t("login.form.submitHelp") }),
697
+ otpEnabled && /* @__PURE__ */ jsx("div", { className: "text-center mt-4", children: /* @__PURE__ */ jsx(
698
+ "button",
699
+ {
700
+ type: "button",
701
+ onClick: () => switchEmailMode("otp"),
702
+ disabled: !!loadingProvider,
703
+ className: "text-sm text-muted-foreground hover:text-primary focus:outline-none focus:ring-2 focus:ring-accent min-h-[44px] inline-flex items-center",
704
+ "data-cy": sel("auth.login.useOtp"),
705
+ children: t("login.form.useOtp")
706
+ }
707
+ ) }),
414
708
  googleEnabled && /* @__PURE__ */ jsx("div", { className: "text-center mt-4", children: /* @__PURE__ */ jsx(
415
709
  "button",
416
710
  {
@@ -7,5 +7,6 @@ export { LoginForm } from './forms/LoginForm';
7
7
  export { SignupForm } from './forms/SignupForm';
8
8
  export { AuthWrapper } from './layouts/AuthWrapper';
9
9
  export { AuthWrapperWithPreload } from './layouts/AuthWrapperWithPreload';
10
+ export { SessionCookieRefresher } from './SessionCookieRefresher';
10
11
  export { DevKeyring } from './DevKeyring';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/auth/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAGzE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/auth/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAGzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
@@ -2,11 +2,13 @@ import { LoginForm } from "./forms/LoginForm.js";
2
2
  import { SignupForm } from "./forms/SignupForm.js";
3
3
  import { AuthWrapper } from "./layouts/AuthWrapper.js";
4
4
  import { AuthWrapperWithPreload } from "./layouts/AuthWrapperWithPreload.js";
5
+ import { SessionCookieRefresher } from "./SessionCookieRefresher.js";
5
6
  import { DevKeyring } from "./DevKeyring.js";
6
7
  export {
7
8
  AuthWrapper,
8
9
  AuthWrapperWithPreload,
9
10
  DevKeyring,
10
11
  LoginForm,
12
+ SessionCookieRefresher,
11
13
  SignupForm
12
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"InvoicesTable.d.ts","sourceRoot":"","sources":["../../../src/components/billing/InvoicesTable.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAI7E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACrC;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAiB,EACjB,KAAK,EACL,KAAK,EACL,MAAM,EACN,YAAY,GACb,EAAE,kBAAkB,2CA+HpB"}
1
+ {"version":3,"file":"InvoicesTable.d.ts","sourceRoot":"","sources":["../../../src/components/billing/InvoicesTable.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAI7E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACrC;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAiB,EACjB,KAAK,EACL,KAAK,EACL,MAAM,EACN,YAAY,GACb,EAAE,kBAAkB,2CAiIpB"}