@jmruthers/pace-core 0.5.193 → 0.6.2
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 +62 -0
- package/README.md +7 -1
- package/cursor-rules/00-pace-core-compliance.mdc +299 -0
- package/cursor-rules/01-standards-compliance.mdc +244 -0
- package/cursor-rules/02-project-structure.mdc +200 -0
- package/cursor-rules/03-solid-principles.mdc +222 -0
- package/cursor-rules/04-testing-standards.mdc +268 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
- package/cursor-rules/06-code-quality.mdc +309 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +214 -0
- package/cursor-rules/08-markup-quality.mdc +452 -0
- package/cursor-rules/CHANGELOG.md +119 -0
- package/cursor-rules/README.md +192 -0
- package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
- package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-BMRU8a1j.d.ts} +34 -2
- package/dist/{DataTable-5FU7IESH.js → DataTable-TPTKCX4D.js} +10 -9
- package/dist/{PublicPageProvider-C0Sm_e5k.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +385 -261
- package/dist/{UnifiedAuthProvider-RGJTDE2C.js → UnifiedAuthProvider-CH6Z342H.js} +3 -3
- package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CVcTjx-d.d.ts} +29 -0
- package/dist/{api-N774RPUA.js → api-MVVQZLJI.js} +2 -2
- package/dist/{chunk-KNC55RTG.js → chunk-24UVZUZG.js} +90 -54
- package/dist/chunk-24UVZUZG.js.map +1 -0
- package/dist/{chunk-HWIIPPNI.js → chunk-2UOI2FG5.js} +20 -20
- package/dist/chunk-2UOI2FG5.js.map +1 -0
- package/dist/{chunk-E3SPN4VZ 5.js → chunk-3XC4CPTD.js} +4345 -3986
- package/dist/chunk-3XC4CPTD.js.map +1 -0
- package/dist/{chunk-7EQTDTTJ.js → chunk-6J4GEEJR.js} +172 -45
- package/dist/chunk-6J4GEEJR.js.map +1 -0
- package/dist/{chunk-6C4YBBJM 5.js → chunk-6SOIHG6Z.js} +1 -1
- package/dist/chunk-6SOIHG6Z.js.map +1 -0
- package/dist/{chunk-7FLMSG37.js → chunk-EHMR7VYL.js} +25 -25
- package/dist/chunk-EHMR7VYL.js.map +1 -0
- package/dist/{chunk-I7PSE6JW.js → chunk-F2IMUDXZ.js} +2 -75
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-QWWZ5CAQ.js → chunk-FFQEQTNW.js} +7 -9
- package/dist/chunk-FFQEQTNW.js.map +1 -0
- package/dist/chunk-FMUCXFII.js +76 -0
- package/dist/chunk-FMUCXFII.js.map +1 -0
- package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
- package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
- package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
- package/dist/chunk-L4OXEN46.js.map +1 -0
- package/dist/{chunk-R77UEZ4E 3.js → chunk-M43Y4SSO.js} +1 -1
- package/dist/chunk-M43Y4SSO.js.map +1 -0
- package/dist/{chunk-IIELH4DL.js → chunk-MMZ7JXPU.js} +60 -223
- package/dist/chunk-MMZ7JXPU.js.map +1 -0
- package/dist/{chunk-NOAYCWCX 5.js → chunk-NECFR5MM.js} +394 -312
- package/dist/chunk-NECFR5MM.js.map +1 -0
- package/dist/{chunk-BC4IJKSL.js → chunk-SFZUDBL5.js} +40 -4
- package/dist/chunk-SFZUDBL5.js.map +1 -0
- package/dist/{chunk-XNXXZ43G.js → chunk-XWQCNGTQ.js} +748 -364
- package/dist/chunk-XWQCNGTQ.js.map +1 -0
- package/dist/components.d.ts +6 -6
- package/dist/components.js +15 -12
- package/dist/components.js.map +1 -1
- package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
- package/dist/hooks.d.ts +59 -126
- package/dist/hooks.js +19 -28
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +63 -16
- package/dist/index.js +23 -24
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +21 -3
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +146 -115
- package/dist/rbac/index.js +8 -11
- package/dist/theming/runtime.d.ts +1 -13
- package/dist/theming/runtime.js +1 -1
- package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
- package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
- package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
- package/dist/types.d.ts +2 -2
- package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +34 -4
- package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +15 -15
- package/dist/utils.js.map +1 -1
- package/docs/api/README.md +7 -1
- package/docs/api/classes/ColumnFactory.md +8 -8
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/Logger.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +18 -15
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/enums/LogLevel.md +1 -1
- package/docs/api/enums/RBACErrorCode.md +1 -1
- package/docs/api/enums/RPCFunction.md +1 -1
- package/docs/api/interfaces/AddressFieldProps.md +1 -1
- package/docs/api/interfaces/AddressFieldRef.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/AutocompleteOptions.md +1 -1
- package/docs/api/interfaces/AvatarProps.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +9 -2
- package/docs/api/interfaces/ButtonProps.md +7 -4
- package/docs/api/interfaces/CalendarProps.md +8 -5
- package/docs/api/interfaces/CardProps.md +8 -5
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/ComplianceResult.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +9 -9
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +24 -21
- package/docs/api/interfaces/DataTableColumn.md +31 -31
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
- package/docs/api/interfaces/DatabaseIssue.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/ErrorBoundaryProps.md +147 -0
- package/docs/api/interfaces/ErrorBoundaryProviderProps.md +36 -0
- package/docs/api/interfaces/ErrorBoundaryState.md +75 -0
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +1 -1
- package/docs/api/interfaces/ExportOptions.md +8 -8
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +26 -23
- package/docs/api/interfaces/FooterProps.md +10 -8
- package/docs/api/interfaces/FormFieldProps.md +10 -10
- package/docs/api/interfaces/FormProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +7 -4
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoggerConfig.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +14 -11
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +11 -11
- package/docs/api/interfaces/NavigationMenuProps.md +15 -15
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +30 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +6 -4
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/ParsedAddress.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.md +7 -26
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +7 -20
- package/docs/api/interfaces/QuickFix.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
- package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
- package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
- package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContext.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
- package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
- package/docs/api/interfaces/RBACResult.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
- package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
- package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
- package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
- package/docs/api/interfaces/RBACRolesListParams.md +1 -1
- package/docs/api/interfaces/RBACRolesListResult.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
- package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +9 -9
- package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +3 -3
- package/docs/api/interfaces/SetupIssue.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +3 -3
- package/docs/api/interfaces/TextareaProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +4 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +58 -55
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +15 -13
- package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
- package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +11 -9
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +9 -6
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +8 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +12 -9
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +10 -7
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +14 -11
- package/docs/api/interfaces/UserMenuProps.md +8 -6
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +575 -634
- package/docs/architecture/database-schema-requirements.md +161 -0
- package/docs/core-concepts/rbac-system.md +3 -3
- package/docs/documentation-index.md +2 -4
- package/docs/getting-started/cursor-rules.md +263 -0
- package/docs/getting-started/installation-guide.md +6 -1
- package/docs/getting-started/quick-start.md +6 -1
- package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
- package/docs/migration/MIGRATION_GUIDE.md +6 -28
- package/docs/migration/README.md +52 -6
- package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
- package/docs/migration/V0.6.0_REACT_19_MIGRATION.md +227 -0
- package/docs/migration/database-changes-december-2025.md +3 -3
- package/docs/rbac/event-based-apps.md +1 -1
- package/docs/rbac/getting-started.md +1 -1
- package/docs/rbac/quick-start.md +1 -1
- package/docs/standards/README.md +40 -0
- package/docs/troubleshooting/migration.md +4 -4
- package/examples/PublicPages/PublicEventPage.tsx +1 -1
- package/package.json +12 -6
- package/scripts/audit/core/checks/accessibility.cjs +197 -0
- package/scripts/audit/core/checks/api-usage.cjs +191 -0
- package/scripts/audit/core/checks/bundle.cjs +142 -0
- package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +737 -691
- package/scripts/audit/core/checks/config.cjs +54 -0
- package/scripts/audit/core/checks/coverage.cjs +84 -0
- package/scripts/audit/core/checks/dependencies.cjs +454 -0
- package/scripts/audit/core/checks/documentation.cjs +203 -0
- package/scripts/audit/core/checks/environment.cjs +128 -0
- package/scripts/audit/core/checks/error-handling.cjs +299 -0
- package/scripts/audit/core/checks/forms.cjs +172 -0
- package/scripts/audit/core/checks/heuristics.cjs +68 -0
- package/scripts/audit/core/checks/hooks.cjs +334 -0
- package/scripts/audit/core/checks/imports.cjs +244 -0
- package/scripts/audit/core/checks/performance.cjs +325 -0
- package/scripts/audit/core/checks/routes.cjs +117 -0
- package/scripts/audit/core/checks/state.cjs +130 -0
- package/scripts/audit/core/checks/structure.cjs +65 -0
- package/scripts/audit/core/checks/style.cjs +584 -0
- package/scripts/audit/core/checks/testing.cjs +122 -0
- package/scripts/audit/core/checks/typescript.cjs +61 -0
- package/scripts/audit/core/scanner.cjs +199 -0
- package/scripts/audit/core/utils.cjs +137 -0
- package/scripts/audit/index.cjs +223 -0
- package/scripts/audit/reporters/console.cjs +151 -0
- package/scripts/audit/reporters/json.cjs +54 -0
- package/scripts/audit/reporters/markdown.cjs +124 -0
- package/scripts/audit-consuming-app.cjs +86 -0
- package/scripts/build-docs/build-decision.js +240 -0
- package/scripts/build-docs/cache-utils.js +105 -0
- package/scripts/build-docs/content-normalization.js +150 -0
- package/scripts/build-docs/file-utils.js +105 -0
- package/scripts/build-docs/git-utils.js +86 -0
- package/scripts/build-docs/hash-utils.js +116 -0
- package/scripts/build-docs/typedoc-runner.js +220 -0
- package/scripts/build-docs-incremental.js +77 -913
- package/scripts/install-cursor-rules.cjs +236 -0
- package/scripts/utils/command-runner.js +16 -11
- package/scripts/validate-formats.js +61 -56
- package/scripts/validate-master.js +74 -69
- package/scripts/validate-pre-publish.js +70 -65
- package/src/__tests__/helpers/test-providers.tsx +1 -1
- package/src/__tests__/helpers/test-utils.tsx +1 -1
- package/src/__tests__/hooks/usePermissions.test.ts +2 -2
- package/src/components/Alert/Alert.test.tsx +12 -18
- package/src/components/Alert/Alert.tsx +5 -7
- package/src/components/Avatar/Avatar.test.tsx +4 -4
- package/src/components/Badge/Badge.tsx +16 -4
- package/src/components/Button/Button.tsx +27 -4
- package/src/components/Calendar/Calendar.tsx +9 -3
- package/src/components/Card/Card.tsx +4 -0
- package/src/components/Checkbox/Checkbox.test.tsx +12 -12
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/DataTable/DataTable.test.tsx +57 -93
- package/src/components/DataTable/DataTable.tsx +40 -6
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +29 -7
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
- package/src/components/DataTable/components/AccessDeniedPage.tsx +17 -26
- package/src/components/DataTable/components/ActionButtons.tsx +10 -7
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
- package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
- package/src/components/DataTable/components/DataTableBody.tsx +8 -0
- package/src/components/DataTable/components/DataTableCore.tsx +200 -561
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
- package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
- package/src/components/DataTable/components/DataTableModals.tsx +9 -1
- package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
- package/src/components/DataTable/components/EditFields.tsx +307 -0
- package/src/components/DataTable/components/EditableRow.tsx +9 -1
- package/src/components/DataTable/components/EmptyState.tsx +10 -0
- package/src/components/DataTable/components/FilterRow.tsx +12 -0
- package/src/components/DataTable/components/GroupHeader.tsx +12 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
- package/src/components/DataTable/components/ImportModal.tsx +7 -0
- package/src/components/DataTable/components/LoadingState.tsx +6 -0
- package/src/components/DataTable/components/PaginationControls.tsx +16 -1
- package/src/components/DataTable/components/RowComponent.tsx +391 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +62 -852
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
- package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
- package/src/components/DataTable/components/cellValueUtils.ts +40 -0
- package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
- package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
- package/src/components/DataTable/context/DataTableContext.tsx +50 -0
- package/src/components/DataTable/core/ColumnFactory.ts +31 -0
- package/src/components/DataTable/core/DataTableContext.tsx +32 -1
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +14 -2
- package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
- package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +124 -32
- package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
- package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
- package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
- package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
- package/src/components/DataTable/styles.ts +6 -6
- package/src/components/DataTable/types.ts +6 -10
- package/src/components/DataTable/utils/a11yUtils.ts +7 -0
- package/src/components/DataTable/utils/debugTools.ts +18 -113
- package/src/components/DataTable/utils/errorHandling.ts +12 -0
- package/src/components/DataTable/utils/exportUtils.ts +9 -0
- package/src/components/DataTable/utils/flexibleImport.ts +12 -48
- package/src/components/DataTable/utils/paginationUtils.ts +8 -0
- package/src/components/DataTable/utils/performanceUtils.ts +5 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
- package/src/components/Dialog/Dialog.tsx +8 -7
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +46 -6
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
- package/src/components/ErrorBoundary/index.ts +27 -2
- package/src/components/EventSelector/EventSelector.tsx +4 -1
- package/src/components/FileDisplay/FileDisplay.test.tsx +2 -2
- package/src/components/FileDisplay/FileDisplay.tsx +32 -18
- package/src/components/FileUpload/FileUpload.tsx +22 -2
- package/src/components/Footer/Footer.test.tsx +16 -16
- package/src/components/Footer/Footer.tsx +15 -12
- package/src/components/Form/Form.test.tsx +36 -15
- package/src/components/Form/Form.tsx +31 -26
- package/src/components/Header/Header.tsx +22 -11
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
- package/src/components/Input/Input.test.tsx +2 -2
- package/src/components/Input/Input.tsx +36 -34
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +42 -42
- package/src/components/LoginForm/LoginForm.tsx +12 -8
- package/src/components/NavigationMenu/NavigationMenu.tsx +15 -514
- package/src/components/NavigationMenu/types.ts +56 -0
- package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +3 -0
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +54 -52
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +33 -12
- package/src/components/PaceAppLayout/README.md +1 -1
- package/src/components/PaceAppLayout/test-setup.tsx +1 -2
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +4 -1
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
- package/src/components/PasswordChange/PasswordChangeForm.tsx +10 -1
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
- package/src/components/PublicLayout/PublicPageLayout.tsx +3 -6
- package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
- package/src/components/Select/Select.tsx +95 -438
- package/src/components/Select/context.ts +23 -0
- package/src/components/Select/hooks/useSelectEvents.ts +87 -0
- package/src/components/Select/hooks/useSelectSearch.ts +91 -0
- package/src/components/Select/hooks/useSelectState.ts +104 -0
- package/src/components/Select/index.ts +9 -1
- package/src/components/Select/types.ts +123 -0
- package/src/components/Select/utils/text.ts +26 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +5 -6
- package/src/components/Switch/Switch.tsx +4 -4
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Textarea/Textarea.tsx +27 -29
- package/src/components/Toast/Toast.tsx +5 -1
- package/src/components/Tooltip/Tooltip.tsx +3 -3
- package/src/components/UserMenu/UserMenu.test.tsx +24 -11
- package/src/components/UserMenu/UserMenu.tsx +22 -19
- package/src/components/index.ts +2 -2
- package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
- package/src/hooks/index.ts +1 -2
- package/src/hooks/public/usePublicEvent.ts +5 -1
- package/src/hooks/public/usePublicEventLogo.ts +5 -1
- package/src/hooks/public/usePublicFileDisplay.ts +4 -0
- package/src/hooks/public/usePublicRouteParams.ts +5 -1
- package/src/hooks/services/useAuth.ts +32 -0
- package/src/hooks/services/useCurrentEvent.ts +6 -0
- package/src/hooks/services/useCurrentOrganisation.ts +6 -0
- package/src/hooks/useDataTableState.ts +8 -18
- package/src/hooks/useDebounce.ts +9 -0
- package/src/hooks/useEventTheme.ts +6 -0
- package/src/hooks/useFileDisplay.ts +4 -0
- package/src/hooks/useFileReference.ts +25 -7
- package/src/hooks/useFileUrl.ts +11 -1
- package/src/hooks/useFocusManagement.ts +16 -2
- package/src/hooks/useFocusTrap.ts +7 -4
- package/src/hooks/useFormDialog.ts +8 -7
- package/src/hooks/useInactivityTracker.ts +4 -1
- package/src/hooks/useKeyboardShortcuts.ts +4 -0
- package/src/hooks/useOrganisationPermissions.ts +4 -0
- package/src/hooks/useOrganisationSecurity.ts +4 -0
- package/src/hooks/usePerformanceMonitor.ts +4 -0
- package/src/hooks/usePermissionCache.ts +8 -1
- package/src/hooks/useQueryCache.ts +12 -1
- package/src/hooks/useSessionRestoration.ts +4 -0
- package/src/hooks/useStorage.ts +4 -0
- package/src/hooks/useToast.ts +3 -3
- package/src/index.ts +2 -1
- package/src/providers/__tests__/OrganisationProvider.test.tsx +115 -49
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
- package/src/providers/services/AuthServiceProvider.tsx +18 -0
- package/src/providers/services/EventServiceProvider.tsx +18 -0
- package/src/providers/services/InactivityServiceProvider.tsx +18 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +58 -22
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +33 -7
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +26 -26
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
- package/src/rbac/adapters.tsx +14 -5
- package/src/rbac/api.ts +100 -67
- package/src/rbac/components/EnhancedNavigationMenu.tsx +1 -1
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.tsx +5 -2
- package/src/rbac/components/PagePermissionGuard.tsx +158 -18
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +6 -2
- package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
- package/src/rbac/components/SecureDataProvider.tsx +21 -6
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
- package/src/rbac/engine.ts +38 -14
- package/src/rbac/hooks/permissions/index.ts +7 -0
- package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
- package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
- package/src/rbac/hooks/permissions/useCan.ts +347 -0
- package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
- package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
- package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
- package/src/rbac/hooks/useCan.test.ts +71 -64
- package/src/rbac/hooks/usePermissions.ts +14 -995
- package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
- package/src/rbac/hooks/useResourcePermissions.ts +14 -4
- package/src/rbac/hooks/useSecureSupabase.ts +33 -13
- package/src/rbac/permissions.ts +0 -30
- package/src/rbac/secureClient.ts +212 -61
- package/src/rbac/types.ts +8 -0
- package/src/theming/__tests__/parseEventColours.test.ts +6 -9
- package/src/theming/parseEventColours.ts +5 -19
- package/src/types/vitest-globals.d.ts +51 -26
- package/src/utils/__mocks__/supabaseMock.ts +1 -3
- package/src/utils/__tests__/formatting.unit.test.ts +4 -4
- package/src/utils/__tests__/index.unit.test.ts +2 -2
- package/src/utils/audit/audit.ts +0 -3
- package/src/utils/core/cn.ts +1 -1
- package/src/utils/file-reference/index.ts +53 -1
- package/src/utils/formatting/formatting.ts +8 -18
- package/src/utils/index.ts +0 -1
- package/src/utils/security/secureDataAccess.test.ts +31 -20
- package/src/utils/security/secureDataAccess.ts +4 -3
- package/dist/chunk-6C4YBBJM.js +0 -628
- package/dist/chunk-6C4YBBJM.js.map +0 -1
- package/dist/chunk-7D4SUZUM.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js.map +0 -1
- package/dist/chunk-7FLMSG37.js 2.map +0 -1
- package/dist/chunk-7FLMSG37.js.map +0 -1
- package/dist/chunk-BC4IJKSL.js.map +0 -1
- package/dist/chunk-E3SPN4VZ.js +0 -12917
- package/dist/chunk-E3SPN4VZ.js.map +0 -1
- package/dist/chunk-E66EQZE6 5.js +0 -37
- package/dist/chunk-E66EQZE6.js 2.map +0 -1
- package/dist/chunk-HWIIPPNI.js.map +0 -1
- package/dist/chunk-I7PSE6JW 5.js +0 -191
- package/dist/chunk-I7PSE6JW.js 2.map +0 -1
- package/dist/chunk-I7PSE6JW.js.map +0 -1
- package/dist/chunk-IIELH4DL.js.map +0 -1
- package/dist/chunk-KNC55RTG.js 5.map +0 -1
- package/dist/chunk-KNC55RTG.js.map +0 -1
- package/dist/chunk-KQCRWDSA.js 5.map +0 -1
- package/dist/chunk-LFNCN2SP.js +0 -412
- package/dist/chunk-LFNCN2SP.js 2.map +0 -1
- package/dist/chunk-LFNCN2SP.js.map +0 -1
- package/dist/chunk-LMC26NLJ 2.js +0 -84
- package/dist/chunk-NOAYCWCX.js +0 -4993
- package/dist/chunk-NOAYCWCX.js.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js 3.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js.map +0 -1
- package/dist/chunk-QXHPKYJV 3.js +0 -113
- package/dist/chunk-R77UEZ4E.js +0 -68
- package/dist/chunk-R77UEZ4E.js.map +0 -1
- package/dist/chunk-SQGMNID3.js.map +0 -1
- package/dist/chunk-VBXEHIUJ.js 6.map +0 -1
- package/dist/chunk-XNXXZ43G.js.map +0 -1
- package/dist/chunk-ZSAAAMVR 6.js +0 -25
- package/dist/components.js 5.map +0 -1
- package/dist/styles/index 2.js +0 -12
- package/dist/styles/index.js 5.map +0 -1
- package/dist/theming/runtime 5.js +0 -19
- package/dist/theming/runtime.js 5.map +0 -1
- package/docs/api/classes/ErrorBoundary.md +0 -144
- package/docs/migration/quick-migration-guide.md +0 -356
- package/docs/migration/service-architecture.md +0 -281
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
- package/src/hooks/useSecureDataAccess.test.ts +0 -559
- package/src/hooks/useSecureDataAccess.ts +0 -666
- /package/dist/{DataTable-5FU7IESH.js.map → DataTable-TPTKCX4D.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-RGJTDE2C.js.map → UnifiedAuthProvider-CH6Z342H.js.map} +0 -0
- /package/dist/{api-N774RPUA.js.map → api-MVVQZLJI.js.map} +0 -0
- /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
- /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
- /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
- /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
- /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/index.ts +0 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Config Files Check Module
|
|
5
|
+
* @package @jmruthers/pace-core
|
|
6
|
+
* @module Audit/Checks/Config
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
|
|
12
|
+
const configCheck = {
|
|
13
|
+
name: 'config',
|
|
14
|
+
description: 'Config file checks (package.json, tsconfig.json, vite.config.ts, etc.)',
|
|
15
|
+
severity: 'error',
|
|
16
|
+
|
|
17
|
+
async run(context) {
|
|
18
|
+
const { projectRoot } = context;
|
|
19
|
+
const issues = [];
|
|
20
|
+
const warnings = [];
|
|
21
|
+
|
|
22
|
+
const requiredConfigs = [
|
|
23
|
+
{ file: 'package.json', severity: 'error' },
|
|
24
|
+
{ file: 'tsconfig.json', severity: 'error' },
|
|
25
|
+
{ file: 'vite.config.ts', severity: 'warning' },
|
|
26
|
+
{ file: 'vitest.config.ts', severity: 'warning' }
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
requiredConfigs.forEach(({ file, severity }) => {
|
|
30
|
+
const filePath = path.join(projectRoot, file);
|
|
31
|
+
if (!fs.existsSync(filePath)) {
|
|
32
|
+
if (severity === 'error') {
|
|
33
|
+
issues.push({
|
|
34
|
+
type: 'missing-config',
|
|
35
|
+
file,
|
|
36
|
+
message: `Required config file '${file}' is missing`,
|
|
37
|
+
recommendation: `Create '${file}' file`
|
|
38
|
+
});
|
|
39
|
+
} else {
|
|
40
|
+
warnings.push({
|
|
41
|
+
type: 'missing-config',
|
|
42
|
+
file,
|
|
43
|
+
message: `Recommended config file '${file}' is missing`,
|
|
44
|
+
recommendation: `Consider creating '${file}' file`
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
return { issues, warnings, suggestions: [] };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
module.exports = configCheck;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Test Coverage Check Module
|
|
5
|
+
* @package @jmruthers/pace-core
|
|
6
|
+
* @module Audit/Checks/Coverage
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
|
|
12
|
+
const coverageCheck = {
|
|
13
|
+
name: 'coverage',
|
|
14
|
+
description: 'Test coverage checks',
|
|
15
|
+
severity: 'warning',
|
|
16
|
+
|
|
17
|
+
async run(context) {
|
|
18
|
+
const { projectRoot } = context;
|
|
19
|
+
const issues = [];
|
|
20
|
+
const warnings = [];
|
|
21
|
+
|
|
22
|
+
// Try to find coverage report
|
|
23
|
+
const coveragePaths = [
|
|
24
|
+
path.join(projectRoot, 'coverage', 'coverage-summary.json'),
|
|
25
|
+
path.join(projectRoot, 'coverage', 'coverage-final.json')
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
let coverageData = null;
|
|
29
|
+
for (const coveragePath of coveragePaths) {
|
|
30
|
+
if (fs.existsSync(coveragePath)) {
|
|
31
|
+
try {
|
|
32
|
+
coverageData = JSON.parse(fs.readFileSync(coveragePath, 'utf8'));
|
|
33
|
+
break;
|
|
34
|
+
} catch (error) {
|
|
35
|
+
// Continue to next path
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (!coverageData) {
|
|
41
|
+
warnings.push({
|
|
42
|
+
type: 'coverage',
|
|
43
|
+
file: 'coverage/',
|
|
44
|
+
message: 'No coverage report found. Run tests with coverage to get accurate metrics.',
|
|
45
|
+
recommendation: 'Run tests with coverage: npm run test:coverage'
|
|
46
|
+
});
|
|
47
|
+
return { issues, warnings, suggestions: [], metrics: null };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Check coverage thresholds
|
|
51
|
+
const total = coverageData.total || {};
|
|
52
|
+
const lines = total.lines?.pct || 0;
|
|
53
|
+
const functions = total.functions?.pct || 0;
|
|
54
|
+
const branches = total.branches?.pct || 0;
|
|
55
|
+
const statements = total.statements?.pct || 0;
|
|
56
|
+
|
|
57
|
+
if (lines < 70) {
|
|
58
|
+
warnings.push({
|
|
59
|
+
type: 'coverage',
|
|
60
|
+
file: 'coverage/',
|
|
61
|
+
message: `Line coverage is ${lines.toFixed(1)}%, below recommended 70%`,
|
|
62
|
+
recommendation: 'Increase test coverage to meet the 70% threshold'
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (functions < 70) {
|
|
67
|
+
warnings.push({
|
|
68
|
+
type: 'coverage',
|
|
69
|
+
file: 'coverage/',
|
|
70
|
+
message: `Function coverage is ${functions.toFixed(1)}%, below recommended 70%`,
|
|
71
|
+
recommendation: 'Increase test coverage to meet the 70% threshold'
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
issues,
|
|
77
|
+
warnings,
|
|
78
|
+
suggestions: [],
|
|
79
|
+
metrics: { lines, functions, branches, statements }
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
module.exports = coverageCheck;
|
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Dependencies Check Module
|
|
5
|
+
* @package @jmruthers/pace-core
|
|
6
|
+
* @module Audit/Checks/Dependencies
|
|
7
|
+
*
|
|
8
|
+
* Checks for:
|
|
9
|
+
* - Outdated pace-core version
|
|
10
|
+
* - Security vulnerabilities
|
|
11
|
+
* - Unused dependencies
|
|
12
|
+
* - Missing peer dependencies
|
|
13
|
+
* - Version mismatches
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const fs = require('fs');
|
|
17
|
+
const path = require('path');
|
|
18
|
+
const { getPackageInfo, findSourceFiles } = require('../utils.cjs');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Extract package name from import/require path
|
|
22
|
+
*/
|
|
23
|
+
function extractPackageName(modulePath) {
|
|
24
|
+
if (modulePath.startsWith('@')) {
|
|
25
|
+
const parts = modulePath.split('/');
|
|
26
|
+
if (parts.length >= 2) {
|
|
27
|
+
return `${parts[0]}/${parts[1]}`;
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
return modulePath.split('/')[0];
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Find all config files in the project
|
|
37
|
+
*/
|
|
38
|
+
function findConfigFiles(projectRoot) {
|
|
39
|
+
const configFiles = [];
|
|
40
|
+
const configPatterns = [
|
|
41
|
+
'vite.config.{ts,js,mjs,cjs}',
|
|
42
|
+
'vitest.config.{ts,js,mjs,cjs}',
|
|
43
|
+
'tsconfig.json',
|
|
44
|
+
'.eslintrc.{js,json,cjs}',
|
|
45
|
+
'eslint.config.{js,mjs,cjs}',
|
|
46
|
+
'tailwind.config.{ts,js}',
|
|
47
|
+
'postcss.config.{js,cjs}',
|
|
48
|
+
'babel.config.{js,json}',
|
|
49
|
+
'jest.config.{js,ts}',
|
|
50
|
+
'webpack.config.{js,ts}',
|
|
51
|
+
'rollup.config.{js,ts}',
|
|
52
|
+
'next.config.{js,mjs}',
|
|
53
|
+
'remix.config.{js,ts}',
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
// Check root directory
|
|
57
|
+
const rootFiles = fs.readdirSync(projectRoot);
|
|
58
|
+
rootFiles.forEach(file => {
|
|
59
|
+
configPatterns.forEach(pattern => {
|
|
60
|
+
const regex = new RegExp('^' + pattern.replace(/\{.*?\}/g, '.*') + '$');
|
|
61
|
+
if (regex.test(file)) {
|
|
62
|
+
const fullPath = path.join(projectRoot, file);
|
|
63
|
+
if (fs.existsSync(fullPath)) {
|
|
64
|
+
configFiles.push(fullPath);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
return configFiles;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Get pace-core peer dependencies
|
|
75
|
+
*/
|
|
76
|
+
function getPaceCorePeerDeps(projectRoot) {
|
|
77
|
+
try {
|
|
78
|
+
// Try to find pace-core in node_modules
|
|
79
|
+
const paceCorePath = path.join(projectRoot, 'node_modules', '@jmruthers', 'pace-core', 'package.json');
|
|
80
|
+
if (fs.existsSync(paceCorePath)) {
|
|
81
|
+
const paceCorePkg = JSON.parse(fs.readFileSync(paceCorePath, 'utf8'));
|
|
82
|
+
return paceCorePkg.peerDependencies || {};
|
|
83
|
+
}
|
|
84
|
+
} catch (error) {
|
|
85
|
+
// If we can't find it, return empty object
|
|
86
|
+
}
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Check if a dependency is used in config files
|
|
92
|
+
*/
|
|
93
|
+
function checkConfigFiles(configFiles, depName) {
|
|
94
|
+
for (const configFile of configFiles) {
|
|
95
|
+
try {
|
|
96
|
+
const content = fs.readFileSync(configFile, 'utf8');
|
|
97
|
+
|
|
98
|
+
// Check for direct imports/requires
|
|
99
|
+
const importPatterns = [
|
|
100
|
+
/from\s+['"]([^'"]+)['"]/g,
|
|
101
|
+
/require\(['"]([^'"]+)['"]\)/g,
|
|
102
|
+
/import\(['"]([^'"]+)['"]\)/g,
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
for (const pattern of importPatterns) {
|
|
106
|
+
let match;
|
|
107
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
108
|
+
const modulePath = match[1];
|
|
109
|
+
const pkgName = extractPackageName(modulePath);
|
|
110
|
+
if (pkgName === depName) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Check for string references (e.g., in optimizeDeps, plugins, etc.)
|
|
117
|
+
// This is a heuristic - check if the package name appears as a string
|
|
118
|
+
const depNameEscaped = depName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
119
|
+
const stringRefPattern = new RegExp(`['"]${depNameEscaped}['"]`, 'g');
|
|
120
|
+
if (stringRefPattern.test(content)) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
} catch (error) {
|
|
124
|
+
// Skip files we can't read
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Check if a dependency is used in CSS or other non-JS files
|
|
132
|
+
*/
|
|
133
|
+
function checkNonJsFiles(projectRoot, depName) {
|
|
134
|
+
const cssFiles = [];
|
|
135
|
+
const cssExtensions = ['.css', '.scss', '.sass', '.less', '.styl'];
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
const srcPath = path.join(projectRoot, 'src');
|
|
139
|
+
if (fs.existsSync(srcPath)) {
|
|
140
|
+
const walkDir = (dir) => {
|
|
141
|
+
const files = fs.readdirSync(dir);
|
|
142
|
+
files.forEach(file => {
|
|
143
|
+
const fullPath = path.join(dir, file);
|
|
144
|
+
const stat = fs.statSync(fullPath);
|
|
145
|
+
if (stat.isDirectory() && !file.startsWith('.') && file !== 'node_modules') {
|
|
146
|
+
walkDir(fullPath);
|
|
147
|
+
} else if (stat.isFile()) {
|
|
148
|
+
const ext = path.extname(file);
|
|
149
|
+
if (cssExtensions.includes(ext)) {
|
|
150
|
+
cssFiles.push(fullPath);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
walkDir(srcPath);
|
|
156
|
+
}
|
|
157
|
+
} catch (error) {
|
|
158
|
+
// Skip if can't read
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Check CSS files for @import statements
|
|
162
|
+
for (const cssFile of cssFiles) {
|
|
163
|
+
try {
|
|
164
|
+
const content = fs.readFileSync(cssFile, 'utf8');
|
|
165
|
+
// Check for @import statements that might reference packages
|
|
166
|
+
const importPattern = /@import\s+['"]([^'"]+)['"]/g;
|
|
167
|
+
let match;
|
|
168
|
+
while ((match = importPattern.exec(content)) !== null) {
|
|
169
|
+
const modulePath = match[1];
|
|
170
|
+
const pkgName = extractPackageName(modulePath);
|
|
171
|
+
if (pkgName === depName) {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
} catch (error) {
|
|
176
|
+
// Skip files we can't read
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const dependenciesCheck = {
|
|
184
|
+
name: 'dependencies',
|
|
185
|
+
description: 'Dependency analysis (outdated versions, security, unused deps)',
|
|
186
|
+
severity: 'warning',
|
|
187
|
+
|
|
188
|
+
async run(context) {
|
|
189
|
+
const { projectRoot } = context;
|
|
190
|
+
const issues = [];
|
|
191
|
+
const warnings = [];
|
|
192
|
+
const suggestions = [];
|
|
193
|
+
|
|
194
|
+
const packageJson = getPackageInfo(projectRoot);
|
|
195
|
+
if (!packageJson) {
|
|
196
|
+
return { issues, warnings, suggestions };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Skip dependency checks if this is the pace-core repository itself
|
|
200
|
+
// Detect pace-core repository by checking if packages/core exists
|
|
201
|
+
const packagesCorePath = path.join(projectRoot, 'packages', 'core');
|
|
202
|
+
const isPaceCoreRepository = fs.existsSync(packagesCorePath);
|
|
203
|
+
|
|
204
|
+
const allDeps = { ...packageJson.dependencies, ...packageJson.devDependencies };
|
|
205
|
+
const devDeps = packageJson.devDependencies || {};
|
|
206
|
+
|
|
207
|
+
// Get pace-core peer dependencies
|
|
208
|
+
const paceCorePeerDeps = getPaceCorePeerDeps(projectRoot);
|
|
209
|
+
|
|
210
|
+
// Check pace-core version (skip if this is the pace-core repository itself)
|
|
211
|
+
if (!isPaceCoreRepository) {
|
|
212
|
+
const paceCoreVersion = allDeps['@jmruthers/pace-core'];
|
|
213
|
+
if (paceCoreVersion) {
|
|
214
|
+
// Check if version is outdated (simplified - would need to check npm registry)
|
|
215
|
+
if (paceCoreVersion.startsWith('^') || paceCoreVersion.startsWith('~')) {
|
|
216
|
+
// Version range - this is fine
|
|
217
|
+
} else if (paceCoreVersion.match(/^\d+\.\d+\.\d+$/)) {
|
|
218
|
+
// Exact version - suggest using range
|
|
219
|
+
suggestions.push({
|
|
220
|
+
type: 'exact-version',
|
|
221
|
+
file: 'package.json',
|
|
222
|
+
message: `pace-core is pinned to exact version ${paceCoreVersion}`,
|
|
223
|
+
recommendation: 'Consider using a version range (^ or ~) to receive patch/minor updates automatically'
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
} else {
|
|
227
|
+
issues.push({
|
|
228
|
+
type: 'missing-pace-core',
|
|
229
|
+
file: 'package.json',
|
|
230
|
+
message: '@jmruthers/pace-core is not in dependencies',
|
|
231
|
+
recommendation: 'Add @jmruthers/pace-core to your dependencies'
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Collect all files to scan
|
|
237
|
+
// Skip unused dependency checks if this is the pace-core repository itself
|
|
238
|
+
// The library's dependencies are used in packages/core/src/, not in the root src/
|
|
239
|
+
const sourceFiles = [];
|
|
240
|
+
if (!isPaceCoreRepository) {
|
|
241
|
+
try {
|
|
242
|
+
const srcPath = path.join(projectRoot, 'src');
|
|
243
|
+
if (fs.existsSync(srcPath)) {
|
|
244
|
+
sourceFiles.push(...findSourceFiles(srcPath));
|
|
245
|
+
}
|
|
246
|
+
} catch (error) {
|
|
247
|
+
// Skip if can't read source files
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Also scan config files
|
|
252
|
+
const configFiles = findConfigFiles(projectRoot);
|
|
253
|
+
|
|
254
|
+
// Build set of imported packages from source files
|
|
255
|
+
const importedPackages = new Set();
|
|
256
|
+
|
|
257
|
+
// Scan source files
|
|
258
|
+
sourceFiles.forEach(filePath => {
|
|
259
|
+
try {
|
|
260
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
261
|
+
// Check for ES6 imports
|
|
262
|
+
const importPattern = /from\s+['"]([^'"]+)['"]/g;
|
|
263
|
+
let match;
|
|
264
|
+
while ((match = importPattern.exec(content)) !== null) {
|
|
265
|
+
const modulePath = match[1];
|
|
266
|
+
const pkgName = extractPackageName(modulePath);
|
|
267
|
+
if (pkgName) {
|
|
268
|
+
importedPackages.add(pkgName);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Check for require() statements
|
|
272
|
+
const requirePattern = /require\(['"]([^'"]+)['"]\)/g;
|
|
273
|
+
while ((match = requirePattern.exec(content)) !== null) {
|
|
274
|
+
const modulePath = match[1];
|
|
275
|
+
const pkgName = extractPackageName(modulePath);
|
|
276
|
+
if (pkgName) {
|
|
277
|
+
importedPackages.add(pkgName);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
} catch (error) {
|
|
281
|
+
// Skip files with errors
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
// Scan config files for imports
|
|
286
|
+
configFiles.forEach(filePath => {
|
|
287
|
+
try {
|
|
288
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
289
|
+
const importPattern = /from\s+['"]([^'"]+)['"]/g;
|
|
290
|
+
let match;
|
|
291
|
+
while ((match = importPattern.exec(content)) !== null) {
|
|
292
|
+
const modulePath = match[1];
|
|
293
|
+
const pkgName = extractPackageName(modulePath);
|
|
294
|
+
if (pkgName) {
|
|
295
|
+
importedPackages.add(pkgName);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
const requirePattern = /require\(['"]([^'"]+)['"]\)/g;
|
|
299
|
+
while ((match = requirePattern.exec(content)) !== null) {
|
|
300
|
+
const modulePath = match[1];
|
|
301
|
+
const pkgName = extractPackageName(modulePath);
|
|
302
|
+
if (pkgName) {
|
|
303
|
+
importedPackages.add(pkgName);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
} catch (error) {
|
|
307
|
+
// Skip files with errors
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
// Known build tools and dev dependencies that are commonly used but not directly imported
|
|
312
|
+
const knownBuildTools = [
|
|
313
|
+
'vite',
|
|
314
|
+
'typescript',
|
|
315
|
+
'eslint',
|
|
316
|
+
'prettier',
|
|
317
|
+
'vitest',
|
|
318
|
+
'@types',
|
|
319
|
+
'@vitejs',
|
|
320
|
+
'@testing-library',
|
|
321
|
+
'jsdom',
|
|
322
|
+
'globals',
|
|
323
|
+
'tailwindcss',
|
|
324
|
+
'@tailwindcss',
|
|
325
|
+
'postcss',
|
|
326
|
+
'autoprefixer',
|
|
327
|
+
'babel',
|
|
328
|
+
'webpack',
|
|
329
|
+
'rollup',
|
|
330
|
+
'tsup',
|
|
331
|
+
'esbuild',
|
|
332
|
+
'lovable-tagger',
|
|
333
|
+
'babel-plugin-react-compiler',
|
|
334
|
+
];
|
|
335
|
+
|
|
336
|
+
// Check for potentially unused dependencies
|
|
337
|
+
// Skip this check if running on the pace-core repository itself
|
|
338
|
+
// The library's dependencies are used in packages/core/src/, not in the root src/ (demo app)
|
|
339
|
+
if (!isPaceCoreRepository) {
|
|
340
|
+
Object.keys(allDeps).forEach(dep => {
|
|
341
|
+
// Skip if it's a known build tool
|
|
342
|
+
if (knownBuildTools.some(tool => dep.includes(tool) || dep.startsWith(tool))) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Skip if it's a peer dependency of pace-core
|
|
347
|
+
if (paceCorePeerDeps[dep]) {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// Skip if it's pace-core itself
|
|
352
|
+
if (dep === '@jmruthers/pace-core') {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// Check if package is imported in source files
|
|
357
|
+
if (importedPackages.has(dep)) {
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Check if it's used in config files
|
|
362
|
+
if (checkConfigFiles(configFiles, dep)) {
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Check if it's used in CSS or other non-JS files
|
|
367
|
+
if (checkNonJsFiles(projectRoot, dep)) {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// For dev dependencies, provide more context
|
|
372
|
+
const isDevDep = dep in devDeps;
|
|
373
|
+
const context = [];
|
|
374
|
+
|
|
375
|
+
if (isDevDep) {
|
|
376
|
+
context.push('This is a dev dependency and may be used by build tools or test frameworks');
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Check if it might be a transitive dependency needed by pace-core
|
|
380
|
+
if (paceCoreVersion) {
|
|
381
|
+
context.push('This may be required by @jmruthers/pace-core as a transitive dependency');
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Only warn if we're reasonably sure it's unused
|
|
385
|
+
// For runtime dependencies, be more strict
|
|
386
|
+
if (!isDevDep) {
|
|
387
|
+
// Check if it's in vite.config.ts optimizeDeps (common for pace-core peer deps)
|
|
388
|
+
const viteConfigPath = path.join(projectRoot, 'vite.config.ts');
|
|
389
|
+
const viteConfigJsPath = path.join(projectRoot, 'vite.config.js');
|
|
390
|
+
let isInViteConfig = false;
|
|
391
|
+
|
|
392
|
+
for (const configPath of [viteConfigPath, viteConfigJsPath]) {
|
|
393
|
+
if (fs.existsSync(configPath)) {
|
|
394
|
+
try {
|
|
395
|
+
const viteContent = fs.readFileSync(configPath, 'utf8');
|
|
396
|
+
if (viteContent.includes(dep)) {
|
|
397
|
+
isInViteConfig = true;
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
} catch (error) {
|
|
401
|
+
// Skip if can't read
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const recommendation = `Verify if '${dep}' is actually used. ${context.length > 0 ? context.join(' ') : ''}${isInViteConfig ? 'This dependency is referenced in vite.config.ts, which suggests it may be required by pace-core components. ' : ''}If it's a peer dependency of @jmruthers/pace-core (check pace-core's package.json), it's required even if not directly imported. If confirmed unused, remove it to reduce bundle size.`;
|
|
407
|
+
|
|
408
|
+
warnings.push({
|
|
409
|
+
type: 'unused-dependency',
|
|
410
|
+
file: 'package.json',
|
|
411
|
+
message: `Runtime dependency '${dep}' may be unused`,
|
|
412
|
+
recommendation: recommendation
|
|
413
|
+
});
|
|
414
|
+
} else {
|
|
415
|
+
// For dev dependencies, only suggest (lower severity)
|
|
416
|
+
suggestions.push({
|
|
417
|
+
type: 'potentially-unused-dev-dependency',
|
|
418
|
+
file: 'package.json',
|
|
419
|
+
message: `Dev dependency '${dep}' may be unused`,
|
|
420
|
+
recommendation: `Check if '${dep}' is used in build configs, test files, or by pace-core. ${context.join(' ')}If confirmed unused, you can remove it.`
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Check for missing peer dependencies from pace-core
|
|
427
|
+
Object.keys(paceCorePeerDeps).forEach(peerDep => {
|
|
428
|
+
if (!allDeps[peerDep]) {
|
|
429
|
+
warnings.push({
|
|
430
|
+
type: 'missing-peer-dependency',
|
|
431
|
+
file: 'package.json',
|
|
432
|
+
message: `Peer dependency '${peerDep}' is missing but required by @jmruthers/pace-core`,
|
|
433
|
+
recommendation: `Install '${peerDep}' as it's required by pace-core. Run: npm install ${peerDep}`
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
// Check for version mismatches (e.g., React versions)
|
|
439
|
+
const reactVersion = allDeps.react;
|
|
440
|
+
const reactDomVersion = allDeps['react-dom'];
|
|
441
|
+
if (reactVersion && reactDomVersion && reactVersion !== reactDomVersion) {
|
|
442
|
+
issues.push({
|
|
443
|
+
type: 'version-mismatch',
|
|
444
|
+
file: 'package.json',
|
|
445
|
+
message: `React version mismatch: react@${reactVersion} vs react-dom@${reactDomVersion}`,
|
|
446
|
+
recommendation: 'React and react-dom versions must match exactly'
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
return { issues, warnings, suggestions };
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
module.exports = dependenciesCheck;
|