hazo_auth 4.3.0 → 4.4.1

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 (119) hide show
  1. package/cli-src/lib/already_logged_in_config.server.ts +1 -1
  2. package/cli-src/lib/app_logger.ts +8 -18
  3. package/cli-src/lib/auth/auth_types.ts +7 -0
  4. package/cli-src/lib/auth/auth_utils.server.ts +2 -2
  5. package/cli-src/lib/auth/dev_lock_validator.edge.ts +171 -0
  6. package/cli-src/lib/auth/hazo_get_auth.server.ts +84 -13
  7. package/cli-src/lib/auth/index.ts +5 -5
  8. package/cli-src/lib/auth/nextauth_config.ts +4 -4
  9. package/cli-src/lib/auth/org_cache.ts +148 -0
  10. package/cli-src/lib/auth/server_auth.ts +2 -2
  11. package/cli-src/lib/auth/session_token_validator.edge.ts +4 -0
  12. package/cli-src/lib/auth_utility_config.server.ts +1 -1
  13. package/cli-src/lib/config/config_loader.server.ts +1 -1
  14. package/cli-src/lib/config/default_config.ts +44 -0
  15. package/cli-src/lib/dev_lock_config.server.ts +148 -0
  16. package/cli-src/lib/email_verification_config.server.ts +3 -3
  17. package/cli-src/lib/file_types_config.server.ts +1 -1
  18. package/cli-src/lib/forgot_password_config.server.ts +3 -3
  19. package/cli-src/lib/hazo_connect_instance.server.ts +2 -2
  20. package/cli-src/lib/hazo_connect_setup.server.ts +2 -2
  21. package/cli-src/lib/index.ts +24 -24
  22. package/cli-src/lib/login_config.server.ts +4 -4
  23. package/cli-src/lib/messages_config.server.ts +1 -1
  24. package/cli-src/lib/multi_tenancy_config.server.ts +94 -0
  25. package/cli-src/lib/my_settings_config.server.ts +7 -7
  26. package/cli-src/lib/oauth_config.server.ts +2 -2
  27. package/cli-src/lib/password_requirements_config.server.ts +2 -2
  28. package/cli-src/lib/profile_pic_menu_config.server.ts +1 -1
  29. package/cli-src/lib/profile_picture_config.server.ts +2 -2
  30. package/cli-src/lib/register_config.server.ts +5 -5
  31. package/cli-src/lib/reset_password_config.server.ts +4 -4
  32. package/cli-src/lib/scope_hierarchy_config.server.ts +2 -2
  33. package/cli-src/lib/services/email_service.ts +2 -2
  34. package/cli-src/lib/services/email_verification_service.ts +3 -3
  35. package/cli-src/lib/services/login_service.ts +3 -3
  36. package/cli-src/lib/services/oauth_service.ts +4 -4
  37. package/cli-src/lib/services/org_service.ts +965 -0
  38. package/cli-src/lib/services/password_change_service.ts +3 -3
  39. package/cli-src/lib/services/password_reset_service.ts +3 -3
  40. package/cli-src/lib/services/profile_picture_remove_service.ts +3 -3
  41. package/cli-src/lib/services/profile_picture_service.ts +5 -5
  42. package/cli-src/lib/services/registration_service.ts +8 -8
  43. package/cli-src/lib/services/scope_labels_service.ts +3 -3
  44. package/cli-src/lib/services/scope_service.ts +2 -2
  45. package/cli-src/lib/services/session_token_service.ts +6 -2
  46. package/cli-src/lib/services/token_service.ts +2 -2
  47. package/cli-src/lib/services/user_profiles_service.ts +4 -4
  48. package/cli-src/lib/services/user_scope_service.ts +3 -3
  49. package/cli-src/lib/services/user_update_service.ts +4 -4
  50. package/cli-src/lib/ui_shell_config.server.ts +1 -1
  51. package/cli-src/lib/ui_sizes_config.server.ts +1 -1
  52. package/cli-src/lib/user_fields_config.server.ts +1 -1
  53. package/cli-src/lib/user_management_config.server.ts +1 -1
  54. package/cli-src/lib/user_profiles_config.server.ts +1 -1
  55. package/cli-src/lib/utils/error_sanitizer.ts +1 -1
  56. package/cli-src/server/types/app_types.ts +72 -0
  57. package/cli-src/server/types/express.d.ts +16 -0
  58. package/dist/components/layouts/dev_lock/index.d.ts +29 -0
  59. package/dist/components/layouts/dev_lock/index.d.ts.map +1 -0
  60. package/dist/components/layouts/dev_lock/index.js +60 -0
  61. package/dist/components/layouts/index.d.ts +2 -0
  62. package/dist/components/layouts/index.d.ts.map +1 -1
  63. package/dist/components/layouts/index.js +1 -0
  64. package/dist/components/layouts/login/hooks/use_login_form.js +2 -2
  65. package/dist/components/layouts/org_management/index.d.ts +26 -0
  66. package/dist/components/layouts/org_management/index.d.ts.map +1 -0
  67. package/dist/components/layouts/org_management/index.js +75 -0
  68. package/dist/components/layouts/user_management/components/org_hierarchy_tab.d.ts +13 -0
  69. package/dist/components/layouts/user_management/components/org_hierarchy_tab.d.ts.map +1 -0
  70. package/dist/components/layouts/user_management/components/org_hierarchy_tab.js +276 -0
  71. package/dist/components/layouts/user_management/index.d.ts +3 -1
  72. package/dist/components/layouts/user_management/index.d.ts.map +1 -1
  73. package/dist/components/layouts/user_management/index.js +10 -4
  74. package/dist/components/ui/button.d.ts +1 -1
  75. package/dist/lib/app_logger.d.ts +3 -9
  76. package/dist/lib/app_logger.d.ts.map +1 -1
  77. package/dist/lib/app_logger.js +7 -10
  78. package/dist/lib/auth/auth_types.d.ts +6 -0
  79. package/dist/lib/auth/auth_types.d.ts.map +1 -1
  80. package/dist/lib/auth/dev_lock_validator.edge.d.ts +38 -0
  81. package/dist/lib/auth/dev_lock_validator.edge.d.ts.map +1 -0
  82. package/dist/lib/auth/dev_lock_validator.edge.js +122 -0
  83. package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -1
  84. package/dist/lib/auth/hazo_get_auth.server.js +61 -1
  85. package/dist/lib/auth/org_cache.d.ts +65 -0
  86. package/dist/lib/auth/org_cache.d.ts.map +1 -0
  87. package/dist/lib/auth/org_cache.js +103 -0
  88. package/dist/lib/config/default_config.d.ts +76 -0
  89. package/dist/lib/config/default_config.d.ts.map +1 -1
  90. package/dist/lib/config/default_config.js +42 -0
  91. package/dist/lib/dev_lock_config.server.d.ts +41 -0
  92. package/dist/lib/dev_lock_config.server.d.ts.map +1 -0
  93. package/dist/lib/dev_lock_config.server.js +50 -0
  94. package/dist/lib/multi_tenancy_config.server.d.ts +30 -0
  95. package/dist/lib/multi_tenancy_config.server.d.ts.map +1 -0
  96. package/dist/lib/multi_tenancy_config.server.js +41 -0
  97. package/dist/lib/services/org_service.d.ts +191 -0
  98. package/dist/lib/services/org_service.d.ts.map +1 -0
  99. package/dist/lib/services/org_service.js +746 -0
  100. package/dist/page_components/dev_lock.d.ts +11 -0
  101. package/dist/page_components/dev_lock.d.ts.map +1 -0
  102. package/dist/page_components/dev_lock.js +17 -0
  103. package/dist/page_components/index.d.ts +1 -0
  104. package/dist/page_components/index.d.ts.map +1 -1
  105. package/dist/page_components/index.js +1 -0
  106. package/dist/page_components/login.d.ts.map +1 -1
  107. package/dist/page_components/login.js +3 -7
  108. package/dist/page_components/org_management.d.ts +27 -0
  109. package/dist/page_components/org_management.d.ts.map +1 -0
  110. package/dist/page_components/org_management.js +18 -0
  111. package/dist/server/config/config_loader.js +2 -2
  112. package/dist/server/index.d.ts.map +1 -1
  113. package/dist/server/index.js +2 -3
  114. package/dist/server/types/app_types.d.ts +3 -7
  115. package/dist/server/types/app_types.d.ts.map +1 -1
  116. package/dist/server_pages/login_client_wrapper.d.ts.map +1 -1
  117. package/dist/server_pages/login_client_wrapper.js +1 -3
  118. package/hazo_auth_config.example.ini +30 -0
  119. package/package.json +29 -2
