hazo_auth 7.0.1 → 7.0.2

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 (210) hide show
  1. package/README.md +73 -330
  2. package/SETUP_CHECKLIST.md +28 -248
  3. package/cli-src/cli/generate.ts +1 -10
  4. package/cli-src/cli/validate.ts +0 -4
  5. package/cli-src/lib/auth/auth_types.ts +12 -21
  6. package/cli-src/lib/auth/hazo_get_tenant_auth.server.ts +24 -25
  7. package/cli-src/lib/auth/index.ts +2 -2
  8. package/cli-src/lib/auth/nextauth_config.ts +27 -67
  9. package/cli-src/lib/auth/with_auth.server.ts +15 -15
  10. package/cli-src/lib/config/default_config.ts +8 -0
  11. package/cli-src/lib/cookies_config.server.ts +1 -1
  12. package/cli-src/lib/email_verification_config.server.ts +34 -0
  13. package/cli-src/lib/forgot_password_config.server.ts +34 -0
  14. package/cli-src/lib/login_config.server.ts +29 -14
  15. package/cli-src/lib/my_settings_config.server.ts +3 -0
  16. package/cli-src/lib/oauth_config.server.ts +31 -57
  17. package/cli-src/lib/register_config.server.ts +35 -11
  18. package/cli-src/lib/reset_password_config.server.ts +31 -0
  19. package/cli-src/lib/services/email_template_manifest.ts +0 -17
  20. package/cli-src/lib/services/index.ts +2 -8
  21. package/cli-src/lib/services/oauth_service.ts +74 -128
  22. package/cli-src/lib/services/otp_service.ts +7 -2
  23. package/cli-src/lib/services/session_token_service.ts +0 -2
  24. package/config/hazo_auth_config.example.ini +41 -76
  25. package/dist/cli/generate.d.ts.map +1 -1
  26. package/dist/cli/generate.js +1 -10
  27. package/dist/cli/validate.d.ts.map +1 -1
  28. package/dist/cli/validate.js +0 -4
  29. package/dist/client.d.ts +0 -2
  30. package/dist/client.d.ts.map +1 -1
  31. package/dist/client.js +0 -1
  32. package/dist/components/layouts/create_firm/index.d.ts +8 -4
  33. package/dist/components/layouts/create_firm/index.d.ts.map +1 -1
  34. package/dist/components/layouts/create_firm/index.js +3 -3
  35. package/dist/components/layouts/email_verification/index.d.ts +5 -4
  36. package/dist/components/layouts/email_verification/index.d.ts.map +1 -1
  37. package/dist/components/layouts/email_verification/index.js +4 -4
  38. package/dist/components/layouts/forgot_password/index.d.ts +5 -4
  39. package/dist/components/layouts/forgot_password/index.d.ts.map +1 -1
  40. package/dist/components/layouts/forgot_password/index.js +2 -2
  41. package/dist/components/layouts/login/index.d.ts +13 -19
  42. package/dist/components/layouts/login/index.d.ts.map +1 -1
  43. package/dist/components/layouts/login/index.js +8 -11
  44. package/dist/components/layouts/otp/index.d.ts +5 -1
  45. package/dist/components/layouts/otp/index.d.ts.map +1 -1
  46. package/dist/components/layouts/otp/index.js +2 -2
  47. package/dist/components/layouts/register/index.d.ts +11 -11
  48. package/dist/components/layouts/register/index.d.ts.map +1 -1
  49. package/dist/components/layouts/register/index.js +6 -7
  50. package/dist/components/layouts/reset_password/index.d.ts +5 -4
  51. package/dist/components/layouts/reset_password/index.d.ts.map +1 -1
  52. package/dist/components/layouts/reset_password/index.js +5 -5
  53. package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts +5 -3
  54. package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts.map +1 -1
  55. package/dist/components/layouts/shared/components/already_logged_in_guard.js +2 -2
  56. package/dist/components/layouts/shared/components/facebook_sign_in_button.d.ts +2 -6
  57. package/dist/components/layouts/shared/components/facebook_sign_in_button.d.ts.map +1 -1
  58. package/dist/components/layouts/shared/components/facebook_sign_in_button.js +11 -13
  59. package/dist/components/layouts/shared/components/sidebar_layout_wrapper.d.ts.map +1 -1
  60. package/dist/components/layouts/shared/components/sidebar_layout_wrapper.js +3 -8
  61. package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts +6 -3
  62. package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts.map +1 -1
  63. package/dist/components/layouts/shared/components/two_column_auth_layout.js +5 -8
  64. package/dist/components/layouts/shared/index.d.ts +2 -0
  65. package/dist/components/layouts/shared/index.d.ts.map +1 -1
  66. package/dist/components/layouts/shared/index.js +1 -0
  67. package/dist/components/layouts/user_management/index.d.ts.map +1 -1
  68. package/dist/components/layouts/user_management/index.js +39 -2
  69. package/dist/index.d.ts +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/lib/auth/auth_types.d.ts +12 -13
  72. package/dist/lib/auth/auth_types.d.ts.map +1 -1
  73. package/dist/lib/auth/auth_types.js +0 -8
  74. package/dist/lib/auth/hazo_get_tenant_auth.server.d.ts +7 -8
  75. package/dist/lib/auth/hazo_get_tenant_auth.server.d.ts.map +1 -1
  76. package/dist/lib/auth/hazo_get_tenant_auth.server.js +22 -23
  77. package/dist/lib/auth/index.d.ts +2 -2
  78. package/dist/lib/auth/index.d.ts.map +1 -1
  79. package/dist/lib/auth/nextauth_config.d.ts +0 -10
  80. package/dist/lib/auth/nextauth_config.d.ts.map +1 -1
  81. package/dist/lib/auth/nextauth_config.js +23 -52
  82. package/dist/lib/auth/with_auth.server.d.ts +13 -13
  83. package/dist/lib/auth/with_auth.server.d.ts.map +1 -1
  84. package/dist/lib/auth/with_auth.server.js +2 -2
  85. package/dist/lib/config/default_config.d.ts +16 -0
  86. package/dist/lib/config/default_config.d.ts.map +1 -1
  87. package/dist/lib/config/default_config.js +8 -0
  88. package/dist/lib/cookies_config.server.d.ts +1 -1
  89. package/dist/lib/cookies_config.server.js +1 -1
  90. package/dist/lib/email_verification_config.server.d.ts +3 -0
  91. package/dist/lib/email_verification_config.server.d.ts.map +1 -1
  92. package/dist/lib/email_verification_config.server.js +15 -0
  93. package/dist/lib/forgot_password_config.server.d.ts +3 -0
  94. package/dist/lib/forgot_password_config.server.d.ts.map +1 -1
  95. package/dist/lib/forgot_password_config.server.js +15 -0
  96. package/dist/lib/login_config.server.d.ts +3 -6
  97. package/dist/lib/login_config.server.d.ts.map +1 -1
  98. package/dist/lib/login_config.server.js +11 -7
  99. package/dist/lib/my_settings_config.server.d.ts +1 -0
  100. package/dist/lib/my_settings_config.server.d.ts.map +1 -1
  101. package/dist/lib/my_settings_config.server.js +2 -0
  102. package/dist/lib/oauth_config.server.d.ts +8 -17
  103. package/dist/lib/oauth_config.server.d.ts.map +1 -1
  104. package/dist/lib/oauth_config.server.js +10 -25
  105. package/dist/lib/register_config.server.d.ts +5 -2
  106. package/dist/lib/register_config.server.d.ts.map +1 -1
  107. package/dist/lib/register_config.server.js +15 -4
  108. package/dist/lib/reset_password_config.server.d.ts +3 -0
  109. package/dist/lib/reset_password_config.server.d.ts.map +1 -1
  110. package/dist/lib/reset_password_config.server.js +13 -0
  111. package/dist/lib/services/email_template_manifest.d.ts.map +1 -1
  112. package/dist/lib/services/email_template_manifest.js +0 -17
  113. package/dist/lib/services/index.d.ts +0 -2
  114. package/dist/lib/services/index.d.ts.map +1 -1
  115. package/dist/lib/services/index.js +0 -1
  116. package/dist/lib/services/oauth_service.d.ts +11 -22
  117. package/dist/lib/services/oauth_service.d.ts.map +1 -1
  118. package/dist/lib/services/oauth_service.js +63 -96
  119. package/dist/lib/services/otp_service.d.ts +1 -1
  120. package/dist/lib/services/otp_service.d.ts.map +1 -1
  121. package/dist/lib/services/otp_service.js +6 -1
  122. package/dist/lib/services/session_token_service.d.ts +0 -2
  123. package/dist/lib/services/session_token_service.d.ts.map +1 -1
  124. package/dist/lib/services/session_token_service.js +0 -2
  125. package/dist/page_components/create_firm.d.ts +1 -13
  126. package/dist/page_components/create_firm.d.ts.map +1 -1
  127. package/dist/page_components/create_firm.js +6 -10
  128. package/dist/page_components/forgot_password.d.ts +4 -1
  129. package/dist/page_components/forgot_password.d.ts.map +1 -1
  130. package/dist/page_components/forgot_password.js +6 -2
  131. package/dist/page_components/login.d.ts +4 -1
  132. package/dist/page_components/login.d.ts.map +1 -1
  133. package/dist/page_components/login.js +6 -2
  134. package/dist/page_components/register.d.ts +4 -1
  135. package/dist/page_components/register.d.ts.map +1 -1
  136. package/dist/page_components/register.js +6 -2
  137. package/dist/page_components/reset_password.d.ts +4 -1
  138. package/dist/page_components/reset_password.d.ts.map +1 -1
  139. package/dist/page_components/reset_password.js +6 -2
  140. package/dist/page_components/verify_email.d.ts +4 -1
  141. package/dist/page_components/verify_email.d.ts.map +1 -1
  142. package/dist/page_components/verify_email.js +6 -2
  143. package/dist/server/routes/assets.d.ts +8 -0
  144. package/dist/server/routes/assets.d.ts.map +1 -0
  145. package/dist/server/routes/assets.js +38 -0
  146. package/dist/server/routes/consent_me.d.ts +4 -0
  147. package/dist/server/routes/consent_me.d.ts.map +1 -0
  148. package/dist/server/routes/consent_me.js +15 -0
  149. package/dist/server/routes/index.d.ts +6 -4
  150. package/dist/server/routes/index.d.ts.map +1 -1
  151. package/dist/server/routes/index.js +9 -5
  152. package/dist/server/routes/me.d.ts.map +1 -1
  153. package/dist/server/routes/me.js +1 -43
  154. package/dist/server/routes/oauth_facebook_callback.d.ts +1 -1
  155. package/dist/server/routes/oauth_facebook_callback.d.ts.map +1 -1
  156. package/dist/server/routes/oauth_facebook_callback.js +8 -1
  157. package/dist/server/routes/oauth_google_callback.js +1 -1
  158. package/dist/server/routes/otp/verify.js +2 -2
  159. package/dist/server/routes/strings_defaults.d.ts +4 -0
  160. package/dist/server/routes/strings_defaults.d.ts.map +1 -0
  161. package/dist/server/routes/strings_defaults.js +7 -0
  162. package/dist/server/routes/user_management_users.d.ts +11 -0
  163. package/dist/server/routes/user_management_users.d.ts.map +1 -1
  164. package/dist/server/routes/user_management_users.js +50 -0
  165. package/dist/server-lib.d.ts +0 -3
  166. package/dist/server-lib.d.ts.map +1 -1
  167. package/dist/server-lib.js +0 -2
  168. package/dist/server_pages/forgot_password.d.ts +18 -14
  169. package/dist/server_pages/forgot_password.d.ts.map +1 -1
  170. package/dist/server_pages/forgot_password.js +14 -12
  171. package/dist/server_pages/forgot_password_client_wrapper.d.ts +8 -7
  172. package/dist/server_pages/forgot_password_client_wrapper.d.ts.map +1 -1
  173. package/dist/server_pages/forgot_password_client_wrapper.js +2 -2
  174. package/dist/server_pages/index.d.ts +2 -0
  175. package/dist/server_pages/index.d.ts.map +1 -1
  176. package/dist/server_pages/index.js +1 -0
  177. package/dist/server_pages/login.d.ts +22 -23
  178. package/dist/server_pages/login.d.ts.map +1 -1
  179. package/dist/server_pages/login.js +27 -14
  180. package/dist/server_pages/login_client_wrapper.d.ts +9 -10
  181. package/dist/server_pages/login_client_wrapper.d.ts.map +1 -1
  182. package/dist/server_pages/login_client_wrapper.js +2 -2
  183. package/dist/server_pages/my_settings.d.ts +1 -3
  184. package/dist/server_pages/my_settings.d.ts.map +1 -1
  185. package/dist/server_pages/my_settings.js +2 -9
  186. package/dist/server_pages/register.d.ts +17 -20
  187. package/dist/server_pages/register.d.ts.map +1 -1
  188. package/dist/server_pages/register.js +20 -15
  189. package/dist/server_pages/register_client_wrapper.d.ts +8 -10
  190. package/dist/server_pages/register_client_wrapper.d.ts.map +1 -1
  191. package/dist/server_pages/register_client_wrapper.js +2 -2
  192. package/dist/server_pages/reset_password.d.ts +16 -11
  193. package/dist/server_pages/reset_password.d.ts.map +1 -1
  194. package/dist/server_pages/reset_password.js +14 -10
  195. package/dist/server_pages/reset_password_client_wrapper.d.ts +8 -7
  196. package/dist/server_pages/reset_password_client_wrapper.d.ts.map +1 -1
  197. package/dist/server_pages/reset_password_client_wrapper.js +2 -2
  198. package/dist/server_pages/verify_email.d.ts +18 -12
  199. package/dist/server_pages/verify_email.d.ts.map +1 -1
  200. package/dist/server_pages/verify_email.js +13 -11
  201. package/dist/server_pages/verify_email_client_wrapper.d.ts +8 -7
  202. package/dist/server_pages/verify_email_client_wrapper.d.ts.map +1 -1
  203. package/dist/server_pages/verify_email_client_wrapper.js +2 -2
  204. package/dist/themes/index.d.ts +0 -1
  205. package/dist/themes/index.d.ts.map +1 -1
  206. package/dist/themes/index.js +1 -1
  207. package/package.json +26 -40
  208. package/dist/themes/preset_indigo_sunset.d.ts +0 -3
  209. package/dist/themes/preset_indigo_sunset.d.ts.map +0 -1
  210. package/dist/themes/preset_indigo_sunset.js +0 -20
