@jmruthers/pace-core 0.6.9 → 0.6.11
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 +21 -0
- package/audit-tool/00-dependencies.cjs +46 -13
- package/audit-tool/audits/01-pace-core-compliance.cjs +96 -21
- package/audit-tool/audits/02-project-structure.cjs +74 -2
- package/audit-tool/audits/03-architecture.cjs +220 -20
- package/audit-tool/audits/04-code-quality.cjs +95 -3
- package/audit-tool/audits/05-styling.cjs +19 -7
- package/audit-tool/audits/06-security-rbac.cjs +214 -25
- package/audit-tool/audits/07-api-tech-stack.cjs +31 -15
- package/audit-tool/audits/08-testing-documentation.cjs +11 -3
- package/audit-tool/audits/09-operations.cjs +19 -7
- package/audit-tool/index.cjs +22 -11
- package/audit-tool/utils/report-utils.cjs +4 -0
- package/cursor-rules/01-pace-core-compliance.mdc +1 -0
- package/cursor-rules/02-project-structure.mdc +3 -26
- package/cursor-rules/03-architecture.mdc +3 -1
- package/cursor-rules/04-code-quality.mdc +1 -0
- package/cursor-rules/05-styling.mdc +120 -8
- package/cursor-rules/06-security-rbac.mdc +126 -2
- package/cursor-rules/07-api-tech-stack.mdc +1 -0
- package/cursor-rules/08-testing-documentation.mdc +1 -0
- package/cursor-rules/09-operations.mdc +1 -0
- package/dist/DataTable-EFYP2QLE.js +16 -0
- package/dist/InactivityServiceProvider-BbxwwDz1.d.ts +308 -0
- package/dist/UnifiedAuthProvider-Bkt_tzdS.d.ts +183 -0
- package/dist/api-BZR2CYXL.js +5 -0
- package/dist/api-result-USV1Czr-.d.ts +51 -0
- package/dist/assets/app-icons/admin_favicon.svg +462 -0
- package/dist/assets/app-icons/base_favicon.svg +85 -0
- package/dist/assets/app-icons/cake_favicon.svg +68 -0
- package/dist/assets/app-icons/core_favicon.svg +256 -0
- package/dist/assets/app-icons/gear_favicon.svg +91 -0
- package/dist/assets/app-icons/medi_favicon.svg +92 -0
- package/dist/assets/app-icons/mint_favicon.svg +83 -0
- package/dist/assets/app-icons/pace_favicon.svg +49 -0
- package/dist/assets/app-icons/pump_favicon.svg +68 -0
- package/dist/assets/app-icons/seed_favicon.svg +91 -0
- package/dist/assets/app-icons/team_favicon.svg +67 -0
- package/dist/assets/app-icons/trac_favicon.svg +112 -0
- package/dist/assets/app-icons/trip_favicon.svg +102 -0
- package/dist/audit-HI2DHUVU.js +4 -0
- package/dist/auth-JvdRVaud.d.ts +49 -0
- package/dist/chunk-2DL2WSOE.js +327 -0
- package/dist/chunk-2OEVOGGR.js +9598 -0
- package/dist/chunk-44CNXN4P.js +15 -0
- package/dist/chunk-4R3T5ENU.js +2943 -0
- package/dist/chunk-7A6IMHH2.js +2321 -0
- package/dist/chunk-BTHN5MKC.js +121 -0
- package/dist/chunk-CU2BU2MQ.js +2 -0
- package/dist/chunk-D6BMFMQZ.js +200 -0
- package/dist/chunk-DDMPHZ3D.js +58 -0
- package/dist/chunk-ENLXB7GP.js +721 -0
- package/dist/chunk-J2KQK6DG.js +2159 -0
- package/dist/chunk-KJXRL3XE.js +6434 -0
- package/dist/chunk-L5LFKKLJ.js +61 -0
- package/dist/chunk-PCSHBLPB.js +811 -0
- package/dist/chunk-QRYSEPHB.js +429 -0
- package/dist/chunk-RMLY6KB5.js +187 -0
- package/dist/chunk-SACF5YSM.js +31 -0
- package/dist/chunk-UZNAFKGW.js +125 -0
- package/dist/chunk-V7FTM2LU.js +1080 -0
- package/dist/chunk-WY6Y7KC3.js +264 -0
- package/dist/chunk-XOJME5T7.js +407 -0
- package/dist/chunk-XPFVT3GN.js +492 -0
- package/dist/chunk-YFTFFJIV.js +529 -0
- package/dist/chunk-YYTWKVHO.js +1334 -0
- package/dist/components.d.ts +12 -89
- package/dist/components.js +23 -55
- package/dist/database.generated-qkdoiVrJ.d.ts +9441 -0
- package/dist/eslint-rules/index.cjs +3 -0
- package/dist/eslint-rules/rules/03-architecture.cjs +74 -0
- package/dist/eslint-rules/rules/05-styling.cjs +507 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +84 -0
- package/dist/event-BfCox3N2.d.ts +265 -0
- package/dist/file-reference-DU1hcawx.d.ts +164 -0
- package/dist/functions-DH45k8ec.d.ts +208 -0
- package/dist/hooks.d.ts +28 -14
- package/dist/hooks.js +90 -56
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +392 -155
- package/dist/index.js +337 -347
- package/dist/pagination-BW1mqywp.d.ts +201 -0
- package/dist/papaparseLoader-WG2UXQ22.js +7 -0
- package/dist/providers.d.ts +29 -14
- package/dist/providers.js +7 -5
- package/dist/rbac/eslint-rules.js +2 -2
- package/dist/rbac/index.d.ts +180 -351
- package/dist/rbac/index.js +13 -11
- package/dist/theming/runtime.d.ts +28 -5
- package/dist/theming/runtime.js +2 -2
- package/dist/timezone-BTWWXKVY.d.ts +696 -0
- package/dist/types-BE2sEHKd.d.ts +55 -0
- package/dist/types-CvOPXWWZ.d.ts +111 -0
- package/dist/types-Dr8sNhER.d.ts +50 -0
- package/dist/types.d.ts +20 -13
- package/dist/types.js +1 -0
- package/dist/usePublicPageContext-B91dGYW1.d.ts +4367 -0
- package/dist/usePublicRouteParams-BgV6VhMi.d.ts +946 -0
- package/dist/utils.d.ts +338 -156
- package/dist/utils.js +78 -60
- package/dist/validation-g5n0hDkh.d.ts +177 -0
- package/docs/api/modules.md +1226 -1094
- package/docs/api-reference/components.md +5 -5
- package/docs/api-reference/rpc-functions.md +12 -3
- package/docs/core-concepts/rbac-system.md +8 -0
- package/docs/getting-started/cursor-rules.md +17 -20
- package/docs/getting-started/dependencies.md +1 -1
- package/docs/getting-started/setup.md +235 -0
- package/docs/implementation-guides/authentication.md +27 -0
- package/docs/implementation-guides/data-tables.md +365 -10
- package/docs/migration/ApiResult-migration.md +25 -0
- package/docs/rbac/RBAC_CONTRACT.md +0 -12
- package/docs/rbac/api-reference.md +33 -31
- package/docs/standards/0-standards-overview.md +50 -15
- package/docs/standards/1-pace-core-compliance-standards.md +62 -57
- package/docs/standards/2-project-structure-standards.md +45 -90
- package/docs/standards/3-architecture-standards.md +41 -1
- package/docs/standards/4-code-quality-standards.md +26 -6
- package/docs/standards/5-styling-standards.md +35 -1
- package/docs/standards/6-security-rbac-standards.md +288 -7
- package/docs/standards/7-api-tech-stack-standards.md +116 -17
- package/docs/standards/8-testing-documentation-standards.md +31 -0
- package/docs/standards/9-operations-standards.md +19 -0
- package/docs/standards/README.md +20 -201
- package/docs/testing/README.md +10 -0
- package/docs/testing/test-setup-for-consumers.md +916 -0
- package/docs/troubleshooting/common-issues.md +17 -1
- package/docs/troubleshooting/organisation-context-setup.md +8 -0
- package/docs/troubleshooting/print-event-name-css-variable-analysis.md +217 -0
- package/eslint-config-pace-core.cjs +24 -0
- package/package.json +14 -20
- package/scripts/build-docs.js +180 -0
- package/scripts/setup.cjs +536 -0
- package/scripts/validate.cjs +480 -0
- package/src/__mocks__/lucide-react.ts +0 -2
- package/src/__tests__/helpers/component-test-utils.test.tsx +260 -0
- package/src/__tests__/helpers/optimized-test-setup.test.ts +224 -0
- package/src/__tests__/helpers/supabaseMock.test.ts +273 -0
- package/src/__tests__/helpers/test-providers.test.tsx +99 -0
- package/src/__tests__/helpers/test-providers.tsx +37 -39
- package/src/__tests__/helpers/test-utils.test.tsx +447 -0
- package/src/__tests__/helpers/timer-utils.test.ts +371 -0
- package/src/assets/app-icons/admin_favicon.svg +462 -0
- package/src/assets/app-icons/base_favicon.svg +85 -0
- package/src/assets/app-icons/cake_favicon.svg +68 -0
- package/src/assets/app-icons/core_favicon.svg +256 -0
- package/src/assets/app-icons/gear_favicon.svg +91 -0
- package/src/assets/app-icons/index.test.ts +304 -0
- package/src/assets/app-icons/index.ts +83 -0
- package/src/assets/app-icons/medi_favicon.svg +92 -0
- package/src/assets/app-icons/mint_favicon.svg +83 -0
- package/src/assets/app-icons/pace_favicon.svg +49 -0
- package/src/assets/app-icons/pump_favicon.svg +68 -0
- package/src/assets/app-icons/seed_favicon.svg +91 -0
- package/src/assets/app-icons/team_favicon.svg +67 -0
- package/src/assets/app-icons/trac_favicon.svg +112 -0
- package/src/assets/app-icons/trip_favicon.svg +102 -0
- package/src/components/AddressField/AddressField.test.tsx +379 -4
- package/src/components/AddressField/AddressField.tsx +239 -213
- package/src/components/AddressField/types.ts +2 -2
- package/src/components/Alert/Alert.test.tsx +35 -25
- package/src/components/Alert/Alert.tsx +8 -8
- package/src/components/AppSwitcher/AppSwitcher.test.tsx +1250 -0
- package/src/components/AppSwitcher/AppSwitcher.tsx +315 -0
- package/src/components/Avatar/Avatar.test.tsx +11 -1
- package/src/components/Avatar/Avatar.tsx +3 -2
- package/src/components/Badge/Badge.test.tsx +11 -1
- package/src/components/Button/Button.test.tsx +13 -3
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/Calendar/Calendar.test.tsx +523 -131
- package/src/components/Calendar/Calendar.tsx +107 -488
- package/src/components/Card/Card.test.tsx +384 -258
- package/src/components/Card/Card.tsx +19 -10
- package/src/components/Checkbox/Checkbox.test.tsx +58 -174
- package/src/components/ContextSelector/ContextSelector.internals.tsx +204 -0
- package/src/components/ContextSelector/ContextSelector.test.tsx +360 -0
- package/src/components/ContextSelector/ContextSelector.tsx +66 -280
- package/src/components/ContextSelector/ContextSelector.types.ts +35 -0
- package/src/components/ContextSelector/useContextSelectorState.tsx +195 -0
- package/src/components/DataTable/AUDIT_REPORT.md +59 -44
- package/src/components/DataTable/DataTable.comprehensive.test.tsx +759 -0
- package/src/components/DataTable/DataTable.default-state.test.tsx +524 -0
- package/src/components/DataTable/DataTable.export.test.tsx +705 -0
- package/src/components/DataTable/DataTable.grouping-aggregation.test.tsx +658 -0
- package/src/components/DataTable/DataTable.hooks.test.tsx +192 -0
- package/src/components/DataTable/DataTable.select-label-display.test.tsx +485 -0
- package/src/components/DataTable/DataTable.test.tsx +787 -416
- package/src/components/DataTable/DataTable.tsx +14 -14
- package/src/components/DataTable/DataTableCore.integration.test.tsx +458 -0
- package/src/components/DataTable/DataTableCore.test-setup.ts +221 -0
- package/src/components/DataTable/DataTableCore.test.tsx +970 -0
- package/src/components/DataTable/README.md +155 -0
- package/src/components/DataTable/TESTING.md +101 -0
- package/src/components/DataTable/a11y.basic.test.tsx +788 -0
- package/src/components/DataTable/components/DataTableCore.tsx +126 -894
- package/src/components/DataTable/components/GroupingDropdown.test.tsx +621 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +2 -3
- package/src/components/DataTable/components/ImportModal.tsx +82 -408
- package/src/components/DataTable/components/ImportModalFileSection.tsx +148 -0
- package/src/components/DataTable/context/DataTableContext.test.tsx +328 -0
- package/src/components/DataTable/context/DataTableContext.tsx +13 -13
- package/src/components/DataTable/core/ColumnFactory.test.ts +403 -0
- package/src/components/DataTable/core/ColumnFactory.ts +3 -3
- package/src/components/DataTable/hooks/useColumnOrderPersistence.test.ts +516 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +12 -9
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.test.ts +256 -0
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +12 -9
- package/src/components/DataTable/hooks/useDataTableConfiguration.test.ts +297 -0
- package/src/components/DataTable/hooks/useDataTableConfiguration.ts +15 -3
- package/src/components/DataTable/hooks/useDataTableDataPipeline.test.ts +270 -0
- package/src/components/DataTable/hooks/useDataTableDeletionBatching.test.ts +127 -0
- package/src/components/DataTable/hooks/useDataTableDeletionBatching.ts +106 -0
- package/src/components/DataTable/hooks/useDataTableEffectiveActions.test.ts +461 -0
- package/src/components/DataTable/hooks/useDataTableEffectiveActions.ts +238 -0
- package/src/components/DataTable/hooks/useDataTableLayoutHandlers.test.ts +296 -0
- package/src/components/DataTable/hooks/useDataTableLayoutHandlers.ts +175 -0
- package/src/components/DataTable/hooks/useDataTablePaginationSync.test.ts +203 -0
- package/src/components/DataTable/hooks/useDataTablePaginationSync.ts +109 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.test.ts +280 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +81 -260
- package/src/components/DataTable/hooks/useDataTablePipeline.test.tsx +219 -0
- package/src/components/DataTable/hooks/useDataTablePipeline.tsx +239 -0
- package/src/components/DataTable/hooks/useDataTableRenderGuard.test.tsx +316 -0
- package/src/components/DataTable/hooks/useDataTableRenderGuard.tsx +195 -0
- package/src/components/DataTable/hooks/useDataTableScope.test.ts +110 -0
- package/src/components/DataTable/hooks/useDataTableScope.ts +123 -0
- package/src/components/DataTable/hooks/useDataTableState.test.ts +733 -0
- package/src/components/DataTable/hooks/useDataTableState.ts +161 -114
- package/src/components/DataTable/hooks/useDataTableStateAndPersistence.test.ts +277 -0
- package/src/components/DataTable/hooks/useDataTableStateAndPersistence.ts +222 -0
- package/src/components/DataTable/hooks/useDataTableSuperAdmin.test.ts +93 -0
- package/src/components/DataTable/hooks/useDataTableSuperAdmin.ts +86 -0
- package/src/components/DataTable/hooks/useDataTableTableInstance.test.ts +185 -0
- package/src/components/DataTable/hooks/useDataTableTableInstance.ts +178 -0
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.test.ts +183 -0
- package/src/components/DataTable/hooks/useHierarchicalState.test.ts +294 -0
- package/src/components/DataTable/hooks/useImportModalFocus.test.ts +184 -0
- package/src/components/DataTable/hooks/useImportModalFocus.ts +53 -0
- package/src/components/DataTable/hooks/useImportModalState.test.ts +390 -0
- package/src/components/DataTable/hooks/useImportModalState.ts +345 -0
- package/src/components/DataTable/hooks/useKeyboardNavigation.test.ts +787 -0
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +311 -271
- package/src/components/DataTable/hooks/usePermissionTracking.test.ts +381 -0
- package/src/components/DataTable/hooks/usePermissionTracking.ts +122 -0
- package/src/components/DataTable/hooks/useServerSideDataEffect.test.ts +258 -0
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +27 -4
- package/src/components/DataTable/hooks/useTableColumns.test.ts +499 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +15 -39
- package/src/components/DataTable/hooks/useTableHandlers.test.ts +461 -0
- package/src/components/DataTable/hooks/useTableHandlers.ts +13 -22
- package/src/components/DataTable/index.ts +28 -5
- package/src/components/DataTable/keyboard.test.tsx +734 -0
- package/src/components/DataTable/mocks/MockRBACProvider.tsx +66 -0
- package/src/components/DataTable/pagination.modes.test.tsx +728 -0
- package/src/components/DataTable/ssr.strict-mode.test.tsx +319 -0
- package/src/components/DataTable/styles.test.ts +379 -0
- package/src/components/DataTable/styles.ts +0 -1
- package/src/components/DataTable/test-utils/MockDataTableComponents.tsx +55 -0
- package/src/components/DataTable/test-utils/dataFactories.ts +103 -0
- package/src/components/DataTable/test-utils/featureConfig.ts +10 -0
- package/src/components/DataTable/test-utils/sharedTestUtils.ts +419 -0
- package/src/components/DataTable/test-utils.ts +94 -0
- package/src/components/DataTable/types/actions.ts +71 -0
- package/src/components/DataTable/types/base.ts +39 -0
- package/src/components/DataTable/types/columns.ts +125 -0
- package/src/components/DataTable/types/export.ts +32 -0
- package/src/components/DataTable/types/features.ts +81 -0
- package/src/components/DataTable/types/hierarchical.ts +44 -0
- package/src/components/DataTable/types/index.ts +43 -0
- package/src/components/DataTable/types/pagination.ts +85 -0
- package/src/components/DataTable/types/performance.ts +47 -0
- package/src/components/DataTable/types/props.ts +62 -0
- package/src/components/DataTable/types/rbac.ts +45 -0
- package/src/components/DataTable/ui/layout/DataTableCore.test.tsx +1194 -0
- package/src/components/DataTable/ui/layout/DataTableCore.tsx +345 -0
- package/src/components/DataTable/ui/layout/DataTableErrorBoundary.test.tsx +438 -0
- package/src/components/DataTable/ui/layout/DataTableErrorBoundary.tsx +225 -0
- package/src/components/DataTable/ui/layout/DataTableLayout.test.tsx +1352 -0
- package/src/components/DataTable/ui/layout/DataTableLayout.tsx +661 -0
- package/src/components/DataTable/ui/modals/BulkDeleteConfirmDialog.test.tsx +91 -0
- package/src/components/DataTable/ui/modals/BulkDeleteConfirmDialog.tsx +43 -0
- package/src/components/DataTable/ui/modals/DataTableModals.test.tsx +749 -0
- package/src/components/DataTable/ui/modals/DataTableModals.tsx +341 -0
- package/src/components/DataTable/ui/modals/ImportModal.test.tsx +1834 -0
- package/src/components/DataTable/ui/modals/ImportModal.tsx +197 -0
- package/src/components/DataTable/ui/modals/ImportModalFailedRowsSection.tsx +60 -0
- package/src/components/DataTable/ui/modals/ImportModalFileSection.tsx +148 -0
- package/src/components/DataTable/ui/modals/ImportModalPreviewSection.tsx +60 -0
- package/src/components/DataTable/ui/modals/ImportModalSummarySection.tsx +59 -0
- package/src/components/DataTable/ui/modals/importModalPersistence.ts +73 -0
- package/src/components/DataTable/ui/shared/AccessDeniedPage.test.tsx +245 -0
- package/src/components/DataTable/ui/shared/AccessDeniedPage.tsx +159 -0
- package/src/components/DataTable/ui/shared/ActionButtons.test.tsx +921 -0
- package/src/components/DataTable/ui/shared/ActionButtons.tsx +195 -0
- package/src/components/DataTable/ui/shared/ColumnFilter.test.tsx +497 -0
- package/src/components/DataTable/ui/shared/ColumnFilter.tsx +113 -0
- package/src/components/DataTable/ui/shared/PaginationControls.test.tsx +451 -0
- package/src/components/DataTable/ui/shared/PaginationControls.tsx +291 -0
- package/src/components/DataTable/ui/shared/SortIndicator.test.tsx +135 -0
- package/src/components/DataTable/ui/shared/SortIndicator.tsx +50 -0
- package/src/components/DataTable/ui/table/EditFields.test.tsx +526 -0
- package/src/components/DataTable/ui/table/EditFields.tsx +355 -0
- package/src/components/DataTable/ui/table/EditableRow.test.tsx +1003 -0
- package/src/components/DataTable/ui/table/EditableRow.tsx +444 -0
- package/src/components/DataTable/ui/table/EmptyState.test.tsx +360 -0
- package/src/components/DataTable/ui/table/EmptyState.tsx +74 -0
- package/src/components/DataTable/ui/table/FilterRow.test.tsx +416 -0
- package/src/components/DataTable/ui/table/FilterRow.tsx +148 -0
- package/src/components/DataTable/ui/table/LoadingState.test.tsx +77 -0
- package/src/components/DataTable/ui/table/LoadingState.tsx +17 -0
- package/src/components/DataTable/ui/table/RowComponent.test.tsx +1024 -0
- package/src/components/DataTable/ui/table/RowComponent.tsx +429 -0
- package/src/components/DataTable/ui/table/UnifiedTableBody.test.tsx +1273 -0
- package/src/components/DataTable/ui/table/UnifiedTableBody.tsx +440 -0
- package/src/components/DataTable/ui/table/cellValueUtils.test.ts +453 -0
- package/src/components/DataTable/ui/table/cellValueUtils.ts +40 -0
- package/src/components/DataTable/ui/toolbar/BulkOperationsDropdown.test.tsx +551 -0
- package/src/components/DataTable/ui/toolbar/BulkOperationsDropdown.tsx +160 -0
- package/src/components/DataTable/ui/toolbar/ColumnVisibilityDropdown.test.tsx +751 -0
- package/src/components/DataTable/ui/toolbar/ColumnVisibilityDropdown.tsx +114 -0
- package/src/components/DataTable/ui/toolbar/DataTableToolbar.test.tsx +629 -0
- package/src/components/DataTable/ui/toolbar/DataTableToolbar.tsx +271 -0
- package/src/components/DataTable/ui/toolbar/GroupingDropdown.test.tsx +621 -0
- package/src/components/DataTable/ui/toolbar/GroupingDropdown.tsx +107 -0
- package/src/components/DataTable/utils/a11yUtils.test.ts +548 -0
- package/src/components/DataTable/utils/a11yUtils.ts +1 -1
- package/src/components/DataTable/utils/aggregationUtils.test.ts +288 -0
- package/src/components/DataTable/utils/aggregationUtils.ts +5 -5
- package/src/components/DataTable/utils/columnUtils.test.ts +94 -0
- package/src/components/DataTable/utils/csvParse.test.ts +74 -0
- package/src/components/DataTable/utils/csvParse.ts +65 -0
- package/src/components/DataTable/utils/errorHandling.test.ts +209 -0
- package/src/components/DataTable/utils/errorHandling.ts +3 -1
- package/src/components/DataTable/utils/exportUtils.test.ts +954 -0
- package/src/components/DataTable/utils/exportUtils.ts +1 -1
- package/src/components/DataTable/utils/flexibleImport.test.ts +573 -0
- package/src/components/DataTable/utils/flexibleImport.ts +3 -186
- package/src/components/DataTable/utils/hierarchicalSorting.test.ts +235 -0
- package/src/components/DataTable/utils/hierarchicalSorting.ts +3 -3
- package/src/components/DataTable/utils/hierarchicalUtils.test.ts +586 -0
- package/src/components/DataTable/utils/importDateParser.test.ts +162 -0
- package/src/components/DataTable/utils/importDateParser.ts +114 -0
- package/src/components/DataTable/utils/importValueParser.test.ts +138 -0
- package/src/components/DataTable/utils/importValueParser.ts +91 -0
- package/src/components/DataTable/utils/paginationUtils.test.ts +593 -0
- package/src/components/DataTable/utils/paginationUtils.ts +7 -4
- package/src/components/DataTable/utils/performanceUtils.test.ts +470 -0
- package/src/components/DataTable/utils/performanceUtils.ts +1 -1
- package/src/components/DataTable/utils/rowUtils.test.ts +235 -0
- package/src/components/DataTable/utils/selectFieldUtils.test.ts +271 -0
- package/src/components/DataTable/utils/selectFieldUtils.ts +97 -67
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +18 -25
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +1 -1
- package/src/components/DateTimeField/DateTimeField.test.tsx +3 -16
- package/src/components/DateTimeField/DateTimeField.tsx +1 -1
- package/src/components/Dialog/Dialog.test-utils.ts +49 -0
- package/src/components/Dialog/Dialog.test.tsx +2865 -458
- package/src/components/Dialog/Dialog.tsx +183 -986
- package/src/components/Dialog/dialogLock.test.ts +238 -0
- package/src/components/Dialog/dialogLock.ts +98 -0
- package/src/components/Dialog/index.ts +2 -0
- package/src/components/Dialog/useDialogDimensions.test.ts +163 -0
- package/src/components/Dialog/useDialogDimensions.ts +140 -0
- package/src/components/Dialog/useDialogLifecycle.test.ts +358 -0
- package/src/components/Dialog/useDialogLifecycle.ts +135 -0
- package/src/components/Dialog/useDialogPersistence.test.ts +381 -0
- package/src/components/Dialog/useDialogPersistence.ts +357 -0
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +2 -62
- package/src/components/ErrorBoundary/ErrorBoundaryContext.context.ts +17 -0
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +2 -45
- package/src/components/ErrorBoundary/ErrorBoundaryContext.types.ts +41 -0
- package/src/components/ErrorBoundary/index.ts +3 -4
- package/src/components/ErrorBoundary/useErrorBoundaryContext.ts +20 -0
- package/src/components/FileDisplay/FileDisplay.test.tsx +479 -247
- package/src/components/FileDisplay/FileDisplay.tsx +29 -659
- package/src/components/FileDisplay/FileDisplayContent.test.tsx +395 -0
- package/src/components/FileDisplay/FileDisplayContent.tsx +242 -0
- package/src/components/FileDisplay/FileDisplayDeleteConfirmDialog.test.tsx +74 -0
- package/src/components/FileDisplay/FileDisplayDeleteConfirmDialog.tsx +38 -0
- package/src/components/FileDisplay/FileDisplayEmptyView.test.tsx +33 -0
- package/src/components/FileDisplay/FileDisplayEmptyView.tsx +33 -0
- package/src/components/FileDisplay/FileDisplayErrorView.test.tsx +71 -0
- package/src/components/FileDisplay/FileDisplayErrorView.tsx +50 -0
- package/src/components/FileDisplay/FileDisplayLoadingFallbackView.test.tsx +22 -0
- package/src/components/FileDisplay/FileDisplayLoadingFallbackView.tsx +22 -0
- package/src/components/FileDisplay/FileDisplayLoadingView.test.tsx +21 -0
- package/src/components/FileDisplay/FileDisplayLoadingView.tsx +23 -0
- package/src/components/FileDisplay/FileDisplayMultipleFilesView.test.tsx +101 -0
- package/src/components/FileDisplay/FileDisplayMultipleFilesView.tsx +109 -0
- package/src/components/FileDisplay/FileDisplaySingleDocumentLinkView.test.tsx +58 -0
- package/src/components/FileDisplay/FileDisplaySingleDocumentLinkView.tsx +48 -0
- package/src/components/FileDisplay/FileDisplaySingleFileWithActionsView.test.tsx +111 -0
- package/src/components/FileDisplay/FileDisplaySingleFileWithActionsView.tsx +270 -0
- package/src/components/FileDisplay/FileDisplaySingleImageView.test.tsx +78 -0
- package/src/components/FileDisplay/FileDisplaySingleImageView.tsx +67 -0
- package/src/components/FileDisplay/fallbackUtils.test.ts +50 -0
- package/src/components/FileDisplay/fallbackUtils.ts +44 -0
- package/src/components/FileDisplay/fetchFileDisplayData.ts +24 -0
- package/src/components/FileDisplay/fetchFileDisplayData.unit.test.ts +183 -0
- package/src/components/FileDisplay/fileDisplayUtils.test.ts +58 -0
- package/src/components/FileDisplay/fileDisplayUtils.ts +24 -0
- package/src/components/FileDisplay/index.tsx +1 -1
- package/src/components/FileDisplay/useFileDisplay.test.ts +538 -0
- package/src/components/FileDisplay/useFileDisplay.ts +515 -0
- package/src/components/FileDisplay/useFileDisplay.unit.test.ts +1438 -0
- package/src/components/FileDisplay/useFileDisplayData.ts +126 -0
- package/src/components/FileDisplay/usePublicFileDisplay.test.ts +729 -0
- package/src/components/FileDisplay/usePublicFileDisplay.ts +579 -0
- package/src/components/FileUpload/FileUpload.test.tsx +69 -27
- package/src/components/FileUpload/FileUpload.tsx +112 -527
- package/src/components/FileUpload/FileUploadDropZone.tsx +112 -0
- package/src/components/FileUpload/FileUploadProgressItem.tsx +86 -0
- package/src/components/FileUpload/FileUploadProgressList.tsx +40 -0
- package/src/components/FileUpload/index.tsx +1 -1
- package/src/components/FileUpload/useFileUploadManager.test.ts +308 -0
- package/src/components/FileUpload/useFileUploadManager.ts +454 -0
- package/src/components/FileUpload/useResolvedAppId.test.ts +102 -0
- package/src/components/FileUpload/useResolvedAppId.ts +77 -0
- package/src/components/Footer/Footer.test.tsx +15 -382
- package/src/components/Footer/Footer.tsx +8 -125
- package/src/components/Form/Form.test.tsx +425 -88
- package/src/components/Form/Form.tsx +91 -299
- package/src/components/Form/useFormPersistence.ts +257 -0
- package/src/components/Header/Header.test.tsx +653 -163
- package/src/components/Header/Header.tsx +62 -44
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +35 -76
- package/src/components/Input/Input.test.tsx +34 -120
- package/src/components/Input/Input.tsx +1 -1
- package/src/components/Label/Label.test.tsx +46 -45
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +8 -11
- package/src/components/LoginForm/LoginForm.test.tsx +0 -1
- package/src/components/NavigationMenu/HierarchicalNavItem.tsx +104 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +2422 -102
- package/src/components/NavigationMenu/NavigationMenu.tsx +62 -362
- package/src/components/NavigationMenu/index.ts +6 -1
- package/src/components/NavigationMenu/navigationPermissionHelper.ts +188 -0
- package/src/components/NavigationMenu/useNavigationFiltering.test.ts +1949 -0
- package/src/components/NavigationMenu/useNavigationFiltering.ts +199 -308
- package/src/components/NavigationMenu/useNavigationScope.ts +125 -0
- package/src/components/PaceAppLayout/PaceAppLayout.edge-cases.test.tsx +1322 -0
- package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +50 -49
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +81 -38
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +103 -85
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +774 -44
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +282 -764
- package/src/components/PaceAppLayout/README.md +0 -9
- package/src/components/PaceAppLayout/test-setup.tsx +15 -9
- package/src/components/PaceAppLayout/useFilteredNavItems.ts +304 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutConfig.ts +142 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutGate.tsx +150 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutPermissions.ts +162 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutScope.ts +79 -0
- package/src/components/PaceAppLayout/useRoleBasedRouteAccess.ts +157 -0
- package/src/components/PaceAppLayout/useSuperAdminFallback.ts +58 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +782 -20
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +33 -125
- package/src/components/PaceLoginPage/useLoginAppAccess.ts +153 -0
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +1 -1
- package/src/components/Progress/Progress.test.tsx +127 -1
- package/src/components/Progress/Progress.tsx +1 -2
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +1196 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +29 -217
- package/src/components/ProtectedRoute/useProtectedRouteState.ts +128 -0
- package/src/components/ProtectedRoute/useVisibilityRedirectGrace.ts +89 -0
- package/src/components/PublicLayout/PublicLayout.test.tsx +1640 -38
- package/src/components/PublicLayout/PublicPageContext.ts +28 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +134 -75
- package/src/components/PublicLayout/PublicPageProvider.tsx +7 -42
- package/src/components/PublicLayout/usePublicPageContext.ts +36 -0
- package/src/components/Select/Select.test.tsx +45 -8
- package/src/components/Select/Select.tsx +57 -40
- package/src/components/Select/context.test.tsx +56 -0
- package/src/components/Select/text.test.tsx +104 -0
- package/src/components/Select/text.ts +26 -0
- package/src/components/Select/types.ts +3 -0
- package/src/components/Select/useSelectEvents.test.ts +279 -0
- package/src/components/Select/useSelectEvents.ts +87 -0
- package/src/components/Select/useSelectSearch.test.tsx +295 -0
- package/src/components/Select/useSelectSearch.ts +91 -0
- package/src/components/Select/useSelectState.test.ts +268 -0
- package/src/components/Select/useSelectState.ts +104 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +28 -112
- package/src/components/Switch/Switch.test.tsx +57 -153
- package/src/components/Table/Table.test.tsx +395 -317
- package/src/components/Tabs/Tabs.test.tsx +270 -0
- package/src/components/Tabs/Tabs.tsx +4 -4
- package/src/components/Textarea/Textarea.test.tsx +11 -38
- package/src/components/Toast/Toast.test.tsx +425 -496
- package/src/components/Tooltip/Tooltip.test.tsx +4 -21
- package/src/components/UserMenu/UserMenu.test.tsx +1 -21
- package/src/components/UserMenu/UserMenu.tsx +0 -1
- package/src/components/index.test.ts +346 -0
- package/src/components/index.ts +12 -1
- package/src/constants/performance.test.ts +91 -0
- package/src/hooks/ServiceHooks.test.tsx +725 -0
- package/src/hooks/hooks.integration.test.tsx +608 -0
- package/src/hooks/index.ts +18 -3
- package/src/hooks/index.unit.test.ts +220 -0
- package/src/hooks/public/usePublicEvent.test.ts +304 -0
- package/src/hooks/public/usePublicEvent.ts +11 -11
- package/src/hooks/public/usePublicEventLogo.test.ts +655 -120
- package/src/hooks/public/usePublicEventLogo.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.test.ts +595 -0
- package/src/hooks/public/usePublicRouteParams.ts +2 -2
- package/src/hooks/services/useAuth.ts +9 -7
- package/src/hooks/services/useAuthService.ts +1 -1
- package/src/hooks/services/useEventService.ts +1 -1
- package/src/hooks/useAccessibleApps.test.ts +400 -0
- package/src/hooks/useAccessibleApps.ts +264 -0
- package/src/hooks/useAddressAutocomplete.test.ts +170 -47
- package/src/hooks/useAddressAutocomplete.ts +109 -81
- package/src/hooks/useApiFetch.unit.test.ts +111 -0
- package/src/hooks/useAppConfig.ts +13 -3
- package/src/hooks/useAppConfig.unit.test.ts +712 -0
- package/src/hooks/useComponentPerformance.unit.test.tsx +314 -0
- package/src/hooks/useDataTablePerformance.ts +111 -130
- package/src/hooks/useDataTablePerformance.unit.test.ts +720 -0
- package/src/hooks/useDataTableState.test.ts +170 -0
- package/src/hooks/useDataTableState.ts +5 -5
- package/src/hooks/useDebounce.unit.test.ts +157 -0
- package/src/hooks/useEventTheme.test.ts +70 -18
- package/src/hooks/useEventTheme.ts +50 -22
- package/src/hooks/useEvents.ts +49 -2
- package/src/hooks/useEvents.unit.test.ts +227 -0
- package/src/hooks/useFileReference.test.ts +388 -107
- package/src/hooks/useFileReference.ts +184 -179
- package/src/hooks/useFileUrl.ts +1 -1
- package/src/hooks/useFileUrl.unit.test.ts +686 -0
- package/src/hooks/useFileUrlCache.test.ts +319 -0
- package/src/hooks/useFileUrlCache.ts +5 -2
- package/src/hooks/useFocusManagement.unit.test.ts +604 -0
- package/src/hooks/useFocusTrap.unit.test.tsx +613 -0
- package/src/hooks/useFormDialog.test.ts +307 -0
- package/src/hooks/useFormDialog.ts +2 -2
- package/src/hooks/useInactivityTracker.ts +141 -134
- package/src/hooks/useInactivityTracker.unit.test.ts +446 -0
- package/src/hooks/useIsMobile.unit.test.ts +317 -0
- package/src/hooks/useIsPrint.ts +62 -0
- package/src/hooks/useIsPrint.unit.test.ts +545 -0
- package/src/hooks/useKeyboardShortcuts.unit.test.ts +907 -0
- package/src/hooks/useOrganisationPermissions.test.ts +1 -2
- package/src/hooks/useOrganisationPermissions.ts +1 -4
- package/src/hooks/useOrganisationPermissions.unit.test.tsx +293 -0
- package/src/hooks/useOrganisationSecurity.test.ts +4 -33
- package/src/hooks/useOrganisationSecurity.ts +192 -203
- package/src/hooks/useOrganisationSecurity.unit.test.tsx +959 -0
- package/src/hooks/useOrganisations.ts +1 -1
- package/src/hooks/useOrganisations.unit.test.ts +369 -0
- package/src/hooks/usePerformanceMonitor.ts +1 -1
- package/src/hooks/usePerformanceMonitor.unit.test.ts +693 -0
- package/src/hooks/usePermissionCache.test.ts +298 -329
- package/src/hooks/usePermissionCache.ts +277 -276
- package/src/hooks/usePreventTabReload.test.ts +307 -0
- package/src/hooks/usePublicEvent.simple.test.ts +794 -0
- package/src/hooks/usePublicEvent.test.ts +670 -0
- package/src/hooks/usePublicEvent.unit.test.ts +638 -0
- package/src/hooks/usePublicFileDisplay.test.ts +948 -0
- package/src/hooks/usePublicRouteParams.unit.test.ts +442 -0
- package/src/hooks/useQueryCache.test.ts +391 -0
- package/src/hooks/useQueryCache.ts +7 -9
- package/src/hooks/useRBAC.unit.test.ts +253 -0
- package/src/hooks/useSessionDraft.test.ts +556 -0
- package/src/hooks/useSessionDraft.ts +14 -11
- package/src/hooks/useSessionRestoration.ts +1 -1
- package/src/hooks/useSessionRestoration.unit.test.tsx +381 -0
- package/src/hooks/useStorage.ts +94 -54
- package/src/hooks/useStorage.unit.test.ts +684 -0
- package/src/hooks/useToast.test.ts +413 -0
- package/src/hooks/useToast.ts +2 -2
- package/src/hooks/useToast.unit.test.tsx +481 -0
- package/src/hooks/useZodForm.ts +3 -3
- package/src/hooks/useZodForm.unit.test.tsx +191 -0
- package/src/icons/index.test.ts +133 -0
- package/src/icons/index.ts +3 -1
- package/src/index.test.ts +528 -0
- package/src/index.ts +56 -9
- package/src/providers/AuthProvider.test.tsx +218 -0
- package/src/providers/EventProvider.test.tsx +487 -0
- package/src/providers/InactivityProvider.test-helper.tsx +40 -0
- package/src/providers/InactivityProvider.test.tsx +421 -0
- package/src/providers/ProviderLifecycle.test.tsx +308 -0
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +7 -12
- package/src/providers/UnifiedAuthProvider.test.tsx +503 -0
- package/src/providers/index.test.ts +138 -0
- package/src/providers/services/AuthServiceContext.ts +27 -0
- package/src/providers/services/AuthServiceProvider.integration.test.tsx +229 -0
- package/src/providers/services/AuthServiceProvider.test.tsx +638 -0
- package/src/providers/services/AuthServiceProvider.tsx +81 -20
- package/src/providers/services/EventServiceContext.ts +25 -0
- package/src/providers/services/EventServiceProvider.test.tsx +839 -0
- package/src/providers/services/EventServiceProvider.tsx +11 -20
- package/src/providers/services/InactivityServiceContext.ts +25 -0
- package/src/providers/services/InactivityServiceProvider.test.tsx +662 -0
- package/src/providers/services/InactivityServiceProvider.tsx +7 -17
- package/src/providers/services/OrganisationServiceContext.ts +25 -0
- package/src/providers/services/OrganisationServiceProvider.test.tsx +440 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +7 -17
- package/src/providers/services/UnifiedAuthContext.ts +102 -0
- package/src/providers/services/UnifiedAuthProvider.advanced.test.tsx +434 -0
- package/src/providers/services/UnifiedAuthProvider.appId.test.tsx +408 -0
- package/src/providers/services/UnifiedAuthProvider.integration.test.tsx +304 -0
- package/src/providers/services/UnifiedAuthProvider.test.tsx +212 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +147 -497
- package/src/providers/services/contexts.test.tsx +281 -0
- package/src/providers/services/useUnifiedAuth.test.tsx +251 -0
- package/src/providers/services/useUnifiedAuth.ts +29 -0
- package/src/providers/services/useUnifiedAuthContextValue.ts +279 -0
- package/src/providers/useInactivity.test-helper.ts +27 -0
- package/src/rbac/README.md +5 -5
- package/src/rbac/adapters.comprehensive.test.tsx +429 -0
- package/src/rbac/adapters.test.tsx +654 -0
- package/src/rbac/adapters.tsx +53 -38
- package/src/rbac/api.test.ts +986 -259
- package/src/rbac/api.ts +260 -216
- package/src/rbac/audit-batched.test.ts +550 -0
- package/src/rbac/audit-batched.ts +5 -4
- package/src/rbac/audit.test.ts +225 -28
- package/src/rbac/audit.ts +26 -18
- package/src/rbac/auth-rbac-security.integration.test.tsx +300 -0
- package/src/rbac/auth-rbac.e2e.test.tsx +510 -0
- package/src/rbac/cache-invalidation.test.ts +715 -0
- package/src/rbac/cache-invalidation.ts +18 -15
- package/src/rbac/cache.test.ts +123 -63
- package/src/rbac/cache.ts +3 -4
- package/src/rbac/components/AccessDenied.test.tsx +324 -0
- package/src/rbac/components/AccessDenied.tsx +20 -18
- package/src/rbac/components/NavigationGuard.test.tsx +1148 -0
- package/src/rbac/components/NavigationGuard.tsx +10 -8
- package/src/rbac/components/PagePermissionGuard.guard.test.tsx +236 -0
- package/src/rbac/components/PagePermissionGuard.performance.test.tsx +252 -0
- package/src/rbac/components/PagePermissionGuard.race-condition.test.tsx +243 -0
- package/src/rbac/components/PagePermissionGuard.test.tsx +1430 -0
- package/src/rbac/components/PagePermissionGuard.tsx +188 -381
- package/src/rbac/components/PagePermissionGuard.verification.test.tsx +185 -0
- package/src/rbac/config.test.ts +131 -48
- package/src/rbac/config.ts +69 -26
- package/src/rbac/docs/event-based-apps.md +26 -13
- package/src/rbac/engine.comprehensive.test.ts +808 -0
- package/src/rbac/engine.test.ts +974 -130
- package/src/rbac/engine.ts +53 -13
- package/src/rbac/errors.test.ts +99 -87
- package/src/rbac/errors.ts +89 -55
- package/src/rbac/eslint-rules.js +2 -2
- package/src/rbac/hooks/permissions/runPermissionCheck.ts +77 -0
- package/src/rbac/hooks/permissions/useAccessLevel.test.ts +622 -0
- package/src/rbac/hooks/permissions/useAccessLevel.ts +23 -14
- package/src/rbac/hooks/permissions/useCan.test.ts +798 -0
- package/src/rbac/hooks/permissions/useCan.ts +173 -253
- package/src/rbac/hooks/permissions/useMultiplePermissions.test.ts +843 -0
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +63 -10
- package/src/rbac/hooks/permissions/usePermissions.test.ts +543 -0
- package/src/rbac/hooks/permissions/usePermissions.ts +50 -78
- package/src/rbac/hooks/useCan.test.ts +348 -32
- package/src/rbac/hooks/usePageAccessLogging.ts +160 -0
- package/src/rbac/hooks/usePageGuardScope.ts +117 -0
- package/src/rbac/hooks/usePagePermissionCheck.ts +67 -0
- package/src/rbac/hooks/usePermissions.integration.test.ts +427 -0
- package/src/rbac/hooks/usePermissions.stability.test.ts +268 -0
- package/src/rbac/hooks/usePermissions.test.ts +459 -33
- package/src/rbac/hooks/usePermissions.ts +5 -7
- package/src/rbac/hooks/useRBAC.test.ts +1784 -21
- package/src/rbac/hooks/useRBAC.ts +148 -88
- package/src/rbac/hooks/useResolvedScope.test.ts +442 -5
- package/src/rbac/hooks/useResolvedScope.ts +4 -1
- package/src/rbac/hooks/useResourcePermissions.test.ts +561 -24
- package/src/rbac/hooks/useResourcePermissions.ts +76 -140
- package/src/rbac/hooks/useResourcePermissionsSuperAdmin.ts +67 -0
- package/src/rbac/hooks/useRoleManagement.test.ts +634 -61
- package/src/rbac/hooks/useRoleManagement.ts +158 -586
- package/src/rbac/hooks/useSecureSupabase.test.ts +1179 -0
- package/src/rbac/hooks/useSecureSupabase.ts +21 -14
- package/src/rbac/hooks/useSuperAdminCheck.ts +80 -0
- package/src/rbac/index.test.ts +107 -0
- package/src/rbac/index.ts +32 -32
- package/src/rbac/performance.test.ts +451 -0
- package/src/rbac/permissions.test.ts +149 -68
- package/src/rbac/permissions.ts +0 -3
- package/src/rbac/rbac-core.test.tsx +276 -0
- package/src/rbac/rbac-engine-core-logic.test.ts +387 -0
- package/src/rbac/rbac-engine-simplified.test.ts +252 -0
- package/src/rbac/rbac-functions.test.ts +703 -0
- package/src/rbac/rbac-integration.test.ts +523 -0
- package/src/rbac/rbac-role-isolation.test.ts +456 -0
- package/src/rbac/request-deduplication.test.ts +352 -0
- package/src/rbac/request-deduplication.ts +5 -4
- package/src/rbac/scenarios.user-role.test.tsx +271 -0
- package/src/rbac/secureClient.test.ts +499 -115
- package/src/rbac/secureClient.ts +54 -28
- package/src/rbac/security.test.ts +448 -44
- package/src/rbac/security.ts +7 -6
- package/src/rbac/types/roleManagement.ts +66 -0
- package/src/rbac/types.test.ts +236 -0
- package/src/rbac/types.ts +7 -5
- package/src/rbac/utils/clientSecurity.test.ts +192 -0
- package/src/rbac/utils/clientSecurity.ts +6 -4
- package/src/rbac/utils/contextValidator.test.ts +126 -0
- package/src/rbac/utils/contextValidator.ts +6 -3
- package/src/rbac/utils/deep-equal.test.ts +76 -0
- package/src/rbac/utils/eventContext.test.ts +401 -0
- package/src/rbac/utils/eventContext.ts +38 -34
- package/src/rbac/utils/fetchPermissionMap.ts +13 -0
- package/src/rbac/utils/permissionMapHelpers.ts +34 -0
- package/src/rbac/utils/roleManagementRpc.ts +303 -0
- package/src/services/AuthService.edge-cases.test.ts +746 -0
- package/src/services/AuthService.restoreSession.test.ts +59 -0
- package/src/services/AuthService.test.ts +1362 -0
- package/src/services/AuthService.ts +197 -216
- package/src/services/BaseService.edge-cases.test.ts +506 -0
- package/src/services/BaseService.test.ts +363 -0
- package/src/services/EventService.edge-cases.test.ts +636 -0
- package/src/services/EventService.eventColours.test.ts +64 -0
- package/src/services/EventService.test.ts +1250 -0
- package/src/services/EventService.ts +244 -315
- package/src/services/InactivityService.edge-cases.test.ts +492 -0
- package/src/services/InactivityService.lifecycle.test.ts +406 -0
- package/src/services/InactivityService.test.ts +829 -0
- package/src/services/InactivityService.ts +172 -213
- package/src/services/OrganisationService.edge-cases.test.ts +633 -0
- package/src/services/OrganisationService.pagination.test.ts +409 -0
- package/src/services/OrganisationService.test.ts +1579 -0
- package/src/services/OrganisationService.ts +186 -257
- package/src/services/base/BaseService.test.ts +214 -0
- package/src/services/interfaces/IAuthService.test.ts +184 -0
- package/src/services/interfaces/IAuthService.ts +10 -9
- package/src/services/interfaces/IEventService.test.ts +176 -0
- package/src/services/interfaces/IInactivityService.test.ts +183 -0
- package/src/services/interfaces/IOrganisationService.test.ts +207 -0
- package/src/services/interfaces/IOrganisationService.ts +0 -1
- package/src/styles/core.css +244 -12
- package/src/theming/parseEventColours.test.ts +321 -0
- package/src/theming/parseEventColours.ts +18 -9
- package/src/theming/runtime.test.ts +495 -0
- package/src/theming/runtime.ts +72 -7
- package/src/types/api-result.ts +53 -0
- package/src/types/auth.ts +0 -1
- package/src/types/core.test.ts +397 -0
- package/src/types/database-generated.test.ts +78 -0
- package/src/types/database.generated.ts +45 -10
- package/src/types/event.ts +39 -19
- package/src/types/file-reference.test.ts +351 -0
- package/src/types/file-reference.ts +37 -12
- package/src/types/guards.test.ts +246 -0
- package/src/types/index.test.ts +265 -0
- package/src/types/index.ts +3 -0
- package/src/types/organisation.roles.test.ts +55 -0
- package/src/types/organisation.test.ts +1105 -0
- package/src/types/organisation.ts +15 -15
- package/src/types/rpc-responses.ts +33 -0
- package/src/types/supabase.ts +14 -6
- package/src/types/theme.test.ts +830 -0
- package/src/types/type-validation.test.ts +526 -0
- package/src/types/validation.test.ts +729 -0
- package/src/types/vitest-globals.d.ts +1 -1
- package/src/utils/app/appConfig.test.ts +235 -0
- package/src/utils/app/appIdResolver.test.ts +252 -57
- package/src/utils/app/appIdResolver.ts +31 -20
- package/src/utils/app/appNameResolver.test.ts +18 -10
- package/src/utils/app/appNameResolver.ts +11 -9
- package/src/utils/app/appPortMap.test.ts +125 -0
- package/src/utils/app/appPortMap.ts +51 -0
- package/src/utils/app/buildAppUrl.test.ts +273 -0
- package/src/utils/app/buildAppUrl.ts +114 -0
- package/src/utils/appConfig.unit.test.ts +55 -0
- package/src/utils/audit/audit.test.ts +354 -39
- package/src/utils/audit.unit.test.ts +69 -0
- package/src/utils/auth-utils.unit.test.ts +69 -0
- package/src/utils/bundleAnalysis.unit.test.ts +326 -0
- package/src/utils/cn.unit.test.ts +34 -0
- package/src/utils/context/organisationContext.test.ts +115 -95
- package/src/utils/context/organisationContext.ts +32 -43
- package/src/utils/context/sessionTracking.test.ts +354 -0
- package/src/utils/core/cn.test.ts +66 -0
- package/src/utils/core/debugLogger.test.ts +113 -0
- package/src/utils/core/debugLogger.ts +15 -8
- package/src/utils/core/logger.test.ts +217 -0
- package/src/utils/core/logger.ts +20 -16
- package/src/utils/core/mergeRefs.ts +24 -0
- package/src/utils/debugLogger.test.ts +417 -0
- package/src/utils/device/deviceFingerprint.test.ts +8 -5
- package/src/utils/device/deviceFingerprint.ts +3 -3
- package/src/utils/deviceFingerprint.unit.test.ts +818 -0
- package/src/utils/dynamic/createLazyComponent.tsx +46 -0
- package/src/utils/dynamic/dynamicUtils.test.ts +185 -0
- package/src/utils/dynamic/dynamicUtils.ts +6 -6
- package/src/utils/dynamic/lazyLoad.test.tsx +156 -0
- package/src/utils/dynamic/lazyLoad.tsx +8 -36
- package/src/utils/dynamic/papaparseLoader.ts +7 -0
- package/src/utils/dynamicUtils.unit.test.ts +331 -0
- package/src/utils/file-reference/file-reference.test.ts +1238 -0
- package/src/utils/file-reference/index.ts +330 -348
- package/src/utils/formatDate.unit.test.ts +109 -0
- package/src/utils/formatting/formatDate.test.ts +22 -148
- package/src/utils/formatting/formatDateTime.test.ts +41 -119
- package/src/utils/formatting/formatDateTimeTimezone.test.ts +41 -85
- package/src/utils/formatting/formatNumber.test.ts +259 -0
- package/src/utils/formatting/formatTime.test.ts +36 -128
- package/src/utils/formatting/formatting.ts +1 -1
- package/src/utils/formatting.unit.test.ts +99 -0
- package/src/utils/google-places/googlePlacesUtils.test.ts +127 -36
- package/src/utils/google-places/googlePlacesUtils.ts +67 -86
- package/src/utils/google-places/loadGoogleMapsScript.test.ts +68 -8
- package/src/utils/google-places/loadGoogleMapsScript.ts +140 -118
- package/src/utils/index.ts +52 -11
- package/src/utils/index.unit.test.ts +251 -0
- package/src/utils/lazyLoad.unit.test.tsx +319 -0
- package/src/utils/location/location.test.ts +19 -116
- package/src/utils/logger.unit.test.ts +398 -0
- package/src/utils/organisationContext.unit.test.ts +180 -0
- package/src/utils/performance/bundleAnalysis.test.ts +148 -0
- package/src/utils/performance/bundleAnalysis.ts +16 -22
- package/src/utils/performance/performanceBenchmark.test.ts +251 -0
- package/src/utils/performance/performanceBenchmark.ts +12 -4
- package/src/utils/performance/performanceBudgets.test.ts +241 -0
- package/src/utils/performance/performanceBudgets.ts +9 -6
- package/src/utils/performanceBenchmark.test.ts +174 -0
- package/src/utils/performanceBudgets.unit.test.ts +288 -0
- package/src/utils/permissionTypes.unit.test.ts +250 -0
- package/src/utils/permissionUtils.unit.test.ts +362 -0
- package/src/utils/permissions/permissionTypes.test.ts +149 -0
- package/src/utils/permissions/permissionUtils.test.ts +20 -42
- package/src/utils/persistence/keyDerivation.test.ts +306 -0
- package/src/utils/persistence/sensitiveFieldDetection.test.ts +271 -0
- package/src/utils/persistence/sensitiveFieldDetection.ts +2 -2
- package/src/utils/request-deduplication.test.ts +349 -0
- package/src/utils/request-deduplication.ts +6 -4
- package/src/utils/sanitization.unit.test.ts +346 -0
- package/src/utils/schemaUtils.unit.test.ts +441 -0
- package/src/utils/secureDataAccess.unit.test.ts +334 -0
- package/src/utils/secureErrors.unit.test.ts +390 -0
- package/src/utils/secureStorage.unit.test.ts +289 -0
- package/src/utils/security/auth-utils.ts +38 -27
- package/src/utils/security/secureDataAccess.test.ts +22 -191
- package/src/utils/security/secureDataAccess.ts +241 -281
- package/src/utils/security/secureErrors.test.ts +163 -0
- package/src/utils/security/secureStorage.test.ts +156 -0
- package/src/utils/security/secureStorage.ts +1 -1
- package/src/utils/security/security.test.ts +212 -0
- package/src/utils/security/security.ts +15 -18
- package/src/utils/security/securityMonitor.test.ts +90 -0
- package/src/utils/security/securityMonitor.ts +1 -1
- package/src/utils/security.unit.test.ts +155 -0
- package/src/utils/securityMonitor.unit.test.ts +276 -0
- package/src/utils/sessionTracking.unit.test.ts +218 -0
- package/src/utils/storage/config.unit.test.ts +239 -0
- package/src/utils/storage/helpers.test.ts +769 -456
- package/src/utils/storage/helpers.ts +174 -253
- package/src/utils/storage/index.unit.test.ts +68 -0
- package/src/utils/storage/storageUtils.ts +32 -0
- package/src/utils/storage/types.ts +9 -2
- package/src/utils/supabase/createBaseClient.test.ts +201 -0
- package/src/utils/supabase/createBaseClient.ts +2 -1
- package/src/utils/timezone/timezone.test.ts +26 -44
- package/src/utils/timezone.test.ts +345 -0
- package/src/utils/validation/common.test.ts +115 -0
- package/src/utils/validation/csrf.test.ts +198 -0
- package/src/utils/validation/csrf.ts +42 -41
- package/src/utils/validation/htmlSanitization.ts +27 -31
- package/src/utils/validation/htmlSanitization.unit.test.ts +618 -0
- package/src/utils/validation/passwordSchema.test.ts +164 -0
- package/src/utils/validation/schema.test.ts +127 -0
- package/src/utils/validation/schema.ts +6 -3
- package/src/utils/validation/sqlInjectionProtection.test.ts +165 -0
- package/src/utils/validation/sqlInjectionProtection.ts +2 -2
- package/src/utils/validation/user.test.ts +173 -0
- package/src/utils/validation/validation.test.ts +197 -0
- package/src/utils/validation/validationUtils.test.ts +294 -0
- package/src/utils/validation.unit.test.ts +307 -0
- package/src/utils/validationUtils.unit.test.ts +558 -0
- package/src/vite-env.d.ts +6 -0
- package/dist/AuthService-DmfO5rGS.d.ts +0 -524
- package/dist/DataTable-DRUIgtUH.d.ts +0 -166
- package/dist/DataTable-SOAFXIWY.js +0 -15
- package/dist/PublicPageProvider-CIGSujI2.d.ts +0 -4147
- package/dist/UnifiedAuthProvider-7SNDOWYD.js +0 -7
- package/dist/UnifiedAuthProvider-CKvHP1MK.d.ts +0 -139
- package/dist/api-7P7DI652.js +0 -4
- package/dist/audit-MYQXYZFU.js +0 -3
- package/dist/auth-BZOJqrdd.d.ts +0 -49
- package/dist/chunk-4DDCYDQ3.js +0 -544
- package/dist/chunk-5HNSDQWH.js +0 -5046
- package/dist/chunk-5W2A3DRC.js +0 -164
- package/dist/chunk-6GLLNA6U.js +0 -31
- package/dist/chunk-7ILTDCL2.js +0 -80
- package/dist/chunk-A3W6LW53.js +0 -70
- package/dist/chunk-AHU7G2R5.js +0 -423
- package/dist/chunk-C7ZQ5O4C.js +0 -481
- package/dist/chunk-EF2UGZWY.js +0 -611
- package/dist/chunk-FEJLJNWA.js +0 -181
- package/dist/chunk-FYHN4DD5.js +0 -415
- package/dist/chunk-GS5672WG.js +0 -2003
- package/dist/chunk-HF6O3O37.js +0 -187
- package/dist/chunk-J2U36LHD.js +0 -8517
- package/dist/chunk-LX6U42O3.js +0 -2177
- package/dist/chunk-MPBLMWVR.js +0 -2161
- package/dist/chunk-OJ4SKRSV.js +0 -105
- package/dist/chunk-S6ZQKDY6.js +0 -62
- package/dist/chunk-S7DKJPLT.js +0 -699
- package/dist/chunk-T5CVK4R3.js +0 -2816
- package/dist/chunk-TTRFSOKR.js +0 -121
- package/dist/chunk-Z2FNRKF3.js +0 -994
- package/dist/database.generated-DT8JTZiP.d.ts +0 -9406
- package/dist/event-CW5YB_2p.d.ts +0 -239
- package/dist/file-reference-BavO2eQj.d.ts +0 -148
- package/dist/functions-lBy5L2ry.d.ts +0 -208
- package/dist/timezone-0AyangqX.d.ts +0 -697
- package/dist/types-BeoeWV5I.d.ts +0 -110
- package/dist/types-DXstZpNI.d.ts +0 -614
- package/dist/types-t9H8qKRw.d.ts +0 -55
- package/dist/usePublicRouteParams-DQLrDqDb.d.ts +0 -876
- package/dist/useToast-AyaT-x7p.d.ts +0 -68
- package/dist/validation-643vUDZW.d.ts +0 -177
- package/scripts/build-docs-incremental.js +0 -179
- package/scripts/eslint-audit.cjs +0 -123
- package/scripts/generate-docs.js +0 -157
- package/scripts/install-cursor-rules.cjs +0 -255
- package/scripts/install-eslint-config.cjs +0 -349
- package/scripts/setup-build-cache.js +0 -73
- package/scripts/validate-pre-publish.js +0 -145
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +0 -260
- package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +0 -224
- package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +0 -273
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +0 -99
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +0 -448
- package/src/__tests__/helpers/__tests__/timer-utils.test.ts +0 -371
- package/src/__tests__/hooks/usePermissions.test.ts +0 -268
- package/src/__tests__/integration/UserProfile.test.tsx +0 -124
- package/src/__tests__/public-recipe-view.test.ts +0 -228
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +0 -220
- package/src/__tests__/rls-policies.test.ts +0 -471
- package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +0 -759
- package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +0 -524
- package/src/components/DataTable/__tests__/DataTable.export.test.tsx +0 -705
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +0 -658
- package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +0 -192
- package/src/components/DataTable/__tests__/DataTable.select-label-display.test.tsx +0 -483
- package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -876
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +0 -220
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +0 -1474
- package/src/components/DataTable/__tests__/README.md +0 -145
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +0 -788
- package/src/components/DataTable/__tests__/keyboard.test.tsx +0 -756
- package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +0 -66
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +0 -730
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +0 -325
- package/src/components/DataTable/__tests__/styles.test.ts +0 -382
- package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +0 -103
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +0 -380
- package/src/components/DataTable/__tests__/test-utils.ts +0 -94
- package/src/components/DataTable/components/AccessDeniedPage.tsx +0 -159
- package/src/components/DataTable/components/ActionButtons.tsx +0 -190
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +0 -160
- package/src/components/DataTable/components/ColumnFilter.tsx +0 -118
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +0 -114
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +0 -225
- package/src/components/DataTable/components/DataTableLayout.tsx +0 -573
- package/src/components/DataTable/components/DataTableModals.tsx +0 -245
- package/src/components/DataTable/components/DataTableToolbar.tsx +0 -271
- package/src/components/DataTable/components/EditFields.tsx +0 -327
- package/src/components/DataTable/components/EditableRow.tsx +0 -462
- package/src/components/DataTable/components/EmptyState.tsx +0 -79
- package/src/components/DataTable/components/FilterRow.tsx +0 -141
- package/src/components/DataTable/components/LoadingState.tsx +0 -17
- package/src/components/DataTable/components/PaginationControls.tsx +0 -289
- package/src/components/DataTable/components/RowComponent.tsx +0 -403
- package/src/components/DataTable/components/SortIndicator.tsx +0 -50
- package/src/components/DataTable/components/UnifiedTableBody.tsx +0 -355
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +0 -657
- package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +0 -913
- package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +0 -572
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +0 -612
- package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.test.tsx +0 -708
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +0 -479
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +0 -475
- package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +0 -157
- package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +0 -1061
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +0 -437
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +0 -474
- package/src/components/DataTable/components/__tests__/GroupingDropdown.test.tsx +0 -617
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +0 -1093
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +0 -139
- package/src/components/DataTable/components/__tests__/PaginationControls.test.tsx +0 -519
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +0 -1004
- package/src/components/DataTable/components/cellValueUtils.ts +0 -40
- package/src/components/DataTable/components/hooks/useImportModalFocus.ts +0 -53
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -122
- package/src/components/DataTable/components/index.ts +0 -16
- package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +0 -342
- package/src/components/DataTable/core/ActionManager.ts +0 -235
- package/src/components/DataTable/core/ColumnManager.ts +0 -205
- package/src/components/DataTable/core/DataManager.ts +0 -188
- package/src/components/DataTable/core/LocalDataAdapter.ts +0 -274
- package/src/components/DataTable/core/PluginRegistry.ts +0 -229
- package/src/components/DataTable/core/StateManager.ts +0 -312
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +0 -123
- package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +0 -305
- package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +0 -84
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +0 -115
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +0 -100
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +0 -120
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +0 -104
- package/src/components/DataTable/core/index.ts +0 -1
- package/src/components/DataTable/core/interfaces.ts +0 -338
- package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +0 -521
- package/src/components/DataTable/hooks/__tests__/useColumnVisibilityPersistence.test.ts +0 -167
- package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +0 -124
- package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +0 -117
- package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +0 -102
- package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +0 -596
- package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +0 -53
- package/src/components/DataTable/hooks/__tests__/useHierarchicalState.test.ts +0 -214
- package/src/components/DataTable/hooks/__tests__/useTableColumns.test.ts +0 -448
- package/src/components/DataTable/hooks/index.ts +0 -13
- package/src/components/DataTable/types.ts +0 -761
- package/src/components/DataTable/utils/__tests__/a11yUtils.test.ts +0 -612
- package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +0 -94
- package/src/components/DataTable/utils/__tests__/errorHandling.test.ts +0 -266
- package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +0 -954
- package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +0 -573
- package/src/components/DataTable/utils/__tests__/hierarchicalSorting.test.ts +0 -247
- package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +0 -570
- package/src/components/DataTable/utils/__tests__/performanceUtils.test.ts +0 -470
- package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +0 -251
- package/src/components/DataTable/utils/__tests__/selectFieldUtils.test.ts +0 -207
- package/src/components/DataTable/utils/index.ts +0 -10
- package/src/components/PublicLayout/index.ts +0 -32
- package/src/components/Select/hooks/useSelectEvents.ts +0 -87
- package/src/components/Select/hooks/useSelectSearch.ts +0 -91
- package/src/components/Select/hooks/useSelectState.ts +0 -104
- package/src/components/Select/utils/text.ts +0 -26
- package/src/hooks/__tests__/ServiceHooks.test.tsx +0 -615
- package/src/hooks/__tests__/hooks.integration.test.tsx +0 -607
- package/src/hooks/__tests__/index.unit.test.ts +0 -220
- package/src/hooks/__tests__/useApiFetch.unit.test.ts +0 -111
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +0 -347
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +0 -144
- package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +0 -776
- package/src/hooks/__tests__/useDataTableState.test.ts +0 -76
- package/src/hooks/__tests__/useDebounce.unit.test.ts +0 -82
- package/src/hooks/__tests__/useEvents.unit.test.ts +0 -252
- package/src/hooks/__tests__/useFileDisplay.unit.test.ts +0 -1112
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +0 -916
- package/src/hooks/__tests__/useFileUrlCache.test.ts +0 -129
- package/src/hooks/__tests__/useFocusManagement.unit.test.ts +0 -230
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +0 -828
- package/src/hooks/__tests__/useFormDialog.test.ts +0 -478
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +0 -446
- package/src/hooks/__tests__/useIsMobile.unit.test.ts +0 -317
- package/src/hooks/__tests__/useKeyboardShortcuts.unit.test.ts +0 -910
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +0 -294
- package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +0 -961
- package/src/hooks/__tests__/useOrganisations.unit.test.ts +0 -369
- package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +0 -694
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +0 -192
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -741
- package/src/hooks/__tests__/usePreventTabReload.test.ts +0 -88
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +0 -785
- package/src/hooks/__tests__/usePublicEvent.test.ts +0 -678
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +0 -630
- package/src/hooks/__tests__/usePublicFileDisplay.test.ts +0 -951
- package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +0 -443
- package/src/hooks/__tests__/useQueryCache.test.ts +0 -144
- package/src/hooks/__tests__/useRBAC.unit.test.ts +0 -236
- package/src/hooks/__tests__/useSessionDraft.test.ts +0 -163
- package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +0 -390
- package/src/hooks/__tests__/useStorage.unit.test.ts +0 -751
- package/src/hooks/__tests__/useToast.unit.test.tsx +0 -481
- package/src/hooks/__tests__/useZodForm.unit.test.tsx +0 -37
- package/src/hooks/public/index.ts +0 -36
- package/src/hooks/public/usePublicFileDisplay.ts +0 -504
- package/src/hooks/useFileDisplay.ts +0 -715
- package/src/providers/OrganisationProvider.tsx +0 -92
- package/src/providers/__tests__/AuthProvider.test.tsx +0 -287
- package/src/providers/__tests__/EventProvider.test.tsx +0 -551
- package/src/providers/__tests__/InactivityProvider.test-helper.tsx +0 -65
- package/src/providers/__tests__/InactivityProvider.test.tsx +0 -572
- package/src/providers/__tests__/OrganisationProvider.test.tsx +0 -617
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +0 -424
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +0 -596
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +0 -263
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +0 -294
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +0 -434
- package/src/rbac/__tests__/auth-rbac-security.integration.test.tsx +0 -313
- package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +0 -486
- package/src/rbac/__tests__/cache-invalidation.test.ts +0 -399
- package/src/rbac/__tests__/engine.comprehensive.test.ts +0 -813
- package/src/rbac/__tests__/isSuperAdmin.real.test.ts +0 -82
- package/src/rbac/__tests__/rbac-core.test.tsx +0 -276
- package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +0 -392
- package/src/rbac/__tests__/rbac-engine-simplified.test.ts +0 -258
- package/src/rbac/__tests__/rbac-functions.test.ts +0 -647
- package/src/rbac/__tests__/rbac-integration.test.ts +0 -524
- package/src/rbac/__tests__/rbac-role-isolation.test.ts +0 -456
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +0 -282
- package/src/rbac/audit-enhanced.ts +0 -384
- package/src/rbac/compliance/database-validator.ts +0 -165
- package/src/rbac/compliance/index.ts +0 -48
- package/src/rbac/compliance/pattern-detector.ts +0 -553
- package/src/rbac/compliance/quick-fix-suggestions.ts +0 -209
- package/src/rbac/compliance/runtime-compliance.ts +0 -99
- package/src/rbac/compliance/setup-validator.ts +0 -131
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +0 -975
- package/src/rbac/components/__tests__/PagePermissionGuard.performance.test.tsx +0 -248
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +0 -242
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +0 -1107
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +0 -184
- package/src/rbac/components/index.ts +0 -26
- package/src/rbac/hooks/__tests__/usePermissions.integration.test.ts +0 -432
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +0 -579
- package/src/rbac/hooks/index.ts +0 -34
- package/src/rbac/hooks/permissions/index.ts +0 -4
- package/src/rbac/hooks/useRBAC.simple.test.ts +0 -95
- package/src/rbac/utils/__tests__/contextValidator.test.ts +0 -128
- package/src/rbac/utils/__tests__/deep-equal.test.ts +0 -53
- package/src/rbac/utils/__tests__/eventContext.test.ts +0 -433
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -490
- package/src/services/__tests__/AuthService.restoreSession.test.ts +0 -39
- package/src/services/__tests__/AuthService.test.ts +0 -1332
- package/src/services/__tests__/BaseService.test.ts +0 -314
- package/src/services/__tests__/EventService.eventColours.test.ts +0 -76
- package/src/services/__tests__/EventService.test.ts +0 -1025
- package/src/services/__tests__/InactivityService.lifecycle.test.ts +0 -411
- package/src/services/__tests__/InactivityService.test.ts +0 -654
- package/src/services/__tests__/OrganisationService.pagination.test.ts +0 -409
- package/src/services/__tests__/OrganisationService.test.ts +0 -1176
- package/src/theming/__tests__/parseEventColours.test.ts +0 -321
- package/src/theming/__tests__/runtime.test.ts +0 -569
- package/src/types/__tests__/file-reference.test.ts +0 -447
- package/src/types/__tests__/guards.test.ts +0 -246
- package/src/types/__tests__/organisation.roles.test.ts +0 -55
- package/src/types/__tests__/organisation.test.ts +0 -1133
- package/src/types/__tests__/theme.test.ts +0 -830
- package/src/types/__tests__/type-validation.test.ts +0 -526
- package/src/types/__tests__/validation.test.ts +0 -731
- package/src/utils/__tests__/appConfig.unit.test.ts +0 -55
- package/src/utils/__tests__/audit.unit.test.ts +0 -69
- package/src/utils/__tests__/auth-utils.unit.test.ts +0 -70
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +0 -339
- package/src/utils/__tests__/cn.unit.test.ts +0 -34
- package/src/utils/__tests__/debugLogger.test.ts +0 -417
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +0 -818
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +0 -318
- package/src/utils/__tests__/formatDate.unit.test.ts +0 -109
- package/src/utils/__tests__/formatting.unit.test.ts +0 -99
- package/src/utils/__tests__/index.unit.test.ts +0 -251
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +0 -321
- package/src/utils/__tests__/logger.unit.test.ts +0 -398
- package/src/utils/__tests__/organisationContext.unit.test.ts +0 -191
- package/src/utils/__tests__/performanceBenchmark.test.ts +0 -175
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +0 -253
- package/src/utils/__tests__/permissionTypes.unit.test.ts +0 -250
- package/src/utils/__tests__/permissionUtils.unit.test.ts +0 -362
- package/src/utils/__tests__/sanitization.unit.test.ts +0 -346
- package/src/utils/__tests__/schemaUtils.unit.test.ts +0 -441
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +0 -335
- package/src/utils/__tests__/secureErrors.unit.test.ts +0 -390
- package/src/utils/__tests__/secureStorage.unit.test.ts +0 -289
- package/src/utils/__tests__/security.unit.test.ts +0 -149
- package/src/utils/__tests__/securityMonitor.unit.test.ts +0 -276
- package/src/utils/__tests__/sessionTracking.unit.test.ts +0 -218
- package/src/utils/__tests__/timezone.test.ts +0 -345
- package/src/utils/__tests__/validation.unit.test.ts +0 -308
- package/src/utils/__tests__/validationUtils.unit.test.ts +0 -555
- package/src/utils/app/appNameResolver.simple.test.ts +0 -212
- package/src/utils/file-reference/__tests__/file-reference.test.ts +0 -875
- package/src/utils/google-places/index.ts +0 -26
- package/src/utils/location/index.ts +0 -16
- package/src/utils/persistence/__tests__/keyDerivation.test.ts +0 -135
- package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +0 -123
- package/src/utils/storage/__tests__/helpers.unit.test.ts +0 -332
- package/src/utils/storage/__tests__/index.unit.test.ts +0 -16
- package/src/utils/storage/index.ts +0 -67
- package/src/utils/timezone/index.ts +0 -17
- package/src/utils/validation/__tests__/csrf.test.ts +0 -105
- package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +0 -598
- package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +0 -92
- package/src/utils/validation/__tests__/validationUtils.test.ts +0 -72
- package/src/utils/validation/index.ts +0 -73
- /package/src/components/DataTable/{components/__tests__ → ui}/COVERAGE_NOTE.md +0 -0
- /package/src/components/DataTable/utils/{__tests__/COVERAGE_NOTE.md → COVERAGE_NOTE.md} +0 -0
- /package/src/providers/{__tests__/README.md → README.md} +0 -0
- /package/src/types/{__tests__/README.md → README.md} +0 -0
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file PaceAppLayout Integration Tests
|
|
3
|
+
* @package @jmruthers/pace-core
|
|
4
|
+
* @module Components/PaceAppLayout/Integration
|
|
5
|
+
* @since 0.1.0
|
|
6
|
+
*
|
|
7
|
+
* Comprehensive integration tests for PaceAppLayout component covering:
|
|
8
|
+
* - Integration with React Router
|
|
9
|
+
* - Integration with authentication providers
|
|
10
|
+
* - Integration with permission systems
|
|
11
|
+
* - Real-world user workflows
|
|
12
|
+
* - Configuration integration
|
|
13
|
+
* - Layout integration
|
|
14
|
+
*/
|
|
15
|
+
|
|
1
16
|
import React from 'react';
|
|
2
17
|
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
3
18
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
@@ -165,15 +180,16 @@ vi.mock('../../hooks/services/useEventService', () => ({
|
|
|
165
180
|
// Mock useEvents hook (used by useEventTheme and ContextSelector)
|
|
166
181
|
// Use the hoisted mockUseEventService so useEvents can work properly
|
|
167
182
|
// But also provide a direct mock for components that import useEvents directly
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
183
|
+
// Note: mockUseEvents is defined but not currently used - kept for potential future use
|
|
184
|
+
// const mockUseEvents = vi.hoisted(() => vi.fn(() => ({
|
|
185
|
+
// selectedEvent: { event_id: 'event-123' },
|
|
186
|
+
// events: [],
|
|
187
|
+
// isLoading: false,
|
|
188
|
+
// error: null,
|
|
189
|
+
// setSelectedEvent: vi.fn(),
|
|
190
|
+
// refreshEvents: vi.fn(),
|
|
191
|
+
// clearEventSelection: vi.fn(),
|
|
192
|
+
// })));
|
|
177
193
|
|
|
178
194
|
// Don't mock useEvents - let it use the mocked useEventService
|
|
179
195
|
// The real useEvents will work because useEventService is mocked
|
|
@@ -231,7 +247,7 @@ vi.mock('../../providers/services/EventServiceProvider', () => {
|
|
|
231
247
|
return React.createElement(MockContext.Provider, { value: mockContextValue }, children);
|
|
232
248
|
},
|
|
233
249
|
EventServiceContext: {
|
|
234
|
-
Provider: ({ children
|
|
250
|
+
Provider: ({ children }: any) => React.createElement('div', { 'data-testid': 'event-service-provider' }, children),
|
|
235
251
|
Consumer: ({ children }: any) => children(mockContextValue),
|
|
236
252
|
},
|
|
237
253
|
useEventService: mockUseEventService,
|
|
@@ -279,9 +295,9 @@ vi.mock('../../rbac/api', () => ({
|
|
|
279
295
|
setupRBAC: vi.fn()
|
|
280
296
|
}));
|
|
281
297
|
|
|
282
|
-
// Mock RBAC hooks
|
|
298
|
+
// Mock RBAC hooks - mock individual files since barrel was removed
|
|
283
299
|
// Reference hoisted mocks - they're available when factory runs
|
|
284
|
-
vi.mock('../../rbac/hooks', () => ({
|
|
300
|
+
vi.mock('../../rbac/hooks/useRBAC', () => ({
|
|
285
301
|
useRBAC: vi.fn(() => ({
|
|
286
302
|
hasPermission: mockHasPermissionRBAC,
|
|
287
303
|
isLoading: false,
|
|
@@ -294,7 +310,9 @@ vi.mock('../../rbac/hooks', () => ({
|
|
|
294
310
|
eventRoles: [],
|
|
295
311
|
permissionMap: {},
|
|
296
312
|
})),
|
|
297
|
-
|
|
313
|
+
}));
|
|
314
|
+
|
|
315
|
+
vi.mock('../../rbac/hooks/useResolvedScope', () => ({
|
|
298
316
|
useResolvedScope: vi.fn(() => ({
|
|
299
317
|
resolvedScope: { organisationId: 'org-123', eventId: 'event-123', appId: 'app-123' },
|
|
300
318
|
isLoading: false,
|
|
@@ -302,6 +320,10 @@ vi.mock('../../rbac/hooks', () => ({
|
|
|
302
320
|
})),
|
|
303
321
|
}));
|
|
304
322
|
|
|
323
|
+
vi.mock('../../rbac/hooks/usePermissions', () => ({
|
|
324
|
+
useCan: mockUseCan,
|
|
325
|
+
}));
|
|
326
|
+
|
|
305
327
|
// Mock ContextSelector to avoid useEventService requirement
|
|
306
328
|
vi.mock('../ContextSelector', () => ({
|
|
307
329
|
ContextSelector: vi.fn(({ placeholder, className, 'data-testid': testId }: any) => (
|
|
@@ -323,26 +345,24 @@ vi.mock('../Header', () => ({
|
|
|
323
345
|
navItems,
|
|
324
346
|
actions,
|
|
325
347
|
userMenu,
|
|
326
|
-
logo,
|
|
327
348
|
logoUrl,
|
|
349
|
+
logoAlt,
|
|
328
350
|
showContextSelector,
|
|
329
351
|
showUserMenu,
|
|
330
352
|
className
|
|
331
353
|
}) => (
|
|
332
354
|
<header data-testid="mock-header" role="banner" className={className}>
|
|
333
|
-
<div data-testid="app-name">{
|
|
355
|
+
<div data-testid="app-name">{logoAlt ? logoAlt.replace(' Logo', '') : 'Test App'}</div>
|
|
334
356
|
<div data-testid="user-info">{user?.user_metadata?.display_name || user?.email}</div>
|
|
335
357
|
<div data-testid="nav-items-count">{navItems?.length || 0}</div>
|
|
336
358
|
{actions && actions}
|
|
337
359
|
<div data-testid="has-actions">{actions ? 'true' : 'false'}</div>
|
|
338
360
|
{userMenu && userMenu}
|
|
339
361
|
<div data-testid="has-custom-user-menu">{userMenu ? 'true' : 'false'}</div>
|
|
340
|
-
{logo && logo}
|
|
341
|
-
<div data-testid="has-custom-logo">{logo ? 'true' : 'false'}</div>
|
|
342
362
|
<div data-testid="logo-url">{logoUrl || 'default'}</div>
|
|
343
363
|
<div data-testid="show-user-menu">{showUserMenu !== false ? 'true' : 'false'}</div>
|
|
344
364
|
<nav data-testid="navigation">
|
|
345
|
-
{navItems?.map((item
|
|
365
|
+
{navItems?.map((item) => (
|
|
346
366
|
<button
|
|
347
367
|
key={item.id}
|
|
348
368
|
data-testid={`nav-${item.id}`}
|
|
@@ -451,6 +471,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
451
471
|
|
|
452
472
|
// Reset RBAC hook mocks
|
|
453
473
|
// Access hoisted mocks directly (they're available in this scope)
|
|
474
|
+
// CRITICAL: All mocks must resolve immediately to prevent test hanging
|
|
454
475
|
mockHasPermissionRBAC.mockClear();
|
|
455
476
|
mockHasPermissionRBAC.mockResolvedValue(true);
|
|
456
477
|
mockUseCan.mockReturnValue({
|
|
@@ -465,11 +486,12 @@ describe('PaceAppLayout Integration', () => {
|
|
|
465
486
|
mockIsPermitted = vi.mocked(isPermitted);
|
|
466
487
|
|
|
467
488
|
// Reset super admin mock (use module-level mockIsSuperAdmin)
|
|
489
|
+
// CRITICAL: Must resolve immediately to prevent hanging
|
|
468
490
|
mockIsSuperAdmin.mockClear();
|
|
469
491
|
mockIsSuperAdmin.mockResolvedValue(false);
|
|
470
492
|
|
|
471
493
|
// Reset mockIsPermitted to default implementation
|
|
472
|
-
mockIsPermitted.mockImplementation((
|
|
494
|
+
mockIsPermitted.mockImplementation((_input) => {
|
|
473
495
|
return Promise.resolve(true);
|
|
474
496
|
});
|
|
475
497
|
|
|
@@ -557,23 +579,6 @@ describe('PaceAppLayout Integration', () => {
|
|
|
557
579
|
expect(screen.getByTestId('has-custom-user-menu')).toHaveTextContent('true');
|
|
558
580
|
});
|
|
559
581
|
|
|
560
|
-
it('integrates with custom logo', () => {
|
|
561
|
-
const CustomLogo = () => (
|
|
562
|
-
<div data-testid="custom-logo">
|
|
563
|
-
<img src="/custom-logo.svg" alt="Custom Logo" />
|
|
564
|
-
</div>
|
|
565
|
-
);
|
|
566
|
-
|
|
567
|
-
render(
|
|
568
|
-
<TestWrapper>
|
|
569
|
-
<PaceAppLayout appName="Test App" customLogo={<CustomLogo />} enforcePermissions={false} />
|
|
570
|
-
</TestWrapper>
|
|
571
|
-
);
|
|
572
|
-
|
|
573
|
-
expect(screen.getByTestId('custom-logo')).toBeInTheDocument();
|
|
574
|
-
expect(screen.getByTestId('has-custom-logo')).toHaveTextContent('true');
|
|
575
|
-
expect(screen.getByTestId('logo-url')).toHaveTextContent('default');
|
|
576
|
-
});
|
|
577
582
|
});
|
|
578
583
|
|
|
579
584
|
describe('Navigation Integration', () => {
|
|
@@ -698,7 +703,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
698
703
|
{ id: 'admin', label: 'Admin', href: '/admin' }
|
|
699
704
|
];
|
|
700
705
|
|
|
701
|
-
it('integrates permission enforcement with navigation', async () => {
|
|
706
|
+
it('integrates permission enforcement with navigation', { timeout: 15000 }, async () => {
|
|
702
707
|
const routePermissions = {
|
|
703
708
|
'/dashboard': 'read',
|
|
704
709
|
'/settings': 'read'
|
|
@@ -719,7 +724,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
719
724
|
await waitFor(() => {
|
|
720
725
|
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
721
726
|
expect(screen.getByTestId('mock-outlet')).toBeInTheDocument();
|
|
722
|
-
}, { timeout:
|
|
727
|
+
}, { timeout: 10000 });
|
|
723
728
|
});
|
|
724
729
|
|
|
725
730
|
it('integrates permission filtering with navigation items', async () => {
|
|
@@ -730,7 +735,6 @@ describe('PaceAppLayout Integration', () => {
|
|
|
730
735
|
};
|
|
731
736
|
|
|
732
737
|
// Get the mocked isPermitted and update it to deny 'private' page access
|
|
733
|
-
const rbacApi = await import('../../rbac/api');
|
|
734
738
|
|
|
735
739
|
render(
|
|
736
740
|
<TestWrapper>
|
|
@@ -750,7 +754,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
750
754
|
}, { timeout: 2000 });
|
|
751
755
|
});
|
|
752
756
|
|
|
753
|
-
it('integrates custom page ID mapping with permissions', async () => {
|
|
757
|
+
it('integrates custom page ID mapping with permissions', { timeout: 15000 }, async () => {
|
|
754
758
|
const pageIdMapping = {
|
|
755
759
|
'/test-path': 'custom-page-id'
|
|
756
760
|
};
|
|
@@ -772,7 +776,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
772
776
|
}, { timeout: 2000 });
|
|
773
777
|
});
|
|
774
778
|
|
|
775
|
-
it('integrates permission fallback with custom components', async () => {
|
|
779
|
+
it('integrates permission fallback with custom components', { timeout: 15000 }, async () => {
|
|
776
780
|
// Mock the RBAC system to deny permission
|
|
777
781
|
const CustomFallback = () => (
|
|
778
782
|
<div data-testid="custom-fallback">
|
|
@@ -833,7 +837,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
833
837
|
expect(screen.getByRole('contentinfo')).toBeInTheDocument(); // footer
|
|
834
838
|
|
|
835
839
|
const main = screen.getByTestId('mock-outlet').parentElement;
|
|
836
|
-
expect(main).toHaveClass('px-4', 'w-
|
|
840
|
+
expect(main).toHaveClass('px-4', 'w-full', 'max-w-app-content-max', 'mx-auto', 'py-8');
|
|
837
841
|
});
|
|
838
842
|
|
|
839
843
|
it('ensures main content area grows to fill available space', () => {
|
|
@@ -844,7 +848,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
844
848
|
);
|
|
845
849
|
|
|
846
850
|
const main = screen.getByTestId('mock-outlet').parentElement;
|
|
847
|
-
expect(main).toHaveClass('px-4', 'w-
|
|
851
|
+
expect(main).toHaveClass('px-4', 'w-full', 'max-w-app-content-max', 'mx-auto', 'py-8');
|
|
848
852
|
});
|
|
849
853
|
|
|
850
854
|
it('integrates custom header className', () => {
|
|
@@ -864,7 +868,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
864
868
|
</TestWrapper>
|
|
865
869
|
);
|
|
866
870
|
|
|
867
|
-
expect(screen.getByTestId('mock-header')).toHaveClass('sticky', 'top-0', 'z-
|
|
871
|
+
expect(screen.getByTestId('mock-header')).toHaveClass('sticky', 'top-0', 'z-header', 'w-full');
|
|
868
872
|
});
|
|
869
873
|
});
|
|
870
874
|
|
|
@@ -952,7 +956,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
952
956
|
}, { timeout: 2000 });
|
|
953
957
|
});
|
|
954
958
|
|
|
955
|
-
it('handles complex navigation with custom items and permissions', async () => {
|
|
959
|
+
it('handles complex navigation with custom items and permissions', { timeout: 15000 }, async () => {
|
|
956
960
|
// Mock permission check to filter admin access
|
|
957
961
|
mockIsPermitted.mockImplementation((input) => {
|
|
958
962
|
if (input.pageId === 'admin') return Promise.resolve(false);
|
|
@@ -1025,7 +1029,6 @@ describe('PaceAppLayout Integration', () => {
|
|
|
1025
1029
|
|
|
1026
1030
|
const HeaderActions = () => <div data-testid="header-actions">Actions</div>;
|
|
1027
1031
|
const CustomUserMenu = () => <div data-testid="custom-user-menu">Menu</div>;
|
|
1028
|
-
const CustomLogo = () => <div data-testid="custom-logo">Logo</div>;
|
|
1029
1032
|
|
|
1030
1033
|
const routePermissions = {
|
|
1031
1034
|
'/custom1': 'read',
|
|
@@ -1044,7 +1047,6 @@ describe('PaceAppLayout Integration', () => {
|
|
|
1044
1047
|
navItems={stableConfigNavItems}
|
|
1045
1048
|
headerActions={<HeaderActions />}
|
|
1046
1049
|
customUserMenu={<CustomUserMenu />}
|
|
1047
|
-
customLogo={<CustomLogo />}
|
|
1048
1050
|
showContextSelector={false}
|
|
1049
1051
|
showUserMenu={false}
|
|
1050
1052
|
headerClassName="complex-header-class"
|
|
@@ -1059,7 +1061,6 @@ describe('PaceAppLayout Integration', () => {
|
|
|
1059
1061
|
// Verify all custom components are rendered
|
|
1060
1062
|
expect(screen.getByTestId('header-actions')).toBeInTheDocument();
|
|
1061
1063
|
expect(screen.getByTestId('custom-user-menu')).toBeInTheDocument();
|
|
1062
|
-
expect(screen.getByTestId('custom-logo')).toBeInTheDocument();
|
|
1063
1064
|
|
|
1064
1065
|
// Verify configuration is applied
|
|
1065
1066
|
expect(screen.getByTestId('app-name')).toHaveTextContent('Complex App');
|
|
@@ -1069,7 +1070,7 @@ describe('PaceAppLayout Integration', () => {
|
|
|
1069
1070
|
expect(screen.getByTestId('mock-header')).toHaveClass('complex-header-class');
|
|
1070
1071
|
});
|
|
1071
1072
|
|
|
1072
|
-
it('handles dynamic configuration changes', async () => {
|
|
1073
|
+
it('handles dynamic configuration changes', { timeout: 15000 }, async () => {
|
|
1073
1074
|
// Ensure super admin check resolves immediately
|
|
1074
1075
|
mockIsSuperAdmin.mockResolvedValue(false);
|
|
1075
1076
|
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file PaceAppLayout Performance Tests
|
|
3
|
+
* @package @jmruthers/pace-core
|
|
4
|
+
* @module Components/PaceAppLayout/Performance
|
|
5
|
+
* @since 0.1.0
|
|
6
|
+
*
|
|
7
|
+
* Comprehensive performance tests for PaceAppLayout component covering:
|
|
8
|
+
* - Render performance and optimization
|
|
9
|
+
* - Re-render prevention with stable props
|
|
10
|
+
* - Memory usage and cleanup
|
|
11
|
+
* - Navigation performance
|
|
12
|
+
* - Permission check performance
|
|
13
|
+
*/
|
|
14
|
+
|
|
1
15
|
import React from 'react';
|
|
2
16
|
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
3
17
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
@@ -202,6 +216,7 @@ vi.mock('../../providers/services/EventServiceProvider', () => {
|
|
|
202
216
|
|
|
203
217
|
// Define mocks using vi.hoisted() so they're available in hoisted vi.mock factories
|
|
204
218
|
// Note: Cannot export hoisted variables directly, so we define them and access directly in tests
|
|
219
|
+
// CRITICAL: All mocks must resolve immediately to prevent test hanging
|
|
205
220
|
const mockIsPermitted = vi.hoisted(() => vi.fn().mockResolvedValue(true));
|
|
206
221
|
const mockCheckPermission = vi.hoisted(() => vi.fn().mockResolvedValue(true));
|
|
207
222
|
const mockHasPermissionRBAC = vi.hoisted(() => vi.fn().mockResolvedValue(true));
|
|
@@ -228,16 +243,17 @@ vi.mock('@supabase/supabase-js', () => {
|
|
|
228
243
|
|
|
229
244
|
// Mock the new RBAC system for performance testing
|
|
230
245
|
// Reference hoisted mocks - they're available when factory runs
|
|
246
|
+
// CRITICAL: All async mocks must resolve immediately to prevent test hanging
|
|
231
247
|
vi.mock('../../rbac/api', () => ({
|
|
232
248
|
isPermitted: mockIsPermitted,
|
|
233
249
|
isPermittedCached: vi.fn().mockResolvedValue(true),
|
|
234
250
|
getPermissionMap: vi.fn().mockResolvedValue({}),
|
|
235
251
|
getAccessLevel: vi.fn().mockResolvedValue('viewer'),
|
|
236
252
|
isSuperAdmin: mockIsSuperAdmin,
|
|
237
|
-
setupRBAC: vi.fn()
|
|
253
|
+
setupRBAC: vi.fn().mockResolvedValue(undefined)
|
|
238
254
|
}));
|
|
239
255
|
|
|
240
|
-
// Mock RBAC hooks
|
|
256
|
+
// Mock RBAC hooks - mock individual files since barrel was removed
|
|
241
257
|
// Reference hoisted mocks - they're available when factory runs
|
|
242
258
|
// Mock useCan hook - create a mock function that can be controlled in tests
|
|
243
259
|
const mockUseCanFn = vi.fn(() => ({
|
|
@@ -247,7 +263,7 @@ const mockUseCanFn = vi.fn(() => ({
|
|
|
247
263
|
refetch: vi.fn().mockResolvedValue(undefined),
|
|
248
264
|
}));
|
|
249
265
|
|
|
250
|
-
vi.mock('../../rbac/hooks', () => ({
|
|
266
|
+
vi.mock('../../rbac/hooks/useRBAC', () => ({
|
|
251
267
|
useRBAC: vi.fn(() => ({
|
|
252
268
|
hasPermission: mockHasPermissionRBAC,
|
|
253
269
|
isLoading: false,
|
|
@@ -260,7 +276,13 @@ vi.mock('../../rbac/hooks', () => ({
|
|
|
260
276
|
eventRoles: [],
|
|
261
277
|
permissionMap: {},
|
|
262
278
|
})),
|
|
279
|
+
}));
|
|
280
|
+
|
|
281
|
+
vi.mock('../../rbac/hooks/usePermissions', () => ({
|
|
263
282
|
useCan: (...args: any[]) => mockUseCanFn(...args),
|
|
283
|
+
}));
|
|
284
|
+
|
|
285
|
+
vi.mock('../../rbac/hooks/useResolvedScope', () => ({
|
|
264
286
|
useResolvedScope: vi.fn(() => ({
|
|
265
287
|
resolvedScope: { organisationId: 'org-123', eventId: 'event-123', appId: 'app-123' },
|
|
266
288
|
isLoading: false,
|
|
@@ -370,6 +392,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
370
392
|
|
|
371
393
|
(performance as any).memory = { usedJSHeapSize: 10_000_000 };
|
|
372
394
|
|
|
395
|
+
// CRITICAL: Ensure all async mocks resolve immediately to prevent hanging
|
|
373
396
|
mockUpdatePassword.mockResolvedValue({ error: null });
|
|
374
397
|
mockCheckPermission.mockClear();
|
|
375
398
|
mockCheckPermission.mockResolvedValue(true);
|
|
@@ -378,15 +401,29 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
378
401
|
// Reset RBAC hook mock
|
|
379
402
|
mockHasPermissionRBAC.mockClear();
|
|
380
403
|
mockHasPermissionRBAC.mockResolvedValue(true);
|
|
404
|
+
// Ensure super admin mock resolves immediately
|
|
405
|
+
mockIsSuperAdmin.mockClear();
|
|
406
|
+
mockIsSuperAdmin.mockResolvedValue(false);
|
|
407
|
+
// Reset useCan mock to return resolved state
|
|
408
|
+
mockUseCanFn.mockReturnValue({
|
|
409
|
+
can: true,
|
|
410
|
+
isLoading: false,
|
|
411
|
+
error: null,
|
|
412
|
+
refetch: vi.fn().mockResolvedValue(undefined),
|
|
413
|
+
});
|
|
381
414
|
});
|
|
382
415
|
|
|
383
416
|
afterEach(() => {
|
|
384
417
|
performanceNowSpy?.mockRestore();
|
|
385
418
|
(performance as any).memory = originalPerformanceMemory;
|
|
419
|
+
// Clear all timers to prevent hanging
|
|
420
|
+
vi.clearAllTimers();
|
|
421
|
+
// Ensure all mocks are reset
|
|
422
|
+
vi.clearAllMocks();
|
|
386
423
|
});
|
|
387
424
|
|
|
388
425
|
describe('Rendering Performance', () => {
|
|
389
|
-
it('renders within performance threshold', async () => {
|
|
426
|
+
it('renders within performance threshold', { timeout: 10000 }, async () => {
|
|
390
427
|
render(
|
|
391
428
|
<TestWrapper>
|
|
392
429
|
<PaceAppLayout appName="Test App" />
|
|
@@ -395,30 +432,27 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
395
432
|
|
|
396
433
|
await waitFor(() => {
|
|
397
434
|
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
398
|
-
});
|
|
435
|
+
}, { timeout: 5000 });
|
|
399
436
|
});
|
|
400
437
|
|
|
401
|
-
it('renders with custom components within threshold', async () => {
|
|
402
|
-
const CustomLogo = () => <div data-testid="custom-logo">Custom Logo</div>;
|
|
438
|
+
it('renders with custom components within threshold', { timeout: 10000 }, async () => {
|
|
403
439
|
const CustomUserMenu = () => <div data-testid="custom-user-menu">Custom Menu</div>;
|
|
404
440
|
|
|
405
441
|
render(
|
|
406
442
|
<TestWrapper>
|
|
407
443
|
<PaceAppLayout
|
|
408
444
|
appName="Test App"
|
|
409
|
-
customLogo={<CustomLogo />}
|
|
410
445
|
customUserMenu={<CustomUserMenu />}
|
|
411
446
|
/>
|
|
412
447
|
</TestWrapper>
|
|
413
448
|
);
|
|
414
449
|
|
|
415
450
|
await waitFor(() => {
|
|
416
|
-
expect(screen.getByTestId('custom-logo')).toBeInTheDocument();
|
|
417
451
|
expect(screen.getByTestId('custom-user-menu')).toBeInTheDocument();
|
|
418
|
-
});
|
|
452
|
+
}, { timeout: 5000 });
|
|
419
453
|
});
|
|
420
454
|
|
|
421
|
-
it('renders with large navigation items within threshold', async () => {
|
|
455
|
+
it('renders with large navigation items within threshold', { timeout: 10000 }, async () => {
|
|
422
456
|
const largeNavItems = Array.from({ length: 50 }, (_, i) => ({
|
|
423
457
|
id: `nav-${i}`,
|
|
424
458
|
label: `Navigation ${i}`,
|
|
@@ -433,7 +467,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
433
467
|
|
|
434
468
|
await waitFor(() => {
|
|
435
469
|
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
436
|
-
});
|
|
470
|
+
}, { timeout: 5000 });
|
|
437
471
|
expect(screen.getAllByRole('button').length).toBeGreaterThan(0);
|
|
438
472
|
});
|
|
439
473
|
});
|
|
@@ -452,7 +486,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
452
486
|
// Wait for permission check to complete and component to render
|
|
453
487
|
await waitFor(() => {
|
|
454
488
|
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
455
|
-
});
|
|
489
|
+
}, { timeout: 5000 });
|
|
456
490
|
|
|
457
491
|
// Use real performance.now() for accurate timing (temporarily restore the spy)
|
|
458
492
|
// Note: We're measuring after mount, so this should be very fast
|
|
@@ -501,7 +535,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
501
535
|
// Wait for component to fully mount (including super admin check)
|
|
502
536
|
await waitFor(() => {
|
|
503
537
|
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
504
|
-
});
|
|
538
|
+
}, { timeout: 5000 });
|
|
505
539
|
|
|
506
540
|
// Use real performance.now() for accurate timing (temporarily restore the spy)
|
|
507
541
|
performanceNowSpy?.mockRestore();
|
|
@@ -529,7 +563,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
529
563
|
}
|
|
530
564
|
});
|
|
531
565
|
|
|
532
|
-
it('handles permission check errors efficiently', async () => {
|
|
566
|
+
it('handles permission check errors efficiently', { timeout: 10000 }, async () => {
|
|
533
567
|
mockUseCanFn.mockReturnValue({
|
|
534
568
|
can: false,
|
|
535
569
|
isLoading: false,
|
|
@@ -545,12 +579,12 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
545
579
|
|
|
546
580
|
await waitFor(() => {
|
|
547
581
|
expect(screen.getByText('Permission check failed')).toBeInTheDocument();
|
|
548
|
-
});
|
|
582
|
+
}, { timeout: 5000 });
|
|
549
583
|
});
|
|
550
584
|
});
|
|
551
585
|
|
|
552
586
|
describe('Memory Usage', () => {
|
|
553
|
-
it('does not cause significant memory leaks on re-renders', () => {
|
|
587
|
+
it('does not cause significant memory leaks on re-renders', { timeout: 10000 }, () => {
|
|
554
588
|
const initialMemory = (performance as any).memory?.usedJSHeapSize || 0;
|
|
555
589
|
|
|
556
590
|
const { rerender } = render(
|
|
@@ -581,7 +615,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
581
615
|
}
|
|
582
616
|
});
|
|
583
617
|
|
|
584
|
-
it('handles large navigation items without memory issues', () => {
|
|
618
|
+
it('handles large navigation items without memory issues', { timeout: 10000 }, () => {
|
|
585
619
|
const largeNavItems = Array.from({ length: 100 }, (_, i) => ({
|
|
586
620
|
id: `nav-${i}`,
|
|
587
621
|
label: `Navigation ${i}`,
|
|
@@ -611,7 +645,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
611
645
|
});
|
|
612
646
|
|
|
613
647
|
describe('Re-render Performance', () => {
|
|
614
|
-
it('handles prop changes efficiently', () => {
|
|
648
|
+
it('handles prop changes efficiently', { timeout: 10000 }, () => {
|
|
615
649
|
const { rerender } = render(
|
|
616
650
|
<TestWrapper>
|
|
617
651
|
<PaceAppLayout appName="Test App" />
|
|
@@ -646,7 +680,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
646
680
|
}
|
|
647
681
|
});
|
|
648
682
|
|
|
649
|
-
it('handles permission enforcement toggles efficiently', async () => {
|
|
683
|
+
it('handles permission enforcement toggles efficiently', { timeout: 10000 }, async () => {
|
|
650
684
|
// Ensure super admin check resolves immediately for performance testing
|
|
651
685
|
mockIsSuperAdmin.mockResolvedValue(false);
|
|
652
686
|
|
|
@@ -659,7 +693,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
659
693
|
// Wait for initial mount
|
|
660
694
|
await waitFor(() => {
|
|
661
695
|
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
662
|
-
});
|
|
696
|
+
}, { timeout: 5000 });
|
|
663
697
|
|
|
664
698
|
// Use real performance.now() for accurate timing (temporarily restore the spy)
|
|
665
699
|
performanceNowSpy?.mockRestore();
|
|
@@ -672,7 +706,10 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
672
706
|
</TestWrapper>
|
|
673
707
|
);
|
|
674
708
|
|
|
675
|
-
|
|
709
|
+
// Wait for re-render to complete
|
|
710
|
+
await waitFor(() => {
|
|
711
|
+
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
712
|
+
}, { timeout: 1000 });
|
|
676
713
|
|
|
677
714
|
rerender(
|
|
678
715
|
<TestWrapper>
|
|
@@ -701,7 +738,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
701
738
|
});
|
|
702
739
|
|
|
703
740
|
describe('Navigation Performance', () => {
|
|
704
|
-
it('handles rapid navigation efficiently', () => {
|
|
741
|
+
it('handles rapid navigation efficiently', { timeout: 10000 }, () => {
|
|
705
742
|
const navItems = [
|
|
706
743
|
{ id: 'home', label: 'Home', href: '/' },
|
|
707
744
|
{ id: 'dashboard', label: 'Dashboard', href: '/dashboard' },
|
|
@@ -731,18 +768,18 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
731
768
|
|
|
732
769
|
// Rapidly click navigation buttons
|
|
733
770
|
// If not, this test will fail.
|
|
734
|
-
// @ts-
|
|
771
|
+
// @ts-expect-error - fireEvent.click is used for performance testing
|
|
735
772
|
fireEvent.click(screen.getByTestId('nav-nav-0'));
|
|
736
|
-
// @ts-
|
|
773
|
+
// @ts-expect-error - fireEvent.click is used for performance testing
|
|
737
774
|
fireEvent.click(screen.getByTestId('nav-nav-1'));
|
|
738
|
-
// @ts-
|
|
775
|
+
// @ts-expect-error - fireEvent.click is used for performance testing
|
|
739
776
|
fireEvent.click(screen.getByTestId('nav-nav-2'));
|
|
740
777
|
|
|
741
778
|
// Should handle rapid navigation without performance issues
|
|
742
779
|
expect(mockNavigate).toHaveBeenCalledTimes(3);
|
|
743
780
|
});
|
|
744
781
|
|
|
745
|
-
it('handles large navigation items efficiently', () => {
|
|
782
|
+
it('handles large navigation items efficiently', { timeout: 10000 }, () => {
|
|
746
783
|
const largeNavItems = Array.from({ length: 50 }, (_, i) => ({
|
|
747
784
|
id: `nav-${i}`,
|
|
748
785
|
label: `Navigation ${i}`,
|
|
@@ -760,7 +797,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
760
797
|
// Click on multiple navigation items
|
|
761
798
|
for (let i = 0; i < 5; i++) {
|
|
762
799
|
const navButton = screen.getByTestId(`nav-nav-${i}`);
|
|
763
|
-
// @ts-
|
|
800
|
+
// @ts-expect-error - fireEvent.click expects specific event types, but test environment allows this
|
|
764
801
|
fireEvent.click(navButton);
|
|
765
802
|
}
|
|
766
803
|
|
|
@@ -772,7 +809,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
772
809
|
});
|
|
773
810
|
|
|
774
811
|
describe('Authentication Performance', () => {
|
|
775
|
-
it('handles authentication actions efficiently', async () => {
|
|
812
|
+
it('handles authentication actions efficiently', { timeout: 10000 }, async () => {
|
|
776
813
|
// Ensure super admin check resolves immediately for performance testing
|
|
777
814
|
mockIsSuperAdmin.mockResolvedValue(false);
|
|
778
815
|
|
|
@@ -789,7 +826,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
789
826
|
// Wait for component to fully mount (including super admin check)
|
|
790
827
|
await waitFor(() => {
|
|
791
828
|
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
792
|
-
});
|
|
829
|
+
}, { timeout: 5000 });
|
|
793
830
|
|
|
794
831
|
// Use real performance.now() for accurate timing (temporarily restore the spy)
|
|
795
832
|
performanceNowSpy?.mockRestore();
|
|
@@ -802,8 +839,11 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
802
839
|
fireEvent.click(signOutButton);
|
|
803
840
|
fireEvent.click(changePasswordButton);
|
|
804
841
|
|
|
805
|
-
// Wait for async operations to complete
|
|
806
|
-
await
|
|
842
|
+
// Wait for async operations to complete with timeout
|
|
843
|
+
await waitFor(() => {
|
|
844
|
+
expect(mockSignOut).toHaveBeenCalled();
|
|
845
|
+
expect(mockUpdatePassword).toHaveBeenCalled();
|
|
846
|
+
}, { timeout: 1000 });
|
|
807
847
|
|
|
808
848
|
const endTime = performance.now();
|
|
809
849
|
const authTime = endTime - startTime;
|
|
@@ -827,7 +867,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
827
867
|
expect(mockUpdatePassword).toHaveBeenCalledWith('newpassword123');
|
|
828
868
|
});
|
|
829
869
|
|
|
830
|
-
it('handles authentication errors efficiently', async () => {
|
|
870
|
+
it('handles authentication errors efficiently', { timeout: 10000 }, async () => {
|
|
831
871
|
// Ensure super admin check resolves immediately for performance testing
|
|
832
872
|
mockIsSuperAdmin.mockResolvedValue(false);
|
|
833
873
|
|
|
@@ -846,7 +886,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
846
886
|
// Wait for component to fully mount (including super admin check)
|
|
847
887
|
await waitFor(() => {
|
|
848
888
|
expect(screen.getByTestId('mock-header')).toBeInTheDocument();
|
|
849
|
-
});
|
|
889
|
+
}, { timeout: 5000 });
|
|
850
890
|
|
|
851
891
|
// Use real performance.now() for accurate timing (temporarily restore the spy)
|
|
852
892
|
performanceNowSpy?.mockRestore();
|
|
@@ -859,8 +899,11 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
859
899
|
fireEvent.click(signOutButton);
|
|
860
900
|
fireEvent.click(changePasswordButton);
|
|
861
901
|
|
|
862
|
-
// Wait for async operations to complete
|
|
863
|
-
await
|
|
902
|
+
// Wait for async operations to complete with timeout
|
|
903
|
+
await waitFor(() => {
|
|
904
|
+
expect(mockSignOut).toHaveBeenCalled();
|
|
905
|
+
expect(mockUpdatePassword).toHaveBeenCalled();
|
|
906
|
+
}, { timeout: 1000 });
|
|
864
907
|
|
|
865
908
|
const endTime = performance.now();
|
|
866
909
|
const authTime = endTime - startTime;
|
|
@@ -884,7 +927,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
884
927
|
});
|
|
885
928
|
|
|
886
929
|
describe('Complex Configuration Performance', () => {
|
|
887
|
-
it('handles complex configurations efficiently', async () => {
|
|
930
|
+
it('handles complex configurations efficiently', { timeout: 10000 }, async () => {
|
|
888
931
|
const customNavItems = Array.from({ length: 20 }, (_, i) => ({
|
|
889
932
|
id: `nav-${i}`,
|
|
890
933
|
label: `Navigation ${i}`,
|
|
@@ -939,7 +982,7 @@ const TestWrapper = ({ children }: { children: React.ReactNode }) => (
|
|
|
939
982
|
await waitFor(() => {
|
|
940
983
|
expect(screen.getByTestId('header-actions')).toBeInTheDocument();
|
|
941
984
|
expect(screen.getByTestId('custom-user-menu')).toBeInTheDocument();
|
|
942
|
-
});
|
|
985
|
+
}, { timeout: 5000 });
|
|
943
986
|
|
|
944
987
|
const endTime = performance.now();
|
|
945
988
|
const renderTime = endTime - startTime;
|