@@ -0,0 +1,11 @@
1
+ import type { DevLockLayoutProps } from "../components/layouts/dev_lock";
2
+ export type DevLockPageProps = DevLockLayoutProps;
3
+ /**
4
+ * Zero-config dev lock page component
5
+ * Uses sensible defaults and can be customized via props
6
+ * @param props - Optional configuration overrides
7
+ * @returns Dev lock page component
8
+ */
9
+ export declare function DevLockPage(props?: DevLockPageProps): import("react/jsx-runtime").JSX.Element;
10
+ export default DevLockPage;
11
+ //# sourceMappingURL=dev_lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev_lock.d.ts","sourceRoot":"","sources":["../../src/page_components/dev_lock.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAGlD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,GAAE,gBAAqB,2CAEvD;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,17 @@
1
+ // file_description: zero-config dev lock page component for hazo_auth
2
+ // Consumers can use this directly without needing to configure props
3
+ "use client";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ // section: imports
6
+ import DevLockLayout from "../components/layouts/dev_lock";
7
+ // section: component
8
+ /**
9
+ * Zero-config dev lock page component
10
+ * Uses sensible defaults and can be customized via props
11
+ * @param props - Optional configuration overrides
12
+ * @returns Dev lock page component
13
+ */
14
+ export function DevLockPage(props = {}) {
15
+ return _jsx(DevLockLayout, Object.assign({}, props));
16
+ }
17
+ export default DevLockPage;
@@ -4,4 +4,5 @@ export { ForgotPasswordPage, type ForgotPasswordPageProps } from "./forgot_passw
4
4
  export { ResetPasswordPage, type ResetPasswordPageProps } from "./reset_password.js";
