@jmruthers/pace-core 0.5.136 → 0.5.139
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-CYOHOX3O.js → DataTable-JXFCA2BJ.js} +10 -9
- package/dist/{EventLogo-801uofbR.d.ts → EventLogo-rFL_kRjk.d.ts} +73 -1
- package/dist/{UnifiedAuthProvider-5E5TUNMS.js → UnifiedAuthProvider-XIQQ7LVU.js} +4 -5
- package/dist/{chunk-YLKIDTUK.js → chunk-22WKWKRX.js} +4 -4
- package/dist/{chunk-TVYPTYOY.js → chunk-4C7EXCAR.js} +60 -24
- package/dist/chunk-4C7EXCAR.js.map +1 -0
- package/dist/{chunk-NOHEVYVX.js → chunk-5JMOHWDI.js} +417 -319
- package/dist/chunk-5JMOHWDI.js.map +1 -0
- package/dist/{chunk-FHWWBIHA.js → chunk-6DXZ6V5Q.js} +5 -5
- package/dist/{chunk-2TWNJ46Y.js → chunk-6LAAY47Q.js} +2 -2
- package/dist/{chunk-444EZN6N.js → chunk-7QCC6MCP.js} +88 -1
- package/dist/chunk-7QCC6MCP.js.map +1 -0
- package/dist/chunk-BJPBT3CU.js +21 -0
- package/dist/chunk-BJPBT3CU.js.map +1 -0
- package/dist/{chunk-L6PGMCMD.js → chunk-BOOI7GK2.js} +38 -12
- package/dist/chunk-BOOI7GK2.js.map +1 -0
- package/dist/{chunk-XARJS7CD.js → chunk-INQLMHPF.js} +2 -2
- package/dist/chunk-JISYG63F.js +70 -0
- package/dist/chunk-JISYG63F.js.map +1 -0
- package/dist/{chunk-SL2YQDR6.js → chunk-MA6EPSGZ.js} +2 -2
- package/dist/{chunk-5DPZ5EAT.js → chunk-OWAG3GSU.js} +1 -3
- package/dist/{chunk-LTV3XIJJ.js → chunk-T6JN6LH6.js} +4 -4
- package/dist/{chunk-HJGGOMQ6.js → chunk-TLT2ZR3L.js} +147 -103
- package/dist/chunk-TLT2ZR3L.js.map +1 -0
- package/dist/{chunk-4MT5BGGL.js → chunk-YCWDTTUK.js} +4 -6
- package/dist/{chunk-4MT5BGGL.js.map → chunk-YCWDTTUK.js.map} +1 -1
- package/dist/components.d.ts +1 -1
- package/dist/components.js +12 -11
- package/dist/components.js.map +1 -1
- package/dist/hooks.js +8 -9
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +15 -14
- package/dist/index.js.map +1 -1
- package/dist/providers.js +3 -4
- package/dist/rbac/index.js +8 -9
- package/dist/schema-DTDZQe2u.d.ts +28 -0
- package/dist/types.d.ts +152 -3
- package/dist/types.js +51 -16
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +89 -4
- package/dist/utils.js +214 -96
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +1 -343
- package/dist/validation.js +3 -100
- 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/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +27 -0
- 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/DataRecord.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/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.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/ProtectedRouteProps.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 +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.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 +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/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.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 +84 -15
- package/docs/architecture/README.md +0 -1
- package/docs/styles/README.md +0 -2
- package/examples/RBAC/CompleteRBACExample.tsx +324 -0
- package/examples/RBAC/EventBasedApp.tsx +239 -0
- package/examples/RBAC/PermissionExample.tsx +151 -0
- package/examples/RBAC/index.ts +13 -0
- package/examples/public-pages/CorrectPublicPageImplementation.tsx +301 -0
- package/examples/public-pages/PublicEventPage.tsx +274 -0
- package/examples/public-pages/PublicPageApp.tsx +308 -0
- package/examples/public-pages/PublicPageUsageExample.tsx +216 -0
- package/examples/public-pages/index.ts +14 -0
- package/package.json +1 -10
- package/src/__tests__/TEST_STANDARD.md +92 -0
- package/src/components/Badge/Badge.test.tsx +314 -0
- package/src/components/Badge/Badge.tsx +304 -0
- package/src/components/Badge/index.ts +3 -0
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
- package/src/components/DataTable/__tests__/styles.test.ts +1 -1
- package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
- package/src/components/DataTable/components/DataTableBody.tsx +461 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
- package/src/components/DataTable/components/FilterRow.tsx +9 -3
- package/src/components/DataTable/components/PaginationControls.tsx +1 -0
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
- package/src/components/DataTable/core/ActionManager.ts +235 -0
- package/src/components/DataTable/core/ColumnManager.ts +205 -0
- package/src/components/DataTable/core/DataManager.ts +188 -0
- package/src/components/DataTable/core/DataTableContext.tsx +181 -0
- package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
- package/src/components/DataTable/core/PluginRegistry.ts +229 -0
- package/src/components/DataTable/core/StateManager.ts +311 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/styles.ts +27 -6
- package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
- package/src/components/DataTable/utils/columnUtils.ts +40 -0
- package/src/components/DataTable/utils/debugTools.ts +609 -0
- package/src/components/DataTable/utils/index.ts +1 -0
- package/src/components/Dialog/README.md +804 -0
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +611 -0
- package/src/components/Dialog/utils/safeHtml.ts +185 -0
- package/src/components/Footer/Footer.test.tsx +1 -1
- package/src/components/Form/Form.test.tsx +1 -1
- package/src/components/Form/FormErrorSummary.tsx +113 -0
- package/src/components/Form/FormFieldset.tsx +127 -0
- package/src/components/Form/FormLiveRegion.tsx +198 -0
- package/src/components/LoginForm/LoginForm.test.tsx +1 -1
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +1 -1
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +597 -0
- package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
- package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
- package/src/components/Select/Select.test.tsx +1 -1
- package/src/components/Select/Select.tsx +20 -8
- package/src/components/Table/__tests__/Table.test.tsx +1 -1
- package/src/components/index.ts +3 -0
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
- package/src/index.ts +4 -0
- package/src/rbac/hooks/useCan.test.ts +24 -0
- package/src/rbac/hooks/usePermissions.ts +49 -12
- package/src/styles/core.css +3 -0
- package/src/utils/appConfig.ts +47 -0
- package/src/utils/appIdResolver.test.ts +499 -0
- package/src/utils/appIdResolver.ts +130 -0
- package/src/utils/appNameResolver.simple.test.ts +212 -0
- package/src/utils/appNameResolver.test.ts +121 -0
- package/src/utils/appNameResolver.ts +191 -0
- package/src/utils/audit.ts +127 -0
- package/src/utils/auth-utils.ts +96 -0
- package/src/utils/bundleAnalysis.ts +129 -0
- package/src/utils/cn.ts +7 -0
- package/src/utils/debugLogger.ts +67 -0
- package/src/utils/deviceFingerprint.ts +215 -0
- package/src/utils/dynamicUtils.ts +105 -0
- package/src/utils/file-reference.test.ts +788 -0
- package/src/utils/file-reference.ts +519 -0
- package/src/utils/formatDate.test.ts +237 -0
- package/src/utils/formatting.ts +133 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/lazyLoad.tsx +44 -0
- package/src/utils/logger.ts +179 -0
- package/src/utils/organisationContext.test.ts +322 -0
- package/src/utils/organisationContext.ts +153 -0
- package/src/utils/performanceBenchmark.ts +64 -0
- package/src/utils/performanceBudgets.ts +110 -0
- package/src/utils/permissionTypes.ts +37 -0
- package/src/utils/permissionUtils.test.ts +393 -0
- package/src/utils/permissionUtils.ts +34 -0
- package/src/utils/sanitization.ts +264 -0
- package/src/utils/schemaUtils.ts +37 -0
- package/src/utils/secureDataAccess.test.ts +711 -0
- package/src/utils/secureDataAccess.ts +377 -0
- package/src/utils/secureErrors.ts +79 -0
- package/src/utils/secureStorage.ts +244 -0
- package/src/utils/security.ts +156 -0
- package/src/utils/securityMonitor.ts +45 -0
- package/src/utils/sessionTracking.ts +126 -0
- package/src/utils/validation.ts +111 -0
- package/src/utils/validationUtils.ts +120 -0
- package/src/validation/index.ts +2 -2
- package/dist/chunk-444EZN6N.js.map +0 -1
- package/dist/chunk-APIBCTL2.js +0 -670
- package/dist/chunk-APIBCTL2.js.map +0 -1
- package/dist/chunk-HJGGOMQ6.js.map +0 -1
- package/dist/chunk-K2WWTH7O.js +0 -94
- package/dist/chunk-K2WWTH7O.js.map +0 -1
- package/dist/chunk-L6PGMCMD.js.map +0 -1
- package/dist/chunk-LMC26NLJ.js +0 -84
- package/dist/chunk-LMC26NLJ.js.map +0 -1
- package/dist/chunk-NOHEVYVX.js.map +0 -1
- package/dist/chunk-TVYPTYOY.js.map +0 -1
- package/dist/validation-8npbysjg.d.ts +0 -177
- /package/dist/{DataTable-CYOHOX3O.js.map → DataTable-JXFCA2BJ.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-5E5TUNMS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
- /package/dist/{chunk-YLKIDTUK.js.map → chunk-22WKWKRX.js.map} +0 -0
- /package/dist/{chunk-FHWWBIHA.js.map → chunk-6DXZ6V5Q.js.map} +0 -0
- /package/dist/{chunk-2TWNJ46Y.js.map → chunk-6LAAY47Q.js.map} +0 -0
- /package/dist/{chunk-XARJS7CD.js.map → chunk-INQLMHPF.js.map} +0 -0
- /package/dist/{chunk-SL2YQDR6.js.map → chunk-MA6EPSGZ.js.map} +0 -0
- /package/dist/{chunk-5DPZ5EAT.js.map → chunk-OWAG3GSU.js.map} +0 -0
- /package/dist/{chunk-LTV3XIJJ.js.map → chunk-T6JN6LH6.js.map} +0 -0
- /package/examples/{components → components 2}/DataTable/HierarchicalActionsExample.tsx +0 -0
- /package/examples/{components → components 2}/DataTable/HierarchicalExample.tsx +0 -0
- /package/examples/{components → components 2}/DataTable/InitialPageSizeExample.tsx +0 -0
- /package/examples/{components → components 2}/DataTable/PerformanceExample.tsx +0 -0
- /package/examples/{components → components 2}/DataTable/index.ts +0 -0
- /package/examples/{components → components 2}/Dialog/BasicHtmlTest.tsx +0 -0
- /package/examples/{components → components 2}/Dialog/DebugHtmlExample.tsx +0 -0
- /package/examples/{components → components 2}/Dialog/HtmlDialogExample.tsx +0 -0
- /package/examples/{components → components 2}/Dialog/ScrollableDialogExample.tsx +0 -0
- /package/examples/{components → components 2}/Dialog/SimpleHtmlTest.tsx +0 -0
- /package/examples/{components → components 2}/Dialog/SmartDialogExample.tsx +0 -0
- /package/examples/{components → components 2}/Dialog/index.ts +0 -0
- /package/examples/{components → components 2}/index.ts +0 -0
|
@@ -216,6 +216,9 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
216
216
|
);
|
|
217
217
|
|
|
218
218
|
// Performance thresholds
|
|
219
|
+
// NOTE: These thresholds are used for smoke tests to detect significant regressions.
|
|
220
|
+
// They are intentionally generous to avoid flakiness in CI/coverage environments.
|
|
221
|
+
// For more reliable performance testing, prefer behavioral assertions (waitFor) over timing.
|
|
219
222
|
const PERFORMANCE_THRESHOLDS = {
|
|
220
223
|
RENDER_TIME: 200, // ms - Increased due to migration changes requiring more complex organization loading
|
|
221
224
|
PERMISSION_CHECK_TIME: 110, // ms - Increased to account for timing variations
|
|
@@ -223,6 +226,9 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
223
226
|
RE_RENDER_COUNT: 3
|
|
224
227
|
};
|
|
225
228
|
|
|
229
|
+
// Skip performance timing tests in coverage mode (they're unreliable under instrumentation)
|
|
230
|
+
const shouldSkipTimingTests = process.env.COVERAGE === 'true' || process.env.VITEST_COVERAGE;
|
|
231
|
+
|
|
226
232
|
const originalPerformanceMemory = (performance as any).memory;
|
|
227
233
|
|
|
228
234
|
describe('PaceAppLayout Performance', () => {
|
|
@@ -336,7 +342,13 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
336
342
|
});
|
|
337
343
|
|
|
338
344
|
// Since we're only measuring after mount, the time should be very small
|
|
339
|
-
|
|
345
|
+
// Skip timing assertion in coverage mode (unreliable under instrumentation)
|
|
346
|
+
if (!shouldSkipTimingTests) {
|
|
347
|
+
expect(permissionCheckTime).toBeLessThan(PERFORMANCE_THRESHOLDS.PERMISSION_CHECK_TIME);
|
|
348
|
+
} else {
|
|
349
|
+
// In coverage mode, just verify the component rendered successfully
|
|
350
|
+
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
351
|
+
}
|
|
340
352
|
}, { timeout: 6000 });
|
|
341
353
|
|
|
342
354
|
it('handles multiple permission checks efficiently', async () => {
|
|
@@ -381,7 +393,13 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
381
393
|
});
|
|
382
394
|
|
|
383
395
|
// Since we're only measuring after mount, the time should be very small
|
|
384
|
-
|
|
396
|
+
// Skip timing assertion in coverage mode (unreliable under instrumentation)
|
|
397
|
+
if (!shouldSkipTimingTests) {
|
|
398
|
+
expect(permissionCheckTime).toBeLessThan(PERFORMANCE_THRESHOLDS.PERMISSION_CHECK_TIME);
|
|
399
|
+
} else {
|
|
400
|
+
// In coverage mode, just verify the component rendered successfully
|
|
401
|
+
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
402
|
+
}
|
|
385
403
|
}, { timeout: 6000 });
|
|
386
404
|
|
|
387
405
|
it('handles permission check errors efficiently', async () => {
|
|
@@ -427,7 +445,12 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
427
445
|
const memoryIncrease = finalMemory - initialMemory;
|
|
428
446
|
|
|
429
447
|
if (initialMemory > 0 && finalMemory > 0) {
|
|
430
|
-
|
|
448
|
+
// Skip memory assertions in coverage mode (unreliable under instrumentation)
|
|
449
|
+
if (!shouldSkipTimingTests) {
|
|
450
|
+
expect(memoryIncrease).toBeLessThan(PERFORMANCE_THRESHOLDS.MEMORY_USAGE_INCREASE);
|
|
451
|
+
}
|
|
452
|
+
// Always verify component still renders correctly (behavioral check)
|
|
453
|
+
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
431
454
|
}
|
|
432
455
|
});
|
|
433
456
|
|
|
@@ -450,7 +473,12 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
450
473
|
const memoryIncrease = finalMemory - initialMemory;
|
|
451
474
|
|
|
452
475
|
if (initialMemory > 0 && finalMemory > 0) {
|
|
453
|
-
|
|
476
|
+
// Skip memory assertions in coverage mode (unreliable under instrumentation)
|
|
477
|
+
if (!shouldSkipTimingTests) {
|
|
478
|
+
expect(memoryIncrease).toBeLessThan(PERFORMANCE_THRESHOLDS.MEMORY_USAGE_INCREASE);
|
|
479
|
+
}
|
|
480
|
+
// Always verify component still renders correctly (behavioral check)
|
|
481
|
+
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
454
482
|
}
|
|
455
483
|
});
|
|
456
484
|
});
|
|
@@ -482,7 +510,13 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
482
510
|
const totalTime = endTime - startTime;
|
|
483
511
|
const averageTime = totalTime / PERFORMANCE_THRESHOLDS.RE_RENDER_COUNT;
|
|
484
512
|
|
|
485
|
-
|
|
513
|
+
// Skip timing assertion in coverage mode (unreliable under instrumentation)
|
|
514
|
+
if (!shouldSkipTimingTests) {
|
|
515
|
+
expect(averageTime).toBeLessThan(PERFORMANCE_THRESHOLDS.RENDER_TIME);
|
|
516
|
+
} else {
|
|
517
|
+
// In coverage mode, verify component renders successfully (behavioral check)
|
|
518
|
+
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
519
|
+
}
|
|
486
520
|
});
|
|
487
521
|
|
|
488
522
|
it('handles permission enforcement toggles efficiently', async () => {
|
|
@@ -529,7 +563,13 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
529
563
|
return tick;
|
|
530
564
|
});
|
|
531
565
|
|
|
532
|
-
|
|
566
|
+
// Skip timing assertion in coverage mode (unreliable under instrumentation)
|
|
567
|
+
if (!shouldSkipTimingTests) {
|
|
568
|
+
expect(totalTime).toBeLessThan(PERFORMANCE_THRESHOLDS.PERMISSION_CHECK_TIME);
|
|
569
|
+
} else {
|
|
570
|
+
// In coverage mode, verify component rendered successfully (behavioral check)
|
|
571
|
+
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
572
|
+
}
|
|
533
573
|
});
|
|
534
574
|
});
|
|
535
575
|
|
|
@@ -554,7 +594,13 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
554
594
|
const endTime = performance.now();
|
|
555
595
|
const renderTime = endTime - startTime;
|
|
556
596
|
|
|
557
|
-
|
|
597
|
+
// Skip timing assertion in coverage mode (unreliable under instrumentation)
|
|
598
|
+
if (!shouldSkipTimingTests) {
|
|
599
|
+
expect(renderTime).toBeLessThan(PERFORMANCE_THRESHOLDS.RENDER_TIME);
|
|
600
|
+
} else {
|
|
601
|
+
// In coverage mode, verify component renders successfully (behavioral check)
|
|
602
|
+
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
603
|
+
}
|
|
558
604
|
|
|
559
605
|
// Rapidly click navigation buttons
|
|
560
606
|
// If not, this test will fail.
|
|
@@ -642,7 +688,14 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
642
688
|
return tick;
|
|
643
689
|
});
|
|
644
690
|
|
|
645
|
-
|
|
691
|
+
// Skip timing assertion in coverage mode (unreliable under instrumentation)
|
|
692
|
+
if (!shouldSkipTimingTests) {
|
|
693
|
+
expect(authTime).toBeLessThan(PERFORMANCE_THRESHOLDS.PERMISSION_CHECK_TIME);
|
|
694
|
+
} else {
|
|
695
|
+
// In coverage mode, verify actions completed successfully (behavioral check)
|
|
696
|
+
expect(mockSignOut).toHaveBeenCalled();
|
|
697
|
+
expect(mockUpdatePassword).toHaveBeenCalledWith('newpassword123');
|
|
698
|
+
}
|
|
646
699
|
expect(mockSignOut).toHaveBeenCalled();
|
|
647
700
|
expect(mockUpdatePassword).toHaveBeenCalledWith('newpassword123');
|
|
648
701
|
});
|
|
@@ -692,7 +745,14 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
692
745
|
return tick;
|
|
693
746
|
});
|
|
694
747
|
|
|
695
|
-
|
|
748
|
+
// Skip timing assertion in coverage mode (unreliable under instrumentation)
|
|
749
|
+
if (!shouldSkipTimingTests) {
|
|
750
|
+
expect(authTime).toBeLessThan(PERFORMANCE_THRESHOLDS.PERMISSION_CHECK_TIME);
|
|
751
|
+
} else {
|
|
752
|
+
// In coverage mode, verify actions completed successfully (behavioral check)
|
|
753
|
+
expect(mockSignOut).toHaveBeenCalled();
|
|
754
|
+
expect(mockUpdatePassword).toHaveBeenCalledWith('newpassword123');
|
|
755
|
+
}
|
|
696
756
|
});
|
|
697
757
|
});
|
|
698
758
|
|
|
@@ -760,7 +820,13 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
760
820
|
|
|
761
821
|
// Performance threshold adjusted - render time includes async operations and filtering
|
|
762
822
|
// Since enforcePermissions is false, permission checks are minimal, but navigation filtering may be async
|
|
763
|
-
|
|
823
|
+
// Skip timing assertion in coverage mode (unreliable under instrumentation)
|
|
824
|
+
if (!shouldSkipTimingTests) {
|
|
825
|
+
expect(renderTime).toBeLessThan(PERFORMANCE_THRESHOLDS.RENDER_TIME * 3); // Allow more time for complex config
|
|
826
|
+
} else {
|
|
827
|
+
// In coverage mode, verify component renders successfully (behavioral check)
|
|
828
|
+
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
829
|
+
}
|
|
764
830
|
}, { timeout: 3000 });
|
|
765
831
|
});
|
|
766
832
|
});
|
|
@@ -166,7 +166,7 @@ export interface PaceLoginPageProps {
|
|
|
166
166
|
*/
|
|
167
167
|
export const PaceLoginPage: React.FC<PaceLoginPageProps> = ({
|
|
168
168
|
appName = 'Pace',
|
|
169
|
-
onSuccessRedirectPath = '/',
|
|
169
|
+
onSuccessRedirectPath = '/user-dashboard',
|
|
170
170
|
requireAppAccess = false
|
|
171
171
|
}) => {
|
|
172
172
|
const { signIn, isAuthenticated, isLoading, authError, user, supabase } = useUnifiedAuth();
|