@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,236 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Installation Script for pace-core Cursor Rules
|
|
5
|
+
* @package @jmruthers/pace-core
|
|
6
|
+
* @module Scripts/install-cursor-rules
|
|
7
|
+
*
|
|
8
|
+
* Copies cursor rules from pace-core to consuming app's .cursor/rules/ directory.
|
|
9
|
+
* This is an opt-in script - it does NOT run automatically via postinstall.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
// ANSI color codes for terminal output
|
|
16
|
+
const colors = {
|
|
17
|
+
reset: '\x1b[0m',
|
|
18
|
+
green: '\x1b[32m',
|
|
19
|
+
yellow: '\x1b[33m',
|
|
20
|
+
blue: '\x1b[34m',
|
|
21
|
+
cyan: '\x1b[36m',
|
|
22
|
+
bold: '\x1b[1m',
|
|
23
|
+
red: '\x1b[31m'
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// Check for safety guards
|
|
27
|
+
function checkSafetyGuards() {
|
|
28
|
+
// Check environment variable
|
|
29
|
+
if (process.env.PACE_CURSOR_RULES_DISABLED === '1') {
|
|
30
|
+
console.log(`${colors.yellow}Skipping cursor rules installation: PACE_CURSOR_RULES_DISABLED=1${colors.reset}`);
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Check for .git folder (safety guard for CI)
|
|
35
|
+
const cwd = process.cwd();
|
|
36
|
+
if (!fs.existsSync(path.join(cwd, '.git'))) {
|
|
37
|
+
console.log(`${colors.yellow}Skipping cursor rules installation: No .git folder found${colors.reset}`);
|
|
38
|
+
console.log(`${colors.yellow}This is a safety guard. If you want to install anyway, run with --force${colors.reset}`);
|
|
39
|
+
if (!process.argv.includes('--force')) {
|
|
40
|
+
process.exit(0);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Get pace-core package path
|
|
46
|
+
function getPaceCorePath() {
|
|
47
|
+
// Try to find pace-core in node_modules
|
|
48
|
+
const cwd = process.cwd();
|
|
49
|
+
const paceCorePath = path.join(cwd, 'node_modules', '@jmruthers', 'pace-core');
|
|
50
|
+
|
|
51
|
+
if (fs.existsSync(paceCorePath)) {
|
|
52
|
+
return paceCorePath;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// If not found, try relative to script location (for development)
|
|
56
|
+
const scriptDir = __dirname;
|
|
57
|
+
const relativePath = path.join(scriptDir, '..');
|
|
58
|
+
if (fs.existsSync(path.join(relativePath, 'cursor-rules'))) {
|
|
59
|
+
return relativePath;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
console.error(`${colors.red}Error: Could not find @jmruthers/pace-core package${colors.reset}`);
|
|
63
|
+
console.error(`${colors.red}Make sure pace-core is installed: npm install @jmruthers/pace-core${colors.reset}`);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Get cursor rules source directory
|
|
68
|
+
function getCursorRulesSource(paceCorePath) {
|
|
69
|
+
const rulesPath = path.join(paceCorePath, 'cursor-rules');
|
|
70
|
+
if (!fs.existsSync(rulesPath)) {
|
|
71
|
+
console.error(`${colors.red}Error: cursor-rules directory not found in pace-core${colors.reset}`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
return rulesPath;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Get target directory (.cursor/rules in app root)
|
|
78
|
+
function getCursorRulesTarget() {
|
|
79
|
+
const cwd = process.cwd();
|
|
80
|
+
const targetDir = path.join(cwd, '.cursor', 'rules');
|
|
81
|
+
return targetDir;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Read rule file and extract version metadata
|
|
85
|
+
function getRuleVersion(filePath) {
|
|
86
|
+
try {
|
|
87
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
88
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
89
|
+
if (frontmatterMatch) {
|
|
90
|
+
const frontmatter = frontmatterMatch[1];
|
|
91
|
+
const versionMatch = frontmatter.match(/paceCoreVersion:\s*["']?([^"'\n]+)["']?/);
|
|
92
|
+
const rulesVersionMatch = frontmatter.match(/rulesVersion:\s*["']?([^"'\n]+)["']?/);
|
|
93
|
+
return {
|
|
94
|
+
paceCoreVersion: versionMatch ? versionMatch[1] : null,
|
|
95
|
+
rulesVersion: rulesVersionMatch ? rulesVersionMatch[1] : null
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
} catch (error) {
|
|
99
|
+
// Ignore errors
|
|
100
|
+
}
|
|
101
|
+
return { paceCoreVersion: null, rulesVersion: null };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Check if file needs updating
|
|
105
|
+
function needsUpdate(sourcePath, targetPath, force) {
|
|
106
|
+
if (force) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (!fs.existsSync(targetPath)) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Compare versions first (fast check)
|
|
115
|
+
const sourceVersion = getRuleVersion(sourcePath);
|
|
116
|
+
const targetVersion = getRuleVersion(targetPath);
|
|
117
|
+
|
|
118
|
+
// If versions differ, needs update
|
|
119
|
+
if (sourceVersion.paceCoreVersion !== targetVersion.paceCoreVersion ||
|
|
120
|
+
sourceVersion.rulesVersion !== targetVersion.rulesVersion) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// If versions match but content differs, also needs update
|
|
125
|
+
// (handles cases where version metadata wasn't updated)
|
|
126
|
+
try {
|
|
127
|
+
const sourceContent = fs.readFileSync(sourcePath, 'utf8');
|
|
128
|
+
const targetContent = fs.readFileSync(targetPath, 'utf8');
|
|
129
|
+
if (sourceContent !== targetContent) {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
} catch (error) {
|
|
133
|
+
// If we can't read files, assume update needed
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Install cursor rules
|
|
141
|
+
function installCursorRules(force = false) {
|
|
142
|
+
checkSafetyGuards();
|
|
143
|
+
|
|
144
|
+
const paceCorePath = getPaceCorePath();
|
|
145
|
+
const sourceDir = getCursorRulesSource(paceCorePath);
|
|
146
|
+
const targetDir = getCursorRulesTarget();
|
|
147
|
+
|
|
148
|
+
// Create target directory if it doesn't exist
|
|
149
|
+
if (!fs.existsSync(targetDir)) {
|
|
150
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
151
|
+
console.log(`${colors.green}Created .cursor/rules/ directory${colors.reset}`);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Read all .mdc files from source
|
|
155
|
+
const files = fs.readdirSync(sourceDir)
|
|
156
|
+
.filter(file => file.endsWith('.mdc'))
|
|
157
|
+
.sort(); // Sort for consistent output
|
|
158
|
+
|
|
159
|
+
if (files.length === 0) {
|
|
160
|
+
console.log(`${colors.yellow}No cursor rules found in pace-core${colors.reset}`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
console.log(`${colors.cyan}Installing cursor rules from pace-core...${colors.reset}\n`);
|
|
165
|
+
|
|
166
|
+
let installed = 0;
|
|
167
|
+
let skipped = 0;
|
|
168
|
+
let updated = 0;
|
|
169
|
+
|
|
170
|
+
files.forEach(file => {
|
|
171
|
+
const sourcePath = path.join(sourceDir, file);
|
|
172
|
+
const targetPath = path.join(targetDir, file);
|
|
173
|
+
|
|
174
|
+
// Check if this is a pace-core rule (00-09) or app rule (50+)
|
|
175
|
+
const ruleNumber = parseInt(file.match(/^(\d+)-/)?.[1] || '99');
|
|
176
|
+
const isPaceCoreRule = ruleNumber >= 0 && ruleNumber <= 9;
|
|
177
|
+
|
|
178
|
+
if (fs.existsSync(targetPath)) {
|
|
179
|
+
if (isPaceCoreRule) {
|
|
180
|
+
// pace-core rules should be automatically updated when they change
|
|
181
|
+
if (needsUpdate(sourcePath, targetPath, force)) {
|
|
182
|
+
// Automatically update pace-core rules when versions differ or content changed
|
|
183
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
184
|
+
console.log(`${colors.green}✓${colors.reset} Updated ${file}${force ? ' (forced)' : ''}`);
|
|
185
|
+
updated++;
|
|
186
|
+
} else {
|
|
187
|
+
console.log(`${colors.blue}○${colors.reset} ${file} is up to date`);
|
|
188
|
+
skipped++;
|
|
189
|
+
}
|
|
190
|
+
} else {
|
|
191
|
+
// App rules (50+) are never overwritten
|
|
192
|
+
console.log(`${colors.blue}○${colors.reset} ${file} is a custom rule, skipping`);
|
|
193
|
+
skipped++;
|
|
194
|
+
}
|
|
195
|
+
} else {
|
|
196
|
+
// File doesn't exist, install it
|
|
197
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
198
|
+
console.log(`${colors.green}✓${colors.reset} Installed ${file}`);
|
|
199
|
+
installed++;
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
console.log(`\n${colors.bold}Installation Summary:${colors.reset}`);
|
|
204
|
+
console.log(` ${colors.green}Installed:${colors.reset} ${installed}`);
|
|
205
|
+
console.log(` ${colors.yellow}Updated:${colors.reset} ${updated}`);
|
|
206
|
+
console.log(` ${colors.blue}Skipped:${colors.reset} ${skipped}`);
|
|
207
|
+
console.log(`\n${colors.cyan}Cursor rules are now available in .cursor/rules/${colors.reset}`);
|
|
208
|
+
console.log(`${colors.cyan}Restart Cursor to load the new rules.${colors.reset}`);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Main execution
|
|
212
|
+
function main() {
|
|
213
|
+
const force = process.argv.includes('--force');
|
|
214
|
+
|
|
215
|
+
if (force) {
|
|
216
|
+
console.log(`${colors.yellow}Warning: --force flag is set. This will overwrite existing pace-core rules.${colors.reset}\n`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
try {
|
|
220
|
+
installCursorRules(force);
|
|
221
|
+
} catch (error) {
|
|
222
|
+
console.error(`${colors.red}Error installing cursor rules:${colors.reset}`);
|
|
223
|
+
console.error(error.message);
|
|
224
|
+
if (error.stack) {
|
|
225
|
+
console.error(error.stack);
|
|
226
|
+
}
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Run if called directly
|
|
232
|
+
if (require.main === module) {
|
|
233
|
+
main();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
module.exports = { installCursorRules, getCursorRulesTarget };
|
|
@@ -112,19 +112,24 @@ export async function runCommand(command, args = [], options = {}) {
|
|
|
112
112
|
* @returns {Promise<{success: boolean}>} Test execution result
|
|
113
113
|
*/
|
|
114
114
|
export async function runStandardizedTests(packageRoot, repoRoot, timeout) {
|
|
115
|
-
|
|
115
|
+
try {
|
|
116
|
+
logger.step('Running test suite from root (matching npm run test behavior)...');
|
|
116
117
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
const result = await runCommand('npm', ['run', 'test'], {
|
|
119
|
+
cwd: repoRoot,
|
|
120
|
+
timeout,
|
|
121
|
+
showLiveOutput: true, // Show test output in CI
|
|
122
|
+
});
|
|
122
123
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
if (result.success) {
|
|
125
|
+
logger.success('All tests passed successfully');
|
|
126
|
+
return { success: true };
|
|
127
|
+
} else {
|
|
128
|
+
logger.error('Tests failed');
|
|
129
|
+
return { success: false };
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
logger.error(`Test execution error: ${error.message}`);
|
|
128
133
|
return { success: false };
|
|
129
134
|
}
|
|
130
135
|
}
|
|
@@ -58,70 +58,75 @@ async function validateESMFormat(filePath) {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
async function validateFormats() {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
console.log('📋 ESM Format Compliance Report:');
|
|
65
|
-
console.log('─'.repeat(80));
|
|
66
|
-
|
|
67
|
-
for (const module of modules) {
|
|
68
|
-
const esmPath = join(distDir, module.esm);
|
|
61
|
+
try {
|
|
62
|
+
let allValid = true;
|
|
63
|
+
const results = [];
|
|
69
64
|
|
|
70
|
-
console.log(
|
|
65
|
+
console.log('📋 ESM Format Compliance Report:');
|
|
66
|
+
console.log('─'.repeat(80));
|
|
71
67
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
console.log(` ESM (${module.esm}): ${esmStatus} ${(esmValidation.score * 100).toFixed(0)}% compliant`);
|
|
68
|
+
for (const module of modules) {
|
|
69
|
+
const esmPath = join(distDir, module.esm);
|
|
70
|
+
|
|
71
|
+
console.log(`\n📦 Module: ${module.name}`);
|
|
77
72
|
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
// Validate ESM format
|
|
74
|
+
if (existsSync(esmPath)) {
|
|
75
|
+
const esmValidation = await validateESMFormat(esmPath);
|
|
76
|
+
const esmStatus = esmValidation.valid ? '✅' : '❌';
|
|
77
|
+
console.log(` ESM (${module.esm}): ${esmStatus} ${(esmValidation.score * 100).toFixed(0)}% compliant`);
|
|
78
|
+
|
|
79
|
+
if (!esmValidation.valid) {
|
|
80
|
+
console.log(` Issues: ${esmValidation.issues.join(', ')}`);
|
|
81
|
+
allValid = false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
results.push({ module: module.name, format: 'esm', ...esmValidation });
|
|
85
|
+
} else {
|
|
86
|
+
console.log(` ESM (${module.esm}): ❌ File not found`);
|
|
80
87
|
allValid = false;
|
|
81
88
|
}
|
|
82
|
-
|
|
83
|
-
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Summary
|
|
92
|
+
console.log('\n' + '='.repeat(80));
|
|
93
|
+
console.log('📊 ESM FORMAT VALIDATION SUMMARY');
|
|
94
|
+
console.log('='.repeat(80));
|
|
95
|
+
|
|
96
|
+
const totalModules = modules.length;
|
|
97
|
+
const validESM = results.filter(r => r.format === 'esm' && r.valid).length;
|
|
98
|
+
|
|
99
|
+
console.log(`ESM Format Compliance: ${validESM}/${totalModules} modules ✓`);
|
|
100
|
+
|
|
101
|
+
const averageESMScore = results
|
|
102
|
+
.filter(r => r.format === 'esm')
|
|
103
|
+
.reduce((sum, r) => sum + r.score, 0) / totalModules;
|
|
104
|
+
|
|
105
|
+
console.log(`Average ESM Compliance: ${(averageESMScore * 100).toFixed(1)}%`);
|
|
106
|
+
|
|
107
|
+
if (allValid) {
|
|
108
|
+
console.log('✅ All ESM format validations passed!');
|
|
109
|
+
console.log('\n🎯 ESM Quality Indicators:');
|
|
110
|
+
console.log(' ✅ Proper "use client" directives in all modules');
|
|
111
|
+
console.log(' ✅ Clean ESM export syntax');
|
|
112
|
+
console.log(' ✅ No CommonJS patterns detected');
|
|
113
|
+
console.log(' ✅ Optimal for modern bundlers and tree-shaking');
|
|
84
114
|
} else {
|
|
85
|
-
console.log(
|
|
86
|
-
|
|
115
|
+
console.log('❌ Some ESM format validations failed!');
|
|
116
|
+
console.log('\n🔧 Common fixes:');
|
|
117
|
+
console.log(' - Ensure "use client" directive is present');
|
|
118
|
+
console.log(' - Use proper ESM export syntax');
|
|
119
|
+
console.log(' - Remove any CommonJS patterns (require, module.exports)');
|
|
120
|
+
console.log(' - Check tsup configuration for proper ESM output');
|
|
87
121
|
}
|
|
122
|
+
|
|
123
|
+
console.log('='.repeat(80));
|
|
124
|
+
|
|
125
|
+
return allValid;
|
|
126
|
+
} catch (error) {
|
|
127
|
+
console.error('❌ Validation error:', error.message);
|
|
128
|
+
return false;
|
|
88
129
|
}
|
|
89
|
-
|
|
90
|
-
// Summary
|
|
91
|
-
console.log('\n' + '='.repeat(80));
|
|
92
|
-
console.log('📊 ESM FORMAT VALIDATION SUMMARY');
|
|
93
|
-
console.log('='.repeat(80));
|
|
94
|
-
|
|
95
|
-
const totalModules = modules.length;
|
|
96
|
-
const validESM = results.filter(r => r.format === 'esm' && r.valid).length;
|
|
97
|
-
|
|
98
|
-
console.log(`ESM Format Compliance: ${validESM}/${totalModules} modules ✓`);
|
|
99
|
-
|
|
100
|
-
const averageESMScore = results
|
|
101
|
-
.filter(r => r.format === 'esm')
|
|
102
|
-
.reduce((sum, r) => sum + r.score, 0) / totalModules;
|
|
103
|
-
|
|
104
|
-
console.log(`Average ESM Compliance: ${(averageESMScore * 100).toFixed(1)}%`);
|
|
105
|
-
|
|
106
|
-
if (allValid) {
|
|
107
|
-
console.log('✅ All ESM format validations passed!');
|
|
108
|
-
console.log('\n🎯 ESM Quality Indicators:');
|
|
109
|
-
console.log(' ✅ Proper "use client" directives in all modules');
|
|
110
|
-
console.log(' ✅ Clean ESM export syntax');
|
|
111
|
-
console.log(' ✅ No CommonJS patterns detected');
|
|
112
|
-
console.log(' ✅ Optimal for modern bundlers and tree-shaking');
|
|
113
|
-
} else {
|
|
114
|
-
console.log('❌ Some ESM format validations failed!');
|
|
115
|
-
console.log('\n🔧 Common fixes:');
|
|
116
|
-
console.log(' - Ensure "use client" directive is present');
|
|
117
|
-
console.log(' - Use proper ESM export syntax');
|
|
118
|
-
console.log(' - Remove any CommonJS patterns (require, module.exports)');
|
|
119
|
-
console.log(' - Check tsup configuration for proper ESM output');
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
console.log('='.repeat(80));
|
|
123
|
-
|
|
124
|
-
return allValid;
|
|
125
130
|
}
|
|
126
131
|
|
|
127
132
|
// Run validation
|
|
@@ -49,87 +49,92 @@ async function runStandardizedTestsWrapper() {
|
|
|
49
49
|
|
|
50
50
|
// Main validation orchestrator
|
|
51
51
|
async function runValidation(mode = 'standard') {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
52
|
+
try {
|
|
53
|
+
logger.header(`Running ${mode} validation`);
|
|
54
|
+
if (isCI()) {
|
|
55
|
+
logger.info('CI environment detected - using extended timeouts and live output');
|
|
56
|
+
logger.newline();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const results = [];
|
|
60
|
+
const startTime = Date.now();
|
|
61
|
+
let criticalFailures = 0;
|
|
62
|
+
|
|
63
|
+
for (const [stepKey, step] of Object.entries(validationSteps)) {
|
|
64
|
+
// Skip tests in pre-publish mode if configured to do so
|
|
65
|
+
if (mode === 'pre-publish' && step.skipInPrePublish) {
|
|
66
|
+
logger.skipped(`Skipping: ${step.name} (skipped in pre-publish mode)...`);
|
|
67
|
+
results.push({
|
|
68
|
+
step: stepKey,
|
|
69
|
+
name: step.name,
|
|
70
|
+
success: true,
|
|
71
|
+
duration: 0,
|
|
72
|
+
skipped: true
|
|
73
|
+
});
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const stepStartTime = Date.now();
|
|
78
|
+
logger.step(`Running: ${step.name}...`);
|
|
79
|
+
|
|
80
|
+
const result = step.customHandler
|
|
81
|
+
? await step.customHandler()
|
|
82
|
+
: await runCommand(step.command[0], step.command.slice(1), {
|
|
83
|
+
cwd: step.cwd || packageRoot,
|
|
84
|
+
timeout: step.timeout || DEFAULT_TIMEOUT,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const stepDuration = Date.now() - stepStartTime;
|
|
88
|
+
const status = result.success ? '✅' : '❌';
|
|
89
|
+
|
|
90
|
+
logger.info(`${status} ${step.name} - ${stepDuration}ms`);
|
|
91
|
+
logger.newline();
|
|
92
|
+
|
|
66
93
|
results.push({
|
|
67
94
|
step: stepKey,
|
|
68
95
|
name: step.name,
|
|
69
|
-
success:
|
|
70
|
-
duration:
|
|
71
|
-
skipped:
|
|
96
|
+
success: result.success,
|
|
97
|
+
duration: stepDuration,
|
|
98
|
+
skipped: false
|
|
72
99
|
});
|
|
73
|
-
|
|
100
|
+
|
|
101
|
+
if (!result.success) {
|
|
102
|
+
criticalFailures++;
|
|
103
|
+
}
|
|
74
104
|
}
|
|
75
105
|
|
|
76
|
-
const
|
|
77
|
-
|
|
106
|
+
const totalDuration = Date.now() - startTime;
|
|
107
|
+
const passedSteps = results.filter(r => r.success).length;
|
|
108
|
+
const skippedSteps = results.filter(r => r.skipped).length;
|
|
78
109
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const stepDuration = Date.now() - stepStartTime;
|
|
87
|
-
const status = result.success ? '✅' : '❌';
|
|
88
|
-
|
|
89
|
-
logger.info(`${status} ${step.name} - ${stepDuration}ms`);
|
|
110
|
+
// Summary
|
|
111
|
+
logger.header('VALIDATION SUMMARY');
|
|
112
|
+
logger.info(`Total steps: ${results.length}`);
|
|
113
|
+
logger.info(`Passed: ${passedSteps}`);
|
|
114
|
+
logger.info(`Skipped: ${skippedSteps}`);
|
|
115
|
+
logger.info(`Failed: ${criticalFailures}`);
|
|
116
|
+
logger.info(`Total duration: ${totalDuration}ms`);
|
|
90
117
|
logger.newline();
|
|
91
118
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
skipped: false
|
|
119
|
+
logger.info('Step Results:');
|
|
120
|
+
results.forEach(result => {
|
|
121
|
+
const status = result.skipped ? '⏭️' : (result.success ? '✅' : '❌');
|
|
122
|
+
const statusText = result.skipped ? 'skipped' : `${result.duration}ms`;
|
|
123
|
+
logger.info(` ${status} ${result.step} - ${statusText}`);
|
|
98
124
|
});
|
|
99
125
|
|
|
100
|
-
|
|
101
|
-
|
|
126
|
+
logger.newline();
|
|
127
|
+
logger.separator();
|
|
128
|
+
|
|
129
|
+
if (criticalFailures === 0) {
|
|
130
|
+
logger.success('All validations passed!');
|
|
131
|
+
return true;
|
|
132
|
+
} else {
|
|
133
|
+
logger.error(`Validation failed! ${criticalFailures} validations failed`);
|
|
134
|
+
return false;
|
|
102
135
|
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const totalDuration = Date.now() - startTime;
|
|
106
|
-
const passedSteps = results.filter(r => r.success).length;
|
|
107
|
-
const skippedSteps = results.filter(r => r.skipped).length;
|
|
108
|
-
|
|
109
|
-
// Summary
|
|
110
|
-
logger.header('VALIDATION SUMMARY');
|
|
111
|
-
logger.info(`Total steps: ${results.length}`);
|
|
112
|
-
logger.info(`Passed: ${passedSteps}`);
|
|
113
|
-
logger.info(`Skipped: ${skippedSteps}`);
|
|
114
|
-
logger.info(`Failed: ${criticalFailures}`);
|
|
115
|
-
logger.info(`Total duration: ${totalDuration}ms`);
|
|
116
|
-
logger.newline();
|
|
117
|
-
|
|
118
|
-
logger.info('Step Results:');
|
|
119
|
-
results.forEach(result => {
|
|
120
|
-
const status = result.skipped ? '⏭️' : (result.success ? '✅' : '❌');
|
|
121
|
-
const statusText = result.skipped ? 'skipped' : `${result.duration}ms`;
|
|
122
|
-
logger.info(` ${status} ${result.step} - ${statusText}`);
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
logger.newline();
|
|
126
|
-
logger.separator();
|
|
127
|
-
|
|
128
|
-
if (criticalFailures === 0) {
|
|
129
|
-
logger.success('All validations passed!');
|
|
130
|
-
return true;
|
|
131
|
-
} else {
|
|
132
|
-
logger.error(`Validation failed! ${criticalFailures} validations failed`);
|
|
136
|
+
} catch (error) {
|
|
137
|
+
logger.error(`Validation error: ${error.message}`);
|
|
133
138
|
return false;
|
|
134
139
|
}
|
|
135
140
|
}
|