@@ -21,6 +21,10 @@ import { useEffect, useState } from "react";
21
21
  import email_verification_layout from "../components/layouts/email_verification/index.js";
22
22
  import { createLayoutDataClient } from "../components/layouts/shared/data/layout_data_client.js";
23
23
  import { create_sqlite_hazo_connect } from "../lib/hazo_connect_setup.js";
24
+ // section: constants
25
+ const DEFAULT_IMAGE_SRC = "/hazo_auth/images/verify_email_default.jpg";
26
+ const DEFAULT_IMAGE_ALT = "Illustration of a globe representing secure authentication workflows";
27
+ const DEFAULT_IMAGE_BG = "#f1f5f9";
24
28
  // section: component
25
29
  /**
26
30
  * Zero-config verify email page component
@@ -28,7 +32,7 @@ import { create_sqlite_hazo_connect } from "../lib/hazo_connect_setup.js";
28
32
  * @param props - Optional configuration overrides
29
33
  * @returns Verify email page component
30
34
  */
31
- export function VerifyEmailPage({ alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", redirectDelay = 3000, loginPath = "/hazo_auth/login", } = {}) {
35
+ export function VerifyEmailPage({ alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", redirectDelay = 3000, loginPath = "/hazo_auth/login", imageSrc = DEFAULT_IMAGE_SRC, imageAlt = DEFAULT_IMAGE_ALT, imageBackgroundColor = DEFAULT_IMAGE_BG, } = {}) {
32
36
  const [dataClient, setDataClient] = useState(null);
33
37
  useEffect(() => {
34
38
  // Initialize hazo_connect on client side
@@ -41,6 +45,6 @@ export function VerifyEmailPage({ alreadyLoggedInMessage = "You are already logg
41
45
  return (_jsx("div", { className: "cls_verify_email_page_loading flex items-center justify-center min-h-screen", children: _jsx("div", { className: "text-slate-600 animate-pulse", children: "Loading..." }) }));
42
46
  }
43
47
  const EmailVerificationLayout = email_verification_layout;
44
- return (_jsx(EmailVerificationLayout, { data_client: dataClient, already_logged_in_message: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath, redirect_delay: redirectDelay, login_path: loginPath }));
48
+ return (_jsx(EmailVerificationLayout, { image_src: imageSrc, image_alt: imageAlt, image_background_color: imageBackgroundColor, data_client: dataClient, already_logged_in_message: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath, redirect_delay: redirectDelay, login_path: loginPath }));
45
49
  }
46
50
  export default VerifyEmailPage;
@@ -0,0 +1,8 @@
1
+ import "server-only";
2
+ import { NextRequest, NextResponse } from "next/server";
3
+ export declare function assetGET(_request: NextRequest, { params }: {
4
+ params: {
5
+ name: string;
6
+ };
7
+ }): Promise<NextResponse>;
8
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/server/routes/assets.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoBxD,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,WAAW,EACrB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACvC,OAAO,CAAC,YAAY,CAAC,CAuBvB"}
@@ -0,0 +1,38 @@
1
+ // file_description: Route handler serving static assets from the package dist directory
2
+ import "server-only";
3
+ import { NextResponse } from "next/server";
4
+ import path from "path";
5
+ import fs from "fs";
6
+ const ASSETS_DIR = path.join(path.dirname(require.resolve("hazo_auth/package.json")), "dist", "assets", "images");
7
+ const MIME = {
8
+ ".jpg": "image/jpeg",
9
+ ".jpeg": "image/jpeg",
10
+ ".png": "image/png",
11
+ ".webp": "image/webp",
12
+ ".svg": "image/svg+xml",
13
+ ".gif": "image/gif",
14
+ };
15
+ export async function assetGET(_request, { params }) {
16
+ const name = params.name;
17
+ // Reject path traversal
18
+ if (name.includes("..") || name.includes("/") || name.includes("\\")) {
19
+ return new NextResponse("Not found", { status: 404 });
20
+ }
21
+ const ext = path.extname(name).toLowerCase();
22
+ const mime = MIME[ext];
23
+ if (!mime) {
24
+ return new NextResponse("Not found", { status: 404 });
25
+ }
26
+ const file_path = path.join(ASSETS_DIR, name);
27
+ if (!fs.existsSync(file_path)) {
28
+ return new NextResponse("Not found", { status: 404 });
29
+ }
30
+ const buffer = fs.readFileSync(file_path);
31
+ return new NextResponse(buffer, {
32
+ status: 200,
33
+ headers: {
34
+ "Content-Type": mime,
35
+ "Cache-Control": "public, max-age=31536000, immutable",
36
+ },
37
+ });
38
+ }
@@ -0,0 +1,4 @@
1
+ import "server-only";
2
+ import { NextRequest, NextResponse } from "next/server";
3
+ export declare function consentMeGET(request: NextRequest): Promise<NextResponse>;
4
+ //# sourceMappingURL=consent_me.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consent_me.d.ts","sourceRoot":"","sources":["../../../src/server/routes/consent_me.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAYxD,wBAAsB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAG9E"}
@@ -0,0 +1,15 @@
1
+ // file_description: Route handler returning the current user's parsed consent state
2
+ import "server-only";
3
+ import { NextResponse } from "next/server";
4
+ import { read_consent } from "../../consent/read_consent.js";
5
+ const DEFAULT_CONSENT = {
6
+ necessary: true,
7
+ functional: false,
8
+ analytics: false,
9
+ marketing: false,
10
+ version: 1,
11
+ };
12
+ export async function consentMeGET(request) {
13
+ const consent = read_consent(request.headers);
14
+ return NextResponse.json(consent !== null && consent !== void 0 ? consent : DEFAULT_CONSENT, { status: 200 });
15
+ }
@@ -8,8 +8,6 @@ export { POST as changePasswordPOST } from "./change_password.js";
8
8
  export { GET as validateResetTokenGET } from "./validate_reset_token.js";
9
9
  export { GET as verifyEmailGET } from "./verify_email.js";
10
10
  export { POST as resendVerificationPOST } from "./resend_verification.js";
11
- export { otpRequestPOST } from "./otp/request.js";
12
- export { otpVerifyPOST } from "./otp/verify.js";
13
11
  export { PATCH as updateUserPATCH } from "./update_user.js";
14
12
  export { POST as uploadProfilePicturePOST } from "./upload_profile_picture.js";
15
13
  export { DELETE as removeProfilePictureDELETE } from "./remove_profile_picture.js";
@@ -18,7 +16,7 @@ export { GET as libraryPhotoGET } from "./library_photo.js";
18
16
  export { GET as profilePictureFilenameGET } from "./profile_picture_filename.js";
19
17
  export { POST as getAuthPOST } from "./get_auth.js";
20
18
  export { POST as invalidateCachePOST } from "./invalidate_cache.js";
21
- export { GET as userManagementUsersGET, PATCH as userManagementUsersPATCH, POST as userManagementUsersPOST } from "./user_management_users.js";
19
+ export { GET as userManagementUsersGET, PATCH as userManagementUsersPATCH, POST as userManagementUsersPOST, DELETE as userManagementUsersDELETE } from "./user_management_users.js";
22
20
  export { GET as userManagementPermissionsGET, POST as userManagementPermissionsPOST, PUT as userManagementPermissionsPUT, DELETE as userManagementPermissionsDELETE } from "./user_management_permissions.js";
23
21
  export { GET as userManagementRolesGET, POST as userManagementRolesPOST, PUT as userManagementRolesPUT } from "./user_management_roles.js";
24
22
  export { GET as userManagementUsersRolesGET, POST as userManagementUsersRolesPOST, PUT as userManagementUsersRolesPUT } from "./user_management_users_roles.js";
@@ -28,10 +26,14 @@ export { GET as invitationsGET, POST as invitationsPOST, PATCH as invitationsPAT
28
26
  export { POST as createFirmPOST } from "./create_firm.js";
29
27
  export { GET as nextauthGET, POST as nextauthPOST } from "./nextauth.js";
30
28
  export { GET as oauthGoogleCallbackGET } from "./oauth_google_callback.js";
31
- export { facebookCallbackGET } from "./oauth_facebook_callback.js";
29
+ export { GET as oauthFacebookCallbackGET } from "./oauth_facebook_callback.js";
32
30
  export { POST as setPasswordPOST } from "./set_password.js";
33
31
  export { GET as relationshipsGET, POST as relationshipsPOST, PATCH as relationshipsPATCH, DELETE as relationshipsDELETE } from "./relationships.js";
34
32
  export { POST as relationshipSelfPOST } from "./relationship_self.js";
35
33
  export { POST as relationshipUpgradePOST } from "./relationship_upgrade.js";
36
34
  export { POST as pinLoginPOST } from "./pin_login.js";
35
+ export { otpRequestPOST } from "./otp/request.js";
36
+ export { otpVerifyPOST } from "./otp/verify.js";
37
+ export { consentMeGET } from "./consent_me.js";
38
+ export { stringsDefaultsGET } from "./strings_defaults.js";
37
39
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":"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"}
@@ -13,9 +13,6 @@ export { GET as validateResetTokenGET } from "./validate_reset_token.js";
13
13
  // Email verification routes
14
14
  export { GET as verifyEmailGET } from "./verify_email.js";
15
15
  export { POST as resendVerificationPOST } from "./resend_verification.js";
16
- // OTP routes (one-time password via email)
17
- export { otpRequestPOST } from "./otp/request.js";
18
- export { otpVerifyPOST } from "./otp/verify.js";
19
16
  // User profile routes
20
17
  export { PATCH as updateUserPATCH } from "./update_user.js";
21
18
  export { POST as uploadProfilePicturePOST } from "./upload_profile_picture.js";
@@ -27,7 +24,7 @@ export { GET as profilePictureFilenameGET } from "./profile_picture_filename.js"
27
24
  export { POST as getAuthPOST } from "./get_auth.js";
28
25
  export { POST as invalidateCachePOST } from "./invalidate_cache.js";
29
26
  // User management routes
30
- export { GET as userManagementUsersGET, PATCH as userManagementUsersPATCH, POST as userManagementUsersPOST } from "./user_management_users.js";
27
+ export { GET as userManagementUsersGET, PATCH as userManagementUsersPATCH, POST as userManagementUsersPOST, DELETE as userManagementUsersDELETE } from "./user_management_users.js";
31
28
  export { GET as userManagementPermissionsGET, POST as userManagementPermissionsPOST, PUT as userManagementPermissionsPUT, DELETE as userManagementPermissionsDELETE } from "./user_management_permissions.js";
32
29
  export { GET as userManagementRolesGET, POST as userManagementRolesPOST, PUT as userManagementRolesPUT } from "./user_management_roles.js";
33
30
  export { GET as userManagementUsersRolesGET, POST as userManagementUsersRolesPOST, PUT as userManagementUsersRolesPUT } from "./user_management_users_roles.js";
@@ -41,10 +38,17 @@ export { POST as createFirmPOST } from "./create_firm.js";
41
38
  // OAuth routes
42
39
  export { GET as nextauthGET, POST as nextauthPOST } from "./nextauth.js";
43
40
  export { GET as oauthGoogleCallbackGET } from "./oauth_google_callback.js";
44
- export { facebookCallbackGET } from "./oauth_facebook_callback.js";
41
+ export { GET as oauthFacebookCallbackGET } from "./oauth_facebook_callback.js";
45
42
  export { POST as setPasswordPOST } from "./set_password.js";
46
43
  // Relationship routes (managed sub-profiles)
47
44
  export { GET as relationshipsGET, POST as relationshipsPOST, PATCH as relationshipsPATCH, DELETE as relationshipsDELETE } from "./relationships.js";
48
45
  export { POST as relationshipSelfPOST } from "./relationship_self.js";
49
46
  export { POST as relationshipUpgradePOST } from "./relationship_upgrade.js";
50
47
  export { POST as pinLoginPOST } from "./pin_login.js";
48
+ // OTP sign-in routes
49
+ export { otpRequestPOST } from "./otp/request.js";
50
+ export { otpVerifyPOST } from "./otp/verify.js";
51
+ // Consent routes
52
+ export { consentMeGET } from "./consent_me.js";
53
+ // Strings routes
54
+ export { stringsDefaultsGET } from "./strings_defaults.js";
@@ -1 +1 @@
1
- {"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../../src/server/routes/me.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA+BxD;;;;;GAKG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;IAqJ7C"}
1
+ {"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../../src/server/routes/me.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoBxD;;;;;GAKG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;IA+G7C"}
@@ -1,7 +1,6 @@
1
1
  // file_description: API route handler to get current authenticated user information with permissions
2
2
  // section: imports
3
3
  import { NextResponse } from "next/server";
4
- import { jwtVerify } from "jose";
5
4
  import { hazo_get_auth } from "../../lib/auth/hazo_get_auth.server.js";
6
5
  import { get_hazo_connect_instance } from "../../lib/hazo_connect_instance.server.js";
7
6
  import { createCrudService } from "hazo_connect/server";
@@ -9,9 +8,6 @@ import { map_db_source_to_ui } from "../../lib/services/profile_picture_source_m
9
8
  import { create_app_logger } from "../../lib/app_logger.js";
10
9
  import { get_filename, get_line_number } from "../../lib/utils/api_route_helpers.js";
11
10
  import { is_user_types_enabled, get_user_type_by_key, } from "../../lib/user_types_config.server.js";
12
- import { get_cookie_name, get_cookie_options, BASE_COOKIE_NAMES, } from "../../lib/cookies_config.server.js";
13
- import { create_session_token } from "../../lib/services/session_token_service.js";
14
- import { get_otp_config, hazo_auth_otp_session_ttl_seconds, } from "../../lib/otp_config.server.js";
15
11
  // section: helpers
16
12
  function strip_sentinel_email(email) {
17
13
  if (!email)
@@ -28,7 +24,6 @@ function strip_sentinel_email(email) {
28
24
  * Always returns the same format to prevent downstream variations.
29
25
  */
30
26
  export async function GET(request) {
31
- var _a, _b, _c, _d, _e, _f;
32
27
  const logger = create_app_logger();
33
28
  try {
34
29
  // Use hazo_get_auth to get user with permissions
@@ -75,7 +70,7 @@ export async function GET(request) {
75
70
  }
76
71
  // Return unified format with all fields
77
72
  const profile_pic = auth_result.user.profile_picture_url;
78
- const response = NextResponse.json({
73
+ return NextResponse.json({
79
74
  authenticated: true,
80
75
  // Top-level fields for backward compatibility
81
76
  user_id: auth_result.user.id,
@@ -105,43 +100,6 @@ export async function GET(request) {
105
100
  permission_ok: auth_result.permission_ok,
106
101
  missing_permissions: auth_result.missing_permissions,
107
102
  }, { status: 200 });
108
- // --- OTP sliding-session hook ---
109
- const session_kind = (_a = request.cookies.get(get_cookie_name(BASE_COOKIE_NAMES.SESSION_KIND))) === null || _a === void 0 ? void 0 : _a.value;
110
- if (session_kind === "otp") {
111
- try {
112
- const session_cookie = (_b = request.cookies.get(get_cookie_name(BASE_COOKIE_NAMES.SESSION))) === null || _b === void 0 ? void 0 : _b.value;
113
- if (session_cookie) {
114
- const secret = new TextEncoder().encode((_c = process.env.JWT_SECRET) !== null && _c !== void 0 ? _c : "");
115
- const { payload } = await jwtVerify(session_cookie, secret);
116
- const exp = Number((_d = payload.exp) !== null && _d !== void 0 ? _d : 0);
117
- const now_seconds = Math.floor(Date.now() / 1000);
118
- const otp_cfg = get_otp_config();
119
- const seconds_until_exp = exp - now_seconds;
120
- if (seconds_until_exp > 0 && seconds_until_exp < otp_cfg.slide_when_within_seconds) {
121
- const ttl_seconds = hazo_auth_otp_session_ttl_seconds();
122
- const user_id = String((_e = payload.user_id) !== null && _e !== void 0 ? _e : "");
123
- const user_email = String((_f = payload.email) !== null && _f !== void 0 ? _f : "");
124
- const new_token = await create_session_token(user_id, user_email, undefined, ttl_seconds);
125
- const cookie_options = get_cookie_options({
126
- httpOnly: true,
127
- secure: process.env.NODE_ENV === "production",
128
- sameSite: "lax",
129
- path: "/",
130
- maxAge: ttl_seconds,
131
- });
132
- response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.SESSION), new_token, cookie_options);
133
- response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.USER_ID), user_id, cookie_options);
134
- response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.USER_EMAIL), user_email, cookie_options);
135
- response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.SESSION_KIND), "otp", cookie_options);
136
- }
137
- }
138
- }
139
- catch (slide_err) {
140
- // Slide is best-effort — never break /me for this
141
- }
142
- }
143
- // --- end OTP sliding-session hook ---
144
- return response;
145
103
  }
146
104
  catch (error) {
147
105
  const error_message = error instanceof Error ? error.message : "Unknown error";
@@ -4,5 +4,5 @@ import { NextRequest, NextResponse } from "next/server";
4
4
  * The user creation/linking is done in NextAuth signIn callback
5
5
  * This route just sets the hazo_auth session cookies
6
6
  */
7
- export declare function facebookCallbackGET(original_request: NextRequest): Promise<NextResponse<unknown>>;
7
+ export declare function GET(original_request: NextRequest): Promise<NextResponse<unknown>>;
8
8
  //# sourceMappingURL=oauth_facebook_callback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauth_facebook_callback.d.ts","sourceRoot":"","sources":["../../../src/server/routes/oauth_facebook_callback.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAuBxD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,gBAAgB,EAAE,WAAW,kCAoKtE"}
1
+ {"version":3,"file":"oauth_facebook_callback.d.ts","sourceRoot":"","sources":["../../../src/server/routes/oauth_facebook_callback.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAuBxD;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,gBAAgB,EAAE,WAAW,kCAiLtD"}
@@ -17,7 +17,7 @@ import { rewrite_request_for_proxy } from "../../lib/utils/proxy_request.js";
17
17
  * The user creation/linking is done in NextAuth signIn callback
18
18
  * This route just sets the hazo_auth session cookies
19
19
  */
20
- export async function facebookCallbackGET(original_request) {
20
+ export async function GET(original_request) {
21
21
  // Rewrite request.url to public origin when behind a reverse proxy.
22
22
  const request = rewrite_request_for_proxy(original_request);
23
23
  const logger = create_app_logger();
@@ -139,6 +139,13 @@ export async function facebookCallbackGET(original_request) {
139
139
  note: "OAuth login succeeded but session token creation failed - using legacy cookies",
140
140
  });
141
141
  }
142
+ // Set session kind cookie so downstream can identify sign-in method
143
+ response.cookies.set(get_cookie_name(BASE_COOKIE_NAMES.SESSION_KIND), "facebook", cookie_options);
144
+ logger.info("facebook_callback_session_created", {
145
+ filename: get_filename(),
146
+ user_id,
147
+ email,
148
+ });
142
149
  return response;
143
150
  }
144
151
  catch (error) {
@@ -172,7 +172,7 @@ export async function GET(original_request) {
172
172
  error_message,
173
173
  error_stack,
174
174
  });
175
- const login_url = new URL(sign_in_page, request.url);
175
+ const login_url = new URL("/hazo_auth/login", request.url);
176
176
  login_url.searchParams.set("error", "oauth_error");
177
177
  return NextResponse.redirect(login_url.toString());
178
178
  }
@@ -28,7 +28,7 @@ export async function otpVerifyPOST(request) {
28
28
  ip,
29
29
  });
30
30
  if (result.ok === false) {
31
- return NextResponse.json({ ok: false, error: "invalid_or_expired" }, { status: 400 });
31
+ return NextResponse.json({ ok: false, error: result.error }, { status: 401 });
32
32
  }
33
33
  const ttl_seconds = hazo_auth_otp_session_ttl_seconds();
34
34
  const base_cookie_options = {
@@ -53,6 +53,6 @@ export async function otpVerifyPOST(request) {
53
53
  catch (err) {
54
54
  const msg = err instanceof Error ? err.message : String(err);
55
55
  logger.error("otp_verify_route_error", { error: msg });
56
- return NextResponse.json({ ok: false, error: "invalid_or_expired" }, { status: 400 });
56
+ return NextResponse.json({ ok: false, error: "invalid_or_expired" }, { status: 401 });
57
57
  }
58
58
  }
@@ -0,0 +1,4 @@
1
+ import "server-only";
2
+ import { NextResponse } from "next/server";
3
+ export declare function stringsDefaultsGET(): Promise<NextResponse>;
4
+ //# sourceMappingURL=strings_defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strings_defaults.d.ts","sourceRoot":"","sources":["../../../src/server/routes/strings_defaults.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CAEhE"}
@@ -0,0 +1,7 @@
1
+ // file_description: Route handler returning the DEFAULT_STRINGS object for introspection and testing
2
+ import "server-only";
3
+ import { NextResponse } from "next/server";
4
+ import { DEFAULT_STRINGS } from "../../strings/default_strings.js";
5
+ export async function stringsDefaultsGET() {
6
+ return NextResponse.json(DEFAULT_STRINGS, { status: 200 });
7
+ }
@@ -44,4 +44,15 @@ export declare function POST(request: NextRequest): Promise<NextResponse<{
44
44
  }> | NextResponse<{
45
45
  success: boolean;
46
46
  }>>;
47
+ /**
48
+ * DELETE - Hard-delete a user from hazo_users (cascades to all related rows).
49
+ * Body: { user_id: string }
50
+ * Requires: admin_user_management permission (enforced by UI, not here — same
51
+ * pattern as PATCH/POST in this file which also don't re-auth).
52
+ */
53
+ export declare function DELETE(request: NextRequest): Promise<NextResponse<{
54
+ error: string;
55
+ }> | NextResponse<{
56
+ success: boolean;
57
+ }>>;
47
58
  //# sourceMappingURL=user_management_users.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user_management_users.d.ts","sourceRoot":"","sources":["../../../src/server/routes/user_management_users.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAexD,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAGvC;;;GAGG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;IAyF7C;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,WAAW;;;;IAgI/C;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;IA2E9C"}
1
+ {"version":3,"file":"user_management_users.d.ts","sourceRoot":"","sources":["../../../src/server/routes/user_management_users.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAexD,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAGvC;;;GAGG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;IAyF7C;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,WAAW;;;;IAgI/C;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;IA2E9C;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,WAAW;;;;IAuDhD"}
@@ -241,3 +241,53 @@ export async function POST(request) {
241
241
  return NextResponse.json({ error: "Failed to send password reset email" }, { status: 500 });
242
242
  }
243
243
  }
244
+ /**
245
+ * DELETE - Hard-delete a user from hazo_users (cascades to all related rows).
246
+ * Body: { user_id: string }
247
+ * Requires: admin_user_management permission (enforced by UI, not here — same
248
+ * pattern as PATCH/POST in this file which also don't re-auth).
249
+ */
250
+ export async function DELETE(request) {
251
+ const logger = create_app_logger();
252
+ try {
253
+ const body = await request.json();
254
+ const { user_id } = body;
255
+ if (!user_id) {
256
+ return NextResponse.json({ error: "user_id is required" }, { status: 400 });
257
+ }
258
+ const hazoConnect = get_hazo_connect_instance();
259
+ const users_service = createCrudService(hazoConnect, "hazo_users");
260
+ // Verify user exists before deleting
261
+ const users = await users_service.findBy({ id: user_id });
262
+ if (!Array.isArray(users) || users.length === 0) {
263
+ return NextResponse.json({ error: "User not found" }, { status: 404 });
264
+ }
265
+ // Invalidate auth cache first
266
+ try {
267
+ const auth_config = get_auth_utility_config();
268
+ const auth_cache = get_auth_cache(auth_config.cache_max_users, auth_config.cache_ttl_minutes, auth_config.cache_max_age_minutes);
269
+ auth_cache.invalidate_user(user_id);
270
+ }
271
+ catch (_a) {
272
+ // Non-fatal
273
+ }
274
+ await users_service.deleteById(user_id);
275
+ logger.info("user_management_user_deleted", {
276
+ filename: get_filename(),
277
+ line_number: get_line_number(),
278
+ user_id,
279
+ });
280
+ return NextResponse.json({ success: true }, { status: 200 });
281
+ }
282
+ catch (error) {
283
+ const error_message = error instanceof Error ? error.message : "Unknown error";
284
+ const error_stack = error instanceof Error ? error.stack : undefined;
285
+ logger.error("user_management_user_delete_error", {
286
+ filename: get_filename(),
287
+ line_number: get_line_number(),
288
+ error_message,
289
+ error_stack,
290
+ });
291
+ return NextResponse.json({ error: "Failed to delete user" }, { status: 500 });
292
+ }
293
+ }
@@ -24,9 +24,6 @@ export { get_oauth_config, is_google_oauth_enabled, is_email_password_enabled, }
24
24
  export type { OAuthConfig } from "./lib/oauth_config.server";
25
25
  export { get_branding_config, is_branding_enabled, is_allowed_logo_format, get_max_logo_size_bytes, } from "./lib/branding_config.server.js";
26
26
  export type { FirmBrandingConfig } from "./lib/branding_config.server";
27
- export { get_otp_config, hazo_auth_otp_session_ttl_seconds, OTP_CONFIG_DEFAULTS } from "./lib/otp_config.server.js";
28
- export type { OtpConfig } from "./lib/otp_config.server";
29
- export { request_email_otp, verify_email_otp } from "./lib/services/otp_service.js";
30
27
  export { create_sqlite_hazo_connect } from "./lib/hazo_connect_setup.js";
31
28
  export { get_hazo_connect_instance } from "./lib/hazo_connect_instance.server.js";
32
29
  export { create_app_logger } from "./lib/app_logger.js";
@@ -1 +1 @@
1
- {"version":3,"file":"server-lib.d.ts","sourceRoot":"","sources":["../src/server-lib.ts"],"names":[],"mappings":"AAYA,OAAO,aAAa,CAAC;AAGrB,cAAc,kBAAkB,CAAC;AAGjC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AAGrF,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,iCAAiC,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACjH,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAG/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,YAAY,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"server-lib.d.ts","sourceRoot":"","sources":["../src/server-lib.ts"],"names":[],"mappings":"AAYA,OAAO,aAAa,CAAC;AAGrB,cAAc,kBAAkB,CAAC;AAGjC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AAGrF,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAG/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,YAAY,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,cAAc,+BAA+B,CAAC"}
@@ -37,8 +37,6 @@ export { get_user_fields_config } from "./lib/user_fields_config.server.js";
37
37
  export { get_file_types_config } from "./lib/file_types_config.server.js";
38
38
  export { get_oauth_config, is_google_oauth_enabled, is_email_password_enabled, } from "./lib/oauth_config.server.js";
39
39
  export { get_branding_config, is_branding_enabled, is_allowed_logo_format, get_max_logo_size_bytes, } from "./lib/branding_config.server.js";
40
- export { get_otp_config, hazo_auth_otp_session_ttl_seconds, OTP_CONFIG_DEFAULTS } from "./lib/otp_config.server.js";
41
- export { request_email_otp, verify_email_otp } from "./lib/services/otp_service.js";
42
40
  // section: hazo_connect_exports
43
41
  export { create_sqlite_hazo_connect } from "./lib/hazo_connect_setup.js";
44
42
  export { get_hazo_connect_instance } from "./lib/hazo_connect_instance.server.js";
@@ -1,5 +1,21 @@
1
1
  import "server-only";
2
+ import type { StaticImageData } from "next/image";
2
3
  export type ForgotPasswordPageProps = {
4
+ /**
5
+ * Optional image source for the visual panel
6
+ * Defaults from hazo_auth_config.ini or package default image
7
+ */
8
+ image_src?: string | StaticImageData;
9
+ /**
10
+ * Optional image alt text
11
+ * Defaults to "Password recovery illustration"
12
+ */
13
+ image_alt?: string;
14
+ /**
15
+ * Optional image background color
16
+ * Defaults to "#f1f5f9"
17
+ */
18
+ image_background_color?: string;
3
19
  /**
4
20
  * Optional sign in path
5
21
  * Defaults from DEFAULT_FORGOT_PASSWORD.loginPath
@@ -10,18 +26,6 @@ export type ForgotPasswordPageProps = {
10
26
  * Defaults from DEFAULT_FORGOT_PASSWORD.loginLabel
11
27
  */
12
28
  sign_in_label?: string;
13
- /**
14
- * Optional theme that controls visual appearance and layout mode.
15
- * When `theme.layout` is `"split"`, activates the two-column split layout
16
- * with the brand panel on the left.
17
- */
18
- theme?: import("../theme/theme_types").HazoAuthTheme;
19
- /** Override the page heading. Falls back to HazoAuthStringsProvider → DEFAULT_STRINGS. */
20
- title?: string;
21
- /** Override the page subtitle. Falls back to HazoAuthStringsProvider → DEFAULT_STRINGS. */
22
- subtitle?: string;
23
- /** Override the submit button label. Falls back to HazoAuthStringsProvider → DEFAULT_STRINGS. */
24
- ctaText?: string;
25
29
  };
26
30
  /**
27
31
  * Zero-config ForgotPasswordPage server component
@@ -43,9 +47,9 @@ export type ForgotPasswordPageProps = {
43
47
  *
44
48
  * Zero configuration required - works out of the box!
45
49
  *
46
- * @param props - Optional navigation customization props
50
+ * @param props - Optional visual and navigation customization props
47
51
  * @returns Server-rendered forgot password page
48
52
  */
49
- export default function ForgotPasswordPage(props: ForgotPasswordPageProps): import("react/jsx-runtime").JSX.Element;
53
+ export default function ForgotPasswordPage({ image_src, image_alt, image_background_color, sign_in_path, sign_in_label, }?: ForgotPasswordPageProps): import("react/jsx-runtime").JSX.Element;
50
54
  export { ForgotPasswordPage };
51
55
  //# sourceMappingURL=forgot_password.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"forgot_password.d.ts","sourceRoot":"","sources":["../../src/server_pages/forgot_password.tsx"],"names":[],"mappings":"AAEA,OAAO,aAAa,CAAC;AAUrB,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,sBAAsB,EAAE,aAAa,CAAC;IACrD,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iGAAiG;IACjG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAGF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CAoCxE;AAGD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"forgot_password.d.ts","sourceRoot":"","sources":["../../src/server_pages/forgot_password.tsx"],"names":[],"mappings":"AAEA,OAAO,aAAa,CAAC;AASrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;IAErC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAGF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EACzC,SAAS,EACT,SAAS,EACT,sBAAsB,EACtB,YAAgD,EAChD,aAAkD,GACnD,GAAE,uBAA4B,2CAkC9B;AAGD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -5,9 +5,9 @@ import "server-only";
5
5
  // section: imports
6
6
  import { get_forgot_password_config } from "../lib/forgot_password_config.server.js";
7
7
  import { ForgotPasswordClientWrapper } from "./forgot_password_client_wrapper.js";
8
+ import { readStrings } from "../strings.js";
8
9
  import { AuthPageShell } from "../components/layouts/shared/components/auth_page_shell.js";
9
10
  import { DEFAULT_FORGOT_PASSWORD } from "../lib/config/default_config.js";
10
- import { DEFAULT_STRINGS, readStrings } from "../strings.js";
11
11
  // section: component
12
12
  /**
13
13
  * Zero-config ForgotPasswordPage server component
@@ -29,22 +29,24 @@ import { DEFAULT_STRINGS, readStrings } from "../strings.js";
29
29
  *
30
30
  * Zero configuration required - works out of the box!
31
31
  *
32
- * @param props - Optional navigation customization props
32
+ * @param props - Optional visual and navigation customization props
33
33
  * @returns Server-rendered forgot password page
34
34
  */
35
- export default function ForgotPasswordPage(props) {
36
- var _a, _b, _c;
37
- const { sign_in_path = DEFAULT_FORGOT_PASSWORD.loginPath, sign_in_label = DEFAULT_FORGOT_PASSWORD.loginLabel, theme, title, subtitle, ctaText, } = props !== null && props !== void 0 ? props : {};
38
- // Resolve strings: prop > HazoAuthStringsProvider > DEFAULT_STRINGS
35
+ export default function ForgotPasswordPage({ image_src, image_alt, image_background_color, sign_in_path = DEFAULT_FORGOT_PASSWORD.loginPath, sign_in_label = DEFAULT_FORGOT_PASSWORD.loginLabel, } = {}) {
36
+ // Load configuration from INI file (with defaults including asset images)
37
+ const config = get_forgot_password_config();
39
38
  const strings = readStrings();
40
39
  const fp_strings = strings.forgot_password;
41
- const resolved_title = (_a = title !== null && title !== void 0 ? title : fp_strings.title) !== null && _a !== void 0 ? _a : DEFAULT_STRINGS.forgot_password.title;
42
- const resolved_subtitle = (_b = subtitle !== null && subtitle !== void 0 ? subtitle : fp_strings.subtitle) !== null && _b !== void 0 ? _b : DEFAULT_STRINGS.forgot_password.subtitle;
43
- const resolved_cta = (_c = ctaText !== null && ctaText !== void 0 ? ctaText : fp_strings.ctaText) !== null && _c !== void 0 ? _c : DEFAULT_STRINGS.forgot_password.ctaText;
44
- // Load configuration from INI file (with defaults)
45
- const config = get_forgot_password_config();
40
+ // Use props if provided, otherwise fall back to config (which includes default asset image)
41
+ const finalImageSrc = image_src || config.imageSrc;
42
+ const finalImageAlt = image_alt || config.imageAlt;
43
+ const finalImageBackgroundColor = image_background_color || config.imageBackgroundColor;
46
44
  // Pass serializable config to client wrapper, wrapped in AuthPageShell for navbar support
47
- return (_jsx(AuthPageShell, { children: _jsx(ForgotPasswordClientWrapper, { sign_in_path: sign_in_path, sign_in_label: sign_in_label, alreadyLoggedInMessage: config.alreadyLoggedInMessage, showLogoutButton: config.showLogoutButton, showReturnHomeButton: config.showReturnHomeButton, returnHomeButtonLabel: config.returnHomeButtonLabel, returnHomePath: config.returnHomePath, theme: theme, labels: { heading: resolved_title, subHeading: resolved_subtitle, submitButton: resolved_cta } }) }));
45
+ return (_jsx(AuthPageShell, { children: _jsx(ForgotPasswordClientWrapper, { image_src: finalImageSrc, image_alt: finalImageAlt, image_background_color: finalImageBackgroundColor, sign_in_path: sign_in_path, sign_in_label: sign_in_label, alreadyLoggedInMessage: config.alreadyLoggedInMessage, showLogoutButton: config.showLogoutButton, showReturnHomeButton: config.showReturnHomeButton, returnHomeButtonLabel: config.returnHomeButtonLabel, returnHomePath: config.returnHomePath, labels: {
46
+ heading: fp_strings.title,
47
+ subHeading: fp_strings.subtitle,
48
+ submitButton: fp_strings.ctaText,
49
+ } }) }));
48
50
  }
49
51
  // Named export for direct imports
50
52
  export { ForgotPasswordPage };
@@ -1,16 +1,17 @@
1
1
  import type { ForgotPasswordConfig } from "../lib/forgot_password_config.server";
2
- import type { HazoAuthTheme } from "../theme/theme_types";
3
- export type ForgotPasswordClientWrapperProps = ForgotPasswordConfig & {
2
+ import type { LayoutLabelOverrides } from "../components/layouts/shared/config/layout_customization";
3
+ import type { StaticImageData } from "next/image";
4
+ export type ForgotPasswordClientWrapperProps = Omit<ForgotPasswordConfig, 'imageSrc' | 'imageAlt' | 'imageBackgroundColor'> & {
5
+ image_src: string | StaticImageData;
6
+ image_alt: string;
7
+ image_background_color: string;
4
8
  sign_in_path: string;
5
9
  sign_in_label: string;
6
- /** Optional theme passed through to ForgotPasswordLayout → TwoColumnAuthLayout. */
7
- theme?: HazoAuthTheme;
8
- /** Optional label overrides (heading, subHeading, submitButton) */
9
- labels?: import("../components/layouts/shared/config/layout_customization").LayoutLabelOverrides;
10
+ labels?: LayoutLabelOverrides;
10
11
  };
11
12
  /**
12
13
  * Client wrapper for ForgotPasswordLayout
13
14
  * Initializes hazo_connect data client on client side and passes config from server
14
15
  */
15
- export declare function ForgotPasswordClientWrapper({ sign_in_path, sign_in_label, alreadyLoggedInMessage, showLogoutButton, showReturnHomeButton, returnHomeButtonLabel, returnHomePath, theme, labels, }: ForgotPasswordClientWrapperProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function ForgotPasswordClientWrapper({ image_src, image_alt, image_background_color, sign_in_path, sign_in_label, alreadyLoggedInMessage, showLogoutButton, showReturnHomeButton, returnHomeButtonLabel, returnHomePath, labels, }: ForgotPasswordClientWrapperProps): import("react/jsx-runtime").JSX.Element;
16
17
  //# sourceMappingURL=forgot_password_client_wrapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"forgot_password_client_wrapper.d.ts","sourceRoot":"","sources":["../../src/server_pages/forgot_password_client_wrapper.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,MAAM,gCAAgC,GAAG,oBAAoB,GAAG;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,0DAA0D,EAAE,oBAAoB,CAAC;CAClG,CAAC;AAGF;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,KAAK,EACL,MAAM,GACP,EAAE,gCAAgC,2CAkClC"}
1
+ {"version":3,"file":"forgot_password_client_wrapper.d.ts","sourceRoot":"","sources":["../../src/server_pages/forgot_password_client_wrapper.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0DAA0D,CAAC;AAGrG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,UAAU,GAAG,sBAAsB,CAAC,GAAG;IAC5H,SAAS,EAAE,MAAM,GAAG,eAAe,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAGF;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,SAAS,EACT,SAAS,EACT,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,MAAM,GACP,EAAE,gCAAgC,2CAoClC"}