@jmruthers/pace-core 0.5.181 → 0.5.183
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +16 -2
- package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
- package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
- package/dist/{DataTable-UA6CL4JI.js → DataTable-QAB34V6K.js} +14 -15
- package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
- package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
- package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
- package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
- package/dist/auth-BZOJqrdd.d.ts +49 -0
- package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
- package/dist/chunk-5DRSZLL2.js.map +1 -0
- package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
- package/dist/chunk-6C4YBBJM.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
- package/dist/{chunk-HRO5HWN2.js → chunk-CSOFYHAG.js} +55 -162
- package/dist/chunk-CSOFYHAG.js.map +1 -0
- package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
- package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
- package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
- package/dist/chunk-FSFQFJCU.js.map +1 -0
- package/dist/chunk-FUEYYMX5.js +2296 -0
- package/dist/chunk-FUEYYMX5.js.map +1 -0
- package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
- package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
- package/dist/chunk-KQCRWDSA.js +1 -0
- package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
- package/dist/chunk-KUEN3HFB.js.map +1 -0
- package/dist/chunk-LMC26NLJ.js +84 -0
- package/dist/chunk-LMC26NLJ.js.map +1 -0
- package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
- package/dist/chunk-M7W4CP3M.js.map +1 -0
- package/dist/{chunk-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
- package/dist/chunk-MI7HBHN3.js.map +1 -0
- package/dist/{chunk-PPMP5J6T.js → chunk-PWAHJW4G.js} +180 -29
- package/dist/chunk-PWAHJW4G.js.map +1 -0
- package/dist/chunk-PWLANIRT.js +127 -0
- package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
- package/dist/chunk-QCDXODCA.js +75 -0
- package/dist/chunk-QCDXODCA.js.map +1 -0
- package/dist/{chunk-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
- package/dist/chunk-QETLRQI6.js.map +1 -0
- package/dist/{chunk-5MT24GKJ.js → chunk-QUVSNGIP.js} +264 -262
- package/dist/chunk-QUVSNGIP.js.map +1 -0
- package/dist/chunk-QXHPKYJV.js +113 -0
- package/dist/chunk-QXHPKYJV.js.map +1 -0
- package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
- package/dist/chunk-R77UEZ4E.js.map +1 -0
- package/dist/{chunk-ZYTYSTO5.js → chunk-RA3JUFMW.js} +314 -161
- package/dist/chunk-RA3JUFMW.js.map +1 -0
- package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
- package/dist/chunk-SQGMNID3.js.map +1 -0
- package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
- package/dist/chunk-UHNYIBXL.js.map +1 -0
- package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
- package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
- package/dist/{chunk-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
- package/dist/{chunk-VZ4VDGTB.js.map → chunk-W22JP75J.js.map} +1 -1
- package/dist/components.d.ts +12 -93
- package/dist/components.js +23 -106
- package/dist/components.js.map +1 -1
- package/dist/core-CUElvH_C.d.ts +164 -0
- package/dist/database.generated-CBmg2950.d.ts +8284 -0
- package/dist/event-CW5YB_2p.d.ts +239 -0
- package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
- package/dist/functions-D_kgHktt.d.ts +208 -0
- package/dist/hooks.d.ts +54 -7
- package/dist/hooks.js +204 -17
- package/dist/hooks.js.map +1 -1
- package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
- package/dist/index.d.ts +94 -261
- package/dist/index.js +314 -126
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +7 -8
- package/dist/providers.js +6 -13
- package/dist/rbac/index.d.ts +171 -101
- package/dist/rbac/index.js +23 -17
- package/dist/styles/index.d.ts +1 -3
- package/dist/styles/index.js +2 -17
- package/dist/theming/runtime.js +3 -3
- package/dist/types-UU913iLA.d.ts +102 -0
- package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
- package/dist/types.d.ts +88 -227
- package/dist/types.js +64 -112
- package/dist/types.js.map +1 -1
- package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
- package/dist/utils.d.ts +299 -13
- package/dist/utils.js +481 -55
- package/dist/utils.js.map +1 -1
- package/dist/validation-643vUDZW.d.ts +177 -0
- package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
- package/docs/README.md +9 -8
- package/docs/api/README.md +16 -2
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +14 -14
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +2 -2
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +29 -9
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +17 -17
- package/docs/api/enums/RBACErrorCode.md +228 -0
- package/docs/api/enums/RPCFunction.md +118 -0
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CalendarProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +29 -3
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +2 -2
- package/docs/api/interfaces/DataTableColumn.md +6 -6
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +5 -5
- package/docs/api/interfaces/ExportOptions.md +4 -4
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +13 -13
- package/docs/api/interfaces/FileReference.md +12 -12
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +10 -10
- package/docs/api/interfaces/FileUploadProps.md +19 -19
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +166 -0
- package/docs/api/interfaces/FormProps.md +113 -0
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +8 -8
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +17 -73
- package/docs/api/interfaces/NavigationMenuProps.md +38 -53
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +13 -13
- package/docs/api/interfaces/OrganisationContextType.md +21 -21
- package/docs/api/interfaces/OrganisationMembership.md +15 -15
- package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
- package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
- package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +50 -0
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
- package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
- package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
- package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
- package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +52 -0
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
- package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
- package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
- package/docs/api/interfaces/RBACResult.md +58 -0
- package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
- package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
- package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
- package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
- package/docs/api/interfaces/RBACRolesListParams.md +52 -0
- package/docs/api/interfaces/RBACRolesListResult.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +43 -2
- package/docs/api/interfaces/TextareaProps.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +4 -4
- package/docs/api/interfaces/UserProfile.md +7 -7
- package/docs/api/modules.md +484 -462
- package/docs/api-reference/components.md +186 -15
- package/docs/api-reference/deprecated.md +376 -0
- package/docs/api-reference/hooks.md +149 -19
- package/docs/api-reference/providers.md +61 -6
- package/docs/api-reference/rpc-functions.md +397 -0
- package/docs/api-reference/types.md +135 -78
- package/docs/api-reference/utilities.md +51 -380
- package/docs/architecture/README.md +49 -3
- package/docs/architecture/database-schema-requirements.md +40 -3
- package/docs/architecture/rbac-security-architecture.md +41 -4
- package/docs/architecture/services.md +127 -42
- package/docs/best-practices/README.md +51 -5
- package/docs/best-practices/accessibility.md +32 -3
- package/docs/best-practices/common-patterns.md +50 -3
- package/docs/best-practices/deployment.md +50 -4
- package/docs/best-practices/performance.md +50 -3
- package/docs/best-practices/security.md +94 -41
- package/docs/best-practices/testing.md +33 -4
- package/docs/core-concepts/authentication.md +5 -5
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +3 -3
- package/docs/core-concepts/permissions.md +3 -3
- package/docs/core-concepts/rbac-system.md +5 -5
- package/docs/documentation-index.md +30 -8
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +7 -5
- package/docs/getting-started/examples/basic-auth-app.md +3 -0
- package/docs/getting-started/examples/full-featured-app.md +5 -3
- package/docs/getting-started/faq.md +6 -6
- package/docs/getting-started/installation-guide.md +192 -13
- package/docs/getting-started/local-development.md +303 -0
- package/docs/getting-started/quick-reference.md +3 -3
- package/docs/getting-started/quick-start.md +517 -0
- package/docs/implementation-guides/app-layout.md +45 -3
- package/docs/implementation-guides/authentication.md +66 -7
- package/docs/implementation-guides/component-styling.md +53 -3
- package/docs/implementation-guides/data-tables.md +76 -7
- package/docs/implementation-guides/datatable-filtering.md +1 -2
- package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
- package/docs/implementation-guides/dynamic-colors.md +155 -4
- package/docs/implementation-guides/file-reference-system.md +72 -3
- package/docs/implementation-guides/file-upload-storage.md +72 -3
- package/docs/implementation-guides/forms.md +53 -3
- package/docs/implementation-guides/inactivity-tracking.md +53 -3
- package/docs/implementation-guides/large-datasets.md +1 -1
- package/docs/implementation-guides/navigation.md +55 -5
- package/docs/implementation-guides/organisation-security.md +72 -3
- package/docs/implementation-guides/performance.md +57 -1
- package/docs/implementation-guides/permission-enforcement.md +81 -8
- package/docs/implementation-guides/public-pages.md +560 -14
- package/docs/migration/MIGRATION_GUIDE.md +409 -50
- package/docs/migration/README.md +37 -3
- package/docs/migration/organisation-context-timing-fix.md +39 -4
- package/docs/migration/quick-migration-guide.md +41 -5
- package/docs/migration/rbac-migration.md +59 -3
- package/docs/migration/service-architecture.md +77 -14
- package/docs/rbac/README.md +79 -3
- package/docs/rbac/advanced-patterns.md +47 -3
- package/docs/rbac/api-reference.md +77 -8
- package/docs/rbac/event-based-apps.md +50 -5
- package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
- package/docs/rbac/examples.md +39 -3
- package/docs/rbac/getting-started.md +63 -4
- package/docs/rbac/quick-start.md +57 -5
- package/docs/rbac/rbac-rls-integration.md +68 -6
- package/docs/rbac/super-admin-guide.md +47 -3
- package/docs/rbac/troubleshooting.md +3 -3
- package/docs/security/README.md +68 -3
- package/docs/security/checklist.md +50 -3
- package/docs/standards/01-architecture-standard.md +39 -0
- package/docs/standards/02-api-and-rpc-standard.md +39 -0
- package/docs/standards/03-component-standard.md +32 -0
- package/docs/standards/04-code-style-standard.md +32 -0
- package/docs/standards/05-security-standard.md +30 -0
- package/docs/standards/06-testing-and-docs-standard.md +29 -0
- package/docs/standards/README.md +35 -0
- package/docs/styles/README.md +89 -8
- package/docs/testing/README.md +175 -24
- package/docs/troubleshooting/README.md +50 -3
- package/docs/troubleshooting/common-issues.md +271 -5
- package/docs/troubleshooting/debugging.md +54 -1
- package/docs/troubleshooting/migration.md +54 -1
- package/docs/troubleshooting/organisation-context-setup.md +29 -3
- package/docs/troubleshooting/styling-issues.md +246 -4
- package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
- package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
- package/{src/components/DataTable/examples → examples/DataTable}/HierarchicalExample.tsx +8 -6
- package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
- package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
- package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
- package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
- package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
- package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
- package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
- package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
- package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
- package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
- package/examples/README.md +81 -33
- package/examples/index.ts +14 -12
- package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
- package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
- package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
- package/package.json +21 -27
- package/src/__tests__/helpers/test-utils.tsx +29 -3
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
- package/src/components/Alert/Alert.test.tsx +2 -2
- package/src/components/Alert/Alert.tsx +4 -4
- package/src/components/Avatar/Avatar.test.tsx +17 -6
- package/src/components/Badge/Badge.test.tsx +1 -1
- package/src/components/Badge/Badge.tsx +2 -2
- package/src/components/Button/Button.test.tsx +2 -2
- package/src/components/Button/Button.tsx +11 -7
- package/src/components/Calendar/Calendar.test.tsx +41 -8
- package/src/components/Calendar/Calendar.tsx +39 -36
- package/src/components/Card/Card.tsx +51 -13
- package/src/components/Checkbox/Checkbox.test.tsx +36 -12
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
- package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
- package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
- package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
- package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
- package/src/components/DataTable/components/DataTableBody.tsx +10 -25
- package/src/components/DataTable/components/DataTableCore.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +3 -1
- package/src/components/DataTable/components/ImportModal.tsx +1 -1
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
- package/src/components/DataTable/core/ColumnFactory.ts +6 -6
- package/src/components/DataTable/core/DataTableContext.tsx +14 -10
- package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
- package/src/components/DataTable/core/PluginRegistry.ts +3 -3
- package/src/components/DataTable/core/StateManager.ts +12 -11
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
- package/src/components/DataTable/core/interfaces.ts +17 -17
- package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
- package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
- package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
- package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
- package/src/components/DataTable/types.ts +5 -5
- package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
- package/src/components/DataTable/utils/columnUtils.ts +3 -2
- package/src/components/DataTable/utils/debugTools.ts +1 -1
- package/src/components/DataTable/utils/exportUtils.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
- package/src/components/DataTable/utils/index.ts +0 -1
- package/src/components/DataTable/utils/performanceUtils.ts +9 -4
- package/src/components/Dialog/Dialog.test.tsx +49 -27
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
- package/src/components/EventSelector/EventSelector.test.tsx +60 -12
- package/src/components/EventSelector/EventSelector.tsx +38 -15
- package/src/components/EventSelector/index.ts +2 -2
- package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
- package/src/components/FileDisplay/FileDisplay.tsx +1 -0
- package/src/components/FileUpload/FileUpload.test.tsx +532 -152
- package/src/components/FileUpload/FileUpload.tsx +43 -8
- package/src/components/Footer/Footer.test.tsx +19 -14
- package/src/components/Form/Form.test.tsx +96 -14
- package/src/components/Form/Form.tsx +210 -1
- package/src/components/Form/index.ts +3 -7
- package/src/components/Header/Header.test.tsx +24 -17
- package/src/components/Header/Header.tsx +3 -1
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
- package/src/components/Input/Input.test.tsx +61 -36
- package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
- package/src/components/Label/Label.tsx +2 -3
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
- package/src/components/LoginForm/LoginForm.test.tsx +14 -13
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/LoginForm/index.ts +7 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
- package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
- package/src/components/NavigationMenu/index.ts +1 -1
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
- package/src/components/PaceAppLayout/test-setup.tsx +192 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
- package/src/components/PasswordChange/index.ts +2 -0
- package/src/components/Progress/Progress.test.tsx +11 -0
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/Progress/index.ts +10 -0
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
- package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
- package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
- package/src/components/PublicLayout/index.ts +10 -28
- package/src/components/Select/Select.test.tsx +7 -7
- package/src/components/Select/Select.tsx +277 -11
- package/src/components/Select/index.ts +1 -2
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
- package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
- package/src/components/Tabs/Tabs.test.tsx +10 -9
- package/src/components/Tabs/Tabs.tsx +61 -33
- package/src/components/Textarea/Textarea.test.tsx +31 -18
- package/src/components/Toast/Toast.tsx +2 -2
- package/src/components/Tooltip/Tooltip.test.tsx +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +7 -6
- package/src/components/UserMenu/UserMenu.tsx +2 -2
- package/src/components/index.ts +5 -4
- package/src/constants/performance.ts +19 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
- package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
- package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
- package/src/hooks/index.ts +4 -0
- package/src/hooks/public/index.ts +2 -0
- package/src/hooks/public/usePublicEvent.ts +4 -6
- package/src/hooks/public/usePublicEventLogo.test.ts +147 -0
- package/src/hooks/public/usePublicRouteParams.ts +1 -1
- package/src/hooks/services/useAuth.ts +2 -4
- package/src/hooks/services/useCurrentEvent.ts +1 -1
- package/src/hooks/useAppConfig.ts +1 -1
- package/src/hooks/useDataTablePerformance.ts +2 -2
- package/src/hooks/useEventTheme.ts +1 -1
- package/src/hooks/useEvents.ts +51 -10
- package/src/hooks/useOrganisationPermissions.test.ts +3 -3
- package/src/hooks/useOrganisationPermissions.ts +1 -1
- package/src/hooks/useOrganisationSecurity.ts +2 -2
- package/src/hooks/usePermissionCache.test.ts +9 -9
- package/src/hooks/usePermissionCache.ts +2 -2
- package/src/index.ts +19 -12
- package/src/providers/OrganisationProvider.tsx +73 -9
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
- package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
- package/src/providers/__tests__/EventProvider.test.tsx +24 -15
- package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
- package/src/providers/index.ts +0 -3
- package/src/providers/services/AuthServiceProvider.tsx +2 -17
- package/src/providers/services/EventServiceProvider.tsx +11 -16
- package/src/providers/services/InactivityServiceProvider.tsx +9 -12
- package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
- package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
- package/src/rbac/adapters.tsx +1 -1
- package/src/rbac/api.ts +20 -4
- package/src/rbac/audit-enhanced.ts +47 -2
- package/src/rbac/audit.ts +47 -2
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.test.tsx +7 -6
- package/src/rbac/components/NavigationProvider.tsx +1 -1
- package/src/rbac/components/PagePermissionGuard.tsx +1 -1
- package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +1 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
- package/src/rbac/components/SecureDataProvider.tsx +1 -1
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
- package/src/rbac/hooks/index.ts +3 -0
- package/src/rbac/hooks/usePermissions.ts +31 -85
- package/src/rbac/hooks/useRBAC.test.ts +13 -1
- package/src/rbac/hooks/useRBAC.ts +13 -67
- package/src/rbac/hooks/useResolvedScope.ts +11 -0
- package/src/rbac/hooks/useSecureSupabase.ts +308 -0
- package/src/rbac/index.ts +3 -0
- package/src/rbac/secureClient.ts +53 -6
- package/src/rbac/security.ts +37 -1
- package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
- package/src/rbac/types.ts +3 -2
- package/src/services/AuthService.ts +33 -25
- package/src/services/EventService.ts +56 -44
- package/src/services/InactivityService.ts +33 -53
- package/src/services/OrganisationService.ts +36 -40
- package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
- package/src/services/__tests__/EventService.test.ts +67 -33
- package/src/services/interfaces/IEventService.ts +1 -1
- package/src/styles/core.css +2 -2
- package/src/styles/index.test.ts +21 -0
- package/src/styles/index.ts +1 -5
- package/src/types/__tests__/guards.test.ts +1 -1
- package/src/types/__tests__/organisation.roles.test.ts +55 -0
- package/src/types/__tests__/type-validation.test.ts +0 -1
- package/src/types/auth.ts +42 -2
- package/src/types/core.ts +251 -0
- package/src/types/database.ts +11 -496
- package/src/types/event.ts +102 -0
- package/src/types/file-reference.ts +6 -4
- package/src/types/guards.ts +2 -1
- package/src/types/index.ts +48 -14
- package/src/types/lodash.debounce.d.ts +15 -0
- package/src/types/organisation.ts +14 -10
- package/src/types/supabase.ts +15 -17
- package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
- package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
- package/src/utils/app/appNameResolver.ts +1 -1
- package/src/utils/audit/audit.test.ts +65 -0
- package/src/utils/device/deviceFingerprint.test.ts +171 -0
- package/src/utils/dynamic/dynamicUtils.ts +3 -2
- package/src/utils/file-reference/index.ts +25 -6
- package/src/utils/security/secureErrors.ts +1 -1
- package/src/utils/validation/__tests__/validationUtils.test.ts +72 -0
- package/src/utils/validation/index.ts +6 -12
- package/src/utils/validation/validationUtils.ts +0 -13
- package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
- package/dist/auth-DReDSLq9.d.ts +0 -16
- package/dist/chunk-3JI76CYK.js +0 -2444
- package/dist/chunk-3JI76CYK.js.map +0 -1
- package/dist/chunk-56XJ3TU6.js +0 -11
- package/dist/chunk-56XJ3TU6.js.map +0 -1
- package/dist/chunk-5MT24GKJ.js.map +0 -1
- package/dist/chunk-7QCC6MCP.js +0 -288
- package/dist/chunk-BESYRHQM.js.map +0 -1
- package/dist/chunk-BJPBT3CU.js +0 -21
- package/dist/chunk-BJPBT3CU.js.map +0 -1
- package/dist/chunk-BVYWGZVV.js.map +0 -1
- package/dist/chunk-CX5M4ZAG.js.map +0 -1
- package/dist/chunk-D7LCGMVS.js.map +0 -1
- package/dist/chunk-EGI6MUL6.js +0 -27
- package/dist/chunk-EGI6MUL6.js.map +0 -1
- package/dist/chunk-ERISIBYU.js.map +0 -1
- package/dist/chunk-HRO5HWN2.js.map +0 -1
- package/dist/chunk-HZLDFOE4.js.map +0 -1
- package/dist/chunk-JISYG63F.js +0 -70
- package/dist/chunk-JISYG63F.js.map +0 -1
- package/dist/chunk-LIMSTKYD.js +0 -61
- package/dist/chunk-LIMSTKYD.js.map +0 -1
- package/dist/chunk-OWAG3GSU.js.map +0 -1
- package/dist/chunk-PPMP5J6T.js.map +0 -1
- package/dist/chunk-Q5QRDWKI.js.map +0 -1
- package/dist/chunk-S5OFRT4M.js.map +0 -1
- package/dist/chunk-SBVILCCA.js.map +0 -1
- package/dist/chunk-TUMEWN34.js +0 -15
- package/dist/chunk-TUMEWN34.js.map +0 -1
- package/dist/chunk-XDNLUEXI.js +0 -138
- package/dist/chunk-XJ2HZOBU.js.map +0 -1
- package/dist/chunk-ZYTYSTO5.js.map +0 -1
- package/dist/chunk-ZZ2SS7NI.js +0 -237
- package/dist/chunk-ZZ2SS7NI.js.map +0 -1
- package/dist/database-C6jy7EOu.d.ts +0 -500
- package/dist/organisation-D6qRDtbF.d.ts +0 -93
- package/dist/schema-DTDZQe2u.d.ts +0 -28
- package/dist/unified-DQ4VcT7H.d.ts +0 -198
- package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
- package/dist/validation.d.ts +0 -47
- package/dist/validation.js +0 -24
- package/dist/validation.js.map +0 -1
- package/docs/DOCUMENTATION_AUDIT.md +0 -172
- package/docs/DOCUMENTATION_STANDARD.md +0 -137
- package/docs/api/classes/PublicErrorBoundary.md +0 -132
- package/docs/api/interfaces/EventLogoProps.md +0 -152
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
- package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
- package/docs/architecture/rpc-function-standards.md +0 -1106
- package/docs/getting-started/consuming-app-vite-config.md +0 -239
- package/docs/implementation-guides/event-theming-summary.md +0 -226
- package/docs/implementation-guides/public-pages-advanced.md +0 -1038
- package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
- package/docs/migration/v0.4.16-css-first-approach.md +0 -312
- package/docs/migration/v0.4.17-source-path-fix.md +0 -235
- package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
- package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
- package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
- package/docs/rbac/README-rbac-rls-integration.md +0 -374
- package/docs/styles/usage.md +0 -227
- package/docs/testing/visual-testing.md +0 -120
- package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
- package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
- package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
- package/docs/troubleshooting/database-view-compatibility.md +0 -125
- package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
- package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
- package/examples/RBAC/EventBasedApp.tsx +0 -239
- package/examples/RBAC/PermissionExample.tsx +0 -151
- package/examples/STRUCTURE.md +0 -125
- package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
- package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
- package/examples/components 2/index.ts +0 -11
- package/examples/features/index.ts +0 -12
- package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
- package/examples/features/rbac/index.ts +0 -13
- package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
- package/examples/public-pages/PublicEventPage.tsx +0 -274
- package/examples/public-pages/PublicPageApp.tsx +0 -308
- package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
- package/examples/public-pages/index.ts +0 -14
- package/src/__tests__/TEST_STANDARD.md +0 -1008
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
- package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
- package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
- package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
- package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
- package/src/components/Dialog/README.md +0 -804
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
- package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
- package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
- package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
- package/src/components/Dialog/utils/safeHtml.ts +0 -185
- package/src/components/EventSelector/types.ts +0 -79
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormField.tsx +0 -249
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/Input/__mocks__/Input.tsx +0 -2
- package/src/components/NavigationMenu/types.ts +0 -85
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/ProtectedRoute/README.md +0 -164
- package/src/components/PublicLayout/EventLogo.tsx +0 -175
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
- package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
- package/src/components/Select/hooks.ts +0 -289
- package/src/hooks/useCounter.test.ts +0 -131
- package/src/hooks/useDebounce.test.ts +0 -375
- package/src/providers/AuthProvider.tsx +0 -15
- package/src/providers/EventProvider.tsx +0 -16
- package/src/providers/InactivityProvider.tsx +0 -15
- package/src/providers/OrganisationProvider.context.test.tsx +0 -169
- package/src/providers/UnifiedAuthProvider.tsx +0 -15
- package/src/types/theme.ts +0 -6
- package/src/types/unified.ts +0 -265
- package/src/utils/appConfig.ts +0 -47
- package/src/utils/appIdResolver.test.ts +0 -499
- package/src/utils/appIdResolver.ts +0 -130
- package/src/utils/appNameResolver.simple.test.ts +0 -212
- package/src/utils/appNameResolver.test.ts +0 -121
- package/src/utils/appNameResolver.ts +0 -191
- package/src/utils/audit.ts +0 -127
- package/src/utils/auth-utils.ts +0 -96
- package/src/utils/bundleAnalysis.ts +0 -129
- package/src/utils/debugLogger.ts +0 -67
- package/src/utils/deviceFingerprint.ts +0 -215
- package/src/utils/dynamicUtils.ts +0 -105
- package/src/utils/file-reference.test.ts +0 -788
- package/src/utils/file-reference.ts +0 -519
- package/src/utils/formatDate.test.ts +0 -237
- package/src/utils/formatting.ts +0 -170
- package/src/utils/lazyLoad.tsx +0 -44
- package/src/utils/logger.ts +0 -179
- package/src/utils/organisationContext.test.ts +0 -322
- package/src/utils/organisationContext.ts +0 -153
- package/src/utils/performanceBenchmark.ts +0 -64
- package/src/utils/performanceBudgets.ts +0 -110
- package/src/utils/permissionTypes.ts +0 -37
- package/src/utils/permissionUtils.test.ts +0 -393
- package/src/utils/permissionUtils.ts +0 -34
- package/src/utils/sanitization.ts +0 -264
- package/src/utils/schemaUtils.ts +0 -37
- package/src/utils/secureDataAccess.test.ts +0 -711
- package/src/utils/secureDataAccess.ts +0 -377
- package/src/utils/secureErrors.ts +0 -79
- package/src/utils/security.ts +0 -156
- package/src/utils/securityMonitor.ts +0 -45
- package/src/utils/sessionTracking.ts +0 -126
- package/src/utils/validation.ts +0 -111
- package/src/utils/validationUtils.ts +0 -120
- package/src/validation/index.ts +0 -12
- /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
- /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
- /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
- /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
- /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
- /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
- /package/examples/{RBAC → rbac}/index.ts +0 -0
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Organisation Context Tests
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Utils/OrganisationContext
|
|
5
|
-
* @since 0.4.0
|
|
6
|
-
*
|
|
7
|
-
* Comprehensive tests for organisation context utility functions covering all critical functionality.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
11
|
-
import {
|
|
12
|
-
setOrganisationContext,
|
|
13
|
-
clearOrganisationContext,
|
|
14
|
-
getOrganisationContext
|
|
15
|
-
} from './organisationContext';
|
|
16
|
-
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
17
|
-
|
|
18
|
-
// Mock Supabase client
|
|
19
|
-
const createMockSupabaseClient = () => ({
|
|
20
|
-
rpc: vi.fn().mockResolvedValue({ data: null, error: null })
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
describe('Organisation Context', () => {
|
|
24
|
-
let mockSupabase: any;
|
|
25
|
-
|
|
26
|
-
beforeEach(() => {
|
|
27
|
-
vi.clearAllMocks();
|
|
28
|
-
mockSupabase = createMockSupabaseClient();
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
describe('setOrganisationContext', () => {
|
|
32
|
-
it('sets organisation context successfully', async () => {
|
|
33
|
-
mockSupabase.rpc.mockResolvedValue({
|
|
34
|
-
data: null,
|
|
35
|
-
error: null
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
await setOrganisationContext(mockSupabase, 'org-123');
|
|
39
|
-
|
|
40
|
-
expect(mockSupabase.rpc).toHaveBeenCalledWith('set_organisation_context', {
|
|
41
|
-
org_id: 'org-123'
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('handles missing supabase client gracefully', async () => {
|
|
46
|
-
await expect(setOrganisationContext(null as any, 'org-123')).resolves.not.toThrow();
|
|
47
|
-
await expect(setOrganisationContext(undefined as any, 'org-123')).resolves.not.toThrow();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('handles missing organisation ID gracefully', async () => {
|
|
51
|
-
await expect(setOrganisationContext(mockSupabase, null as any)).resolves.not.toThrow();
|
|
52
|
-
await expect(setOrganisationContext(mockSupabase, undefined as any)).resolves.not.toThrow();
|
|
53
|
-
await expect(setOrganisationContext(mockSupabase, '')).resolves.not.toThrow();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('handles database function errors gracefully', async () => {
|
|
57
|
-
mockSupabase.rpc.mockResolvedValue({
|
|
58
|
-
data: null,
|
|
59
|
-
error: { message: 'Function not found' }
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
// Should not throw error
|
|
63
|
-
await expect(setOrganisationContext(mockSupabase, 'org-123')).resolves.not.toThrow();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('handles RPC exceptions gracefully', async () => {
|
|
67
|
-
mockSupabase.rpc.mockRejectedValue(new Error('Network error'));
|
|
68
|
-
|
|
69
|
-
// Should not throw error
|
|
70
|
-
await expect(setOrganisationContext(mockSupabase, 'org-123')).resolves.not.toThrow();
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('handles invalid organisation ID format', async () => {
|
|
74
|
-
await expect(setOrganisationContext(mockSupabase, 'invalid-id')).resolves.not.toThrow();
|
|
75
|
-
await expect(setOrganisationContext(mockSupabase, '123')).resolves.not.toThrow();
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('handles very long organisation ID', async () => {
|
|
79
|
-
const longOrgId = 'a'.repeat(1000);
|
|
80
|
-
await expect(setOrganisationContext(mockSupabase, longOrgId)).resolves.not.toThrow();
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
describe('clearOrganisationContext', () => {
|
|
85
|
-
it('clears organisation context successfully', async () => {
|
|
86
|
-
mockSupabase.rpc.mockResolvedValue({
|
|
87
|
-
data: null,
|
|
88
|
-
error: null
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
await clearOrganisationContext(mockSupabase);
|
|
92
|
-
|
|
93
|
-
expect(mockSupabase.rpc).toHaveBeenCalledWith('rbac_audit_log', {
|
|
94
|
-
p_event_type: 'organisation_switched',
|
|
95
|
-
p_metadata: { action: 'clear_context' }
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('handles missing supabase client gracefully', async () => {
|
|
100
|
-
await expect(clearOrganisationContext(null as any)).resolves.not.toThrow();
|
|
101
|
-
await expect(clearOrganisationContext(undefined as any)).resolves.not.toThrow();
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('handles database function errors gracefully', async () => {
|
|
105
|
-
mockSupabase.rpc.mockResolvedValue({
|
|
106
|
-
data: null,
|
|
107
|
-
error: { message: 'Function not found' }
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
// Should not throw error
|
|
111
|
-
await expect(clearOrganisationContext(mockSupabase)).resolves.not.toThrow();
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('handles RPC exceptions gracefully', async () => {
|
|
115
|
-
mockSupabase.rpc.mockRejectedValue(new Error('Network error'));
|
|
116
|
-
|
|
117
|
-
// Should not throw error
|
|
118
|
-
await expect(clearOrganisationContext(mockSupabase)).resolves.not.toThrow();
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
describe('getOrganisationContext', () => {
|
|
123
|
-
it('gets organisation context successfully', async () => {
|
|
124
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
125
|
-
|
|
126
|
-
expect(result).toBeNull();
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('returns null when no context is set', async () => {
|
|
130
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
131
|
-
|
|
132
|
-
expect(result).toBeNull();
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it('handles missing supabase client gracefully', async () => {
|
|
136
|
-
const result1 = await getOrganisationContext(null as any);
|
|
137
|
-
const result2 = await getOrganisationContext(undefined as any);
|
|
138
|
-
|
|
139
|
-
expect(result1).toBeNull();
|
|
140
|
-
expect(result2).toBeNull();
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('handles database function errors gracefully', async () => {
|
|
144
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
145
|
-
|
|
146
|
-
expect(result).toBeNull();
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('handles RPC exceptions gracefully', async () => {
|
|
150
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
151
|
-
|
|
152
|
-
expect(result).toBeNull();
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it('handles invalid data format gracefully', async () => {
|
|
156
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
157
|
-
|
|
158
|
-
expect(result).toBeNull();
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it('handles empty string data', async () => {
|
|
162
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
163
|
-
|
|
164
|
-
expect(result).toBeNull();
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
describe('Integration Tests', () => {
|
|
169
|
-
it('works with real Supabase client structure', async () => {
|
|
170
|
-
const mockClient = {
|
|
171
|
-
rpc: vi.fn().mockResolvedValue({
|
|
172
|
-
data: 'org-123',
|
|
173
|
-
error: null
|
|
174
|
-
})
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
const result = await getOrganisationContext(mockClient as any);
|
|
178
|
-
|
|
179
|
-
expect(result).toBeNull();
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('handles complete workflow', async () => {
|
|
183
|
-
// Set context
|
|
184
|
-
mockSupabase.rpc.mockResolvedValueOnce({
|
|
185
|
-
data: null,
|
|
186
|
-
error: null
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
await setOrganisationContext(mockSupabase, 'org-123');
|
|
190
|
-
|
|
191
|
-
// Get context
|
|
192
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
193
|
-
|
|
194
|
-
expect(result).toBeNull();
|
|
195
|
-
|
|
196
|
-
// Clear context
|
|
197
|
-
mockSupabase.rpc.mockResolvedValueOnce({
|
|
198
|
-
data: null,
|
|
199
|
-
error: null
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
await clearOrganisationContext(mockSupabase);
|
|
203
|
-
|
|
204
|
-
expect(mockSupabase.rpc).toHaveBeenCalledTimes(2);
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
it('handles multiple organisation switches', async () => {
|
|
208
|
-
const organisations = ['org-123', 'org-456', 'org-789'];
|
|
209
|
-
|
|
210
|
-
for (const orgId of organisations) {
|
|
211
|
-
mockSupabase.rpc.mockResolvedValue({
|
|
212
|
-
data: null,
|
|
213
|
-
error: null
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
await setOrganisationContext(mockSupabase, orgId);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
expect(mockSupabase.rpc).toHaveBeenCalledTimes(3);
|
|
220
|
-
expect(mockSupabase.rpc).toHaveBeenCalledWith('set_organisation_context', { org_id: 'org-123' });
|
|
221
|
-
expect(mockSupabase.rpc).toHaveBeenCalledWith('set_organisation_context', { org_id: 'org-456' });
|
|
222
|
-
expect(mockSupabase.rpc).toHaveBeenCalledWith('set_organisation_context', { org_id: 'org-789' });
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
describe('Error Handling', () => {
|
|
227
|
-
it('handles network timeouts gracefully', async () => {
|
|
228
|
-
mockSupabase.rpc.mockRejectedValue(new Error('Request timeout'));
|
|
229
|
-
|
|
230
|
-
await expect(setOrganisationContext(mockSupabase, 'org-123')).resolves.not.toThrow();
|
|
231
|
-
await expect(clearOrganisationContext(mockSupabase)).resolves.not.toThrow();
|
|
232
|
-
await expect(getOrganisationContext(mockSupabase)).resolves.toBeNull();
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
it('handles malformed responses gracefully', async () => {
|
|
236
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
237
|
-
|
|
238
|
-
expect(result).toBeNull();
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
it('handles null responses gracefully', async () => {
|
|
242
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
243
|
-
|
|
244
|
-
expect(result).toBeNull();
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it('handles undefined responses gracefully', async () => {
|
|
248
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
249
|
-
|
|
250
|
-
expect(result).toBeNull();
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
describe('Performance', () => {
|
|
255
|
-
it('handles rapid context changes efficiently', async () => {
|
|
256
|
-
const startTime = Date.now();
|
|
257
|
-
|
|
258
|
-
// Rapidly switch contexts
|
|
259
|
-
for (let i = 0; i < 100; i++) {
|
|
260
|
-
mockSupabase.rpc.mockResolvedValue({
|
|
261
|
-
data: null,
|
|
262
|
-
error: null
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
await setOrganisationContext(mockSupabase, `org-${i}`);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
const endTime = Date.now();
|
|
269
|
-
|
|
270
|
-
expect(endTime - startTime).toBeLessThan(1000); // Should complete within 1 second
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
it('handles concurrent operations gracefully', async () => {
|
|
274
|
-
const operations = [
|
|
275
|
-
setOrganisationContext(mockSupabase, 'org-1'),
|
|
276
|
-
setOrganisationContext(mockSupabase, 'org-2'),
|
|
277
|
-
clearOrganisationContext(mockSupabase),
|
|
278
|
-
getOrganisationContext(mockSupabase)
|
|
279
|
-
];
|
|
280
|
-
|
|
281
|
-
await expect(Promise.all(operations)).resolves.not.toThrow();
|
|
282
|
-
});
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
describe('Edge Cases', () => {
|
|
286
|
-
it('handles special characters in organisation ID', async () => {
|
|
287
|
-
const specialOrgId = 'org-123@domain.com';
|
|
288
|
-
await expect(setOrganisationContext(mockSupabase, specialOrgId)).resolves.not.toThrow();
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
it('handles unicode characters in organisation ID', async () => {
|
|
292
|
-
const unicodeOrgId = 'org-用户-123';
|
|
293
|
-
await expect(setOrganisationContext(mockSupabase, unicodeOrgId)).resolves.not.toThrow();
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
it('handles very long organisation ID', async () => {
|
|
297
|
-
const longOrgId = 'a'.repeat(10000);
|
|
298
|
-
await expect(setOrganisationContext(mockSupabase, longOrgId)).resolves.not.toThrow();
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
it('handles numeric organisation ID', async () => {
|
|
302
|
-
await expect(setOrganisationContext(mockSupabase, '123')).resolves.not.toThrow();
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
it('handles boolean organisation ID', async () => {
|
|
306
|
-
await expect(setOrganisationContext(mockSupabase, 'true' as any)).resolves.not.toThrow();
|
|
307
|
-
});
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
describe('Type Safety', () => {
|
|
311
|
-
it('maintains type safety with TypeScript', async () => {
|
|
312
|
-
const result = await getOrganisationContext(mockSupabase);
|
|
313
|
-
expect(result).toBeNull();
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
it('handles mixed input types gracefully', async () => {
|
|
317
|
-
await expect(setOrganisationContext(mockSupabase, 123 as any)).resolves.not.toThrow();
|
|
318
|
-
await expect(setOrganisationContext(mockSupabase, true as any)).resolves.not.toThrow();
|
|
319
|
-
await expect(setOrganisationContext(mockSupabase, {} as any)).resolves.not.toThrow();
|
|
320
|
-
});
|
|
321
|
-
});
|
|
322
|
-
});
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Organisation Context Utility
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Utils/OrganisationContext
|
|
5
|
-
* @since 0.4.0
|
|
6
|
-
*
|
|
7
|
-
* Utility functions for managing organisation context in database sessions.
|
|
8
|
-
* Provides fallback mechanisms for when database functions are not available.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Set organisation context in the database session
|
|
15
|
-
*
|
|
16
|
-
* This function attempts to set the organisation context using a database function.
|
|
17
|
-
* If the function is not available, it falls back gracefully without throwing errors.
|
|
18
|
-
*
|
|
19
|
-
* @param supabase - Supabase client instance
|
|
20
|
-
* @param organisationId - The organisation ID to set as context
|
|
21
|
-
* @returns Promise that resolves when context is set (or falls back gracefully)
|
|
22
|
-
*/
|
|
23
|
-
export async function setOrganisationContext(
|
|
24
|
-
supabase: SupabaseClient,
|
|
25
|
-
organisationId: string
|
|
26
|
-
): Promise<void> {
|
|
27
|
-
if (!supabase || !organisationId) {
|
|
28
|
-
// TODO: Replace with proper logging service integration
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
// Add timeout to prevent hanging RPC calls
|
|
34
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
35
|
-
setTimeout(() => reject(new Error('RPC timeout after 3 seconds')), 3000);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
// Call the database function to set organisation context
|
|
39
|
-
const rpcPromise = supabase.rpc('set_organisation_context', {
|
|
40
|
-
org_id: organisationId
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
const { error } = await Promise.race([rpcPromise, timeoutPromise]) as any;
|
|
44
|
-
|
|
45
|
-
if (error) {
|
|
46
|
-
// Function might not exist yet - this is expected during migration
|
|
47
|
-
// Silent fail - will fall back to client-side filtering
|
|
48
|
-
console.log('[organisationContext] RPC function not available or failed, continuing without database context');
|
|
49
|
-
} else {
|
|
50
|
-
console.log('[organisationContext] Organisation context set in database successfully');
|
|
51
|
-
}
|
|
52
|
-
} catch (error) {
|
|
53
|
-
// Handle any other errors gracefully
|
|
54
|
-
// Silent fail - will fall back to client-side filtering
|
|
55
|
-
console.log('[organisationContext] Failed to set database context, continuing without it:', error);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Clear organisation context from the database session
|
|
61
|
-
*
|
|
62
|
-
* @param supabase - Supabase client instance
|
|
63
|
-
* @returns Promise that resolves when context is cleared
|
|
64
|
-
*/
|
|
65
|
-
export async function clearOrganisationContext(
|
|
66
|
-
supabase: SupabaseClient
|
|
67
|
-
): Promise<void> {
|
|
68
|
-
if (!supabase) {
|
|
69
|
-
// TODO: Replace with proper logging service integration
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
const { error } = await supabase.rpc('rbac_audit_log', {
|
|
75
|
-
p_event_type: 'organisation_switched',
|
|
76
|
-
p_metadata: { action: 'clear_context' }
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
if (error) {
|
|
80
|
-
// Silent fail - function not available
|
|
81
|
-
// TODO: Replace with proper logging service integration
|
|
82
|
-
} else {
|
|
83
|
-
// TODO: Replace with proper logging service integration
|
|
84
|
-
}
|
|
85
|
-
} catch (error) {
|
|
86
|
-
// Silent fail - error occurred
|
|
87
|
-
// TODO: Replace with proper logging service integration
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Get current organisation context from the database session
|
|
93
|
-
*
|
|
94
|
-
* @param supabase - Supabase client instance
|
|
95
|
-
* @returns Promise that resolves to the current organisation ID or null
|
|
96
|
-
*/
|
|
97
|
-
export async function getOrganisationContext(
|
|
98
|
-
supabase: SupabaseClient
|
|
99
|
-
): Promise<string | null> {
|
|
100
|
-
if (!supabase) {
|
|
101
|
-
// TODO: Replace with proper logging service integration
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
try {
|
|
106
|
-
// For now, return null since we're not using database context
|
|
107
|
-
// This will be replaced with proper context management
|
|
108
|
-
const data = null;
|
|
109
|
-
const error = null;
|
|
110
|
-
|
|
111
|
-
if (error) {
|
|
112
|
-
// TODO: Replace with proper logging service integration
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Validate that data is a string (allow empty strings)
|
|
117
|
-
if (typeof data === 'string') {
|
|
118
|
-
return data;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Return null for invalid data formats
|
|
122
|
-
return null;
|
|
123
|
-
} catch (error) {
|
|
124
|
-
// TODO: Replace with proper logging service integration
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Check if organisation context functions are available in the database
|
|
131
|
-
*
|
|
132
|
-
* @param supabase - Supabase client instance
|
|
133
|
-
* @returns Promise that resolves to true if functions are available
|
|
134
|
-
*/
|
|
135
|
-
export async function isOrganisationContextAvailable(
|
|
136
|
-
supabase: SupabaseClient
|
|
137
|
-
): Promise<boolean> {
|
|
138
|
-
if (!supabase) {
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
try {
|
|
143
|
-
const { error } = await supabase.rpc('get_organisation_context');
|
|
144
|
-
|
|
145
|
-
if (error) {
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return true;
|
|
150
|
-
} catch (error) {
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Performance benchmarking utilities
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export interface PerformanceMetrics {
|
|
6
|
-
renderTime: number;
|
|
7
|
-
interactionTime: number;
|
|
8
|
-
memoryUsage: number;
|
|
9
|
-
bundleSize: number;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function createPerformanceBenchmark(name: string) {
|
|
13
|
-
const startTime = performance.now();
|
|
14
|
-
const startMemory = (performance as any).memory?.usedJSHeapSize || 0;
|
|
15
|
-
|
|
16
|
-
return {
|
|
17
|
-
end: () => {
|
|
18
|
-
const endTime = performance.now();
|
|
19
|
-
const endMemory = (performance as any).memory?.usedJSHeapSize || 0;
|
|
20
|
-
|
|
21
|
-
const metrics: PerformanceMetrics = {
|
|
22
|
-
renderTime: endTime - startTime,
|
|
23
|
-
interactionTime: 0, // Would be measured separately
|
|
24
|
-
memoryUsage: endMemory - startMemory,
|
|
25
|
-
bundleSize: 0, // Would be measured at build time
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
// TODO: Replace with proper logging service integration
|
|
29
|
-
// For now, we'll use a no-op to prevent console pollution
|
|
30
|
-
const _unused = {
|
|
31
|
-
benchmark: `Performance Benchmark [${name}]`,
|
|
32
|
-
metrics
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
return metrics;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function measureRenderPerformance(componentName: string, renderFn: () => void): PerformanceMetrics {
|
|
41
|
-
const startTime = performance.now();
|
|
42
|
-
const startMemory = (performance as any).memory?.usedJSHeapSize || 0;
|
|
43
|
-
|
|
44
|
-
renderFn();
|
|
45
|
-
|
|
46
|
-
const endTime = performance.now();
|
|
47
|
-
const endMemory = (performance as any).memory?.usedJSHeapSize || 0;
|
|
48
|
-
|
|
49
|
-
const metrics: PerformanceMetrics = {
|
|
50
|
-
renderTime: endTime - startTime,
|
|
51
|
-
interactionTime: 0,
|
|
52
|
-
memoryUsage: endMemory - startMemory,
|
|
53
|
-
bundleSize: 0,
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
// TODO: Replace with proper logging service integration
|
|
57
|
-
// For now, we'll use a no-op to prevent console pollution
|
|
58
|
-
const _unused = {
|
|
59
|
-
benchmark: `Render Performance [${componentName}]`,
|
|
60
|
-
metrics
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
return metrics;
|
|
64
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
interface PerformanceBudget {
|
|
3
|
-
metric: string;
|
|
4
|
-
budget: number;
|
|
5
|
-
actual: number;
|
|
6
|
-
threshold: 'error' | 'warning' | 'info';
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
interface PerformanceMetrics {
|
|
10
|
-
bundleSize: number;
|
|
11
|
-
chunkCount: number;
|
|
12
|
-
treeshakingEffectiveness: number;
|
|
13
|
-
dynamicImportUsage: number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
interface MeasurementResult {
|
|
17
|
-
passed: boolean;
|
|
18
|
-
value: number;
|
|
19
|
-
threshold: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Performance budget thresholds with index signature
|
|
23
|
-
export const PERFORMANCE_BUDGETS: { [key: string]: { threshold: number } } = {
|
|
24
|
-
COMPONENT_RENDER: { threshold: 50 },
|
|
25
|
-
BUNDLE_SIZE: { threshold: 150000 },
|
|
26
|
-
CHUNK_COUNT: { threshold: 10 },
|
|
27
|
-
TREESHAKING_SCORE: { threshold: 70 },
|
|
28
|
-
ERROR_BOUNDARY_TRIGGER: { threshold: 5 },
|
|
29
|
-
MEMORY_INCREASE: { threshold: 1000 },
|
|
30
|
-
LARGE_LIST_RENDER: { threshold: 500 },
|
|
31
|
-
} as const;
|
|
32
|
-
|
|
33
|
-
class PerformanceBudgetMonitor {
|
|
34
|
-
private metrics: Map<string, number> = new Map();
|
|
35
|
-
private budgets: PerformanceBudget[] = [];
|
|
36
|
-
|
|
37
|
-
measure(metric: string, value: number, metadata?: Record<string, unknown>): MeasurementResult {
|
|
38
|
-
this.metrics.set(metric, value);
|
|
39
|
-
|
|
40
|
-
// In production, this would send to a proper logging service
|
|
41
|
-
// For now, we'll log to console for testing purposes
|
|
42
|
-
if (import.meta.env.MODE === 'development' || import.meta.env.MODE === 'test' || process.env.NODE_ENV === 'test') {
|
|
43
|
-
console.log('📊 Performance Metric: ' + metric + ' = ' + value, metadata);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Get threshold for this metric
|
|
47
|
-
const budgetConfig = PERFORMANCE_BUDGETS[metric];
|
|
48
|
-
const threshold = budgetConfig?.threshold || 100;
|
|
49
|
-
const passed = value <= threshold;
|
|
50
|
-
|
|
51
|
-
return {
|
|
52
|
-
passed,
|
|
53
|
-
value,
|
|
54
|
-
threshold
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
setBudget(metric: string, budget: number, threshold: 'error' | 'warning' | 'info' = 'warning'): void {
|
|
59
|
-
this.budgets.push({ metric, budget, actual: 0, threshold });
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
checkBudgets(): PerformanceBudget[] {
|
|
63
|
-
const violations: PerformanceBudget[] = [];
|
|
64
|
-
|
|
65
|
-
for (const budget of this.budgets) {
|
|
66
|
-
const actual = this.metrics.get(budget.metric) || 0;
|
|
67
|
-
budget.actual = actual;
|
|
68
|
-
|
|
69
|
-
if (actual > budget.budget) {
|
|
70
|
-
violations.push(budget);
|
|
71
|
-
|
|
72
|
-
// In production, this would send to a proper logging service
|
|
73
|
-
// For now, we'll log to console for testing purposes
|
|
74
|
-
if (import.meta.env.MODE === 'development' || import.meta.env.MODE === 'test' || process.env.NODE_ENV === 'test') {
|
|
75
|
-
if (budget.threshold === 'error') {
|
|
76
|
-
console.error('❌ Performance budget exceeded: ' + budget.metric + ' (' + actual + ' > ' + budget.budget + ')');
|
|
77
|
-
} else if (budget.threshold === 'warning') {
|
|
78
|
-
console.warn('⚠️ Performance budget exceeded: ' + budget.metric + ' (' + actual + ' > ' + budget.budget + ')');
|
|
79
|
-
} else {
|
|
80
|
-
console.info('ℹ️ Performance budget exceeded: ' + budget.metric + ' (' + actual + ' > ' + budget.budget + ')');
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return violations;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
getMetrics(): PerformanceMetrics {
|
|
90
|
-
return {
|
|
91
|
-
bundleSize: this.metrics.get('BUNDLE_SIZE') || 0,
|
|
92
|
-
chunkCount: this.metrics.get('CHUNK_COUNT') || 0,
|
|
93
|
-
treeshakingEffectiveness: this.metrics.get('TREESHAKING_SCORE') || 0,
|
|
94
|
-
dynamicImportUsage: this.metrics.get('DYNAMIC_IMPORTS') || 0,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
reset(): void {
|
|
99
|
-
this.metrics.clear();
|
|
100
|
-
this.budgets.length = 0;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export const performanceBudgetMonitor = new PerformanceBudgetMonitor();
|
|
105
|
-
|
|
106
|
-
// Set default performance budgets
|
|
107
|
-
performanceBudgetMonitor.setBudget('BUNDLE_SIZE', 150000, 'error'); // 150KB
|
|
108
|
-
performanceBudgetMonitor.setBudget('CHUNK_COUNT', 10, 'warning');
|
|
109
|
-
performanceBudgetMonitor.setBudget('TREESHAKING_SCORE', 70, 'warning');
|
|
110
|
-
performanceBudgetMonitor.setBudget('ERROR_BOUNDARY_TRIGGER', 5, 'error');
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @file Permission type definitions and utilities
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export enum PermissionType {
|
|
7
|
-
READ = 'read',
|
|
8
|
-
WRITE = 'write',
|
|
9
|
-
DELETE = 'delete',
|
|
10
|
-
ADMIN = 'admin'
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Parse a permission string into components
|
|
15
|
-
*/
|
|
16
|
-
export function parsePermission(permission: string): { resource: string; action: string } | null {
|
|
17
|
-
if (!permission || typeof permission !== 'string') {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const parts = permission.split(':');
|
|
22
|
-
if (parts.length !== 2) {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const [action, resource] = parts;
|
|
27
|
-
|
|
28
|
-
// Check that both action and resource exist and are not empty
|
|
29
|
-
if (action === undefined || resource === undefined || action === '' || resource === '') {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return {
|
|
34
|
-
resource,
|
|
35
|
-
action
|
|
36
|
-
};
|
|
37
|
-
}
|