@jmruthers/pace-core 0.5.180 → 0.5.182
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-4VSEJQ7D.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-6HLVGAZG.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-CPTUD43C.js → chunk-MI7HBHN3.js} +164 -243
- package/dist/chunk-MI7HBHN3.js.map +1 -0
- package/dist/{chunk-N5YCCUG5.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-P6UUHOIF.js → chunk-QETLRQI6.js} +526 -887
- package/dist/chunk-QETLRQI6.js.map +1 -0
- package/dist/{chunk-GQA2LIAE.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-ONI7Y733.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-R53TUSFK.js → chunk-W22JP75J.js} +5 -13
- package/dist/{chunk-R53TUSFK.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/examples/{components 2/DataTable/HierarchicalExample.tsx → 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/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 +57 -31
- 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.ts +1 -5
- package/src/types/__tests__/guards.test.ts +1 -1
- 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/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/index.ts +6 -12
- package/src/utils/validation/validationUtils.ts +0 -13
- package/dist/UnifiedAuthProvider-BMJAP6Z7.js +0 -16
- package/dist/auth-DReDSLq9.d.ts +0 -16
- package/dist/chunk-56XJ3TU6.js +0 -11
- package/dist/chunk-56XJ3TU6.js.map +0 -1
- package/dist/chunk-6HLVGAZG.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-CPTUD43C.js.map +0 -1
- package/dist/chunk-CX5M4ZAG.js.map +0 -1
- package/dist/chunk-ERGKJX4D.js +0 -15
- package/dist/chunk-ERGKJX4D.js.map +0 -1
- package/dist/chunk-ERISIBYU.js.map +0 -1
- package/dist/chunk-GQA2LIAE.js.map +0 -1
- package/dist/chunk-JISYG63F.js +0 -70
- package/dist/chunk-JISYG63F.js.map +0 -1
- package/dist/chunk-MSHEVJXS.js +0 -27
- package/dist/chunk-MSHEVJXS.js.map +0 -1
- package/dist/chunk-N5YCCUG5.js.map +0 -1
- package/dist/chunk-ONI7Y733.js.map +0 -1
- package/dist/chunk-OWAG3GSU.js.map +0 -1
- package/dist/chunk-P6UUHOIF.js.map +0 -1
- package/dist/chunk-PKW27QVS.js +0 -61
- package/dist/chunk-PKW27QVS.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-WM26XK7I.js +0 -2432
- package/dist/chunk-WM26XK7I.js.map +0 -1
- package/dist/chunk-XDNLUEXI.js +0 -138
- package/dist/chunk-XJ2HZOBU.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/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/HierarchicalExample.tsx +0 -475
- 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-4VSEJQ7D.js.map → DataTable-QAB34V6K.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-BMJAP6Z7.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
|
@@ -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(
|
|
@@ -3,8 +3,69 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
|
3
3
|
import { render, screen, waitFor, act } from '@testing-library/react';
|
|
4
4
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
5
5
|
import { createMemoryRouter, RouterProvider } from 'react-router-dom';
|
|
6
|
-
import { UnifiedAuthProvider } from '../../providers/UnifiedAuthProvider';
|
|
7
|
-
import {
|
|
6
|
+
import { UnifiedAuthProvider } from '../../providers/services/UnifiedAuthProvider';
|
|
7
|
+
import { OrganisationServiceProvider } from '../../providers/services/OrganisationServiceProvider';
|
|
8
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
9
|
+
|
|
10
|
+
// Hoist mockSupabaseClient before mocks that reference it
|
|
11
|
+
const mockSupabaseClient = vi.hoisted(() => ({
|
|
12
|
+
auth: {
|
|
13
|
+
getUser: vi.fn(),
|
|
14
|
+
},
|
|
15
|
+
from: vi.fn(),
|
|
16
|
+
rpc: vi.fn(),
|
|
17
|
+
} as unknown as SupabaseClient));
|
|
18
|
+
|
|
19
|
+
// Mock all service hooks used by UnifiedAuthProvider
|
|
20
|
+
vi.mock('../../hooks/services/useAuthService', () => ({
|
|
21
|
+
useAuthService: () => ({
|
|
22
|
+
getUser: vi.fn(() => ({ id: 'user-123', email: 'test@example.com' })),
|
|
23
|
+
getSession: vi.fn(() => ({ access_token: 'token' })),
|
|
24
|
+
isLoading: vi.fn(() => false),
|
|
25
|
+
getError: vi.fn(() => null),
|
|
26
|
+
getSupabaseClient: vi.fn(() => mockSupabaseClient),
|
|
27
|
+
signIn: vi.fn(),
|
|
28
|
+
signUp: vi.fn(),
|
|
29
|
+
signOut: vi.fn(),
|
|
30
|
+
resetPassword: vi.fn(),
|
|
31
|
+
updatePassword: vi.fn(),
|
|
32
|
+
refreshSession: vi.fn(),
|
|
33
|
+
}),
|
|
34
|
+
}));
|
|
35
|
+
|
|
36
|
+
vi.mock('../../hooks/services/useEventService', () => ({
|
|
37
|
+
useEventService: () => ({
|
|
38
|
+
getEvents: vi.fn(() => []),
|
|
39
|
+
getSelectedEvent: vi.fn(() => null),
|
|
40
|
+
isLoading: vi.fn(() => false),
|
|
41
|
+
getError: vi.fn(() => null),
|
|
42
|
+
setSelectedEvent: vi.fn(),
|
|
43
|
+
refreshEvents: vi.fn(),
|
|
44
|
+
}),
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
vi.mock('../../hooks/services/useInactivityService', () => ({
|
|
48
|
+
useInactivityService: () => ({
|
|
49
|
+
getShowInactivityWarning: vi.fn(() => false),
|
|
50
|
+
getInactivityTimeRemaining: vi.fn(() => 0),
|
|
51
|
+
isIdle: vi.fn(() => false),
|
|
52
|
+
getTimeRemaining: vi.fn(() => 0),
|
|
53
|
+
isWarningShown: vi.fn(() => false),
|
|
54
|
+
isTracking: vi.fn(() => false),
|
|
55
|
+
resetActivity: vi.fn(),
|
|
56
|
+
startTracking: vi.fn(),
|
|
57
|
+
stopTracking: vi.fn(),
|
|
58
|
+
handleIdleLogout: vi.fn(),
|
|
59
|
+
}),
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
vi.mock('../../hooks/useSessionRestoration', () => ({
|
|
63
|
+
useSessionRestoration: () => ({
|
|
64
|
+
isRestoring: false,
|
|
65
|
+
restorationError: null,
|
|
66
|
+
}),
|
|
67
|
+
}));
|
|
68
|
+
|
|
8
69
|
// Note: RBACProvider was removed as part of Phase 1 - use useRBAC() hook instead
|
|
9
70
|
vi.mock('../hooks/useRBAC', () => ({
|
|
10
71
|
useRBAC: () => ({
|
|
@@ -27,7 +88,7 @@ import { useCan, useAccessLevel, useHasAnyPermission, useHasAllPermissions } fro
|
|
|
27
88
|
import { useCachedPermissions } from '../hooks';
|
|
28
89
|
import { usePermissionCache } from '../../hooks/usePermissionCache';
|
|
29
90
|
import { useOrganisationPermissions } from '../../hooks/useOrganisationPermissions';
|
|
30
|
-
import type {
|
|
91
|
+
import type { User } from '@supabase/supabase-js';
|
|
31
92
|
import type { Organisation } from '../../types/organisation';
|
|
32
93
|
import type { AccessLevel } from '../types/access';
|
|
33
94
|
|
|
@@ -61,23 +122,46 @@ vi.mock('../../hooks/useOrganisationSecurity', () => ({
|
|
|
61
122
|
isOrganisationLoaded: true,
|
|
62
123
|
})
|
|
63
124
|
}));
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
125
|
+
|
|
126
|
+
// Hoist mockOrganisationService before mocks that reference it
|
|
127
|
+
const mockOrganisationService = vi.hoisted(() => ({
|
|
128
|
+
getSelectedOrganisation: vi.fn(() => ({ id: 'org-123', name: 'Test Organisation' })),
|
|
129
|
+
getOrganisations: vi.fn(() => [{ id: 'org-123', name: 'Test Organisation' }]),
|
|
130
|
+
getUserMemberships: vi.fn(() => []),
|
|
131
|
+
isLoading: vi.fn(() => false),
|
|
132
|
+
getError: vi.fn(() => null),
|
|
133
|
+
hasValidOrganisationContext: vi.fn(() => true),
|
|
134
|
+
isContextReady: vi.fn(() => true),
|
|
135
|
+
setSelectedOrganisation: vi.fn(),
|
|
136
|
+
switchOrganisation: vi.fn().mockResolvedValue(undefined),
|
|
137
|
+
getUserRole: vi.fn(() => 'member'),
|
|
138
|
+
validateOrganisationAccess: vi.fn(() => true),
|
|
139
|
+
ensureOrganisationContext: vi.fn(() => ({ id: 'org-123', name: 'Test Organisation' })),
|
|
140
|
+
refreshOrganisations: vi.fn().mockResolvedValue(undefined),
|
|
141
|
+
getPrimaryOrganisation: vi.fn(() => ({ id: 'org-123', name: 'Test Organisation' })),
|
|
142
|
+
isOrganisationSecure: vi.fn(() => true),
|
|
143
|
+
subscribe: vi.fn(() => () => {}),
|
|
144
|
+
initialize: vi.fn().mockResolvedValue(undefined),
|
|
145
|
+
cleanup: vi.fn(),
|
|
146
|
+
updateDependencies: vi.fn(),
|
|
72
147
|
}));
|
|
73
148
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
149
|
+
vi.mock('../../hooks/services/useOrganisationService', () => ({
|
|
150
|
+
useOrganisationService: () => mockOrganisationService,
|
|
151
|
+
}));
|
|
152
|
+
|
|
153
|
+
// Mock OrganisationServiceProvider with context
|
|
154
|
+
vi.mock('../../providers/services/OrganisationServiceProvider', async (importOriginal) => {
|
|
155
|
+
const actual = await importOriginal<typeof import('../../providers/services/OrganisationServiceProvider')>();
|
|
156
|
+
return {
|
|
157
|
+
...actual,
|
|
158
|
+
OrganisationServiceProvider: ({ children }: any) => (
|
|
159
|
+
<actual.OrganisationServiceContext.Provider value={{ organisationService: mockOrganisationService }}>
|
|
160
|
+
{children}
|
|
161
|
+
</actual.OrganisationServiceContext.Provider>
|
|
162
|
+
),
|
|
163
|
+
};
|
|
164
|
+
});
|
|
81
165
|
|
|
82
166
|
const mockUser: User = {
|
|
83
167
|
id: 'user-123',
|
|
@@ -142,10 +226,10 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => {
|
|
|
142
226
|
});
|
|
143
227
|
return (
|
|
144
228
|
<QueryClientProvider client={queryClient}>
|
|
145
|
-
<UnifiedAuthProvider
|
|
146
|
-
<
|
|
229
|
+
<UnifiedAuthProvider supabaseClient={mockSupabaseClient} appName="TEST_APP" idleTimeoutMs={30000} warnBeforeMs={5000} onIdleLogout={() => {}}>
|
|
230
|
+
<OrganisationServiceProvider supabaseClient={mockSupabaseClient} user={null} session={null}>
|
|
147
231
|
{children}
|
|
148
|
-
</
|
|
232
|
+
</OrganisationServiceProvider>
|
|
149
233
|
</UnifiedAuthProvider>
|
|
150
234
|
</QueryClientProvider>
|
|
151
235
|
);
|
package/src/rbac/adapters.tsx
CHANGED
|
@@ -12,7 +12,7 @@ import { UUID, Permission } from './types';
|
|
|
12
12
|
import { useCan } from './hooks';
|
|
13
13
|
import { rbacCache, RBACCache } from './cache';
|
|
14
14
|
import { getRBACLogger } from './config';
|
|
15
|
-
import { useUnifiedAuth } from '../providers/UnifiedAuthProvider';
|
|
15
|
+
import { useUnifiedAuth } from '../providers/services/UnifiedAuthProvider';
|
|
16
16
|
|
|
17
17
|
// ============================================================================
|
|
18
18
|
// REACT COMPONENTS
|
package/src/rbac/api.ts
CHANGED
|
@@ -43,18 +43,34 @@ export function setupRBAC(supabase: SupabaseClient<Database>, config?: Partial<R
|
|
|
43
43
|
const logger = getRBACLogger();
|
|
44
44
|
|
|
45
45
|
// Create full config
|
|
46
|
+
const isDevelopment = import.meta.env.MODE === 'development';
|
|
46
47
|
const fullConfig: RBACConfig = {
|
|
47
48
|
supabase,
|
|
48
|
-
debug:
|
|
49
|
+
debug: isDevelopment,
|
|
49
50
|
logLevel: 'warn',
|
|
50
|
-
developmentMode:
|
|
51
|
+
developmentMode: isDevelopment,
|
|
51
52
|
...config,
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
createRBACConfig(fullConfig);
|
|
55
56
|
|
|
56
|
-
//
|
|
57
|
-
|
|
57
|
+
// Automatically disable rate limiting in development mode unless explicitly overridden
|
|
58
|
+
// Apply default first, then let explicit config override it
|
|
59
|
+
// Pass undefined if no config provided and not in development, otherwise create security config
|
|
60
|
+
const securityConfig =
|
|
61
|
+
config === undefined && !isDevelopment
|
|
62
|
+
? undefined
|
|
63
|
+
: {
|
|
64
|
+
// Default: disable rate limiting in development
|
|
65
|
+
...(isDevelopment && config?.security?.enableRateLimiting === undefined
|
|
66
|
+
? { enableRateLimiting: false }
|
|
67
|
+
: {}),
|
|
68
|
+
// Explicit config overrides defaults
|
|
69
|
+
...config?.security,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// Pass security config to engine
|
|
73
|
+
globalEngine = createRBACEngine(supabase, securityConfig);
|
|
58
74
|
|
|
59
75
|
// Setup audit manager
|
|
60
76
|
const auditManager = createAuditManager(supabase);
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
AuditEventSource,
|
|
16
16
|
RBACAuditEvent
|
|
17
17
|
} from './types';
|
|
18
|
+
import type { AuditEventType } from './types/functions';
|
|
18
19
|
import { logger } from '../utils/core/logger';
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -299,10 +300,32 @@ export class EnhancedRBACAuditManager {
|
|
|
299
300
|
.limit(limit);
|
|
300
301
|
|
|
301
302
|
if (error) {
|
|
303
|
+
// Detect CORS errors (they typically have null status or specific error codes)
|
|
304
|
+
const isCorsError =
|
|
305
|
+
error.message?.toLowerCase().includes('cors') ||
|
|
306
|
+
error.message?.toLowerCase().includes('cross-origin') ||
|
|
307
|
+
error.code === null ||
|
|
308
|
+
(error as any).status === null;
|
|
309
|
+
|
|
310
|
+
if (isCorsError) {
|
|
311
|
+
const corsError = new Error(
|
|
312
|
+
`CORS error when querying audit events. This is a Supabase configuration issue. ` +
|
|
313
|
+
`Please configure CORS in your Supabase Dashboard: Settings → API → CORS. ` +
|
|
314
|
+
`Add your app's origin (e.g., http://localhost:8087) to the allowed origins list. ` +
|
|
315
|
+
`Original error: ${error.message || 'CORS request did not succeed'}`
|
|
316
|
+
);
|
|
317
|
+
(corsError as any).isCorsError = true;
|
|
318
|
+
(corsError as any).originalError = error;
|
|
319
|
+
throw corsError;
|
|
320
|
+
}
|
|
321
|
+
|
|
302
322
|
throw new Error(`Failed to get audit events: ${error.message}`);
|
|
303
323
|
}
|
|
304
324
|
|
|
305
|
-
return data || []
|
|
325
|
+
return (data || []).map(event => ({
|
|
326
|
+
...event,
|
|
327
|
+
event_type: event.event_type as AuditEventType
|
|
328
|
+
})) as RBACAuditEvent[];
|
|
306
329
|
}
|
|
307
330
|
|
|
308
331
|
/**
|
|
@@ -321,10 +344,32 @@ export class EnhancedRBACAuditManager {
|
|
|
321
344
|
.limit(limit);
|
|
322
345
|
|
|
323
346
|
if (error) {
|
|
347
|
+
// Detect CORS errors (they typically have null status or specific error codes)
|
|
348
|
+
const isCorsError =
|
|
349
|
+
error.message?.toLowerCase().includes('cors') ||
|
|
350
|
+
error.message?.toLowerCase().includes('cross-origin') ||
|
|
351
|
+
error.code === null ||
|
|
352
|
+
(error as any).status === null;
|
|
353
|
+
|
|
354
|
+
if (isCorsError) {
|
|
355
|
+
const corsError = new Error(
|
|
356
|
+
`CORS error when querying audit events. This is a Supabase configuration issue. ` +
|
|
357
|
+
`Please configure CORS in your Supabase Dashboard: Settings → API → CORS. ` +
|
|
358
|
+
`Add your app's origin (e.g., http://localhost:8087) to the allowed origins list. ` +
|
|
359
|
+
`Original error: ${error.message || 'CORS request did not succeed'}`
|
|
360
|
+
);
|
|
361
|
+
(corsError as any).isCorsError = true;
|
|
362
|
+
(corsError as any).originalError = error;
|
|
363
|
+
throw corsError;
|
|
364
|
+
}
|
|
365
|
+
|
|
324
366
|
throw new Error(`Failed to get audit events: ${error.message}`);
|
|
325
367
|
}
|
|
326
368
|
|
|
327
|
-
return data || []
|
|
369
|
+
return (data || []).map(event => ({
|
|
370
|
+
...event,
|
|
371
|
+
event_type: event.event_type as AuditEventType
|
|
372
|
+
})) as RBACAuditEvent[];
|
|
328
373
|
}
|
|
329
374
|
}
|
|
330
375
|
|