@jmruthers/pace-core 0.5.181 → 0.5.183
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.
- package/CHANGELOG.md +1 -1
- package/README.md +16 -2
- package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
- package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
- package/dist/{DataTable-UA6CL4JI.js → DataTable-QAB34V6K.js} +14 -15
- package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
- package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
- package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
- package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
- package/dist/auth-BZOJqrdd.d.ts +49 -0
- package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
- package/dist/chunk-5DRSZLL2.js.map +1 -0
- package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
- package/dist/chunk-6C4YBBJM.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
- package/dist/{chunk-HRO5HWN2.js → chunk-CSOFYHAG.js} +55 -162
- package/dist/chunk-CSOFYHAG.js.map +1 -0
- package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
- package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
- package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
- package/dist/chunk-FSFQFJCU.js.map +1 -0
- package/dist/chunk-FUEYYMX5.js +2296 -0
- package/dist/chunk-FUEYYMX5.js.map +1 -0
- package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
- package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
- package/dist/chunk-KQCRWDSA.js +1 -0
- package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
- package/dist/chunk-KUEN3HFB.js.map +1 -0
- package/dist/chunk-LMC26NLJ.js +84 -0
- package/dist/chunk-LMC26NLJ.js.map +1 -0
- package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
- package/dist/chunk-M7W4CP3M.js.map +1 -0
- package/dist/{chunk-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
- package/dist/chunk-MI7HBHN3.js.map +1 -0
- package/dist/{chunk-PPMP5J6T.js → chunk-PWAHJW4G.js} +180 -29
- package/dist/chunk-PWAHJW4G.js.map +1 -0
- package/dist/chunk-PWLANIRT.js +127 -0
- package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
- package/dist/chunk-QCDXODCA.js +75 -0
- package/dist/chunk-QCDXODCA.js.map +1 -0
- package/dist/{chunk-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
- package/dist/chunk-QETLRQI6.js.map +1 -0
- package/dist/{chunk-5MT24GKJ.js → chunk-QUVSNGIP.js} +264 -262
- package/dist/chunk-QUVSNGIP.js.map +1 -0
- package/dist/chunk-QXHPKYJV.js +113 -0
- package/dist/chunk-QXHPKYJV.js.map +1 -0
- package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
- package/dist/chunk-R77UEZ4E.js.map +1 -0
- package/dist/{chunk-ZYTYSTO5.js → chunk-RA3JUFMW.js} +314 -161
- package/dist/chunk-RA3JUFMW.js.map +1 -0
- package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
- package/dist/chunk-SQGMNID3.js.map +1 -0
- package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
- package/dist/chunk-UHNYIBXL.js.map +1 -0
- package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
- package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
- package/dist/{chunk-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
- package/dist/{chunk-VZ4VDGTB.js.map → chunk-W22JP75J.js.map} +1 -1
- package/dist/components.d.ts +12 -93
- package/dist/components.js +23 -106
- package/dist/components.js.map +1 -1
- package/dist/core-CUElvH_C.d.ts +164 -0
- package/dist/database.generated-CBmg2950.d.ts +8284 -0
- package/dist/event-CW5YB_2p.d.ts +239 -0
- package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
- package/dist/functions-D_kgHktt.d.ts +208 -0
- package/dist/hooks.d.ts +54 -7
- package/dist/hooks.js +204 -17
- package/dist/hooks.js.map +1 -1
- package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
- package/dist/index.d.ts +94 -261
- package/dist/index.js +314 -126
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +7 -8
- package/dist/providers.js +6 -13
- package/dist/rbac/index.d.ts +171 -101
- package/dist/rbac/index.js +23 -17
- package/dist/styles/index.d.ts +1 -3
- package/dist/styles/index.js +2 -17
- package/dist/theming/runtime.js +3 -3
- package/dist/types-UU913iLA.d.ts +102 -0
- package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
- package/dist/types.d.ts +88 -227
- package/dist/types.js +64 -112
- package/dist/types.js.map +1 -1
- package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
- package/dist/utils.d.ts +299 -13
- package/dist/utils.js +481 -55
- package/dist/utils.js.map +1 -1
- package/dist/validation-643vUDZW.d.ts +177 -0
- package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
- package/docs/README.md +9 -8
- package/docs/api/README.md +16 -2
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +14 -14
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +2 -2
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +29 -9
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +17 -17
- package/docs/api/enums/RBACErrorCode.md +228 -0
- package/docs/api/enums/RPCFunction.md +118 -0
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CalendarProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +29 -3
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +2 -2
- package/docs/api/interfaces/DataTableColumn.md +6 -6
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +5 -5
- package/docs/api/interfaces/ExportOptions.md +4 -4
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +13 -13
- package/docs/api/interfaces/FileReference.md +12 -12
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +10 -10
- package/docs/api/interfaces/FileUploadProps.md +19 -19
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +166 -0
- package/docs/api/interfaces/FormProps.md +113 -0
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +8 -8
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +17 -73
- package/docs/api/interfaces/NavigationMenuProps.md +38 -53
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +13 -13
- package/docs/api/interfaces/OrganisationContextType.md +21 -21
- package/docs/api/interfaces/OrganisationMembership.md +15 -15
- package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
- package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
- package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +50 -0
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
- package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
- package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
- package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
- package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +52 -0
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
- package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
- package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
- package/docs/api/interfaces/RBACResult.md +58 -0
- package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
- package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
- package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
- package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
- package/docs/api/interfaces/RBACRolesListParams.md +52 -0
- package/docs/api/interfaces/RBACRolesListResult.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +43 -2
- package/docs/api/interfaces/TextareaProps.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +4 -4
- package/docs/api/interfaces/UserProfile.md +7 -7
- package/docs/api/modules.md +484 -462
- package/docs/api-reference/components.md +186 -15
- package/docs/api-reference/deprecated.md +376 -0
- package/docs/api-reference/hooks.md +149 -19
- package/docs/api-reference/providers.md +61 -6
- package/docs/api-reference/rpc-functions.md +397 -0
- package/docs/api-reference/types.md +135 -78
- package/docs/api-reference/utilities.md +51 -380
- package/docs/architecture/README.md +49 -3
- package/docs/architecture/database-schema-requirements.md +40 -3
- package/docs/architecture/rbac-security-architecture.md +41 -4
- package/docs/architecture/services.md +127 -42
- package/docs/best-practices/README.md +51 -5
- package/docs/best-practices/accessibility.md +32 -3
- package/docs/best-practices/common-patterns.md +50 -3
- package/docs/best-practices/deployment.md +50 -4
- package/docs/best-practices/performance.md +50 -3
- package/docs/best-practices/security.md +94 -41
- package/docs/best-practices/testing.md +33 -4
- package/docs/core-concepts/authentication.md +5 -5
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +3 -3
- package/docs/core-concepts/permissions.md +3 -3
- package/docs/core-concepts/rbac-system.md +5 -5
- package/docs/documentation-index.md +30 -8
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +7 -5
- package/docs/getting-started/examples/basic-auth-app.md +3 -0
- package/docs/getting-started/examples/full-featured-app.md +5 -3
- package/docs/getting-started/faq.md +6 -6
- package/docs/getting-started/installation-guide.md +192 -13
- package/docs/getting-started/local-development.md +303 -0
- package/docs/getting-started/quick-reference.md +3 -3
- package/docs/getting-started/quick-start.md +517 -0
- package/docs/implementation-guides/app-layout.md +45 -3
- package/docs/implementation-guides/authentication.md +66 -7
- package/docs/implementation-guides/component-styling.md +53 -3
- package/docs/implementation-guides/data-tables.md +76 -7
- package/docs/implementation-guides/datatable-filtering.md +1 -2
- package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
- package/docs/implementation-guides/dynamic-colors.md +155 -4
- package/docs/implementation-guides/file-reference-system.md +72 -3
- package/docs/implementation-guides/file-upload-storage.md +72 -3
- package/docs/implementation-guides/forms.md +53 -3
- package/docs/implementation-guides/inactivity-tracking.md +53 -3
- package/docs/implementation-guides/large-datasets.md +1 -1
- package/docs/implementation-guides/navigation.md +55 -5
- package/docs/implementation-guides/organisation-security.md +72 -3
- package/docs/implementation-guides/performance.md +57 -1
- package/docs/implementation-guides/permission-enforcement.md +81 -8
- package/docs/implementation-guides/public-pages.md +560 -14
- package/docs/migration/MIGRATION_GUIDE.md +409 -50
- package/docs/migration/README.md +37 -3
- package/docs/migration/organisation-context-timing-fix.md +39 -4
- package/docs/migration/quick-migration-guide.md +41 -5
- package/docs/migration/rbac-migration.md +59 -3
- package/docs/migration/service-architecture.md +77 -14
- package/docs/rbac/README.md +79 -3
- package/docs/rbac/advanced-patterns.md +47 -3
- package/docs/rbac/api-reference.md +77 -8
- package/docs/rbac/event-based-apps.md +50 -5
- package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
- package/docs/rbac/examples.md +39 -3
- package/docs/rbac/getting-started.md +63 -4
- package/docs/rbac/quick-start.md +57 -5
- package/docs/rbac/rbac-rls-integration.md +68 -6
- package/docs/rbac/super-admin-guide.md +47 -3
- package/docs/rbac/troubleshooting.md +3 -3
- package/docs/security/README.md +68 -3
- package/docs/security/checklist.md +50 -3
- package/docs/standards/01-architecture-standard.md +39 -0
- package/docs/standards/02-api-and-rpc-standard.md +39 -0
- package/docs/standards/03-component-standard.md +32 -0
- package/docs/standards/04-code-style-standard.md +32 -0
- package/docs/standards/05-security-standard.md +30 -0
- package/docs/standards/06-testing-and-docs-standard.md +29 -0
- package/docs/standards/README.md +35 -0
- package/docs/styles/README.md +89 -8
- package/docs/testing/README.md +175 -24
- package/docs/troubleshooting/README.md +50 -3
- package/docs/troubleshooting/common-issues.md +271 -5
- package/docs/troubleshooting/debugging.md +54 -1
- package/docs/troubleshooting/migration.md +54 -1
- package/docs/troubleshooting/organisation-context-setup.md +29 -3
- package/docs/troubleshooting/styling-issues.md +246 -4
- package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
- package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
- package/{src/components/DataTable/examples → examples/DataTable}/HierarchicalExample.tsx +8 -6
- package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
- package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
- package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
- package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
- package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
- package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
- package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
- package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
- package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
- package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
- package/examples/README.md +81 -33
- package/examples/index.ts +14 -12
- package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
- package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
- package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
- package/package.json +21 -27
- package/src/__tests__/helpers/test-utils.tsx +29 -3
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
- package/src/components/Alert/Alert.test.tsx +2 -2
- package/src/components/Alert/Alert.tsx +4 -4
- package/src/components/Avatar/Avatar.test.tsx +17 -6
- package/src/components/Badge/Badge.test.tsx +1 -1
- package/src/components/Badge/Badge.tsx +2 -2
- package/src/components/Button/Button.test.tsx +2 -2
- package/src/components/Button/Button.tsx +11 -7
- package/src/components/Calendar/Calendar.test.tsx +41 -8
- package/src/components/Calendar/Calendar.tsx +39 -36
- package/src/components/Card/Card.tsx +51 -13
- package/src/components/Checkbox/Checkbox.test.tsx +36 -12
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
- package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
- package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
- package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
- package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
- package/src/components/DataTable/components/DataTableBody.tsx +10 -25
- package/src/components/DataTable/components/DataTableCore.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +3 -1
- package/src/components/DataTable/components/ImportModal.tsx +1 -1
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
- package/src/components/DataTable/core/ColumnFactory.ts +6 -6
- package/src/components/DataTable/core/DataTableContext.tsx +14 -10
- package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
- package/src/components/DataTable/core/PluginRegistry.ts +3 -3
- package/src/components/DataTable/core/StateManager.ts +12 -11
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
- package/src/components/DataTable/core/interfaces.ts +17 -17
- package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
- package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
- package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
- package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
- package/src/components/DataTable/types.ts +5 -5
- package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
- package/src/components/DataTable/utils/columnUtils.ts +3 -2
- package/src/components/DataTable/utils/debugTools.ts +1 -1
- package/src/components/DataTable/utils/exportUtils.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
- package/src/components/DataTable/utils/index.ts +0 -1
- package/src/components/DataTable/utils/performanceUtils.ts +9 -4
- package/src/components/Dialog/Dialog.test.tsx +49 -27
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
- package/src/components/EventSelector/EventSelector.test.tsx +60 -12
- package/src/components/EventSelector/EventSelector.tsx +38 -15
- package/src/components/EventSelector/index.ts +2 -2
- package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
- package/src/components/FileDisplay/FileDisplay.tsx +1 -0
- package/src/components/FileUpload/FileUpload.test.tsx +532 -152
- package/src/components/FileUpload/FileUpload.tsx +43 -8
- package/src/components/Footer/Footer.test.tsx +19 -14
- package/src/components/Form/Form.test.tsx +96 -14
- package/src/components/Form/Form.tsx +210 -1
- package/src/components/Form/index.ts +3 -7
- package/src/components/Header/Header.test.tsx +24 -17
- package/src/components/Header/Header.tsx +3 -1
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
- package/src/components/Input/Input.test.tsx +61 -36
- package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
- package/src/components/Label/Label.tsx +2 -3
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
- package/src/components/LoginForm/LoginForm.test.tsx +14 -13
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/LoginForm/index.ts +7 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
- package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
- package/src/components/NavigationMenu/index.ts +1 -1
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
- package/src/components/PaceAppLayout/test-setup.tsx +192 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
- package/src/components/PasswordChange/index.ts +2 -0
- package/src/components/Progress/Progress.test.tsx +11 -0
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/Progress/index.ts +10 -0
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
- package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
- package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
- package/src/components/PublicLayout/index.ts +10 -28
- package/src/components/Select/Select.test.tsx +7 -7
- package/src/components/Select/Select.tsx +277 -11
- package/src/components/Select/index.ts +1 -2
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
- package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
- package/src/components/Tabs/Tabs.test.tsx +10 -9
- package/src/components/Tabs/Tabs.tsx +61 -33
- package/src/components/Textarea/Textarea.test.tsx +31 -18
- package/src/components/Toast/Toast.tsx +2 -2
- package/src/components/Tooltip/Tooltip.test.tsx +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +7 -6
- package/src/components/UserMenu/UserMenu.tsx +2 -2
- package/src/components/index.ts +5 -4
- package/src/constants/performance.ts +19 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
- package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
- package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
- package/src/hooks/index.ts +4 -0
- package/src/hooks/public/index.ts +2 -0
- package/src/hooks/public/usePublicEvent.ts +4 -6
- package/src/hooks/public/usePublicEventLogo.test.ts +147 -0
- package/src/hooks/public/usePublicRouteParams.ts +1 -1
- package/src/hooks/services/useAuth.ts +2 -4
- package/src/hooks/services/useCurrentEvent.ts +1 -1
- package/src/hooks/useAppConfig.ts +1 -1
- package/src/hooks/useDataTablePerformance.ts +2 -2
- package/src/hooks/useEventTheme.ts +1 -1
- package/src/hooks/useEvents.ts +51 -10
- package/src/hooks/useOrganisationPermissions.test.ts +3 -3
- package/src/hooks/useOrganisationPermissions.ts +1 -1
- package/src/hooks/useOrganisationSecurity.ts +2 -2
- package/src/hooks/usePermissionCache.test.ts +9 -9
- package/src/hooks/usePermissionCache.ts +2 -2
- package/src/index.ts +19 -12
- package/src/providers/OrganisationProvider.tsx +73 -9
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
- package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
- package/src/providers/__tests__/EventProvider.test.tsx +24 -15
- package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
- package/src/providers/index.ts +0 -3
- package/src/providers/services/AuthServiceProvider.tsx +2 -17
- package/src/providers/services/EventServiceProvider.tsx +11 -16
- package/src/providers/services/InactivityServiceProvider.tsx +9 -12
- package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
- package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
- package/src/rbac/adapters.tsx +1 -1
- package/src/rbac/api.ts +20 -4
- package/src/rbac/audit-enhanced.ts +47 -2
- package/src/rbac/audit.ts +47 -2
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.test.tsx +7 -6
- package/src/rbac/components/NavigationProvider.tsx +1 -1
- package/src/rbac/components/PagePermissionGuard.tsx +1 -1
- package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +1 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
- package/src/rbac/components/SecureDataProvider.tsx +1 -1
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
- package/src/rbac/hooks/index.ts +3 -0
- package/src/rbac/hooks/usePermissions.ts +31 -85
- package/src/rbac/hooks/useRBAC.test.ts +13 -1
- package/src/rbac/hooks/useRBAC.ts +13 -67
- package/src/rbac/hooks/useResolvedScope.ts +11 -0
- package/src/rbac/hooks/useSecureSupabase.ts +308 -0
- package/src/rbac/index.ts +3 -0
- package/src/rbac/secureClient.ts +53 -6
- package/src/rbac/security.ts +37 -1
- package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
- package/src/rbac/types.ts +3 -2
- package/src/services/AuthService.ts +33 -25
- package/src/services/EventService.ts +56 -44
- package/src/services/InactivityService.ts +33 -53
- package/src/services/OrganisationService.ts +36 -40
- package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
- package/src/services/__tests__/EventService.test.ts +67 -33
- package/src/services/interfaces/IEventService.ts +1 -1
- package/src/styles/core.css +2 -2
- package/src/styles/index.test.ts +21 -0
- package/src/styles/index.ts +1 -5
- package/src/types/__tests__/guards.test.ts +1 -1
- package/src/types/__tests__/organisation.roles.test.ts +55 -0
- package/src/types/__tests__/type-validation.test.ts +0 -1
- package/src/types/auth.ts +42 -2
- package/src/types/core.ts +251 -0
- package/src/types/database.ts +11 -496
- package/src/types/event.ts +102 -0
- package/src/types/file-reference.ts +6 -4
- package/src/types/guards.ts +2 -1
- package/src/types/index.ts +48 -14
- package/src/types/lodash.debounce.d.ts +15 -0
- package/src/types/organisation.ts +14 -10
- package/src/types/supabase.ts +15 -17
- package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
- package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
- package/src/utils/app/appNameResolver.ts +1 -1
- package/src/utils/audit/audit.test.ts +65 -0
- package/src/utils/device/deviceFingerprint.test.ts +171 -0
- package/src/utils/dynamic/dynamicUtils.ts +3 -2
- package/src/utils/file-reference/index.ts +25 -6
- package/src/utils/security/secureErrors.ts +1 -1
- package/src/utils/validation/__tests__/validationUtils.test.ts +72 -0
- package/src/utils/validation/index.ts +6 -12
- package/src/utils/validation/validationUtils.ts +0 -13
- package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
- package/dist/auth-DReDSLq9.d.ts +0 -16
- package/dist/chunk-3JI76CYK.js +0 -2444
- package/dist/chunk-3JI76CYK.js.map +0 -1
- package/dist/chunk-56XJ3TU6.js +0 -11
- package/dist/chunk-56XJ3TU6.js.map +0 -1
- package/dist/chunk-5MT24GKJ.js.map +0 -1
- package/dist/chunk-7QCC6MCP.js +0 -288
- package/dist/chunk-BESYRHQM.js.map +0 -1
- package/dist/chunk-BJPBT3CU.js +0 -21
- package/dist/chunk-BJPBT3CU.js.map +0 -1
- package/dist/chunk-BVYWGZVV.js.map +0 -1
- package/dist/chunk-CX5M4ZAG.js.map +0 -1
- package/dist/chunk-D7LCGMVS.js.map +0 -1
- package/dist/chunk-EGI6MUL6.js +0 -27
- package/dist/chunk-EGI6MUL6.js.map +0 -1
- package/dist/chunk-ERISIBYU.js.map +0 -1
- package/dist/chunk-HRO5HWN2.js.map +0 -1
- package/dist/chunk-HZLDFOE4.js.map +0 -1
- package/dist/chunk-JISYG63F.js +0 -70
- package/dist/chunk-JISYG63F.js.map +0 -1
- package/dist/chunk-LIMSTKYD.js +0 -61
- package/dist/chunk-LIMSTKYD.js.map +0 -1
- package/dist/chunk-OWAG3GSU.js.map +0 -1
- package/dist/chunk-PPMP5J6T.js.map +0 -1
- package/dist/chunk-Q5QRDWKI.js.map +0 -1
- package/dist/chunk-S5OFRT4M.js.map +0 -1
- package/dist/chunk-SBVILCCA.js.map +0 -1
- package/dist/chunk-TUMEWN34.js +0 -15
- package/dist/chunk-TUMEWN34.js.map +0 -1
- package/dist/chunk-XDNLUEXI.js +0 -138
- package/dist/chunk-XJ2HZOBU.js.map +0 -1
- package/dist/chunk-ZYTYSTO5.js.map +0 -1
- package/dist/chunk-ZZ2SS7NI.js +0 -237
- package/dist/chunk-ZZ2SS7NI.js.map +0 -1
- package/dist/database-C6jy7EOu.d.ts +0 -500
- package/dist/organisation-D6qRDtbF.d.ts +0 -93
- package/dist/schema-DTDZQe2u.d.ts +0 -28
- package/dist/unified-DQ4VcT7H.d.ts +0 -198
- package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
- package/dist/validation.d.ts +0 -47
- package/dist/validation.js +0 -24
- package/dist/validation.js.map +0 -1
- package/docs/DOCUMENTATION_AUDIT.md +0 -172
- package/docs/DOCUMENTATION_STANDARD.md +0 -137
- package/docs/api/classes/PublicErrorBoundary.md +0 -132
- package/docs/api/interfaces/EventLogoProps.md +0 -152
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
- package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
- package/docs/architecture/rpc-function-standards.md +0 -1106
- package/docs/getting-started/consuming-app-vite-config.md +0 -239
- package/docs/implementation-guides/event-theming-summary.md +0 -226
- package/docs/implementation-guides/public-pages-advanced.md +0 -1038
- package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
- package/docs/migration/v0.4.16-css-first-approach.md +0 -312
- package/docs/migration/v0.4.17-source-path-fix.md +0 -235
- package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
- package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
- package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
- package/docs/rbac/README-rbac-rls-integration.md +0 -374
- package/docs/styles/usage.md +0 -227
- package/docs/testing/visual-testing.md +0 -120
- package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
- package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
- package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
- package/docs/troubleshooting/database-view-compatibility.md +0 -125
- package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
- package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
- package/examples/RBAC/EventBasedApp.tsx +0 -239
- package/examples/RBAC/PermissionExample.tsx +0 -151
- package/examples/STRUCTURE.md +0 -125
- package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
- package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
- package/examples/components 2/index.ts +0 -11
- package/examples/features/index.ts +0 -12
- package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
- package/examples/features/rbac/index.ts +0 -13
- package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
- package/examples/public-pages/PublicEventPage.tsx +0 -274
- package/examples/public-pages/PublicPageApp.tsx +0 -308
- package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
- package/examples/public-pages/index.ts +0 -14
- package/src/__tests__/TEST_STANDARD.md +0 -1008
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
- package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
- package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
- package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
- package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
- package/src/components/Dialog/README.md +0 -804
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
- package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
- package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
- package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
- package/src/components/Dialog/utils/safeHtml.ts +0 -185
- package/src/components/EventSelector/types.ts +0 -79
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormField.tsx +0 -249
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/Input/__mocks__/Input.tsx +0 -2
- package/src/components/NavigationMenu/types.ts +0 -85
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/ProtectedRoute/README.md +0 -164
- package/src/components/PublicLayout/EventLogo.tsx +0 -175
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
- package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
- package/src/components/Select/hooks.ts +0 -289
- package/src/hooks/useCounter.test.ts +0 -131
- package/src/hooks/useDebounce.test.ts +0 -375
- package/src/providers/AuthProvider.tsx +0 -15
- package/src/providers/EventProvider.tsx +0 -16
- package/src/providers/InactivityProvider.tsx +0 -15
- package/src/providers/OrganisationProvider.context.test.tsx +0 -169
- package/src/providers/UnifiedAuthProvider.tsx +0 -15
- package/src/types/theme.ts +0 -6
- package/src/types/unified.ts +0 -265
- package/src/utils/appConfig.ts +0 -47
- package/src/utils/appIdResolver.test.ts +0 -499
- package/src/utils/appIdResolver.ts +0 -130
- package/src/utils/appNameResolver.simple.test.ts +0 -212
- package/src/utils/appNameResolver.test.ts +0 -121
- package/src/utils/appNameResolver.ts +0 -191
- package/src/utils/audit.ts +0 -127
- package/src/utils/auth-utils.ts +0 -96
- package/src/utils/bundleAnalysis.ts +0 -129
- package/src/utils/debugLogger.ts +0 -67
- package/src/utils/deviceFingerprint.ts +0 -215
- package/src/utils/dynamicUtils.ts +0 -105
- package/src/utils/file-reference.test.ts +0 -788
- package/src/utils/file-reference.ts +0 -519
- package/src/utils/formatDate.test.ts +0 -237
- package/src/utils/formatting.ts +0 -170
- package/src/utils/lazyLoad.tsx +0 -44
- package/src/utils/logger.ts +0 -179
- package/src/utils/organisationContext.test.ts +0 -322
- package/src/utils/organisationContext.ts +0 -153
- package/src/utils/performanceBenchmark.ts +0 -64
- package/src/utils/performanceBudgets.ts +0 -110
- package/src/utils/permissionTypes.ts +0 -37
- package/src/utils/permissionUtils.test.ts +0 -393
- package/src/utils/permissionUtils.ts +0 -34
- package/src/utils/sanitization.ts +0 -264
- package/src/utils/schemaUtils.ts +0 -37
- package/src/utils/secureDataAccess.test.ts +0 -711
- package/src/utils/secureDataAccess.ts +0 -377
- package/src/utils/secureErrors.ts +0 -79
- package/src/utils/security.ts +0 -156
- package/src/utils/securityMonitor.ts +0 -45
- package/src/utils/sessionTracking.ts +0 -126
- package/src/utils/validation.ts +0 -111
- package/src/utils/validationUtils.ts +0 -120
- package/src/validation/index.ts +0 -12
- /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
- /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
- /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
- /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
- /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
- /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
- /package/examples/{RBAC → rbac}/index.ts +0 -0
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
import { render, screen, waitFor } from '@testing-library/react';
|
|
8
8
|
import { vi, describe, it, expect } from 'vitest';
|
|
9
|
-
import { UnifiedAuthProvider, useUnifiedAuth } from '../UnifiedAuthProvider';
|
|
9
|
+
import { UnifiedAuthProvider, useUnifiedAuth } from '../services/UnifiedAuthProvider';
|
|
10
10
|
|
|
11
11
|
// Mock the debug logger
|
|
12
12
|
vi.mock('../../utils/debugLogger', () => ({
|
|
@@ -15,11 +15,35 @@ vi.mock('../../utils/debugLogger', () => ({
|
|
|
15
15
|
},
|
|
16
16
|
}));
|
|
17
17
|
|
|
18
|
+
// Create mock user and session
|
|
19
|
+
const mockUser = {
|
|
20
|
+
id: 'test-user-id',
|
|
21
|
+
email: 'test@example.com',
|
|
22
|
+
user_metadata: {},
|
|
23
|
+
app_metadata: {},
|
|
24
|
+
} as any;
|
|
25
|
+
|
|
26
|
+
const mockSession = {
|
|
27
|
+
access_token: 'test-token',
|
|
28
|
+
refresh_token: 'test-refresh-token',
|
|
29
|
+
user: mockUser,
|
|
30
|
+
expires_at: Date.now() + 3600000,
|
|
31
|
+
} as any;
|
|
32
|
+
|
|
18
33
|
// Create mock Supabase client
|
|
19
34
|
const createMockSupabaseClient = () => ({
|
|
20
35
|
auth: {
|
|
21
|
-
getSession: vi.fn()
|
|
22
|
-
|
|
36
|
+
getSession: vi.fn().mockResolvedValue({
|
|
37
|
+
data: { session: mockSession },
|
|
38
|
+
error: null
|
|
39
|
+
}),
|
|
40
|
+
getUser: vi.fn().mockResolvedValue({
|
|
41
|
+
data: { user: mockUser },
|
|
42
|
+
error: null
|
|
43
|
+
}),
|
|
44
|
+
onAuthStateChange: vi.fn().mockReturnValue({
|
|
45
|
+
data: { subscription: { unsubscribe: vi.fn() } }
|
|
46
|
+
}),
|
|
23
47
|
signInWithPassword: vi.fn(),
|
|
24
48
|
signUp: vi.fn(),
|
|
25
49
|
signOut: vi.fn(),
|
|
@@ -47,12 +71,22 @@ const TestComponent = () => {
|
|
|
47
71
|
};
|
|
48
72
|
|
|
49
73
|
describe('UnifiedAuthProvider', () => {
|
|
50
|
-
|
|
74
|
+
let mockSupabaseClient: ReturnType<typeof createMockSupabaseClient>;
|
|
75
|
+
const defaultProps = {
|
|
76
|
+
idleTimeoutMs: 30 * 60 * 1000,
|
|
77
|
+
warnBeforeMs: 60 * 1000,
|
|
78
|
+
onIdleLogout: vi.fn(),
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
beforeEach(() => {
|
|
82
|
+
// Create a fresh mock client for each test
|
|
83
|
+
mockSupabaseClient = createMockSupabaseClient();
|
|
84
|
+
});
|
|
51
85
|
|
|
52
86
|
describe('Rendering', () => {
|
|
53
87
|
it('renders without crashing', () => {
|
|
54
88
|
render(
|
|
55
|
-
<UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
|
|
89
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} {...defaultProps}>
|
|
56
90
|
<TestComponent />
|
|
57
91
|
</UnifiedAuthProvider>
|
|
58
92
|
);
|
|
@@ -62,7 +96,7 @@ describe('UnifiedAuthProvider', () => {
|
|
|
62
96
|
|
|
63
97
|
it('renders with custom app name', () => {
|
|
64
98
|
render(
|
|
65
|
-
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Custom App">
|
|
99
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Custom App" {...defaultProps}>
|
|
66
100
|
<TestComponent />
|
|
67
101
|
</UnifiedAuthProvider>
|
|
68
102
|
);
|
|
@@ -84,15 +118,15 @@ describe('UnifiedAuthProvider', () => {
|
|
|
84
118
|
describe('Context Values', () => {
|
|
85
119
|
it('provides all required context values', async () => {
|
|
86
120
|
render(
|
|
87
|
-
<UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
|
|
121
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
|
|
88
122
|
<TestComponent />
|
|
89
123
|
</UnifiedAuthProvider>
|
|
90
124
|
);
|
|
91
125
|
|
|
92
|
-
// Wait for services to initialize
|
|
126
|
+
// Wait for services to initialize and user/session to be loaded
|
|
93
127
|
await waitFor(() => {
|
|
94
|
-
expect(screen.getByTestId('
|
|
95
|
-
});
|
|
128
|
+
expect(screen.getByTestId('hasUser')).toHaveTextContent('true');
|
|
129
|
+
}, { timeout: 3000 });
|
|
96
130
|
|
|
97
131
|
expect(screen.getByTestId('hasUser')).toHaveTextContent('true');
|
|
98
132
|
expect(screen.getByTestId('hasSession')).toHaveTextContent('true');
|
|
@@ -148,7 +182,7 @@ describe('UnifiedAuthProvider', () => {
|
|
|
148
182
|
|
|
149
183
|
it('uses default configuration', () => {
|
|
150
184
|
render(
|
|
151
|
-
<UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
|
|
185
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} {...defaultProps}>
|
|
152
186
|
<TestComponent />
|
|
153
187
|
</UnifiedAuthProvider>
|
|
154
188
|
);
|
|
@@ -158,7 +192,7 @@ describe('UnifiedAuthProvider', () => {
|
|
|
158
192
|
});
|
|
159
193
|
|
|
160
194
|
describe('[integration] Provider Composition', () => {
|
|
161
|
-
it('composes with child providers without errors', () => {
|
|
195
|
+
it('composes with child providers without errors', async () => {
|
|
162
196
|
const TestCompositionComponent = () => {
|
|
163
197
|
const auth = useUnifiedAuth();
|
|
164
198
|
|
|
@@ -173,16 +207,20 @@ describe('UnifiedAuthProvider', () => {
|
|
|
173
207
|
};
|
|
174
208
|
|
|
175
209
|
render(
|
|
176
|
-
<UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
|
|
210
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
|
|
177
211
|
<TestCompositionComponent />
|
|
178
212
|
</UnifiedAuthProvider>
|
|
179
213
|
);
|
|
180
214
|
|
|
181
215
|
expect(screen.getByTestId('composition-success')).toHaveTextContent('composed');
|
|
182
|
-
|
|
216
|
+
|
|
217
|
+
// Wait for user and session to be loaded
|
|
218
|
+
await waitFor(() => {
|
|
219
|
+
expect(screen.getByTestId('has-all-contexts')).toHaveTextContent('yes');
|
|
220
|
+
}, { timeout: 3000 });
|
|
183
221
|
});
|
|
184
222
|
|
|
185
|
-
it('provides complete unified context', () => {
|
|
223
|
+
it('provides complete unified context', async () => {
|
|
186
224
|
const TestCompleteContextComponent = () => {
|
|
187
225
|
const auth = useUnifiedAuth();
|
|
188
226
|
|
|
@@ -198,11 +236,16 @@ describe('UnifiedAuthProvider', () => {
|
|
|
198
236
|
};
|
|
199
237
|
|
|
200
238
|
render(
|
|
201
|
-
<UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
|
|
239
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
|
|
202
240
|
<TestCompleteContextComponent />
|
|
203
241
|
</UnifiedAuthProvider>
|
|
204
242
|
);
|
|
205
243
|
|
|
244
|
+
// Wait for user and session to be loaded
|
|
245
|
+
await waitFor(() => {
|
|
246
|
+
expect(screen.getByTestId('user-context')).toHaveTextContent('present');
|
|
247
|
+
}, { timeout: 3000 });
|
|
248
|
+
|
|
206
249
|
expect(screen.getByTestId('user-context')).toHaveTextContent('present');
|
|
207
250
|
expect(screen.getByTestId('session-context')).toHaveTextContent('present');
|
|
208
251
|
expect(screen.getByTestId('organisation-context')).toHaveTextContent('missing');
|
|
@@ -368,7 +411,7 @@ describe('UnifiedAuthProvider', () => {
|
|
|
368
411
|
});
|
|
369
412
|
|
|
370
413
|
describe('[integration] Hook Integration', () => {
|
|
371
|
-
it('integrates useUnifiedAuth with all contexts', () => {
|
|
414
|
+
it('integrates useUnifiedAuth with all contexts', async () => {
|
|
372
415
|
const TestHookIntegrationComponent = () => {
|
|
373
416
|
const auth = useUnifiedAuth();
|
|
374
417
|
|
|
@@ -385,11 +428,16 @@ describe('UnifiedAuthProvider', () => {
|
|
|
385
428
|
};
|
|
386
429
|
|
|
387
430
|
render(
|
|
388
|
-
<UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
|
|
431
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
|
|
389
432
|
<TestHookIntegrationComponent />
|
|
390
433
|
</UnifiedAuthProvider>
|
|
391
434
|
);
|
|
392
435
|
|
|
436
|
+
// Wait for user and session to be loaded
|
|
437
|
+
await waitFor(() => {
|
|
438
|
+
expect(screen.getByTestId('hook-access')).toHaveTextContent('full');
|
|
439
|
+
}, { timeout: 3000 });
|
|
440
|
+
|
|
393
441
|
expect(screen.getByTestId('hook-access')).toHaveTextContent('full');
|
|
394
442
|
expect(screen.getByTestId('hook-methods')).toHaveTextContent('complete');
|
|
395
443
|
});
|
|
@@ -427,7 +475,7 @@ describe('UnifiedAuthProvider', () => {
|
|
|
427
475
|
expect(screen.getByTestId('user-stable')).toHaveTextContent('stable');
|
|
428
476
|
});
|
|
429
477
|
|
|
430
|
-
it('handles concurrent hook usage', () => {
|
|
478
|
+
it('handles concurrent hook usage', async () => {
|
|
431
479
|
const TestConcurrentComponent = () => {
|
|
432
480
|
const auth = useUnifiedAuth();
|
|
433
481
|
|
|
@@ -446,13 +494,17 @@ describe('UnifiedAuthProvider', () => {
|
|
|
446
494
|
};
|
|
447
495
|
|
|
448
496
|
render(
|
|
449
|
-
<UnifiedAuthProvider supabaseClient={mockSupabaseClient}>
|
|
497
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" {...defaultProps}>
|
|
450
498
|
<TestConcurrentComponent />
|
|
451
499
|
</UnifiedAuthProvider>
|
|
452
500
|
);
|
|
453
501
|
|
|
454
502
|
expect(screen.getByTestId('concurrent-safe')).toHaveTextContent('safe');
|
|
455
|
-
|
|
503
|
+
|
|
504
|
+
// Wait for user and session to be loaded
|
|
505
|
+
await waitFor(() => {
|
|
506
|
+
expect(screen.getByTestId('all-reads')).toHaveTextContent('success');
|
|
507
|
+
}, { timeout: 3000 });
|
|
456
508
|
});
|
|
457
509
|
});
|
|
458
510
|
|
|
@@ -485,7 +537,7 @@ describe('UnifiedAuthProvider', () => {
|
|
|
485
537
|
expect(screen.getByTestId('app-name-consistent')).toHaveTextContent('consistent');
|
|
486
538
|
});
|
|
487
539
|
|
|
488
|
-
it('configures RBAC features when enabled', () => {
|
|
540
|
+
it('configures RBAC features when enabled', async () => {
|
|
489
541
|
const TestRBACConfigComponent = () => {
|
|
490
542
|
const auth = useUnifiedAuth();
|
|
491
543
|
|
|
@@ -502,12 +554,16 @@ describe('UnifiedAuthProvider', () => {
|
|
|
502
554
|
};
|
|
503
555
|
|
|
504
556
|
render(
|
|
505
|
-
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} enableRBAC={true}>
|
|
557
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="Test App" enableRBAC={true} {...defaultProps}>
|
|
506
558
|
<TestRBACConfigComponent />
|
|
507
559
|
</UnifiedAuthProvider>
|
|
508
560
|
);
|
|
509
561
|
|
|
510
|
-
|
|
562
|
+
// Wait for user and session to be loaded
|
|
563
|
+
await waitFor(() => {
|
|
564
|
+
expect(screen.getByTestId('rbac-enabled')).toHaveTextContent('enabled');
|
|
565
|
+
}, { timeout: 3000 });
|
|
566
|
+
|
|
511
567
|
expect(screen.getByTestId('session-available')).toBeInTheDocument();
|
|
512
568
|
});
|
|
513
569
|
|
package/src/providers/index.ts
CHANGED
|
@@ -12,6 +12,3 @@ export * from './services/EventServiceProvider';
|
|
|
12
12
|
export * from './services/OrganisationServiceProvider';
|
|
13
13
|
export * from './services/InactivityServiceProvider';
|
|
14
14
|
export * from './services/AuthServiceProvider';
|
|
15
|
-
|
|
16
|
-
// RBAC Provider - Use @jmruthers/pace-core/rbac instead
|
|
17
|
-
// Note: RBAC functionality has been moved to the dedicated RBAC module
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Provides authentication service instance to React components.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import React, { createContext,
|
|
11
|
+
import React, { createContext, useMemo, useEffect, useState } from 'react';
|
|
12
12
|
import { type SupabaseClient } from '@supabase/supabase-js';
|
|
13
13
|
import { AuthService } from '../../services/AuthService';
|
|
14
14
|
import type { SessionRestorationState } from '../../types/auth';
|
|
@@ -44,11 +44,6 @@ export function AuthServiceProvider({ children, supabaseClient, appName }: AuthS
|
|
|
44
44
|
const unsubscribe = authService.subscribe(() => {
|
|
45
45
|
const restorationState = authService.getSessionRestorationState();
|
|
46
46
|
setSessionRestoration(restorationState);
|
|
47
|
-
|
|
48
|
-
const isDev = typeof import.meta !== 'undefined' && (import.meta.env.DEV || import.meta.env.MODE === 'development');
|
|
49
|
-
if (isDev) {
|
|
50
|
-
logger.debug('AuthServiceProvider', 'Session restoration state updated', restorationState);
|
|
51
|
-
}
|
|
52
47
|
});
|
|
53
48
|
|
|
54
49
|
return () => {
|
|
@@ -78,14 +73,4 @@ export function AuthServiceProvider({ children, supabaseClient, appName }: AuthS
|
|
|
78
73
|
{children}
|
|
79
74
|
</AuthServiceContext.Provider>
|
|
80
75
|
);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export const useAuthService = (): AuthService => {
|
|
84
|
-
const context = useContext(AuthServiceContext);
|
|
85
|
-
|
|
86
|
-
if (!context) {
|
|
87
|
-
throw new Error('useAuthService must be used within AuthServiceProvider');
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return context.authService;
|
|
91
|
-
};
|
|
76
|
+
}
|
|
@@ -8,19 +8,17 @@
|
|
|
8
8
|
* Provides event service instance to React components.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import React, { createContext,
|
|
11
|
+
import React, { createContext, useMemo, useEffect, useRef } from 'react';
|
|
12
12
|
import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
|
|
13
13
|
import { EventService } from '../../services/EventService';
|
|
14
14
|
import { logger } from '../../utils/core/logger';
|
|
15
|
+
import type { Organisation } from '../../types/organisation';
|
|
15
16
|
|
|
16
17
|
// Context type
|
|
17
18
|
export interface EventServiceContextType {
|
|
18
19
|
eventService: EventService;
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
// Backward compatibility type alias
|
|
22
|
-
export type EventContextType = EventServiceContextType;
|
|
23
|
-
|
|
24
22
|
export const EventServiceContext = createContext<EventServiceContextType | null>(null);
|
|
25
23
|
|
|
26
24
|
export interface EventServiceProviderProps {
|
|
@@ -29,7 +27,7 @@ export interface EventServiceProviderProps {
|
|
|
29
27
|
user: User | null;
|
|
30
28
|
session: Session | null;
|
|
31
29
|
appName: string;
|
|
32
|
-
selectedOrganisation:
|
|
30
|
+
selectedOrganisation: Organisation | null;
|
|
33
31
|
setSelectedEventId: (eventId: string | null) => void;
|
|
34
32
|
}
|
|
35
33
|
|
|
@@ -76,6 +74,13 @@ export function EventServiceProvider({
|
|
|
76
74
|
};
|
|
77
75
|
}, [eventService, supabaseClient, user, session, appName, selectedOrganisation, setSelectedEventId]);
|
|
78
76
|
|
|
77
|
+
// Cleanup service on unmount only
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
return () => {
|
|
80
|
+
eventService.cleanup();
|
|
81
|
+
};
|
|
82
|
+
}, [eventService]);
|
|
83
|
+
|
|
79
84
|
const contextValue = useMemo(() => ({
|
|
80
85
|
eventService
|
|
81
86
|
}), [eventService]);
|
|
@@ -85,14 +90,4 @@ export function EventServiceProvider({
|
|
|
85
90
|
{children}
|
|
86
91
|
</EventServiceContext.Provider>
|
|
87
92
|
);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export const useEventService = (): EventService => {
|
|
91
|
-
const context = useContext(EventServiceContext);
|
|
92
|
-
|
|
93
|
-
if (!context) {
|
|
94
|
-
throw new Error('useEventService must be used within EventServiceProvider');
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return context.eventService;
|
|
98
|
-
};
|
|
93
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Provides inactivity service instance to React components.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import React, { createContext,
|
|
11
|
+
import React, { createContext, useMemo, useEffect, useRef } from 'react';
|
|
12
12
|
import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
|
|
13
13
|
import { InactivityService } from '../../services/InactivityService';
|
|
14
14
|
import { logger } from '../../utils/core/logger';
|
|
@@ -66,6 +66,13 @@ export function InactivityServiceProvider({
|
|
|
66
66
|
};
|
|
67
67
|
}, [inactivityService, supabaseClient, user, session, idleTimeoutMs, warnBeforeMs, onIdleLogout]);
|
|
68
68
|
|
|
69
|
+
// Cleanup service on unmount only
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
return () => {
|
|
72
|
+
inactivityService.cleanup();
|
|
73
|
+
};
|
|
74
|
+
}, [inactivityService]);
|
|
75
|
+
|
|
69
76
|
const contextValue = useMemo(() => ({
|
|
70
77
|
inactivityService
|
|
71
78
|
}), [inactivityService]);
|
|
@@ -75,14 +82,4 @@ export function InactivityServiceProvider({
|
|
|
75
82
|
{children}
|
|
76
83
|
</InactivityServiceContext.Provider>
|
|
77
84
|
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export const useInactivityService = (): InactivityService => {
|
|
81
|
-
const context = useContext(InactivityServiceContext);
|
|
82
|
-
|
|
83
|
-
if (!context) {
|
|
84
|
-
throw new Error('useInactivityService must be used within InactivityServiceProvider');
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return context.inactivityService;
|
|
88
|
-
};
|
|
85
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Provides organisation service instance to React components.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import React, { createContext,
|
|
11
|
+
import React, { createContext, useMemo, useEffect, useRef } from 'react';
|
|
12
12
|
import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
|
|
13
13
|
import { OrganisationService } from '../../services/OrganisationService';
|
|
14
14
|
import { logger } from '../../utils/core/logger';
|
|
@@ -60,6 +60,13 @@ export function OrganisationServiceProvider({
|
|
|
60
60
|
};
|
|
61
61
|
}, [organisationService, user, session]);
|
|
62
62
|
|
|
63
|
+
// Cleanup service on unmount only
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
return () => {
|
|
66
|
+
organisationService.cleanup();
|
|
67
|
+
};
|
|
68
|
+
}, [organisationService]);
|
|
69
|
+
|
|
63
70
|
const contextValue = useMemo(() => ({
|
|
64
71
|
organisationService
|
|
65
72
|
}), [organisationService]);
|
|
@@ -69,14 +76,4 @@ export function OrganisationServiceProvider({
|
|
|
69
76
|
{children}
|
|
70
77
|
</OrganisationServiceContext.Provider>
|
|
71
78
|
);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export const useOrganisationService = (): OrganisationService => {
|
|
75
|
-
const context = useContext(OrganisationServiceContext);
|
|
76
|
-
|
|
77
|
-
if (!context) {
|
|
78
|
-
throw new Error('useOrganisationService must be used within OrganisationServiceProvider');
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return context.organisationService;
|
|
82
|
-
};
|
|
79
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Note: RBAC functionality is available via useRBAC() hook from '@jmruthers/pace-core/rbac'
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import React, { createContext, useContext, useMemo, useCallback, useRef } from 'react';
|
|
11
|
+
import React, { createContext, useContext, useMemo, useCallback, useRef, useEffect, useState } from 'react';
|
|
12
12
|
import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
|
|
13
13
|
import { AuthServiceProvider } from './AuthServiceProvider';
|
|
14
14
|
import { OrganisationServiceProvider } from './OrganisationServiceProvider';
|
|
@@ -20,7 +20,7 @@ import { useEventService } from '../../hooks/services/useEventService';
|
|
|
20
20
|
import { useInactivityService } from '../../hooks/services/useInactivityService';
|
|
21
21
|
import { useSessionRestoration } from '../../hooks/useSessionRestoration';
|
|
22
22
|
import type { Organisation, OrganisationMembership } from '../../types/organisation';
|
|
23
|
-
import type { Event } from '../../types/
|
|
23
|
+
import type { Event } from '../../types/event';
|
|
24
24
|
import type { AuthError } from '@supabase/supabase-js';
|
|
25
25
|
import type { SessionRestorationState } from '../../types/auth';
|
|
26
26
|
import { logger } from '../../utils/core/logger';
|
|
@@ -47,9 +47,12 @@ export interface UnifiedAuthContextType {
|
|
|
47
47
|
isAuthenticated: boolean;
|
|
48
48
|
authLoading: boolean;
|
|
49
49
|
authError: AuthError | null;
|
|
50
|
-
error: AuthError | null; // Alias for authError for backward compatibility
|
|
51
50
|
supabase: SupabaseClient | null;
|
|
52
51
|
|
|
52
|
+
// App context (resolved immediately on login)
|
|
53
|
+
appName: string;
|
|
54
|
+
appId: string | undefined; // Resolved from appName when user logs in
|
|
55
|
+
|
|
53
56
|
// Auth methods
|
|
54
57
|
signIn: (email: string, password?: string) => Promise<{ error: AuthError | null }>;
|
|
55
58
|
signUp: (email: string, password: string) => Promise<{ error: AuthError | null }>;
|
|
@@ -103,7 +106,6 @@ export interface UnifiedAuthContextType {
|
|
|
103
106
|
handleSignOutNow: () => Promise<void>;
|
|
104
107
|
|
|
105
108
|
// Additional unified properties
|
|
106
|
-
appName: string;
|
|
107
109
|
appConfig: { requires_event: boolean } | null;
|
|
108
110
|
isLoading: boolean;
|
|
109
111
|
hasErrors: boolean;
|
|
@@ -191,6 +193,68 @@ function UnifiedAuthContextProvider({
|
|
|
191
193
|
const currentUser = authService.getUser();
|
|
192
194
|
const currentSession = authService.getSession();
|
|
193
195
|
const isAuth = !!(currentUser && currentSession);
|
|
196
|
+
|
|
197
|
+
// Get supabase client early so we can use it in useEffect
|
|
198
|
+
const supabase = authService.getSupabaseClient();
|
|
199
|
+
|
|
200
|
+
// Resolve appId immediately when user logs in (don't wait for organisation/event)
|
|
201
|
+
// This makes appId available early for navigation menu filtering
|
|
202
|
+
const [appId, setAppId] = useState<string | undefined>(undefined);
|
|
203
|
+
const isResolvingAppIdRef = useRef(false);
|
|
204
|
+
|
|
205
|
+
useEffect(() => {
|
|
206
|
+
// Resolve appId as soon as we have user + supabase + appName
|
|
207
|
+
// Don't wait for organisation or event - appId resolution only needs user + appName
|
|
208
|
+
if (
|
|
209
|
+
isAuth &&
|
|
210
|
+
currentUser?.id &&
|
|
211
|
+
supabase &&
|
|
212
|
+
appName &&
|
|
213
|
+
!appId &&
|
|
214
|
+
!isResolvingAppIdRef.current
|
|
215
|
+
) {
|
|
216
|
+
isResolvingAppIdRef.current = true;
|
|
217
|
+
const userId = currentUser.id;
|
|
218
|
+
const appNameValue = appName;
|
|
219
|
+
|
|
220
|
+
// Resolve appId immediately
|
|
221
|
+
import('../../rbac/api').then(async ({ resolveAppContext, setupRBAC }) => {
|
|
222
|
+
try {
|
|
223
|
+
// Ensure RBAC is initialized (idempotent - safe to call multiple times)
|
|
224
|
+
setupRBAC(supabase);
|
|
225
|
+
|
|
226
|
+
const result = await resolveAppContext({
|
|
227
|
+
userId,
|
|
228
|
+
appName: appNameValue
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
if (result?.appId) {
|
|
232
|
+
setAppId(result.appId);
|
|
233
|
+
logger.debug('UnifiedAuthProvider', 'appId resolved on login', {
|
|
234
|
+
appId: result.appId,
|
|
235
|
+
appName: appNameValue
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
} catch (error) {
|
|
239
|
+
logger.error('UnifiedAuthProvider', 'Failed to resolve appId on login', {
|
|
240
|
+
error: error instanceof Error ? error.message : String(error),
|
|
241
|
+
appName: appNameValue,
|
|
242
|
+
userId
|
|
243
|
+
});
|
|
244
|
+
} finally {
|
|
245
|
+
isResolvingAppIdRef.current = false;
|
|
246
|
+
}
|
|
247
|
+
}).catch((importError) => {
|
|
248
|
+
logger.error('UnifiedAuthProvider', 'Failed to import RBAC API', importError);
|
|
249
|
+
isResolvingAppIdRef.current = false;
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Clear appId when user logs out
|
|
254
|
+
if (!isAuth) {
|
|
255
|
+
setAppId(undefined);
|
|
256
|
+
}
|
|
257
|
+
}, [isAuth, currentUser?.id, supabase, appName, appId]);
|
|
194
258
|
|
|
195
259
|
// Get loading states - these will trigger re-renders when services change
|
|
196
260
|
const authLoading = authService.isLoading();
|
|
@@ -201,7 +265,7 @@ function UnifiedAuthContextProvider({
|
|
|
201
265
|
|
|
202
266
|
// Extract all primitive values from services to use in dependencies
|
|
203
267
|
const authError = authService.getError();
|
|
204
|
-
|
|
268
|
+
// supabase is already declared above (line 198)
|
|
205
269
|
const selectedOrganisation = organisationService.getSelectedOrganisation();
|
|
206
270
|
const organisations = organisationService.getOrganisations();
|
|
207
271
|
const userMemberships = organisationService.getUserMemberships();
|
|
@@ -266,18 +330,7 @@ function UnifiedAuthContextProvider({
|
|
|
266
330
|
prevState.isAuthenticated !== currentState.isAuthenticated ||
|
|
267
331
|
prevState.userEmail !== currentState.userEmail ||
|
|
268
332
|
prevState.totalLoading !== currentState.totalLoading) {
|
|
269
|
-
|
|
270
|
-
isAuthenticated: isAuth,
|
|
271
|
-
user: currentUser?.email,
|
|
272
|
-
session: currentSession ? 'exists' : 'null',
|
|
273
|
-
totalLoading,
|
|
274
|
-
authLoading,
|
|
275
|
-
orgLoading,
|
|
276
|
-
eventLoading,
|
|
277
|
-
orgContextReady: isContextReady,
|
|
278
|
-
sessionRestoration,
|
|
279
|
-
sessionRestorationTimedOut,
|
|
280
|
-
});
|
|
333
|
+
// State change detected, notify subscribers
|
|
281
334
|
prevStateRef.current = currentState;
|
|
282
335
|
}
|
|
283
336
|
}
|
|
@@ -291,7 +344,6 @@ function UnifiedAuthContextProvider({
|
|
|
291
344
|
isAuthenticated: isAuth,
|
|
292
345
|
authLoading: authLoading,
|
|
293
346
|
authError: authError,
|
|
294
|
-
error: authError, // Alias for backward compatibility
|
|
295
347
|
supabase: supabase,
|
|
296
348
|
|
|
297
349
|
// Auth methods
|
|
@@ -348,6 +400,7 @@ function UnifiedAuthContextProvider({
|
|
|
348
400
|
|
|
349
401
|
// Additional unified properties
|
|
350
402
|
appName,
|
|
403
|
+
appId, // Resolved immediately on login
|
|
351
404
|
appConfig: appConfig,
|
|
352
405
|
isLoading: totalLoading,
|
|
353
406
|
hasErrors: hasErrors,
|
|
@@ -384,6 +437,7 @@ function UnifiedAuthContextProvider({
|
|
|
384
437
|
totalLoading,
|
|
385
438
|
hasErrors,
|
|
386
439
|
appName,
|
|
440
|
+
appId,
|
|
387
441
|
appConfig,
|
|
388
442
|
sessionRestoration,
|
|
389
443
|
sessionRestorationTimedOut,
|
|
@@ -526,6 +580,19 @@ export function UnifiedAuthProvider({
|
|
|
526
580
|
renderInactivityWarning,
|
|
527
581
|
dangerouslyDisableInactivity = false
|
|
528
582
|
}: UnifiedAuthProviderProps) {
|
|
583
|
+
// Warn if supabaseClient reference changes (indicates multiple client instances)
|
|
584
|
+
const clientRef = useRef(supabaseClient);
|
|
585
|
+
useEffect(() => {
|
|
586
|
+
if (clientRef.current !== supabaseClient) {
|
|
587
|
+
logger.warn('UnifiedAuthProvider', 'Supabase client reference changed - this may indicate multiple client instances are being created', {
|
|
588
|
+
previousClient: clientRef.current,
|
|
589
|
+
newClient: supabaseClient,
|
|
590
|
+
note: 'Ensure you create the Supabase client once and reuse it. Creating multiple clients can cause performance issues and the "Multiple GoTrueClient instances" warning.'
|
|
591
|
+
});
|
|
592
|
+
clientRef.current = supabaseClient;
|
|
593
|
+
}
|
|
594
|
+
}, [supabaseClient]);
|
|
595
|
+
|
|
529
596
|
return (
|
|
530
597
|
<AuthServiceProvider supabaseClient={supabaseClient} appName={appName}>
|
|
531
598
|
<ServiceAwareProviders
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
12
12
|
import { render, screen, waitFor } from '@testing-library/react';
|
|
13
13
|
import React from 'react';
|
|
14
|
-
import { AuthServiceProvider
|
|
14
|
+
import { AuthServiceProvider } from '../AuthServiceProvider';
|
|
15
|
+
import { useAuthService } from '../../../hooks/services/useAuthService';
|
|
15
16
|
import { type SupabaseClient, type User, type Session } from '@supabase/supabase-js';
|
|
16
17
|
import { Logger, LogLevel } from '../../../utils/core/logger';
|
|
17
18
|
|
|
@@ -131,7 +132,9 @@ describe('AuthServiceProvider Integration', () => {
|
|
|
131
132
|
describe('Service Integration', () => {
|
|
132
133
|
it('should initialize service on mount', async () => {
|
|
133
134
|
const mockSubscription = { unsubscribe: vi.fn() };
|
|
134
|
-
vi.mocked(mockSupabase.auth.onAuthStateChange).mockReturnValue(
|
|
135
|
+
vi.mocked(mockSupabase.auth.onAuthStateChange).mockReturnValue({
|
|
136
|
+
data: { subscription: mockSubscription }
|
|
137
|
+
} as any);
|
|
135
138
|
|
|
136
139
|
render(
|
|
137
140
|
<AuthServiceProvider supabaseClient={mockSupabase}>
|
|
@@ -147,7 +150,9 @@ describe('AuthServiceProvider Integration', () => {
|
|
|
147
150
|
|
|
148
151
|
it('should cleanup service on unmount', async () => {
|
|
149
152
|
const mockSubscription = { unsubscribe: vi.fn() };
|
|
150
|
-
vi.mocked(mockSupabase.auth.onAuthStateChange).mockReturnValue(
|
|
153
|
+
vi.mocked(mockSupabase.auth.onAuthStateChange).mockReturnValue({
|
|
154
|
+
data: { subscription: mockSubscription }
|
|
155
|
+
} as any);
|
|
151
156
|
|
|
152
157
|
const { unmount } = render(
|
|
153
158
|
<AuthServiceProvider supabaseClient={mockSupabase}>
|
|
@@ -173,7 +178,9 @@ describe('AuthServiceProvider Integration', () => {
|
|
|
173
178
|
|
|
174
179
|
vi.mocked(mockSupabase.auth.onAuthStateChange).mockImplementation((callback) => {
|
|
175
180
|
capturedCallback = callback;
|
|
176
|
-
return
|
|
181
|
+
return {
|
|
182
|
+
data: { subscription: mockSubscription }
|
|
183
|
+
} as any;
|
|
177
184
|
});
|
|
178
185
|
|
|
179
186
|
render(
|