@jmruthers/pace-core 0.6.1 → 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 +43 -10
- package/cursor-rules/00-pace-core-compliance.mdc +18 -91
- package/cursor-rules/01-standards-compliance.mdc +16 -47
- package/cursor-rules/02-project-structure.mdc +4 -4
- package/cursor-rules/03-solid-principles.mdc +45 -164
- package/cursor-rules/04-testing-standards.mdc +22 -69
- package/cursor-rules/05-bug-reports-and-features.mdc +2 -2
- package/cursor-rules/06-code-quality.mdc +42 -125
- package/cursor-rules/07-tech-stack-compliance.mdc +33 -128
- package/cursor-rules/08-markup-quality.mdc +452 -0
- package/cursor-rules/CHANGELOG.md +18 -0
- package/cursor-rules/README.md +2 -1
- package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
- package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
- package/dist/{DataTable-DQ7RSOHE.js → DataTable-TPTKCX4D.js} +10 -9
- package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +356 -111
- package/dist/{UnifiedAuthProvider-ATAP5UTR.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-4N5C5XZU.js → chunk-2UOI2FG5.js} +4 -4
- package/dist/chunk-2UOI2FG5.js.map +1 -0
- package/dist/{chunk-T33XF5ZC.js → chunk-3XC4CPTD.js} +4317 -3963
- package/dist/chunk-3XC4CPTD.js.map +1 -0
- package/dist/{chunk-4ZC4GX36.js → chunk-6J4GEEJR.js} +172 -45
- package/dist/chunk-6J4GEEJR.js.map +1 -0
- package/dist/{chunk-3QRJFVBR.js → chunk-6SOIHG6Z.js} +1 -1
- package/dist/chunk-6SOIHG6Z.js.map +1 -0
- package/dist/{chunk-BYFSK72L.js → chunk-EHMR7VYL.js} +4 -4
- 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-LXQLPRQ2.js → chunk-FFQEQTNW.js} +6 -8
- 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-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
- package/dist/chunk-L4OXEN46.js.map +1 -0
- package/dist/{chunk-R77UEZ4E.js → chunk-M43Y4SSO.js} +1 -1
- package/dist/chunk-M43Y4SSO.js.map +1 -0
- package/dist/{chunk-3XTALGJF.js → chunk-MMZ7JXPU.js} +60 -223
- package/dist/chunk-MMZ7JXPU.js.map +1 -0
- package/dist/{chunk-GLK6VM3F.js → chunk-NECFR5MM.js} +254 -170
- package/dist/chunk-NECFR5MM.js.map +1 -0
- package/dist/{chunk-JBKQ3SAO.js → chunk-SFZUDBL5.js} +40 -4
- package/dist/chunk-SFZUDBL5.js.map +1 -0
- package/dist/{chunk-XM25TVIE.js → chunk-XWQCNGTQ.js} +724 -363
- package/dist/chunk-XWQCNGTQ.js.map +1 -0
- package/dist/components.d.ts +5 -5
- package/dist/components.js +14 -11
- 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 +55 -122
- package/dist/hooks.js +8 -12
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +60 -13
- package/dist/index.js +19 -19
- 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 +145 -114
- 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-BJAlWfuJ.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +31 -1
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +14 -14
- 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 +2 -1
- package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
- package/docs/migration/MIGRATION_GUIDE.md +2 -24
- package/docs/migration/README.md +52 -6
- package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -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 +1 -0
- package/package.json +2 -1
- 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} +714 -687
- 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 +61 -936
- 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/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__/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 +14 -0
- package/src/components/Button/Button.tsx +22 -0
- package/src/components/Calendar/Calendar.tsx +8 -2
- 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.tsx +38 -4
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +18 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
- package/src/components/DataTable/components/AccessDeniedPage.tsx +16 -25
- package/src/components/DataTable/components/ActionButtons.tsx +10 -7
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
- 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 +196 -554
- 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 +8 -0
- 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 +8 -0
- 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 +61 -849
- 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/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 +12 -0
- 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/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/Dialog/Dialog.tsx +2 -2
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +45 -5
- package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
- package/src/components/ErrorBoundary/index.ts +27 -2
- package/src/components/EventSelector/EventSelector.tsx +3 -0
- 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 +14 -11
- package/src/components/Form/Form.tsx +1 -0
- package/src/components/Header/Header.tsx +21 -10
- package/src/components/Input/Input.test.tsx +2 -2
- package/src/components/Input/Input.tsx +8 -4
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
- package/src/components/LoginForm/LoginForm.tsx +4 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +14 -513
- 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.test.tsx +4 -2
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +32 -11
- package/src/components/PaceAppLayout/test-setup.tsx +1 -2
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +3 -0
- package/src/components/PasswordChange/PasswordChangeForm.tsx +9 -0
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
- package/src/components/PublicLayout/PublicPageLayout.tsx +2 -5
- package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
- package/src/components/Select/Select.tsx +80 -434
- 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 +4 -5
- package/src/components/Switch/Switch.tsx +4 -4
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Toast/Toast.tsx +4 -0
- package/src/components/Tooltip/Tooltip.tsx +2 -2
- package/src/components/UserMenu/UserMenu.test.tsx +24 -11
- package/src/components/UserMenu/UserMenu.tsx +21 -18
- package/src/components/index.ts +2 -2
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/index.ts +1 -2
- package/src/hooks/public/usePublicEvent.ts +4 -0
- package/src/hooks/public/usePublicEventLogo.ts +4 -0
- package/src/hooks/public/usePublicFileDisplay.ts +4 -0
- package/src/hooks/public/usePublicRouteParams.ts +4 -0
- 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/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 +14 -0
- package/src/hooks/useFocusTrap.ts +3 -0
- package/src/hooks/useInactivityTracker.ts +3 -0
- 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 +7 -0
- 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 +1 -1
- package/src/index.ts +2 -1
- package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
- 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 +36 -0
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +29 -13
- package/src/rbac/README.md +1 -1
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +2 -2
- 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/NavigationProvider.tsx +4 -1
- package/src/rbac/components/PagePermissionGuard.tsx +157 -17
- package/src/rbac/components/RoleBasedRouter.tsx +5 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
- package/src/rbac/components/SecureDataProvider.tsx +20 -5
- 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 +200 -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/dist/chunk-3QRJFVBR.js.map +0 -1
- package/dist/chunk-3XTALGJF.js.map +0 -1
- package/dist/chunk-4N5C5XZU.js.map +0 -1
- package/dist/chunk-4ZC4GX36.js.map +0 -1
- package/dist/chunk-BYFSK72L.js.map +0 -1
- package/dist/chunk-EXUD6RNJ.js +0 -451
- package/dist/chunk-EXUD6RNJ.js.map +0 -1
- package/dist/chunk-GLK6VM3F.js.map +0 -1
- package/dist/chunk-I7PSE6JW.js.map +0 -1
- package/dist/chunk-JBKQ3SAO.js.map +0 -1
- package/dist/chunk-KNC55RTG.js.map +0 -1
- package/dist/chunk-LXQLPRQ2.js.map +0 -1
- package/dist/chunk-R77UEZ4E.js.map +0 -1
- package/dist/chunk-SQGMNID3.js.map +0 -1
- package/dist/chunk-T33XF5ZC.js.map +0 -1
- package/dist/chunk-XM25TVIE.js.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 -681
- /package/dist/{DataTable-DQ7RSOHE.js.map → DataTable-TPTKCX4D.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-ATAP5UTR.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/docs/migration/{REACT_19_MIGRATION.md → V0.6.0_REACT_19_MIGRATION.md} +0 -0
|
@@ -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
|
}
|
|
@@ -51,75 +51,80 @@ function checkTypedocInstallation() {
|
|
|
51
51
|
|
|
52
52
|
// Main validation function
|
|
53
53
|
async function runPrePublishValidation() {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
// Step 1: Type check
|
|
58
|
-
logger.step('Step 1: Type check');
|
|
59
|
-
const typeCheck = await runCommand('npm', ['run', 'type-check'], {
|
|
60
|
-
cwd: packageRoot,
|
|
61
|
-
timeout: DEFAULT_TIMEOUT,
|
|
62
|
-
});
|
|
63
|
-
if (!typeCheck.success) {
|
|
64
|
-
logger.error('Type check failed');
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Step 2: Build validation
|
|
69
|
-
logger.newline();
|
|
70
|
-
logger.step('Step 2: Build validation');
|
|
71
|
-
const build = await runCommand('npm', ['run', 'build'], {
|
|
72
|
-
cwd: packageRoot,
|
|
73
|
-
timeout: getDefaultTimeout(60000, 180000),
|
|
74
|
-
});
|
|
75
|
-
if (!build.success) {
|
|
76
|
-
logger.error('Build failed');
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Step 3: Test validation - now uses standardized test execution
|
|
81
|
-
logger.newline();
|
|
82
|
-
logger.step('Step 3: Test validation');
|
|
83
|
-
const tests = await runStandardizedTests(packageRoot, repoRoot, TEST_TIMEOUT);
|
|
84
|
-
if (!tests.success) {
|
|
85
|
-
logger.error('Tests failed');
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Step 4: Documentation generation
|
|
90
|
-
logger.newline();
|
|
91
|
-
logger.step('Step 4: Documentation generation');
|
|
92
|
-
if (!checkTypedocInstallation()) {
|
|
93
|
-
logger.error('TypeDoc validation failed');
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
54
|
+
try {
|
|
55
|
+
logger.info('Running validation steps...');
|
|
56
|
+
logger.newline();
|
|
96
57
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
58
|
+
// Step 1: Type check
|
|
59
|
+
logger.step('Step 1: Type check');
|
|
60
|
+
const typeCheck = await runCommand('npm', ['run', 'type-check'], {
|
|
61
|
+
cwd: packageRoot,
|
|
62
|
+
timeout: DEFAULT_TIMEOUT,
|
|
63
|
+
});
|
|
64
|
+
if (!typeCheck.success) {
|
|
65
|
+
logger.error('Type check failed');
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Step 2: Build validation
|
|
70
|
+
logger.newline();
|
|
71
|
+
logger.step('Step 2: Build validation');
|
|
72
|
+
const build = await runCommand('npm', ['run', 'build'], {
|
|
73
|
+
cwd: packageRoot,
|
|
74
|
+
timeout: getDefaultTimeout(60000, 180000),
|
|
75
|
+
});
|
|
76
|
+
if (!build.success) {
|
|
77
|
+
logger.error('Build failed');
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Step 3: Test validation - now uses standardized test execution
|
|
82
|
+
logger.newline();
|
|
83
|
+
logger.step('Step 3: Test validation');
|
|
84
|
+
const tests = await runStandardizedTests(packageRoot, repoRoot, TEST_TIMEOUT);
|
|
85
|
+
if (!tests.success) {
|
|
86
|
+
logger.error('Tests failed');
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Step 4: Documentation generation
|
|
91
|
+
logger.newline();
|
|
92
|
+
logger.step('Step 4: Documentation generation');
|
|
93
|
+
if (!checkTypedocInstallation()) {
|
|
94
|
+
logger.error('TypeDoc validation failed');
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const docs = await runCommand('npm', ['run', 'build:docs'], {
|
|
99
|
+
cwd: packageRoot,
|
|
100
|
+
timeout: getDefaultTimeout(120000, 240000),
|
|
101
|
+
});
|
|
102
|
+
if (!docs.success) {
|
|
103
|
+
logger.error('Documentation generation failed');
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Step 5: Format validation
|
|
108
|
+
logger.newline();
|
|
109
|
+
logger.step('Step 5: Format validation');
|
|
110
|
+
const format = await runCommand('npm', ['run', 'format:check'], {
|
|
111
|
+
cwd: packageRoot,
|
|
112
|
+
timeout: DEFAULT_TIMEOUT,
|
|
113
|
+
});
|
|
114
|
+
if (!format.success) {
|
|
115
|
+
logger.error('Format validation failed');
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
105
118
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (!format.success) {
|
|
114
|
-
logger.error('Format validation failed');
|
|
119
|
+
logger.newline();
|
|
120
|
+
logger.header('PRE-PUBLISH VALIDATION SUMMARY');
|
|
121
|
+
logger.success('All validation steps passed successfully!');
|
|
122
|
+
logger.success('Package meets publication requirements');
|
|
123
|
+
return true;
|
|
124
|
+
} catch (error) {
|
|
125
|
+
logger.error(`Pre-publish validation error: ${error.message}`);
|
|
115
126
|
return false;
|
|
116
127
|
}
|
|
117
|
-
|
|
118
|
-
logger.newline();
|
|
119
|
-
logger.header('PRE-PUBLISH VALIDATION SUMMARY');
|
|
120
|
-
logger.success('All validation steps passed successfully!');
|
|
121
|
-
logger.success('Package meets publication requirements');
|
|
122
|
-
return true;
|
|
123
128
|
}
|
|
124
129
|
|
|
125
130
|
// Run the validation
|
|
@@ -143,7 +143,7 @@ describe('usePermissions Hook Stability', () => {
|
|
|
143
143
|
mockIsPermittedCached.mockResolvedValue(true);
|
|
144
144
|
|
|
145
145
|
const { result, rerender } = renderHook(() =>
|
|
146
|
-
useCan(mockUserId, mockScope, 'read:users', 'page-123', true)
|
|
146
|
+
useCan(mockUserId, mockScope, 'read:users', 'page-123', true, false)
|
|
147
147
|
);
|
|
148
148
|
|
|
149
149
|
// Wait for initial load
|
|
@@ -171,7 +171,7 @@ describe('usePermissions Hook Stability', () => {
|
|
|
171
171
|
.mockResolvedValueOnce(true);
|
|
172
172
|
|
|
173
173
|
const { result, rerender } = renderHook(() =>
|
|
174
|
-
useCan(mockUserId, mockScope, 'read:users', 'page-123', true)
|
|
174
|
+
useCan(mockUserId, mockScope, 'read:users', 'page-123', true, false)
|
|
175
175
|
);
|
|
176
176
|
|
|
177
177
|
// Wait for initial load
|
|
@@ -80,7 +80,7 @@ describe('Alert Component', () => {
|
|
|
80
80
|
it('renders with children content', () => {
|
|
81
81
|
renderWithProviders(
|
|
82
82
|
<Alert>
|
|
83
|
-
<
|
|
83
|
+
<span data-testid="custom-content">Custom content</span>
|
|
84
84
|
</Alert>
|
|
85
85
|
);
|
|
86
86
|
|
|
@@ -330,14 +330,10 @@ describe('Alert Component', () => {
|
|
|
330
330
|
it('works with icons and actions', () => {
|
|
331
331
|
renderWithProviders(
|
|
332
332
|
<Alert>
|
|
333
|
-
<
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
<AlertDescription>Please check your input</AlertDescription>
|
|
338
|
-
</div>
|
|
339
|
-
<button>Dismiss</button>
|
|
340
|
-
</div>
|
|
333
|
+
<span>⚠️</span>
|
|
334
|
+
<AlertTitle>Warning</AlertTitle>
|
|
335
|
+
<AlertDescription>Please check your input</AlertDescription>
|
|
336
|
+
<button>Dismiss</button>
|
|
341
337
|
</Alert>
|
|
342
338
|
);
|
|
343
339
|
|
|
@@ -484,7 +480,7 @@ describe('Alert Component', () => {
|
|
|
484
480
|
|
|
485
481
|
it('works with multiple alerts', () => {
|
|
486
482
|
renderWithProviders(
|
|
487
|
-
|
|
483
|
+
<>
|
|
488
484
|
<Alert variant="default">
|
|
489
485
|
<AlertTitle>Info</AlertTitle>
|
|
490
486
|
<AlertDescription>Information message</AlertDescription>
|
|
@@ -493,7 +489,7 @@ describe('Alert Component', () => {
|
|
|
493
489
|
<AlertTitle>Error</AlertTitle>
|
|
494
490
|
<AlertDescription>Error message</AlertDescription>
|
|
495
491
|
</Alert>
|
|
496
|
-
|
|
492
|
+
</>
|
|
497
493
|
);
|
|
498
494
|
|
|
499
495
|
const alerts = screen.getAllByRole('alert');
|
|
@@ -509,13 +505,11 @@ describe('Alert Component', () => {
|
|
|
509
505
|
<Alert>
|
|
510
506
|
<AlertTitle>Complex Alert</AlertTitle>
|
|
511
507
|
<AlertDescription>
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
<
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
</ul>
|
|
518
|
-
</div>
|
|
508
|
+
This is a complex description with
|
|
509
|
+
<ul>
|
|
510
|
+
<li>Multiple elements</li>
|
|
511
|
+
<li>Nested content</li>
|
|
512
|
+
</ul>
|
|
519
513
|
</AlertDescription>
|
|
520
514
|
</Alert>
|
|
521
515
|
);
|
|
@@ -18,22 +18,20 @@
|
|
|
18
18
|
*
|
|
19
19
|
* @example
|
|
20
20
|
* ```tsx
|
|
21
|
-
* // Basic alert
|
|
21
|
+
* // Basic alert (renders as <aside> with <h5> title and <p> description)
|
|
22
22
|
* <Alert>
|
|
23
23
|
* <AlertTitle>Success</AlertTitle>
|
|
24
24
|
* <AlertDescription>Your changes have been saved.</AlertDescription>
|
|
25
25
|
* </Alert>
|
|
26
26
|
*
|
|
27
|
-
* // Destructive alert with icon
|
|
27
|
+
* // Destructive alert with icon (renders as <aside> with <h5> title and <p> description)
|
|
28
28
|
* <Alert variant="destructive">
|
|
29
29
|
* <ErrorIcon />
|
|
30
|
-
* <
|
|
31
|
-
*
|
|
32
|
-
* <AlertDescription>Something went wrong.</AlertDescription>
|
|
33
|
-
* </div>
|
|
30
|
+
* <AlertTitle>Error</AlertTitle>
|
|
31
|
+
* <AlertDescription>Something went wrong.</AlertDescription>
|
|
34
32
|
* </Alert>
|
|
35
33
|
*
|
|
36
|
-
* // Inline alert (renders as
|
|
34
|
+
* // Inline alert (renders as React.Fragment with <strong> title and <span> description)
|
|
37
35
|
* <Alert variant="inline">
|
|
38
36
|
* <AlertTitle>Note:</AlertTitle>
|
|
39
37
|
* <AlertDescription>This is an inline message.</AlertDescription>
|
|
@@ -409,13 +409,13 @@ describe('Avatar Component', () => {
|
|
|
409
409
|
describe('Integration', () => {
|
|
410
410
|
it('works within user profile components', () => {
|
|
411
411
|
renderWithProviders(
|
|
412
|
-
<
|
|
412
|
+
<section className="user-profile">
|
|
413
413
|
<Avatar src="/user.jpg" alt="Profile" fallback="UP" />
|
|
414
|
-
<
|
|
414
|
+
<section>
|
|
415
415
|
<h3>User Name</h3>
|
|
416
416
|
<p>User description</p>
|
|
417
|
-
</
|
|
418
|
-
</
|
|
417
|
+
</section>
|
|
418
|
+
</section>
|
|
419
419
|
);
|
|
420
420
|
|
|
421
421
|
expect(screen.getByAltText('Profile')).toBeInTheDocument();
|
|
@@ -49,6 +49,14 @@ import { cn } from '../../utils/core/cn';
|
|
|
49
49
|
// TYPE DEFINITIONS
|
|
50
50
|
// ============================================================================
|
|
51
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Badge variant type
|
|
54
|
+
* Defines the visual style, color palette, and shade intensity of the badge.
|
|
55
|
+
* Format: {style}-{color}-{shade}
|
|
56
|
+
* - style: 'solid' | 'outline' | 'soft'
|
|
57
|
+
* - color: 'main' | 'sec' | 'acc'
|
|
58
|
+
* - shade: 'muted' | 'normal' | 'strong'
|
|
59
|
+
*/
|
|
52
60
|
export type BadgeVariant =
|
|
53
61
|
| 'solid-main-muted' | 'solid-main-normal' | 'solid-main-strong'
|
|
54
62
|
| 'solid-sec-muted' | 'solid-sec-normal' | 'solid-sec-strong'
|
|
@@ -60,6 +68,12 @@ export type BadgeVariant =
|
|
|
60
68
|
| 'soft-sec-muted' | 'soft-sec-normal' | 'soft-sec-strong'
|
|
61
69
|
| 'soft-acc-muted' | 'soft-acc-normal' | 'soft-acc-strong';
|
|
62
70
|
|
|
71
|
+
/**
|
|
72
|
+
* Badge component props
|
|
73
|
+
* Extends standard HTML span attributes with badge-specific styling options.
|
|
74
|
+
*
|
|
75
|
+
* @interface BadgeProps
|
|
76
|
+
*/
|
|
63
77
|
export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
64
78
|
/** Visual variant of the badge (style-color-shade) */
|
|
65
79
|
variant?: BadgeVariant;
|