@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
|
@@ -19,6 +19,16 @@ import type {
|
|
|
19
19
|
} from '../types/organisation';
|
|
20
20
|
import { setOrganisationContext } from '../utils/context/organisationContext';
|
|
21
21
|
import { logger } from '../utils/core/logger';
|
|
22
|
+
import { assertUserId, assertOrganisationId } from '../types/core';
|
|
23
|
+
|
|
24
|
+
// Type for RPC response from data_user_organisation_roles_get
|
|
25
|
+
interface OrganisationRoleRpcResponse {
|
|
26
|
+
user_id: string;
|
|
27
|
+
organisation_id: string;
|
|
28
|
+
role: 'org_admin' | 'leader' | 'member' | 'supporter';
|
|
29
|
+
status: 'active' | 'inactive' | 'suspended';
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
22
32
|
|
|
23
33
|
export class OrganisationService extends BaseService implements IOrganisationService {
|
|
24
34
|
private _selectedOrganisation: Organisation | null = null;
|
|
@@ -112,7 +122,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
112
122
|
// If user logs out, allow re-initialization when they log back in
|
|
113
123
|
if (wasAuthenticated && !isAuthenticated) {
|
|
114
124
|
// Reset BaseService initialization state to allow re-initialization
|
|
115
|
-
(
|
|
125
|
+
this.resetInitialization();
|
|
116
126
|
}
|
|
117
127
|
|
|
118
128
|
this.notify();
|
|
@@ -150,7 +160,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
150
160
|
}
|
|
151
161
|
|
|
152
162
|
validateOrganisationAccess(orgId: string): boolean {
|
|
153
|
-
return this._userMemberships.some((m
|
|
163
|
+
return this._userMemberships.some((m) =>
|
|
154
164
|
m.organisation_id === orgId &&
|
|
155
165
|
m.status === 'active' &&
|
|
156
166
|
m.revoked_at === null
|
|
@@ -179,12 +189,12 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
179
189
|
|
|
180
190
|
getPrimaryOrganisation(): Organisation | null {
|
|
181
191
|
// Look for org_admin role first, then leader, then member
|
|
182
|
-
const rolePriority = ['org_admin', 'leader', 'member'];
|
|
192
|
+
const rolePriority = ['org_admin', 'leader', 'member'] as const;
|
|
183
193
|
|
|
184
194
|
for (const role of rolePriority) {
|
|
185
|
-
const membership = this._userMemberships.find((m
|
|
195
|
+
const membership = this._userMemberships.find((m) => m.role === role);
|
|
186
196
|
if (membership) {
|
|
187
|
-
return this._organisations.find((org
|
|
197
|
+
return this._organisations.find((org) => org.id === membership.organisation_id) || null;
|
|
188
198
|
}
|
|
189
199
|
}
|
|
190
200
|
|
|
@@ -262,8 +272,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
262
272
|
}
|
|
263
273
|
|
|
264
274
|
try {
|
|
265
|
-
logger.debug('OrganisationService', 'Setting database organisation context for:', organisation.id);
|
|
266
|
-
|
|
267
275
|
// Add timeout to prevent hanging
|
|
268
276
|
const timeoutPromise = new Promise((_, reject) => {
|
|
269
277
|
setTimeout(() => reject(new Error('Context setting timeout after 5 seconds')), 5000);
|
|
@@ -273,7 +281,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
273
281
|
|
|
274
282
|
await Promise.race([contextPromise, timeoutPromise]);
|
|
275
283
|
|
|
276
|
-
|
|
284
|
+
// Database organisation context set successfully
|
|
277
285
|
this._isContextReady = true;
|
|
278
286
|
this.notify();
|
|
279
287
|
} catch (error) {
|
|
@@ -287,10 +295,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
287
295
|
}
|
|
288
296
|
|
|
289
297
|
private async loadUserOrganisations(): Promise<void> {
|
|
290
|
-
// Add call tracking to detect race conditions
|
|
291
|
-
const callId = Math.random().toString(36).substr(2, 9);
|
|
292
|
-
logger.debug('OrganisationService', `Starting loadUserOrganisations call ${callId}`);
|
|
293
|
-
|
|
294
298
|
if (!this.user || !this.session || !this.supabaseClient) {
|
|
295
299
|
// Clear state when no user, session, or supabase client
|
|
296
300
|
this._selectedOrganisation = null;
|
|
@@ -304,7 +308,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
304
308
|
|
|
305
309
|
// Additional check to prevent loading during auth state changes
|
|
306
310
|
if (this.isLoadingRef) {
|
|
307
|
-
logger.debug("OrganisationService", "Already loading, skipping duplicate load");
|
|
308
311
|
// Ensure loading state is correct
|
|
309
312
|
this._isLoading = true;
|
|
310
313
|
this.notify();
|
|
@@ -314,7 +317,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
314
317
|
// Prevent rapid retries - minimum 2 seconds between attempts
|
|
315
318
|
const now = Date.now();
|
|
316
319
|
if (now - this.lastLoadTimeRef < 2000) {
|
|
317
|
-
logger.debug("OrganisationService", "Too soon since last load, skipping");
|
|
318
320
|
// Ensure loading state is correct
|
|
319
321
|
if (this._organisations.length > 0 || this._selectedOrganisation) {
|
|
320
322
|
this._isLoading = false;
|
|
@@ -341,18 +343,10 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
341
343
|
this.notify();
|
|
342
344
|
|
|
343
345
|
try {
|
|
344
|
-
logger.debug("OrganisationService", "Supabase client ready:", {
|
|
345
|
-
isConnected: !!this.supabaseClient,
|
|
346
|
-
hasAuth: !!this.supabaseClient.auth,
|
|
347
|
-
hasRpc: !!this.supabaseClient.rpc
|
|
348
|
-
});
|
|
349
|
-
|
|
350
346
|
// Get user's organisation memberships using secure RPC function
|
|
351
347
|
// Only get actual members (org_admin, leader, member) - exclude supporters
|
|
352
348
|
let memberships, membershipError;
|
|
353
349
|
try {
|
|
354
|
-
logger.debug("OrganisationService", "Making RPC call to data_user_organisation_roles_get...");
|
|
355
|
-
|
|
356
350
|
// Add timeout and abort signal to prevent hanging RPC calls
|
|
357
351
|
const timeoutPromise = new Promise((_, reject) => {
|
|
358
352
|
const timeoutId = setTimeout(() => reject(new Error('RPC call timeout after 10 seconds')), 10000);
|
|
@@ -372,22 +366,20 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
372
366
|
throw new Error('Request aborted');
|
|
373
367
|
}
|
|
374
368
|
|
|
375
|
-
const result = await Promise.race([rpcPromise, timeoutPromise]) as
|
|
376
|
-
|
|
377
|
-
logger.debug("OrganisationService", "RPC call completed:", {
|
|
378
|
-
hasData: !!result.data,
|
|
379
|
-
hasError: !!result.error,
|
|
380
|
-
dataLength: result.data?.length || 0,
|
|
381
|
-
errorMessage: result.error?.message || 'No error'
|
|
382
|
-
});
|
|
369
|
+
const result = await Promise.race([rpcPromise, timeoutPromise]) as { data: OrganisationRoleRpcResponse[] | null; error: Error | null };
|
|
383
370
|
|
|
384
371
|
// Filter to only actual members (org_admin, leader, member) - exclude supporters
|
|
385
|
-
|
|
372
|
+
// Map to branded types when filtering
|
|
373
|
+
memberships = result.data?.filter((role) =>
|
|
386
374
|
['org_admin', 'leader', 'member'].includes(role.role)
|
|
387
|
-
)
|
|
375
|
+
).map((m) => ({
|
|
376
|
+
...m,
|
|
377
|
+
user_id: assertUserId(m.user_id),
|
|
378
|
+
organisation_id: assertOrganisationId(m.organisation_id),
|
|
379
|
+
})) || [];
|
|
388
380
|
membershipError = result.error;
|
|
389
|
-
} catch (queryError
|
|
390
|
-
membershipError = queryError;
|
|
381
|
+
} catch (queryError) {
|
|
382
|
+
membershipError = queryError instanceof Error ? queryError : new Error(String(queryError));
|
|
391
383
|
}
|
|
392
384
|
|
|
393
385
|
if (membershipError) {
|
|
@@ -395,7 +387,6 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
395
387
|
|
|
396
388
|
// If RPC fails with timeout, try direct database query as fallback
|
|
397
389
|
if (membershipError.message?.includes('timeout')) {
|
|
398
|
-
logger.debug("OrganisationService", "RPC timed out, trying direct database query as fallback...");
|
|
399
390
|
try {
|
|
400
391
|
// Check if request was aborted before making fallback query
|
|
401
392
|
if (abortSignal.aborted) {
|
|
@@ -439,8 +430,12 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
439
430
|
throw membershipError; // Throw original error
|
|
440
431
|
}
|
|
441
432
|
|
|
442
|
-
|
|
443
|
-
memberships = fallbackData
|
|
433
|
+
// Map to branded types
|
|
434
|
+
memberships = fallbackData?.map((m) => ({
|
|
435
|
+
...m,
|
|
436
|
+
user_id: assertUserId(m.user_id),
|
|
437
|
+
organisation_id: assertOrganisationId(m.organisation_id),
|
|
438
|
+
})) || [];
|
|
444
439
|
membershipError = null;
|
|
445
440
|
} catch (fallbackErr) {
|
|
446
441
|
logger.error("OrganisationService", "Fallback query failed:", fallbackErr);
|
|
@@ -457,7 +452,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
457
452
|
|
|
458
453
|
// Get organisation details for the memberships
|
|
459
454
|
const organisationIds = memberships
|
|
460
|
-
.map((m
|
|
455
|
+
.map((m) => m.organisation_id)
|
|
461
456
|
.filter((id: string) => {
|
|
462
457
|
// Better validation to prevent empty string UUID errors
|
|
463
458
|
if (!id || typeof id !== 'string') {
|
|
@@ -503,7 +498,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
503
498
|
|
|
504
499
|
// Create a map of organisation_id to role from the memberships data
|
|
505
500
|
const roleMap = new Map<string, string>();
|
|
506
|
-
memberships?.forEach((membership
|
|
501
|
+
memberships?.forEach((membership) => {
|
|
507
502
|
roleMap.set(membership.organisation_id, membership.role);
|
|
508
503
|
});
|
|
509
504
|
|
|
@@ -516,6 +511,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
516
511
|
}
|
|
517
512
|
|
|
518
513
|
this._organisations = activeOrgs;
|
|
514
|
+
// Memberships already have branded types from earlier mapping
|
|
519
515
|
this._userMemberships = memberships as OrganisationMembership[];
|
|
520
516
|
|
|
521
517
|
// Store role map in component state for later use
|
|
@@ -551,7 +547,7 @@ export class OrganisationService extends BaseService implements IOrganisationSer
|
|
|
551
547
|
|
|
552
548
|
// 2. Fall back to org_admin role organisation (highest privilege)
|
|
553
549
|
if (!initialOrg) {
|
|
554
|
-
const adminMembership = memberships.find((m
|
|
550
|
+
const adminMembership = memberships.find((m) => m.role === 'org_admin');
|
|
555
551
|
if (adminMembership) {
|
|
556
552
|
const foundOrg = organisations.find((org) => org.id === adminMembership.organisation_id);
|
|
557
553
|
if (foundOrg) {
|
|
@@ -7,8 +7,12 @@ function createSupabaseMock() {
|
|
|
7
7
|
getSession: vi.fn().mockResolvedValue({ data: { session: null }, error: null }),
|
|
8
8
|
getUser: vi.fn(), // should not be called when session is null
|
|
9
9
|
onAuthStateChange: vi.fn().mockImplementation((cb: any) => {
|
|
10
|
-
// Provide a subscription-like object
|
|
11
|
-
|
|
10
|
+
// Provide a subscription-like object with data.subscription structure
|
|
11
|
+
const subscription = { unsubscribe: () => {} };
|
|
12
|
+
return {
|
|
13
|
+
data: { subscription },
|
|
14
|
+
error: null
|
|
15
|
+
} as any;
|
|
12
16
|
}),
|
|
13
17
|
} as any;
|
|
14
18
|
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
12
12
|
import { EventService } from '../EventService';
|
|
13
|
-
import { Event } from '../../types/
|
|
13
|
+
import { Event } from '../../types/event';
|
|
14
|
+
import { assertOrganisationId } from '../../types/core';
|
|
14
15
|
|
|
15
16
|
// Don't mock the logger - it now works in test mode
|
|
16
17
|
// We'll spy on the Logger class methods in beforeEach to verify calls
|
|
@@ -62,34 +63,62 @@ const mockOrganisation = {
|
|
|
62
63
|
|
|
63
64
|
const mockSetSelectedEventId = vi.fn();
|
|
64
65
|
|
|
66
|
+
// Raw RPC response data (what comes from database)
|
|
67
|
+
const mockEventRpcData = {
|
|
68
|
+
event_id: 'event-1',
|
|
69
|
+
event_name: 'Test Event',
|
|
70
|
+
event_code: 'test-event',
|
|
71
|
+
event_date: '2025-01-01T00:00:00Z',
|
|
72
|
+
event_venue: 'Test Venue',
|
|
73
|
+
event_participants: 100,
|
|
74
|
+
event_colours: '#FF0000',
|
|
75
|
+
organisation_id: 'org-1',
|
|
76
|
+
is_visible: true
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const mockEvent2RpcData = {
|
|
80
|
+
event_id: 'event-2',
|
|
81
|
+
event_name: 'Future Event',
|
|
82
|
+
event_code: 'future-event',
|
|
83
|
+
event_date: '2025-12-31T00:00:00Z',
|
|
84
|
+
event_venue: 'Future Venue',
|
|
85
|
+
event_participants: 200,
|
|
86
|
+
event_colours: '#00FF00',
|
|
87
|
+
organisation_id: 'org-1',
|
|
88
|
+
is_visible: true
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Transformed Event objects (what EventService returns after transformation)
|
|
65
92
|
const mockEvent: Event = {
|
|
66
93
|
id: 'event-1',
|
|
67
94
|
event_id: 'event-1',
|
|
68
95
|
event_name: 'Test Event',
|
|
96
|
+
event_code: 'test-event',
|
|
69
97
|
event_date: '2025-01-01T00:00:00Z',
|
|
70
98
|
event_venue: 'Test Venue',
|
|
71
99
|
event_participants: 100,
|
|
72
100
|
event_colours: '#FF0000',
|
|
73
101
|
event_logo: '',
|
|
74
|
-
organisation_id: 'org-1',
|
|
102
|
+
organisation_id: assertOrganisationId('org-1'),
|
|
75
103
|
is_visible: true,
|
|
76
|
-
|
|
77
|
-
|
|
104
|
+
created_at: expect.any(String),
|
|
105
|
+
updated_at: expect.any(String)
|
|
78
106
|
};
|
|
79
107
|
|
|
80
108
|
const mockEvent2: Event = {
|
|
81
109
|
id: 'event-2',
|
|
82
110
|
event_id: 'event-2',
|
|
83
111
|
event_name: 'Future Event',
|
|
112
|
+
event_code: 'future-event',
|
|
84
113
|
event_date: '2025-12-31T00:00:00Z',
|
|
85
114
|
event_venue: 'Future Venue',
|
|
86
115
|
event_participants: 200,
|
|
87
116
|
event_colours: '#00FF00',
|
|
88
117
|
event_logo: '',
|
|
89
|
-
organisation_id: 'org-1',
|
|
118
|
+
organisation_id: assertOrganisationId('org-1'),
|
|
90
119
|
is_visible: true,
|
|
91
|
-
|
|
92
|
-
|
|
120
|
+
created_at: expect.any(String),
|
|
121
|
+
updated_at: expect.any(String)
|
|
93
122
|
};
|
|
94
123
|
|
|
95
124
|
describe('EventService', () => {
|
|
@@ -140,7 +169,7 @@ describe('EventService', () => {
|
|
|
140
169
|
|
|
141
170
|
it('should fetch events on initialization', async () => {
|
|
142
171
|
mockSupabase.rpc.mockResolvedValue({
|
|
143
|
-
data: [
|
|
172
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
144
173
|
error: null
|
|
145
174
|
});
|
|
146
175
|
|
|
@@ -176,7 +205,7 @@ describe('EventService', () => {
|
|
|
176
205
|
describe('Event Operations', () => {
|
|
177
206
|
beforeEach(async () => {
|
|
178
207
|
mockSupabase.rpc.mockResolvedValue({
|
|
179
|
-
data: [
|
|
208
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
180
209
|
error: null
|
|
181
210
|
});
|
|
182
211
|
|
|
@@ -226,8 +255,13 @@ describe('EventService', () => {
|
|
|
226
255
|
// Clear the mock call count from the beforeEach initialization
|
|
227
256
|
vi.clearAllMocks();
|
|
228
257
|
|
|
258
|
+
const newEventRpcData = {
|
|
259
|
+
...mockEventRpcData,
|
|
260
|
+
event_id: 'event-3',
|
|
261
|
+
event_name: 'New Event'
|
|
262
|
+
};
|
|
229
263
|
mockSupabase.rpc.mockResolvedValue({
|
|
230
|
-
data: [
|
|
264
|
+
data: [mockEventRpcData, mockEvent2RpcData, newEventRpcData],
|
|
231
265
|
error: null
|
|
232
266
|
});
|
|
233
267
|
|
|
@@ -242,7 +276,7 @@ describe('EventService', () => {
|
|
|
242
276
|
beforeEach(async () => {
|
|
243
277
|
// Set up mock data before creating service
|
|
244
278
|
mockSupabase.rpc.mockResolvedValue({
|
|
245
|
-
data: [
|
|
279
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
246
280
|
error: null
|
|
247
281
|
});
|
|
248
282
|
|
|
@@ -268,19 +302,19 @@ describe('EventService', () => {
|
|
|
268
302
|
});
|
|
269
303
|
|
|
270
304
|
it('should return most recent past event when no future events', async () => {
|
|
271
|
-
const
|
|
272
|
-
...
|
|
305
|
+
const pastEvent1RpcData = {
|
|
306
|
+
...mockEventRpcData,
|
|
273
307
|
event_id: 'event-past-1',
|
|
274
308
|
event_date: '2020-01-01T00:00:00Z'
|
|
275
309
|
};
|
|
276
|
-
const
|
|
277
|
-
...
|
|
310
|
+
const pastEvent2RpcData = {
|
|
311
|
+
...mockEventRpcData,
|
|
278
312
|
event_id: 'event-past-2',
|
|
279
313
|
event_date: '2021-06-15T00:00:00Z' // More recent past event
|
|
280
314
|
};
|
|
281
315
|
|
|
282
316
|
mockSupabase.rpc.mockResolvedValue({
|
|
283
|
-
data: [
|
|
317
|
+
data: [pastEvent1RpcData, pastEvent2RpcData],
|
|
284
318
|
error: null
|
|
285
319
|
});
|
|
286
320
|
|
|
@@ -335,7 +369,7 @@ describe('EventService', () => {
|
|
|
335
369
|
);
|
|
336
370
|
|
|
337
371
|
mockSupabase.rpc.mockResolvedValue({
|
|
338
|
-
data: [
|
|
372
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
339
373
|
error: null
|
|
340
374
|
});
|
|
341
375
|
|
|
@@ -367,7 +401,7 @@ describe('EventService', () => {
|
|
|
367
401
|
);
|
|
368
402
|
|
|
369
403
|
mockSupabase.rpc.mockResolvedValue({
|
|
370
|
-
data: [
|
|
404
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
371
405
|
error: null
|
|
372
406
|
});
|
|
373
407
|
|
|
@@ -389,7 +423,7 @@ describe('EventService', () => {
|
|
|
389
423
|
describe('State Management', () => {
|
|
390
424
|
it('should notify subscribers when state changes', async () => {
|
|
391
425
|
mockSupabase.rpc.mockResolvedValue({
|
|
392
|
-
data: [
|
|
426
|
+
data: [mockEventRpcData],
|
|
393
427
|
error: null
|
|
394
428
|
});
|
|
395
429
|
|
|
@@ -456,7 +490,7 @@ describe('EventService', () => {
|
|
|
456
490
|
it('should auto-select next event when no event is selected', async () => {
|
|
457
491
|
// Set up mock data before creating service
|
|
458
492
|
mockSupabase.rpc.mockResolvedValue({
|
|
459
|
-
data: [
|
|
493
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
460
494
|
error: null
|
|
461
495
|
});
|
|
462
496
|
|
|
@@ -480,7 +514,7 @@ describe('EventService', () => {
|
|
|
480
514
|
it('should not auto-select when user has cleared event', async () => {
|
|
481
515
|
// Set up mock data before calling initialize
|
|
482
516
|
mockSupabase.rpc.mockResolvedValue({
|
|
483
|
-
data: [
|
|
517
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
484
518
|
error: null
|
|
485
519
|
});
|
|
486
520
|
|
|
@@ -491,7 +525,7 @@ describe('EventService', () => {
|
|
|
491
525
|
|
|
492
526
|
// Refresh events
|
|
493
527
|
mockSupabase.rpc.mockResolvedValue({
|
|
494
|
-
data: [
|
|
528
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
495
529
|
error: null
|
|
496
530
|
});
|
|
497
531
|
|
|
@@ -505,7 +539,7 @@ describe('EventService', () => {
|
|
|
505
539
|
describe('Persistence', () => {
|
|
506
540
|
it('should persist event selection across sessions', async () => {
|
|
507
541
|
mockSupabase.rpc.mockResolvedValue({
|
|
508
|
-
data: [
|
|
542
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
509
543
|
error: null
|
|
510
544
|
});
|
|
511
545
|
|
|
@@ -527,7 +561,7 @@ describe('EventService', () => {
|
|
|
527
561
|
mockSecureStorage.getItem.mockResolvedValue('event-1');
|
|
528
562
|
|
|
529
563
|
mockSupabase.rpc.mockResolvedValue({
|
|
530
|
-
data: [
|
|
564
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
531
565
|
error: null
|
|
532
566
|
});
|
|
533
567
|
|
|
@@ -574,7 +608,7 @@ describe('EventService', () => {
|
|
|
574
608
|
|
|
575
609
|
it('should clear events when switching to different organisation', async () => {
|
|
576
610
|
mockSupabase.rpc.mockResolvedValue({
|
|
577
|
-
data: [
|
|
611
|
+
data: [mockEventRpcData],
|
|
578
612
|
error: null
|
|
579
613
|
});
|
|
580
614
|
|
|
@@ -599,7 +633,7 @@ describe('EventService', () => {
|
|
|
599
633
|
|
|
600
634
|
it('should clear event selection when user changes', async () => {
|
|
601
635
|
mockSupabase.rpc.mockResolvedValue({
|
|
602
|
-
data: [
|
|
636
|
+
data: [mockEventRpcData],
|
|
603
637
|
error: null
|
|
604
638
|
});
|
|
605
639
|
|
|
@@ -624,7 +658,7 @@ describe('EventService', () => {
|
|
|
624
658
|
|
|
625
659
|
it('should clear event selection when user logs out', async () => {
|
|
626
660
|
mockSupabase.rpc.mockResolvedValue({
|
|
627
|
-
data: [
|
|
661
|
+
data: [mockEventRpcData],
|
|
628
662
|
error: null
|
|
629
663
|
});
|
|
630
664
|
|
|
@@ -651,7 +685,7 @@ describe('EventService', () => {
|
|
|
651
685
|
mockSecureStorage.getItem.mockResolvedValue('event-1');
|
|
652
686
|
|
|
653
687
|
mockSupabase.rpc.mockResolvedValue({
|
|
654
|
-
data: [
|
|
688
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
655
689
|
error: null
|
|
656
690
|
});
|
|
657
691
|
|
|
@@ -814,7 +848,7 @@ describe('EventService', () => {
|
|
|
814
848
|
event_participants: 100,
|
|
815
849
|
event_colours: '#FF0000',
|
|
816
850
|
event_logo: '',
|
|
817
|
-
organisation_id: 'org-1',
|
|
851
|
+
organisation_id: assertOrganisationId('org-1'),
|
|
818
852
|
is_visible: true,
|
|
819
853
|
name: 'Later Event',
|
|
820
854
|
start_date: futureDate1.toISOString()
|
|
@@ -829,7 +863,7 @@ describe('EventService', () => {
|
|
|
829
863
|
event_participants: 100,
|
|
830
864
|
event_colours: '#00FF00',
|
|
831
865
|
event_logo: '',
|
|
832
|
-
organisation_id: 'org-1',
|
|
866
|
+
organisation_id: assertOrganisationId('org-1'),
|
|
833
867
|
is_visible: true,
|
|
834
868
|
name: 'Earlier Event',
|
|
835
869
|
start_date: futureDate2.toISOString()
|
|
@@ -883,7 +917,7 @@ describe('EventService', () => {
|
|
|
883
917
|
mockSecureStorage.getItem.mockResolvedValue(null);
|
|
884
918
|
|
|
885
919
|
mockSupabase.rpc.mockResolvedValue({
|
|
886
|
-
data: [
|
|
920
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
887
921
|
error: null
|
|
888
922
|
});
|
|
889
923
|
|
|
@@ -904,7 +938,7 @@ describe('EventService', () => {
|
|
|
904
938
|
|
|
905
939
|
it('should not auto-select when user has explicitly cleared event', async () => {
|
|
906
940
|
mockSupabase.rpc.mockResolvedValue({
|
|
907
|
-
data: [
|
|
941
|
+
data: [mockEventRpcData, mockEvent2RpcData],
|
|
908
942
|
error: null
|
|
909
943
|
});
|
|
910
944
|
|
|
@@ -929,7 +963,7 @@ describe('EventService', () => {
|
|
|
929
963
|
localStorage.setItem('_sec_pace-core-selected-event', 'old-encrypted');
|
|
930
964
|
|
|
931
965
|
mockSupabase.rpc.mockResolvedValue({
|
|
932
|
-
data: [
|
|
966
|
+
data: [mockEventRpcData],
|
|
933
967
|
error: null
|
|
934
968
|
});
|
|
935
969
|
|
package/src/styles/core.css
CHANGED
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
font-size: 2.5rem;
|
|
86
86
|
font-weight: 700;
|
|
87
87
|
line-height: 1.2;
|
|
88
|
-
color: var(--color-main-
|
|
88
|
+
color: var(--color-main-700);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
h2 {
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
font-size: 1.75rem;
|
|
100
100
|
font-weight: 600;
|
|
101
101
|
line-height: 1.4;
|
|
102
|
-
color: var(--color-main-
|
|
102
|
+
color: var(--color-main-600);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
h4 {
|
package/src/styles/index.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*
|
|
16
16
|
* @example
|
|
17
17
|
* ```tsx
|
|
18
|
-
* //
|
|
18
|
+
* // For dynamic theming, import from theming/runtime
|
|
19
19
|
* import { applyPalette, clearPalette } from '@jmruthers/pace-core/theming/runtime';
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
@@ -45,7 +45,3 @@ export function getStylePath(style: keyof typeof styleConfig): string {
|
|
|
45
45
|
export function getAllStylePaths(): string[] {
|
|
46
46
|
return Object.values(styleConfig).map(config => config.path);
|
|
47
47
|
}
|
|
48
|
-
|
|
49
|
-
// Re-export theming runtime for convenience
|
|
50
|
-
export { applyPalette, clearPalette, generateSSRThemeCSS, isDynamicThemingActive, getCurrentThemeData, parseAndNormalizeEventColours } from '../theming/runtime';
|
|
51
|
-
export type { PaletteData, ColorPalette, ColorShade } from '../theming/runtime';
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import { describe, it, expect } from 'vitest';
|
|
11
11
|
import { isAuthErrorCode, isUser, isSession } from '../guards';
|
|
12
|
-
import { AuthErrorCode } from '../
|
|
12
|
+
import { AuthErrorCode } from '../core';
|
|
13
13
|
|
|
14
14
|
describe('Type Guards', () => {
|
|
15
15
|
describe('isAuthErrorCode', () => {
|
package/src/types/auth.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @file
|
|
2
|
+
* @file Authentication Types
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
4
|
* @module Types/Auth
|
|
5
|
-
* @since
|
|
5
|
+
* @since 1.0.0
|
|
6
|
+
*
|
|
7
|
+
* Type definitions for authentication, sessions, and user management.
|
|
6
8
|
*/
|
|
7
9
|
|
|
10
|
+
import type { AuthError, AuthErrorCode } from './core';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Session restoration state for tracking Supabase session hydration
|
|
14
|
+
*/
|
|
8
15
|
export interface SessionRestorationState {
|
|
9
16
|
/** True while Supabase is hydrating the local session */
|
|
10
17
|
isRestoring: boolean;
|
|
@@ -13,3 +20,36 @@ export interface SessionRestorationState {
|
|
|
13
20
|
/** Error encountered during restoration (timeout or Supabase error) */
|
|
14
21
|
restorationError: Error | null;
|
|
15
22
|
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Standard Supabase User type
|
|
26
|
+
* Matches @supabase/supabase-js User interface
|
|
27
|
+
*/
|
|
28
|
+
export interface User {
|
|
29
|
+
id: string;
|
|
30
|
+
email?: string;
|
|
31
|
+
created_at: string;
|
|
32
|
+
updated_at: string;
|
|
33
|
+
email_confirmed_at?: string;
|
|
34
|
+
last_sign_in_at?: string;
|
|
35
|
+
user_metadata?: Record<string, unknown>;
|
|
36
|
+
app_metadata?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Standard Supabase Session type
|
|
41
|
+
* Matches @supabase/supabase-js Session interface
|
|
42
|
+
*/
|
|
43
|
+
export interface Session {
|
|
44
|
+
access_token: string;
|
|
45
|
+
refresh_token?: string;
|
|
46
|
+
expires_in: number;
|
|
47
|
+
expires_at: number;
|
|
48
|
+
token_type: string;
|
|
49
|
+
user: User;
|
|
50
|
+
provider_token?: string;
|
|
51
|
+
provider_refresh_token?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Re-export error types for convenience
|
|
55
|
+
export type { AuthError, AuthErrorCode } from './core';
|