5
5
  export { VerifyEmailPage, type VerifyEmailPageProps } from "./verify_email.js";
6
6
  export { MySettingsPage, type MySettingsPageProps } from "./my_settings.js";
7
+ export { OrgManagementPage, type OrgManagementPageProps } from "./org_management.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/page_components/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/page_components/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -7,3 +7,4 @@ export { ForgotPasswordPage } from "./forgot_password.js";
7
7
  export { ResetPasswordPage } from "./reset_password.js";
8
8
  export { VerifyEmailPage } from "./verify_email.js";
9
9
  export { MySettingsPage } from "./my_settings.js";
10
+ export { OrgManagementPage } from "./org_management.js";
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/page_components/login.tsx"],"names":[],"mappings":"AAgCA;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAGF;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EACxB,aAAa,EACb,cAAyC,EACzC,sBAAoD,EACpD,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,kBAAiD,EACjD,mBAAwC,EACxC,iBAAyC,EACzC,kBAAqC,EACrC,UAAU,EACV,QAA4B,EAC5B,QAA4B,EAC5B,oBAAuC,GACxC,GAAE,cAAmB,2CA8CrB;AAED,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/page_components/login.tsx"],"names":[],"mappings":"AA+BA;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAGF;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EACxB,aAAa,EACb,cAAyC,EACzC,sBAAoD,EACpD,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,kBAAiD,EACjD,mBAAwC,EACxC,iBAAyC,EACzC,kBAAqC,EACrC,UAAU,EACV,QAA4B,EAC5B,QAA4B,EAC5B,oBAAuC,GACxC,GAAE,cAAmB,2CA0CrB;AAED,eAAe,SAAS,CAAC"}
@@ -21,7 +21,6 @@ import { useEffect, useState } from "react";
21
21
  import login_layout from "../components/layouts/login";
