@jmruthers/pace-core 0.5.68 → 0.5.69
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/dist/{DataTable-4IUY7BXB.js → DataTable-MPBSXUC6.js} +5 -6
- package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-BOdyU3u-.d.ts} +1 -1
- package/dist/{chunk-PXWEDX7Y.js → chunk-2ARQW6VX.js} +3 -3
- package/dist/{chunk-MOJXHWDE.js → chunk-6JILXFEA.js} +335 -5
- package/dist/chunk-6JILXFEA.js.map +1 -0
- package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
- package/dist/chunk-6RBH67W7.js.map +1 -0
- package/dist/{chunk-ZMS23NS5.js → chunk-FJTAWPAQ.js} +3 -5
- package/dist/{chunk-ZMS23NS5.js.map → chunk-FJTAWPAQ.js.map} +1 -1
- package/dist/{chunk-OPCWH3A4.js → chunk-NO5QHMDX.js} +7 -6
- package/dist/chunk-NO5QHMDX.js.map +1 -0
- package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
- package/dist/chunk-O3NWNXDY.js.map +1 -0
- package/dist/{chunk-UYA6U6H7.js → chunk-Q2UP3ZWQ.js} +4 -4
- package/dist/{chunk-KRCRNXPD.js → chunk-RVYGJPOD.js} +79 -18
- package/dist/chunk-RVYGJPOD.js.map +1 -0
- package/dist/{chunk-NN45OBIS.js → chunk-UCMHBF7Y.js} +3 -5
- package/dist/{chunk-NN45OBIS.js.map → chunk-UCMHBF7Y.js.map} +1 -1
- package/dist/{chunk-ZPG4XPV5.js → chunk-V3QO3LL7.js} +5 -7
- package/dist/chunk-V3QO3LL7.js.map +1 -0
- package/dist/{chunk-U6GPOF6J.js → chunk-ZXJGZLLO.js} +17 -17
- package/dist/{chunk-U6GPOF6J.js.map → chunk-ZXJGZLLO.js.map} +1 -1
- package/dist/components.d.ts +1 -1
- package/dist/components.js +8 -9
- package/dist/components.js.map +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +9 -6
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/providers.js +5 -7
- package/dist/rbac/index.js +5 -6
- package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
- package/dist/utils.d.ts +4 -1
- package/dist/utils.js +3 -3
- package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
- package/docs/README.md +22 -10
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- 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/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventContextType.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/EventProviderProps.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- 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 +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- 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/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContextType.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACProviderProps.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.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/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/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +39 -14
- package/docs/architecture/services.md +374 -0
- package/docs/best-practices/README.md +1 -1
- package/docs/best-practices/testing.md +1 -1
- package/docs/breaking-changes.md +182 -0
- package/docs/common-patterns.md +445 -0
- package/docs/core-concepts/authentication.md +26 -11
- package/docs/core-concepts/events.md +2 -0
- package/docs/core-concepts/organisations.md +2 -0
- package/docs/core-concepts/permissions.md +2 -0
- package/docs/{INDEX.md → documentation-index.md} +26 -38
- package/docs/faq.md +286 -0
- package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
- package/docs/getting-started/installation-guide.md +284 -0
- package/docs/getting-started/quick-start.md +8 -1
- package/docs/implementation-guides/app-layout.md +3 -1
- package/docs/implementation-guides/data-tables.md +2 -0
- package/docs/implementation-guides/dynamic-colors.md +47 -2
- package/docs/implementation-guides/event-theming-summary.md +220 -0
- package/docs/implementation-guides/forms.md +9 -7
- package/docs/implementation-guides/navigation.md +2 -0
- package/docs/migration/service-architecture.md +351 -0
- package/docs/rbac/README-rbac-rls-integration.md +2 -2
- package/docs/rbac/README.md +1 -1
- package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
- package/docs/rbac/quick-start.md +2 -0
- package/docs/rbac/rbac-rls-integration.md +2 -2
- package/docs/style-guide.md +136 -1
- package/docs/testing/README.md +1 -1
- package/docs/troubleshooting/authentication-issues.md +334 -0
- package/docs/troubleshooting/common-issues.md +2 -0
- package/docs/troubleshooting/styling-issues.md +199 -144
- package/docs/usage.md +23 -2
- package/package.json +1 -1
- package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
- package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
- package/src/__tests__/fixtures/test-data.ts +90 -0
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
- package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
- package/src/__tests__/helpers/component-test-utils.tsx +14 -4
- package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
- package/src/__tests__/helpers/test-providers.tsx +329 -0
- package/src/__tests__/helpers/test-utils.tsx +91 -45
- package/src/__tests__/helpers/timer-utils.ts +71 -0
- package/src/__tests__/hooks/usePermissions.test.ts +1 -5
- package/src/__tests__/integration/UserProfile.test.tsx +1 -5
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
- package/src/__tests__/setup.ts +34 -28
- package/src/components/Alert/Alert.test.tsx +1 -5
- package/src/components/Avatar/Avatar.test.tsx +1 -5
- package/src/components/Button/Button.test.tsx +4 -20
- package/src/components/Card/Card.test.tsx +1 -5
- package/src/components/Checkbox/Checkbox.test.tsx +1 -5
- package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
- package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
- package/src/components/DataTable/__tests__/styles.test.ts +382 -0
- package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
- package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
- package/src/components/Footer/Footer.test.tsx +1 -5
- package/src/components/Form/Form.test.tsx +22 -35
- package/src/components/Header/Header.test.tsx +1 -9
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
- package/src/components/Input/Input.test.tsx +2 -10
- package/src/components/LoginForm/LoginForm.test.tsx +1 -5
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -5
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
- package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
- package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
- package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
- package/src/components/Select/Select.bug-test.tsx +69 -0
- package/src/components/Select/Select.refactored.tsx +497 -0
- package/src/components/Select/Select.test.tsx +42 -49
- package/src/components/Select/Select.tsx +5 -2
- package/src/components/Select/hooks.ts +254 -0
- package/src/components/Switch/Switch.test.tsx +1 -5
- package/src/components/Table/__tests__/Table.test.tsx +775 -0
- package/src/components/Toast/Toast.test.tsx +15 -8
- package/src/components/Tooltip/Tooltip.test.tsx +1 -5
- package/src/components/UserMenu/UserMenu.test.tsx +3 -15
- package/src/components/__tests__/FileDisplay.test.tsx +575 -0
- package/src/components/__tests__/FileUpload.test.tsx +446 -0
- package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
- package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
- package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
- package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
- package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
- package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
- package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
- package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/public/usePublicEvent.ts +30 -9
- package/src/hooks/public/usePublicRouteParams.ts +13 -3
- package/src/hooks/services/useAuth.ts +50 -0
- package/src/hooks/services/useAuthService.ts +30 -0
- package/src/hooks/services/useCurrentEvent.ts +36 -0
- package/src/hooks/services/useCurrentOrganisation.ts +52 -0
- package/src/hooks/services/useEventService.ts +30 -0
- package/src/hooks/services/useInactivityService.ts +30 -0
- package/src/hooks/services/useOrganisationService.ts +30 -0
- package/src/hooks/services/usePermissions.ts +70 -0
- package/src/hooks/services/useRBACService.ts +30 -0
- package/src/hooks/useCounter.test.ts +1 -5
- package/src/hooks/useEventTheme.ts +86 -0
- package/src/hooks/useOrganisationPermissions.test.ts +2 -5
- package/src/hooks/useOrganisationSecurity.test.ts +1 -5
- package/src/hooks/usePermissionCache.test.ts +1 -5
- package/src/hooks/usePermissionCheck.ts +150 -0
- package/src/hooks/useSecureDataAccess.test.ts +1 -5
- package/src/index.ts +1 -0
- package/src/providers/OrganisationProvider.test.tsx +1 -5
- package/src/providers/OrganisationProvider.tsx +56 -4
- package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
- package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
- package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
- package/src/providers/__tests__/EventProvider.test.tsx +211 -110
- package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
- package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
- package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
- package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
- package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
- package/src/providers/services/AuthServiceProvider.tsx +65 -0
- package/src/providers/services/EventServiceProvider.tsx +83 -0
- package/src/providers/services/InactivityServiceProvider.tsx +83 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
- package/src/providers/services/RBACServiceProvider.tsx +79 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
- package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
- package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
- package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
- package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
- package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
- package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
- package/src/rbac/api.test.ts +1 -9
- package/src/rbac/cache.test.ts +10 -8
- package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
- package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
- package/src/rbac/components/NavigationProvider.test.tsx +1 -5
- package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
- package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
- package/src/rbac/config.test.ts +1 -5
- package/src/rbac/hooks/useCan.test.ts +262 -9
- package/src/rbac/hooks/usePermissions.test.ts +246 -6
- package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
- package/src/rbac/hooks/useRBAC.test.ts +472 -198
- package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
- package/src/services/AuthService.ts +416 -0
- package/src/services/EventService.ts +366 -0
- package/src/services/InactivityService.ts +388 -0
- package/src/services/OrganisationService.ts +592 -0
- package/src/services/RBACService.ts +522 -0
- package/src/services/__tests__/AuthService.test.ts +356 -0
- package/src/services/__tests__/BaseService.test.ts +314 -0
- package/src/services/__tests__/EventService.test.ts +489 -0
- package/src/services/__tests__/InactivityService.test.ts +403 -0
- package/src/services/__tests__/OrganisationService.test.ts +660 -0
- package/src/services/__tests__/RBACService.test.ts +492 -0
- package/src/services/base/BaseService.ts +87 -0
- package/src/services/interfaces/IAuthService.ts +39 -0
- package/src/services/interfaces/IEventService.ts +30 -0
- package/src/services/interfaces/IInactivityService.ts +31 -0
- package/src/services/interfaces/IOrganisationService.ts +41 -0
- package/src/services/interfaces/IRBACService.ts +62 -0
- package/src/theming/__tests__/runtime.test.ts +540 -0
- package/src/types/__tests__/file-reference.test.ts +447 -0
- package/src/types/__tests__/organisation.test.ts +1133 -0
- package/src/types/__tests__/theme.test.ts +830 -0
- package/src/types/__tests__/type-validation.test.ts +527 -0
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
- package/src/utils/__tests__/debugLogger.test.ts +417 -0
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
- package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
- package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
- package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
- package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
- package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
- package/src/utils/appIdResolver.test.ts +6 -10
- package/src/utils/appNameResolver.simple.test.ts +142 -0
- package/src/utils/appNameResolver.test.ts +31 -458
- package/src/utils/appNameResolver.test.ts.backup +494 -0
- package/src/utils/debugLogger.ts +26 -5
- package/src/utils/formatDate.test.ts +1 -5
- package/src/utils/organisationContext.test.ts +1 -5
- package/src/utils/performanceBudgets.ts +3 -4
- package/src/utils/secureDataAccess.test.ts +1 -5
- package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
- package/dist/chunk-D7ARGIA3.js.map +0 -1
- package/dist/chunk-IPCH4YPT.js +0 -315
- package/dist/chunk-IPCH4YPT.js.map +0 -1
- package/dist/chunk-KRCRNXPD.js.map +0 -1
- package/dist/chunk-MOJXHWDE.js.map +0 -1
- package/dist/chunk-OPCWH3A4.js.map +0 -1
- package/dist/chunk-ZPG4XPV5.js.map +0 -1
- package/dist/chunk-ZPK5656W.js.map +0 -1
- package/docs/getting-started/installation.md +0 -269
- package/src/__tests__/REBUILD_PLAN.md +0 -223
- /package/dist/{DataTable-4IUY7BXB.js.map → DataTable-MPBSXUC6.js.map} +0 -0
- /package/dist/{chunk-PXWEDX7Y.js.map → chunk-2ARQW6VX.js.map} +0 -0
- /package/dist/{chunk-UYA6U6H7.js.map → chunk-Q2UP3ZWQ.js.map} +0 -0
|
@@ -90,11 +90,7 @@ describe('NavigationGuard Component', () => {
|
|
|
90
90
|
});
|
|
91
91
|
});
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
vi.restoreAllMocks();
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
describe('Rendering', () => {
|
|
93
|
+
describe('Rendering', () => {
|
|
98
94
|
it('renders children when permission is granted', async () => {
|
|
99
95
|
mockUseCan.mockReturnValue({
|
|
100
96
|
can: true,
|
|
@@ -111,7 +107,7 @@ describe('NavigationGuard Component', () => {
|
|
|
111
107
|
await waitFor(() => {
|
|
112
108
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
113
109
|
expect(screen.getByText('Navigation Link')).toBeInTheDocument();
|
|
114
|
-
});
|
|
110
|
+
}, { interval: 10 });
|
|
115
111
|
});
|
|
116
112
|
|
|
117
113
|
it('renders fallback when permission is denied', async () => {
|
|
@@ -133,7 +129,7 @@ describe('NavigationGuard Component', () => {
|
|
|
133
129
|
await waitFor(() => {
|
|
134
130
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
135
131
|
expect(screen.queryByTestId('test-component')).not.toBeInTheDocument();
|
|
136
|
-
});
|
|
132
|
+
}, { interval: 10 });
|
|
137
133
|
});
|
|
138
134
|
|
|
139
135
|
it('shows loading state during permission check', () => {
|
|
@@ -171,7 +167,7 @@ describe('NavigationGuard Component', () => {
|
|
|
171
167
|
|
|
172
168
|
await waitFor(() => {
|
|
173
169
|
expect(screen.getByText('Access Denied')).toBeInTheDocument();
|
|
174
|
-
});
|
|
170
|
+
}, { interval: 10 });
|
|
175
171
|
});
|
|
176
172
|
|
|
177
173
|
it('uses default loading when none provided', () => {
|
|
@@ -207,7 +203,7 @@ describe('NavigationGuard Component', () => {
|
|
|
207
203
|
|
|
208
204
|
await waitFor(() => {
|
|
209
205
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
210
|
-
});
|
|
206
|
+
}, { interval: 10 });
|
|
211
207
|
|
|
212
208
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
213
209
|
'user-123',
|
|
@@ -241,7 +237,7 @@ describe('NavigationGuard Component', () => {
|
|
|
241
237
|
|
|
242
238
|
await waitFor(() => {
|
|
243
239
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
244
|
-
});
|
|
240
|
+
}, { interval: 10 });
|
|
245
241
|
|
|
246
242
|
// Should check the first permission as representative
|
|
247
243
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
@@ -276,7 +272,7 @@ describe('NavigationGuard Component', () => {
|
|
|
276
272
|
|
|
277
273
|
await waitFor(() => {
|
|
278
274
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
279
|
-
});
|
|
275
|
+
}, { interval: 10 });
|
|
280
276
|
});
|
|
281
277
|
|
|
282
278
|
it('handles permission checking errors gracefully', async () => {
|
|
@@ -298,7 +294,7 @@ describe('NavigationGuard Component', () => {
|
|
|
298
294
|
|
|
299
295
|
await waitFor(() => {
|
|
300
296
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
301
|
-
});
|
|
297
|
+
}, { interval: 10 });
|
|
302
298
|
});
|
|
303
299
|
});
|
|
304
300
|
|
|
@@ -327,7 +323,7 @@ describe('NavigationGuard Component', () => {
|
|
|
327
323
|
|
|
328
324
|
await waitFor(() => {
|
|
329
325
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
330
|
-
});
|
|
326
|
+
}, { interval: 10 });
|
|
331
327
|
|
|
332
328
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
333
329
|
'user-123',
|
|
@@ -353,7 +349,7 @@ describe('NavigationGuard Component', () => {
|
|
|
353
349
|
|
|
354
350
|
await waitFor(() => {
|
|
355
351
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
356
|
-
});
|
|
352
|
+
}, { interval: 10 });
|
|
357
353
|
|
|
358
354
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
359
355
|
'user-123',
|
|
@@ -389,7 +385,7 @@ describe('NavigationGuard Component', () => {
|
|
|
389
385
|
|
|
390
386
|
await waitFor(() => {
|
|
391
387
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
392
|
-
});
|
|
388
|
+
}, { interval: 10 });
|
|
393
389
|
|
|
394
390
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
395
391
|
'user-123',
|
|
@@ -431,7 +427,7 @@ describe('NavigationGuard Component', () => {
|
|
|
431
427
|
|
|
432
428
|
await waitFor(() => {
|
|
433
429
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
434
|
-
});
|
|
430
|
+
}, { interval: 10 });
|
|
435
431
|
|
|
436
432
|
expect(mockCreateScopeFromEvent).toHaveBeenCalledWith({}, 'event-123');
|
|
437
433
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
@@ -468,7 +464,7 @@ describe('NavigationGuard Component', () => {
|
|
|
468
464
|
|
|
469
465
|
await waitFor(() => {
|
|
470
466
|
expect(screen.getByText('Checking...')).toBeInTheDocument();
|
|
471
|
-
});
|
|
467
|
+
}, { interval: 10 });
|
|
472
468
|
});
|
|
473
469
|
|
|
474
470
|
it('handles missing context gracefully', async () => {
|
|
@@ -490,7 +486,7 @@ describe('NavigationGuard Component', () => {
|
|
|
490
486
|
|
|
491
487
|
await waitFor(() => {
|
|
492
488
|
expect(screen.getByText('Checking...')).toBeInTheDocument();
|
|
493
|
-
});
|
|
489
|
+
}, { interval: 10 });
|
|
494
490
|
});
|
|
495
491
|
});
|
|
496
492
|
|
|
@@ -516,7 +512,7 @@ describe('NavigationGuard Component', () => {
|
|
|
516
512
|
|
|
517
513
|
await waitFor(() => {
|
|
518
514
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
519
|
-
});
|
|
515
|
+
}, { interval: 10 });
|
|
520
516
|
|
|
521
517
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
522
518
|
expect.stringContaining('STRICT MODE VIOLATION'),
|
|
@@ -551,7 +547,7 @@ describe('NavigationGuard Component', () => {
|
|
|
551
547
|
|
|
552
548
|
await waitFor(() => {
|
|
553
549
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
554
|
-
});
|
|
550
|
+
}, { interval: 10 });
|
|
555
551
|
|
|
556
552
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
557
553
|
expect.stringContaining('Navigation access attempt'),
|
|
@@ -587,7 +583,7 @@ describe('NavigationGuard Component', () => {
|
|
|
587
583
|
|
|
588
584
|
await waitFor(() => {
|
|
589
585
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
590
|
-
});
|
|
586
|
+
}, { interval: 10 });
|
|
591
587
|
|
|
592
588
|
expect(onDeniedSpy).toHaveBeenCalledWith(mockNavigationItem);
|
|
593
589
|
});
|
|
@@ -612,7 +608,7 @@ describe('NavigationGuard Component', () => {
|
|
|
612
608
|
|
|
613
609
|
await waitFor(() => {
|
|
614
610
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
615
|
-
});
|
|
611
|
+
}, { interval: 10 });
|
|
616
612
|
|
|
617
613
|
expect(onDeniedSpy).not.toHaveBeenCalled();
|
|
618
614
|
});
|
|
@@ -640,7 +636,7 @@ describe('NavigationGuard Component', () => {
|
|
|
640
636
|
|
|
641
637
|
await waitFor(() => {
|
|
642
638
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
643
|
-
});
|
|
639
|
+
}, { interval: 10 });
|
|
644
640
|
|
|
645
641
|
expect(consoleSpy).not.toHaveBeenCalledWith(
|
|
646
642
|
expect.stringContaining('STRICT MODE VIOLATION')
|
|
@@ -670,7 +666,7 @@ describe('NavigationGuard Component', () => {
|
|
|
670
666
|
|
|
671
667
|
await waitFor(() => {
|
|
672
668
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
673
|
-
});
|
|
669
|
+
}, { interval: 10 });
|
|
674
670
|
|
|
675
671
|
expect(consoleSpy).not.toHaveBeenCalledWith(
|
|
676
672
|
expect.stringContaining('Navigation access attempt')
|
|
@@ -697,7 +693,7 @@ describe('NavigationGuard Component', () => {
|
|
|
697
693
|
|
|
698
694
|
await waitFor(() => {
|
|
699
695
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
700
|
-
});
|
|
696
|
+
}, { interval: 10 });
|
|
701
697
|
|
|
702
698
|
// Should still check the first permission as representative
|
|
703
699
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
@@ -739,7 +735,7 @@ describe('NavigationGuard Component', () => {
|
|
|
739
735
|
|
|
740
736
|
await waitFor(() => {
|
|
741
737
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
742
|
-
});
|
|
738
|
+
}, { interval: 10 });
|
|
743
739
|
|
|
744
740
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
745
741
|
'',
|
|
@@ -772,7 +768,7 @@ describe('NavigationGuard Component', () => {
|
|
|
772
768
|
|
|
773
769
|
await waitFor(() => {
|
|
774
770
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
775
|
-
});
|
|
771
|
+
}, { interval: 10 });
|
|
776
772
|
});
|
|
777
773
|
});
|
|
778
774
|
|
|
@@ -803,7 +799,7 @@ describe('NavigationGuard Component', () => {
|
|
|
803
799
|
|
|
804
800
|
await waitFor(() => {
|
|
805
801
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
806
|
-
});
|
|
802
|
+
}, { interval: 10 });
|
|
807
803
|
|
|
808
804
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
809
805
|
'user-123',
|
|
@@ -837,7 +833,7 @@ describe('NavigationGuard Component', () => {
|
|
|
837
833
|
|
|
838
834
|
await waitFor(() => {
|
|
839
835
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
840
|
-
});
|
|
836
|
+
}, { interval: 10 });
|
|
841
837
|
});
|
|
842
838
|
});
|
|
843
839
|
});
|
|
@@ -104,11 +104,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
104
104
|
});
|
|
105
105
|
});
|
|
106
106
|
|
|
107
|
-
|
|
108
|
-
vi.restoreAllMocks();
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
describe('Rendering', () => {
|
|
107
|
+
describe('Rendering', () => {
|
|
112
108
|
it('renders children when permission is granted', async () => {
|
|
113
109
|
mockUseCan.mockReturnValue({
|
|
114
110
|
can: true,
|
|
@@ -128,7 +124,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
128
124
|
await waitFor(() => {
|
|
129
125
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
130
126
|
expect(screen.getByText('Protected Page')).toBeInTheDocument();
|
|
131
|
-
});
|
|
127
|
+
}, { interval: 10 });
|
|
132
128
|
});
|
|
133
129
|
|
|
134
130
|
it('renders fallback when permission is denied', async () => {
|
|
@@ -151,7 +147,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
151
147
|
await waitFor(() => {
|
|
152
148
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
153
149
|
expect(screen.queryByTestId('test-component')).not.toBeInTheDocument();
|
|
154
|
-
});
|
|
150
|
+
}, { interval: 10 });
|
|
155
151
|
});
|
|
156
152
|
|
|
157
153
|
it('shows loading state during permission check', () => {
|
|
@@ -194,7 +190,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
194
190
|
await waitFor(() => {
|
|
195
191
|
expect(screen.getByText('Access Denied')).toBeInTheDocument();
|
|
196
192
|
expect(screen.getByText('You don\'t have permission to access this page.')).toBeInTheDocument();
|
|
197
|
-
});
|
|
193
|
+
}, { interval: 10 });
|
|
198
194
|
});
|
|
199
195
|
|
|
200
196
|
it('uses default loading when none provided', () => {
|
|
@@ -236,7 +232,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
236
232
|
|
|
237
233
|
await waitFor(() => {
|
|
238
234
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
239
|
-
});
|
|
235
|
+
}, { interval: 10 });
|
|
240
236
|
|
|
241
237
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
242
238
|
'user-123',
|
|
@@ -272,7 +268,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
272
268
|
|
|
273
269
|
await waitFor(() => {
|
|
274
270
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
275
|
-
});
|
|
271
|
+
}, { interval: 10 });
|
|
276
272
|
|
|
277
273
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
278
274
|
'user-123',
|
|
@@ -310,7 +306,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
310
306
|
|
|
311
307
|
await waitFor(() => {
|
|
312
308
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
313
|
-
});
|
|
309
|
+
}, { interval: 10 });
|
|
314
310
|
|
|
315
311
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
316
312
|
'user-123',
|
|
@@ -348,7 +344,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
348
344
|
|
|
349
345
|
await waitFor(() => {
|
|
350
346
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
351
|
-
});
|
|
347
|
+
}, { interval: 10 });
|
|
352
348
|
});
|
|
353
349
|
});
|
|
354
350
|
|
|
@@ -371,7 +367,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
371
367
|
|
|
372
368
|
await waitFor(() => {
|
|
373
369
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
374
|
-
});
|
|
370
|
+
}, { interval: 10 });
|
|
375
371
|
|
|
376
372
|
expect(mockGetCurrentAppName).toHaveBeenCalled();
|
|
377
373
|
});
|
|
@@ -393,6 +389,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
393
389
|
<PagePermissionGuard
|
|
394
390
|
pageName={mockPageName}
|
|
395
391
|
operation={mockOperation}
|
|
392
|
+
scope={mockScope}
|
|
396
393
|
>
|
|
397
394
|
<TestComponent>Protected Page</TestComponent>
|
|
398
395
|
</PagePermissionGuard>
|
|
@@ -400,7 +397,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
400
397
|
|
|
401
398
|
await waitFor(() => {
|
|
402
399
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
403
|
-
});
|
|
400
|
+
}, { interval: 10 });
|
|
404
401
|
|
|
405
402
|
// Restore NODE_ENV
|
|
406
403
|
process.env.NODE_ENV = originalEnv;
|
|
@@ -424,7 +421,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
424
421
|
|
|
425
422
|
await waitFor(() => {
|
|
426
423
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
427
|
-
});
|
|
424
|
+
}, { interval: 10 });
|
|
428
425
|
|
|
429
426
|
// Restore environment
|
|
430
427
|
vi.unstubAllEnvs();
|
|
@@ -470,7 +467,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
470
467
|
|
|
471
468
|
await waitFor(() => {
|
|
472
469
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
473
|
-
});
|
|
470
|
+
}, { interval: 10 });
|
|
474
471
|
|
|
475
472
|
// Restore NODE_ENV
|
|
476
473
|
process.env.NODE_ENV = originalEnv;
|
|
@@ -503,7 +500,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
503
500
|
|
|
504
501
|
await waitFor(() => {
|
|
505
502
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
506
|
-
});
|
|
503
|
+
}, { interval: 10 });
|
|
507
504
|
|
|
508
505
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
509
506
|
'user-123',
|
|
@@ -532,7 +529,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
532
529
|
|
|
533
530
|
await waitFor(() => {
|
|
534
531
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
535
|
-
});
|
|
532
|
+
}, { interval: 10 });
|
|
536
533
|
|
|
537
534
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
538
535
|
'user-123',
|
|
@@ -585,7 +582,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
585
582
|
|
|
586
583
|
await waitFor(() => {
|
|
587
584
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
588
|
-
});
|
|
585
|
+
}, { interval: 10 });
|
|
589
586
|
|
|
590
587
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
591
588
|
'user-123',
|
|
@@ -644,7 +641,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
644
641
|
|
|
645
642
|
await waitFor(() => {
|
|
646
643
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
647
|
-
});
|
|
644
|
+
}, { interval: 10 });
|
|
648
645
|
|
|
649
646
|
expect(mockCreateScopeFromEvent).toHaveBeenCalledWith(
|
|
650
647
|
expect.any(Object),
|
|
@@ -686,7 +683,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
686
683
|
|
|
687
684
|
await waitFor(() => {
|
|
688
685
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
689
|
-
});
|
|
686
|
+
}, { interval: 10 });
|
|
690
687
|
});
|
|
691
688
|
|
|
692
689
|
it('handles missing context gracefully', async () => {
|
|
@@ -709,7 +706,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
709
706
|
|
|
710
707
|
await waitFor(() => {
|
|
711
708
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
712
|
-
});
|
|
709
|
+
}, { interval: 10 });
|
|
713
710
|
});
|
|
714
711
|
});
|
|
715
712
|
|
|
@@ -736,7 +733,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
736
733
|
|
|
737
734
|
await waitFor(() => {
|
|
738
735
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
739
|
-
});
|
|
736
|
+
}, { interval: 10 });
|
|
740
737
|
|
|
741
738
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
742
739
|
expect.stringContaining('STRICT MODE VIOLATION'),
|
|
@@ -772,7 +769,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
772
769
|
|
|
773
770
|
await waitFor(() => {
|
|
774
771
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
775
|
-
});
|
|
772
|
+
}, { interval: 10 });
|
|
776
773
|
|
|
777
774
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
778
775
|
expect.stringContaining('Page access attempt'),
|
|
@@ -809,7 +806,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
809
806
|
|
|
810
807
|
await waitFor(() => {
|
|
811
808
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
812
|
-
});
|
|
809
|
+
}, { interval: 10 });
|
|
813
810
|
|
|
814
811
|
expect(onDeniedSpy).toHaveBeenCalledWith(mockPageName, mockOperation);
|
|
815
812
|
});
|
|
@@ -835,7 +832,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
835
832
|
|
|
836
833
|
await waitFor(() => {
|
|
837
834
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
838
|
-
});
|
|
835
|
+
}, { interval: 10 });
|
|
839
836
|
|
|
840
837
|
expect(onDeniedSpy).not.toHaveBeenCalled();
|
|
841
838
|
});
|
|
@@ -864,7 +861,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
864
861
|
|
|
865
862
|
await waitFor(() => {
|
|
866
863
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
867
|
-
});
|
|
864
|
+
}, { interval: 10 });
|
|
868
865
|
|
|
869
866
|
expect(consoleSpy).not.toHaveBeenCalledWith(
|
|
870
867
|
expect.stringContaining('STRICT MODE VIOLATION')
|
|
@@ -895,7 +892,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
895
892
|
|
|
896
893
|
await waitFor(() => {
|
|
897
894
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
898
|
-
});
|
|
895
|
+
}, { interval: 10 });
|
|
899
896
|
|
|
900
897
|
expect(consoleSpy).not.toHaveBeenCalledWith(
|
|
901
898
|
expect.stringContaining('Page access attempt')
|
|
@@ -945,7 +942,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
945
942
|
|
|
946
943
|
await waitFor(() => {
|
|
947
944
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
948
|
-
});
|
|
945
|
+
}, { interval: 10 });
|
|
949
946
|
|
|
950
947
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
951
948
|
'',
|
|
@@ -997,7 +994,7 @@ describe('PagePermissionGuard Component', () => {
|
|
|
997
994
|
|
|
998
995
|
await waitFor(() => {
|
|
999
996
|
expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
|
|
1000
|
-
});
|
|
997
|
+
}, { interval: 10 });
|
|
1001
998
|
|
|
1002
999
|
// Restore NODE_ENV
|
|
1003
1000
|
process.env.NODE_ENV = originalEnv;
|
|
@@ -82,11 +82,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
82
82
|
});
|
|
83
83
|
});
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
vi.restoreAllMocks();
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
describe('Rendering', () => {
|
|
85
|
+
describe('Rendering', () => {
|
|
90
86
|
it('renders children when permission is granted', async () => {
|
|
91
87
|
mockUseCan.mockReturnValue({
|
|
92
88
|
can: true,
|
|
@@ -106,7 +102,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
106
102
|
await waitFor(() => {
|
|
107
103
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
108
104
|
expect(screen.getByText('Protected Content')).toBeInTheDocument();
|
|
109
|
-
});
|
|
105
|
+
}, { interval: 10 });
|
|
110
106
|
});
|
|
111
107
|
|
|
112
108
|
it('renders fallback when permission is denied', async () => {
|
|
@@ -129,7 +125,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
129
125
|
await waitFor(() => {
|
|
130
126
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
131
127
|
expect(screen.queryByTestId('test-component')).not.toBeInTheDocument();
|
|
132
|
-
});
|
|
128
|
+
}, { interval: 10 });
|
|
133
129
|
});
|
|
134
130
|
|
|
135
131
|
it('shows loading state during permission check', () => {
|
|
@@ -172,7 +168,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
172
168
|
await waitFor(() => {
|
|
173
169
|
expect(screen.getByText('Access Denied')).toBeInTheDocument();
|
|
174
170
|
expect(screen.getByText('You don\'t have permission to perform this operation.')).toBeInTheDocument();
|
|
175
|
-
});
|
|
171
|
+
}, { interval: 10 });
|
|
176
172
|
});
|
|
177
173
|
|
|
178
174
|
it('uses default loading when none provided', () => {
|
|
@@ -216,7 +212,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
216
212
|
|
|
217
213
|
await waitFor(() => {
|
|
218
214
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
219
|
-
});
|
|
215
|
+
}, { interval: 10 });
|
|
220
216
|
|
|
221
217
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
222
218
|
'user-123',
|
|
@@ -249,7 +245,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
249
245
|
|
|
250
246
|
await waitFor(() => {
|
|
251
247
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
252
|
-
});
|
|
248
|
+
}, { interval: 10 });
|
|
253
249
|
|
|
254
250
|
// Should check the first permission as representative
|
|
255
251
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
@@ -284,7 +280,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
284
280
|
|
|
285
281
|
await waitFor(() => {
|
|
286
282
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
287
|
-
});
|
|
283
|
+
}, { interval: 10 });
|
|
288
284
|
});
|
|
289
285
|
|
|
290
286
|
it('handles empty permissions array', async () => {
|
|
@@ -305,7 +301,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
305
301
|
|
|
306
302
|
await waitFor(() => {
|
|
307
303
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
308
|
-
});
|
|
304
|
+
}, { interval: 10 });
|
|
309
305
|
});
|
|
310
306
|
});
|
|
311
307
|
|
|
@@ -335,7 +331,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
335
331
|
|
|
336
332
|
await waitFor(() => {
|
|
337
333
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
338
|
-
});
|
|
334
|
+
}, { interval: 10 });
|
|
339
335
|
|
|
340
336
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
341
337
|
'user-123',
|
|
@@ -364,7 +360,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
364
360
|
|
|
365
361
|
await waitFor(() => {
|
|
366
362
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
367
|
-
});
|
|
363
|
+
}, { interval: 10 });
|
|
368
364
|
|
|
369
365
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
370
366
|
'user-123',
|
|
@@ -403,7 +399,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
403
399
|
|
|
404
400
|
await waitFor(() => {
|
|
405
401
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
406
|
-
});
|
|
402
|
+
}, { interval: 10 });
|
|
407
403
|
|
|
408
404
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
409
405
|
'user-123',
|
|
@@ -448,7 +444,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
448
444
|
|
|
449
445
|
await waitFor(() => {
|
|
450
446
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
451
|
-
});
|
|
447
|
+
}, { interval: 10 });
|
|
452
448
|
|
|
453
449
|
expect(mockCreateScopeFromEvent).toHaveBeenCalledWith({}, 'event-123');
|
|
454
450
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
@@ -486,7 +482,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
486
482
|
|
|
487
483
|
await waitFor(() => {
|
|
488
484
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
489
|
-
});
|
|
485
|
+
}, { interval: 10 });
|
|
490
486
|
});
|
|
491
487
|
|
|
492
488
|
it('handles missing context gracefully', async () => {
|
|
@@ -509,7 +505,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
509
505
|
|
|
510
506
|
await waitFor(() => {
|
|
511
507
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
512
|
-
});
|
|
508
|
+
}, { interval: 10 });
|
|
513
509
|
});
|
|
514
510
|
});
|
|
515
511
|
|
|
@@ -536,7 +532,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
536
532
|
|
|
537
533
|
await waitFor(() => {
|
|
538
534
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
539
|
-
});
|
|
535
|
+
}, { interval: 10 });
|
|
540
536
|
|
|
541
537
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
542
538
|
expect.stringContaining('STRICT MODE VIOLATION'),
|
|
@@ -572,7 +568,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
572
568
|
|
|
573
569
|
await waitFor(() => {
|
|
574
570
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
575
|
-
});
|
|
571
|
+
}, { interval: 10 });
|
|
576
572
|
|
|
577
573
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
578
574
|
expect.stringContaining('Permission check attempt'),
|
|
@@ -609,7 +605,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
609
605
|
|
|
610
606
|
await waitFor(() => {
|
|
611
607
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
612
|
-
});
|
|
608
|
+
}, { interval: 10 });
|
|
613
609
|
|
|
614
610
|
expect(onDeniedSpy).toHaveBeenCalledWith(mockPermissions, mockOperation);
|
|
615
611
|
});
|
|
@@ -635,7 +631,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
635
631
|
|
|
636
632
|
await waitFor(() => {
|
|
637
633
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
638
|
-
});
|
|
634
|
+
}, { interval: 10 });
|
|
639
635
|
|
|
640
636
|
expect(onDeniedSpy).not.toHaveBeenCalled();
|
|
641
637
|
});
|
|
@@ -664,7 +660,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
664
660
|
|
|
665
661
|
await waitFor(() => {
|
|
666
662
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
667
|
-
});
|
|
663
|
+
}, { interval: 10 });
|
|
668
664
|
|
|
669
665
|
expect(consoleSpy).not.toHaveBeenCalledWith(
|
|
670
666
|
expect.stringContaining('STRICT MODE VIOLATION')
|
|
@@ -695,7 +691,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
695
691
|
|
|
696
692
|
await waitFor(() => {
|
|
697
693
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
698
|
-
});
|
|
694
|
+
}, { interval: 10 });
|
|
699
695
|
|
|
700
696
|
expect(consoleSpy).not.toHaveBeenCalledWith(
|
|
701
697
|
expect.stringContaining('Permission check attempt')
|
|
@@ -723,7 +719,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
723
719
|
|
|
724
720
|
await waitFor(() => {
|
|
725
721
|
expect(screen.getByTestId('test-component')).toBeInTheDocument();
|
|
726
|
-
});
|
|
722
|
+
}, { interval: 10 });
|
|
727
723
|
|
|
728
724
|
// Should still check the first permission as representative
|
|
729
725
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
@@ -766,7 +762,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
766
762
|
|
|
767
763
|
await waitFor(() => {
|
|
768
764
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
769
|
-
});
|
|
765
|
+
}, { interval: 10 });
|
|
770
766
|
|
|
771
767
|
expect(mockUseCan).toHaveBeenCalledWith(
|
|
772
768
|
'',
|
|
@@ -800,7 +796,7 @@ describe('PermissionEnforcer Component', () => {
|
|
|
800
796
|
|
|
801
797
|
await waitFor(() => {
|
|
802
798
|
expect(screen.getByTestId('test-fallback')).toBeInTheDocument();
|
|
803
|
-
});
|
|
799
|
+
}, { interval: 10 });
|
|
804
800
|
});
|
|
805
801
|
});
|
|
806
802
|
});
|