22
22
  import { createLayoutDataClient } from "../components/layouts/shared/data/layout_data_client";
23
23
  import { create_sqlite_hazo_connect } from "../lib/hazo_connect_setup";
24
- import { create_app_logger } from "../lib/app_logger";
25
24
  // section: constants
26
25
  const DEFAULT_IMAGE_SRC = "/globe.svg";
27
26
  const DEFAULT_IMAGE_ALT = "Illustration of a globe representing secure authentication workflows";
@@ -35,20 +34,17 @@ const DEFAULT_IMAGE_BG = "#e2e8f0";
35
34
  */
36
35
  export function LoginPage({ redirectRoute, successMessage = "Successfully logged in", alreadyLoggedInMessage = "You are already logged in", showLogoutButton = true, showReturnHomeButton = false, returnHomeButtonLabel = "Return home", returnHomePath = "/", forgotPasswordPath = "/hazo_auth/forgot_password", forgotPasswordLabel = "Forgot password?", createAccountPath = "/hazo_auth/register", createAccountLabel = "Create account", urlOnLogon, imageSrc = DEFAULT_IMAGE_SRC, imageAlt = DEFAULT_IMAGE_ALT, imageBackgroundColor = DEFAULT_IMAGE_BG, } = {}) {
37
36
  const [dataClient, setDataClient] = useState(null);
38
- const [logger, setLogger] = useState(null);
39
37
  useEffect(() => {
40
- // Initialize hazo_connect and logger on client side
38
+ // Initialize hazo_connect on client side
41
39
  const hazoConnect = create_sqlite_hazo_connect();
42
40
  const client = createLayoutDataClient(hazoConnect);
43
- const appLogger = create_app_logger();
44
41
  setDataClient(client);
45
- setLogger(appLogger);
46
42
  }, []);
47
43
  // Show loading state while initializing
48
- if (!dataClient || !logger) {
44
+ if (!dataClient) {
49
45
  return (_jsx("div", { className: "cls_login_page_loading flex items-center justify-center min-h-screen", children: _jsx("div", { className: "text-slate-600 animate-pulse", children: "Loading..." }) }));
50
46
  }
51
47
  const LoginLayout = login_layout;
52
- return (_jsx(LoginLayout, { image_src: imageSrc, image_alt: imageAlt, image_background_color: imageBackgroundColor, data_client: dataClient, logger: logger, redirectRoute: redirectRoute, successMessage: successMessage, alreadyLoggedInMessage: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath, forgot_password_path: forgotPasswordPath, forgot_password_label: forgotPasswordLabel, create_account_path: createAccountPath, create_account_label: createAccountLabel, urlOnLogon: urlOnLogon }));
48
+ return (_jsx(LoginLayout, { image_src: imageSrc, image_alt: imageAlt, image_background_color: imageBackgroundColor, data_client: dataClient, redirectRoute: redirectRoute, successMessage: successMessage, alreadyLoggedInMessage: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath, forgot_password_path: forgotPasswordPath, forgot_password_label: forgotPasswordLabel, create_account_path: createAccountPath, create_account_label: createAccountLabel, urlOnLogon: urlOnLogon }));
53
49
  }
54
50
  export default LoginPage;
@@ -0,0 +1,27 @@
1
+ export type OrgManagementPageProps = {
2
+ /** Title displayed at the top */
3
+ title?: string;
4
+ /** Description displayed below the title */
5
+ description?: string;
6
+ /** Required permission for org management (default: hazo_perm_org_management) */
7
+ requiredPermission?: string;
8
+ /** Permission for global admin access (default: hazo_org_global_admin) */
9
+ globalAdminPermission?: string;
10
+ /** Message shown when authentication is required */
11
+ authRequiredMessage?: string;
12
+ /** Message shown when permission is denied */
13
+ permissionDeniedMessage?: string;
14
+ /** Message shown when multi-tenancy is disabled */
15
+ multiTenancyDisabledMessage?: string;
16
+ /** Additional CSS classes */
17
+ className?: string;
18
+ };
19
+ /**
20
+ * Zero-config organization management page component
21
+ * Uses sensible defaults and can be customized via props
22
+ * @param props - Optional configuration overrides
23
+ * @returns Organization management page component
24
+ */
25
+ export declare function OrgManagementPage({ title, description, requiredPermission, globalAdminPermission, authRequiredMessage, permissionDeniedMessage, multiTenancyDisabledMessage, className, }?: OrgManagementPageProps): import("react/jsx-runtime").JSX.Element;
26
+ export default OrgManagementPage;
27
+ //# sourceMappingURL=org_management.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org_management.d.ts","sourceRoot":"","sources":["../../src/page_components/org_management.tsx"],"names":[],"mappings":"AAQA,MAAM,MAAM,sBAAsB,GAAG;IACnC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0EAA0E;IAC1E,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8CAA8C;IAC9C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,mDAAmD;IACnD,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAGF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAiC,EACjC,WAAiE,EACjE,kBAA+C,EAC/C,qBAA+C,EAC/C,mBAAwE,EACxE,uBAA4F,EAC5F,2BAAkF,EAClF,SAAS,GACV,GAAE,sBAA2B,2CAe7B;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ // file_description: zero-config organization management page component for hazo_auth
2
+ // Consumers can use this directly without needing to configure props
3
+ "use client";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ // section: imports
6
+ import org_management_layout from "../components/layouts/org_management";
7
+ // section: component
8
+ /**
9
+ * Zero-config organization management page component
10
+ * Uses sensible defaults and can be customized via props
11
+ * @param props - Optional configuration overrides
12
+ * @returns Organization management page component
13
+ */
14
+ export function OrgManagementPage({ title = "Organization Management", description = "Manage your organization hierarchy and structure.", requiredPermission = "hazo_perm_org_management", globalAdminPermission = "hazo_org_global_admin", authRequiredMessage = "Please log in to access organization management.", permissionDeniedMessage = "You need organization management permission to access this page.", multiTenancyDisabledMessage = "Multi-tenancy is not enabled in the configuration.", className, } = {}) {
15
+ const OrgManagementLayout = org_management_layout;
16
+ return (_jsx(OrgManagementLayout, { title: title, description: description, requiredPermission: requiredPermission, globalAdminPermission: globalAdminPermission, authRequiredMessage: authRequiredMessage, permissionDeniedMessage: permissionDeniedMessage, multiTenancyDisabledMessage: multiTenancyDisabledMessage, className: className }));
17
+ }
18
+ export default OrgManagementPage;
@@ -4,7 +4,7 @@ import fs from "fs";
4
4
  import path from "path";
5
5
  import axios from "axios";
6
6
  import { HazoConfig } from "hazo_config/dist/lib";
7
- import { create_logger_service } from "../logging/logger_service";
7
+ import { createLogger } from "hazo_logs";
8
8
  const is_string_record = (value) => !!value &&
9
9
  typeof value === "object" &&
10
10
  !Array.isArray(value) &&
@@ -265,7 +265,7 @@ const create_emailer_client = (emailer_options, logger) => {
265
265
  // section: loader
266
266
  export const load_runtime_configuration = (options) => {
267
267
  var _a, _b, _c;
268
- const fallback_logger = create_logger_service("hazo_auth_config");
268
+ const fallback_logger = createLogger("hazo_auth_config");
269
269
  const parsed_options = sanitize_configuration_options(options, fallback_logger);
270
270
  const direct_configuration = parsed_options.direct_configuration;
271
271
  const logger = (_a = direct_configuration === null || direct_configuration === void 0 ? void 0 : direct_configuration.logger) !== null && _a !== void 0 ? _a : fallback_logger;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,IAAI,CAgBjD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,IAAI,CAgBjD,CAAC"}
@@ -3,13 +3,12 @@ var _a;
3
3
  // section: imports
4
4
  import http from "http";
5
5
  import { create_server_app } from "./server";
6
- import { create_logger_service } from "./logging/logger_service";
6
+ import { createLogger } from "hazo_logs";
7
7
  // section: constants
8
8
  const default_port = Number((_a = process.env.PORT) !== null && _a !== void 0 ? _a : 4100);
9
- const server_namespace = "hazo_auth_server";
10
9
  // section: bootstrap_runner
11
10
  export const start_server = async () => {
12
- const logger = create_logger_service(server_namespace);
11
+ const logger = createLogger("hazo_auth_server");
13
12
  const app = create_server_app();
14
13
  const http_server = http.createServer(app);
15
14
  return new Promise((resolve, reject) => {
@@ -1,11 +1,7 @@
1
1
  import type { Request } from "express";
2
- export type logger_method = (message: string, data?: Record<string, unknown>) => void;
3
- export type logger_service = {
4
- debug: logger_method;
5
- info: logger_method;
6
- warn: logger_method;
7
- error: logger_method;
8
- };
2
+ import type { Logger, LogData } from "hazo_logs";
3
+ export type logger_method = (message: string, data?: LogData) => void;
4
+ export type logger_service = Logger;
9
5
  export type emailer_client = {
10
6
  send_message: (payload: Record<string, unknown>) => Promise<{
11
7
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"app_types.d.ts","sourceRoot":"","sources":["../../../src/server/types/app_types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,IAAI,CAAC;AAEV,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC;AAGF,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,CACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,wBAAwB,EAAE,MAAM,CAAC;IACjC,yBAAyB,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,EAAE,cAAc,GAAG,cAAc,GAAG,UAAU,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB,GACD,SAAS,CAAC;AAEd,MAAM,MAAM,qBAAqB,GAAG;IAClC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,oBAAoB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,mBAAmB,CAAC;IAChC,OAAO,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,qBAAqB,CAAC;CAC/B,CAAC;AAGF,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,GAAG;IACnD,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC"}
1
+ {"version":3,"file":"app_types.d.ts","sourceRoot":"","sources":["../../../src/server/types/app_types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIjD,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,OAAO,KACX,IAAI,CAAC;AAGV,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAGpC,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,CACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,wBAAwB,EAAE,MAAM,CAAC;IACjC,yBAAyB,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,EAAE,cAAc,GAAG,cAAc,GAAG,UAAU,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB,GACD,SAAS,CAAC;AAEd,MAAM,MAAM,qBAAqB,GAAG;IAClC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,oBAAoB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,mBAAmB,CAAC;IAChC,OAAO,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,qBAAqB,CAAC;CAC/B,CAAC;AAGF,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,GAAG;IACnD,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"login_client_wrapper.d.ts","sourceRoot":"","sources":["../../src/server_pages/login_client_wrapper.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,sBAAsB,GAAG,OAAO,CAAC,GAAG;IACpH,SAAS,EAAE,MAAM,GAAG,eAAe,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,0BAA0B;IAC1B,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B,CAAC;AAGF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,SAAS,EACT,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,GACN,EAAE,uBAAuB,2CA2CzB"}
1
+ {"version":3,"file":"login_client_wrapper.d.ts","sourceRoot":"","sources":["../../src/server_pages/login_client_wrapper.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,sBAAsB,GAAG,OAAO,CAAC,GAAG;IACpH,SAAS,EAAE,MAAM,GAAG,eAAe,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,0BAA0B;IAC1B,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B,CAAC;AAGF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,SAAS,EACT,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,GACN,EAAE,uBAAuB,2CAwCzB"}
@@ -6,7 +6,6 @@ import { useEffect, useState } from "react";
6
6
  import LoginLayout from "../components/layouts/login";
7
7
  import { createLayoutDataClient } from "../components/layouts/shared/data/layout_data_client";
8
8
  import { create_sqlite_hazo_connect } from "../lib/hazo_connect_setup";
9
- import { create_app_logger } from "../lib/app_logger";
10
9
  // section: component
11
10
  /**
12
11
  * Client wrapper for LoginLayout
@@ -24,6 +23,5 @@ export function LoginClientWrapper({ image_src, image_alt, image_background_colo
24
23
  if (!dataClient) {
25
24
  return (_jsx("div", { className: "cls_login_page_loading flex items-center justify-center min-h-screen", children: _jsx("div", { className: "text-slate-600 animate-pulse", children: "Loading..." }) }));
26
25
  }
27
- const logger = create_app_logger();
28
- return (_jsx(LoginLayout, { image_src: image_src, image_alt: image_alt, image_background_color: image_background_color, data_client: dataClient, logger: logger, redirectRoute: redirectRoute, successMessage: successMessage, alreadyLoggedInMessage: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath, forgot_password_path: forgotPasswordPath, forgot_password_label: forgotPasswordLabel, create_account_path: createAccountPath, create_account_label: createAccountLabel, oauth: oauth }));
26
+ return (_jsx(LoginLayout, { image_src: image_src, image_alt: image_alt, image_background_color: image_background_color, data_client: dataClient, redirectRoute: redirectRoute, successMessage: successMessage, alreadyLoggedInMessage: alreadyLoggedInMessage, showLogoutButton: showLogoutButton, showReturnHomeButton: showReturnHomeButton, returnHomeButtonLabel: returnHomeButtonLabel, returnHomePath: returnHomePath, forgot_password_path: forgotPasswordPath, forgot_password_label: forgotPasswordLabel, create_account_path: createAccountPath, create_account_label: createAccountLabel, oauth: oauth }));
29
27
  }
@@ -553,3 +553,33 @@ application_permission_list_defaults = admin_user_management,admin_role_manageme
553
553
  # - {{user_email}} - User's email address
554
554
  # - {{user_name}} - User's name (if available)
555
555
 
556
+ [hazo_auth__multi_tenancy]
557
+ # Multi-tenancy configuration for organization hierarchy
558
+ # Enables hierarchical organization structures for company-wide access control
559
+
560
+ # Enable multi-tenancy (true/false, default: false)
561
+ # When enabled, users can be assigned to organizations and hazo_get_auth returns org info
562
+ # enable_multi_tenancy = false
563
+
564
+ # Organization cache TTL in minutes (default: 15)
565
+ # Cached org data will be refreshed after this time
566
+ # org_cache_ttl_minutes = 15
567
+
568
+ # Maximum number of org entries to cache (LRU eviction, default: 1000)
569
+ # org_cache_max_entries = 1000
570
+
571
+ # Default user limit for new organizations (0 = unlimited, default: 0)
572
+ # This can be overridden when creating each organization
573
+ # default_user_limit = 0
574
+
575
+ # Permissions required:
576
+ # - hazo_perm_org_management: CRUD operations on organizations
577
+ # - hazo_org_global_admin: View/manage ALL organizations across the system
578
+
579
+ # API endpoints (when multi-tenancy is enabled):
580
+ # - GET /api/hazo_auth/org_management/orgs?action=list - List organizations
581
+ # - GET /api/hazo_auth/org_management/orgs?action=tree - Get organization hierarchy tree
582
+ # - POST /api/hazo_auth/org_management/orgs - Create organization
583
+ # - PATCH /api/hazo_auth/org_management/orgs - Update organization
584
+ # - DELETE /api/hazo_auth/org_management/orgs?org_id=... - Soft delete (deactivate)
585
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hazo_auth",
3
- "version": "4.3.0",
3
+ "version": "4.4.1",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -44,6 +44,14 @@
44
44
  "types": "./dist/components/layouts/user_management/index.d.ts",
45
45
  "import": "./dist/components/layouts/user_management/index.js"
46
46
  },
47
+ "./components/layouts/dev_lock": {
48
+ "types": "./dist/components/layouts/dev_lock/index.d.ts",
49
+ "import": "./dist/components/layouts/dev_lock/index.js"
50
+ },
51
+ "./components/layouts/org_management": {
52
+ "types": "./dist/components/layouts/org_management/index.d.ts",
53
+ "import": "./dist/components/layouts/org_management/index.js"
54
+ },
47
55
  "./components/layouts/shared": {
48
56
  "types": "./dist/components/layouts/shared/index.d.ts",
49
57
  "import": "./dist/components/layouts/shared/index.js"
@@ -115,6 +123,18 @@
115
123
  "./page_components/verify_email": {
116
124
  "types": "./dist/page_components/verify_email.d.ts",
117
125
  "import": "./dist/page_components/verify_email.js"
126
+ },
127
+ "./page_components/dev_lock": {
128
+ "types": "./dist/page_components/dev_lock.d.ts",
129
+ "import": "./dist/page_components/dev_lock.js"
130
+ },
131
+ "./page_components/org_management": {
132
+ "types": "./dist/page_components/org_management.d.ts",
133
+ "import": "./dist/page_components/org_management.js"
134
+ },
135
+ "./page_components/my_settings": {
136
+ "types": "./dist/page_components/my_settings.d.ts",
137
+ "import": "./dist/page_components/my_settings.js"
118
138
  }
119
139
  },
120
140
  "files": [
@@ -174,8 +194,9 @@
174
194
  "gravatar-url": "^4.0.1",
175
195
  "handlebars": "^4.7.8",
176
196
  "hazo_config": "^1.3.0",
177
- "hazo_connect": "^2.0.0",
197
+ "hazo_connect": "^2.3.5",
178
198
  "hazo_notify": "^1.0.0",
199
+ "hazo_ui": "^2.0.0",
179
200
  "helmet": "^8.1.0",
180
201
  "ini": "^6.0.0",
181
202
  "jose": "^5.9.6",
@@ -195,13 +216,18 @@
195
216
  "tsx": "^4.20.6",
196
217
  "zod": "^4.1.12"
197
218
  },
219
+ "peerDependencies": {
220
+ "hazo_logs": "^1.0.0"
221
+ },
198
222
  "devDependencies": {
223
+ "hazo_logs": "file:./hazo_logs-1.0.3.tgz",
199
224
  "@chromatic-com/storybook": "^4.1.2",
200
225
  "@storybook/addon-a11y": "^10.0.6",
201
226
  "@storybook/addon-docs": "^10.0.6",
202
227
  "@storybook/addon-onboarding": "^10.0.6",
203
228
  "@storybook/addon-vitest": "^10.0.6",
204
229
  "@storybook/nextjs": "^10.0.6",
230
+ "@testing-library/dom": "^10.4.1",
205
231
  "@testing-library/jest-dom": "^6.6.3",
206
232
  "@testing-library/react": "^16.0.1",
207
233
  "@types/better-sqlite3": "^7.6.13",
@@ -224,6 +250,7 @@
224
250
  "jest": "^30.2.0",
225
251
  "jest-environment-jsdom": "^29.7.0",
226
252
  "patch-package": "^8.0.1",
253
+ "playwright": "^1.57.0",
227
254
  "postcss": "^8",
228
255
  "storybook": "^10.0.6",
229
256
  "supertest": "^7.1.4",