@jmruthers/pace-core 0.6.1 → 0.6.3
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 +88 -10
- package/cursor-rules/00-pace-core-compliance.mdc +46 -87
- 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-Cb34EQs3.d.ts} +63 -1
- package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
- package/dist/{DataTable-DQ7RSOHE.js → DataTable-THFPBKTP.js} +12 -10
- package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DEMpysFR.d.ts} +394 -171
- package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CKvHP1MK.d.ts} +30 -8
- package/dist/{UnifiedAuthProvider-ATAP5UTR.js → UnifiedAuthProvider-KAGUYQ4J.js} +5 -4
- package/dist/{api-N774RPUA.js → api-IAGWF3ZG.js} +10 -10
- package/dist/{audit-B5P6FFIR.js → audit-V53FV5AG.js} +2 -2
- package/dist/{chunk-JBKQ3SAO.js → chunk-2T2IG7T7.js} +107 -57
- package/dist/chunk-2T2IG7T7.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-3XTALGJF.js → chunk-6Z7LTB3D.js} +69 -240
- package/dist/chunk-6Z7LTB3D.js.map +1 -0
- package/dist/{chunk-4ZC4GX36.js → chunk-CNCQDFLN.js} +199 -46
- package/dist/chunk-CNCQDFLN.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/{chunk-BYFSK72L.js → chunk-DWUBLJJM.js} +361 -187
- package/dist/chunk-DWUBLJJM.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-4N5C5XZU.js → chunk-HFZBI76P.js} +4 -4
- package/dist/chunk-HFZBI76P.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-I7PSE6JW.js → chunk-M7MPQISP.js} +3 -76
- package/dist/chunk-M7MPQISP.js.map +1 -0
- package/dist/chunk-PQBSKX33.js +7793 -0
- package/dist/chunk-PQBSKX33.js.map +1 -0
- package/dist/chunk-QRPVRXYT.js +226 -0
- package/dist/chunk-QRPVRXYT.js.map +1 -0
- package/dist/{chunk-KNC55RTG.js → chunk-RWEBCB47.js} +194 -416
- package/dist/chunk-RWEBCB47.js.map +1 -0
- package/dist/{chunk-XM25TVIE.js → chunk-YDQHOZNA.js} +843 -388
- package/dist/chunk-YDQHOZNA.js.map +1 -0
- package/dist/{chunk-GLK6VM3F.js → chunk-ZNIWI3UC.js} +739 -737
- package/dist/chunk-ZNIWI3UC.js.map +1 -0
- package/dist/components.d.ts +5 -5
- package/dist/components.js +18 -16
- package/dist/components.js.map +1 -1
- package/dist/contextValidator-3JNZKUTX.js +9 -0
- package/dist/contextValidator-3JNZKUTX.js.map +1 -0
- package/dist/eslint-rules/pace-core-compliance.cjs +106 -0
- 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 +10 -13
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +60 -13
- package/dist/index.js +30 -25
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +21 -3
- package/dist/providers.js +4 -3
- package/dist/rbac/index.d.ts +210 -139
- package/dist/rbac/index.js +17 -13
- package/dist/styles/index.js +1 -1
- package/dist/theming/runtime.d.ts +1 -13
- package/dist/theming/runtime.js +2 -2
- 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/types.js +1 -1
- package/dist/{usePublicRouteParams-BJAlWfuJ.d.ts → usePublicRouteParams-i3qtoBgg.d.ts} +38 -17
- package/dist/utils.d.ts +4 -5
- package/dist/utils.js +17 -19
- package/dist/utils.js.map +1 -1
- package/docs/api/README.md +21 -17
- package/docs/api/modules.md +4191 -2967
- package/docs/architecture/database-schema-requirements.md +161 -0
- package/docs/components/context-selector.md +126 -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/RBAC_SCOPE_MIGRATION.md +385 -0
- 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/pace-mint-fix-auto-selection.md +218 -0
- package/docs/pace-mint-rbac-setup.md +391 -0
- 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/rbac/secure-client-protection.md +330 -0
- package/docs/standards/README.md +1 -0
- package/package.json +4 -3
- 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} +784 -685
- 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 +985 -0
- package/scripts/audit/core/checks/documentation.cjs +268 -0
- package/scripts/audit/core/checks/environment.cjs +116 -0
- package/scripts/audit/core/checks/error-handling.cjs +340 -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/ContextSelector/ContextSelector.tsx +384 -0
- package/src/components/ContextSelector/index.ts +3 -0
- 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 +63 -851
- 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 +127 -33
- 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 +31 -3
- 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/FileDisplay/FileDisplay.tsx +74 -28
- 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.test.tsx +43 -73
- package/src/components/Header/Header.tsx +59 -49
- 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/PaceAppLayout/PaceAppLayout.integration.test.tsx +10 -19
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +2 -2
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +5 -5
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +13 -11
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +167 -44
- package/src/components/PaceAppLayout/README.md +14 -17
- package/src/components/PaceAppLayout/test-setup.tsx +3 -4
- 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 +7 -7
- package/src/eslint-rules/pace-core-compliance.cjs +106 -0
- package/src/hooks/__tests__/index.unit.test.ts +2 -5
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +4 -98
- 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/useAppConfig.ts +15 -30
- package/src/hooks/useDebounce.ts +9 -0
- package/src/hooks/useEventTheme.ts +6 -0
- package/src/hooks/useFileDisplay.ts +81 -50
- 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 +6 -6
- package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
- package/src/providers/services/AuthServiceProvider.tsx +35 -7
- package/src/providers/services/EventServiceProvider.tsx +51 -5
- package/src/providers/services/InactivityServiceProvider.tsx +18 -0
- package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
- package/src/providers/services/UnifiedAuthProvider.tsx +126 -134
- 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 +1 -1
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
- package/src/rbac/adapters.tsx +12 -3
- package/src/rbac/api.test.ts +59 -51
- package/src/rbac/api.ts +246 -167
- package/src/rbac/components/NavigationProvider.tsx +4 -1
- package/src/rbac/components/PagePermissionGuard.tsx +185 -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/__tests__/useSecureSupabase.test.ts +32 -21
- 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 +377 -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 +64 -66
- package/src/rbac/hooks/usePermissions.ts +14 -995
- package/src/rbac/hooks/useRBAC.test.ts +1 -5
- package/src/rbac/hooks/useRBAC.ts +36 -37
- package/src/rbac/hooks/useResolvedScope.test.ts +120 -35
- package/src/rbac/hooks/useResolvedScope.ts +35 -40
- package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
- package/src/rbac/hooks/useResourcePermissions.ts +14 -4
- package/src/rbac/hooks/useSecureSupabase.ts +27 -7
- package/src/rbac/index.ts +7 -0
- package/src/rbac/permissions.ts +0 -30
- package/src/rbac/secureClient.test.ts +22 -18
- package/src/rbac/secureClient.ts +294 -68
- package/src/rbac/security.ts +0 -17
- package/src/rbac/types.ts +9 -0
- package/src/rbac/utils/__tests__/contextValidator.test.ts +64 -86
- package/src/rbac/utils/clientSecurity.ts +93 -0
- package/src/rbac/utils/contextValidator.ts +77 -168
- package/src/services/AuthService.ts +39 -7
- package/src/services/EventService.ts +186 -54
- package/src/services/OrganisationService.ts +81 -14
- package/src/services/__tests__/EventService.test.ts +1 -2
- package/src/services/base/BaseService.ts +3 -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/dynamic/dynamicUtils.ts +7 -4
- 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-7D4SUZUM.js +0 -38
- 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 +0 -12922
- package/dist/chunk-T33XF5ZC.js.map +0 -1
- package/dist/chunk-XM25TVIE.js.map +0 -1
- package/docs/api/classes/ColumnFactory.md +0 -243
- package/docs/api/classes/ErrorBoundary.md +0 -144
- package/docs/api/classes/InvalidScopeError.md +0 -73
- package/docs/api/classes/Logger.md +0 -178
- package/docs/api/classes/MissingUserContextError.md +0 -66
- package/docs/api/classes/OrganisationContextRequiredError.md +0 -66
- package/docs/api/classes/PermissionDeniedError.md +0 -73
- package/docs/api/classes/RBACAuditManager.md +0 -297
- package/docs/api/classes/RBACCache.md +0 -322
- package/docs/api/classes/RBACEngine.md +0 -171
- package/docs/api/classes/RBACError.md +0 -76
- package/docs/api/classes/RBACNotInitializedError.md +0 -66
- package/docs/api/classes/SecureSupabaseClient.md +0 -160
- package/docs/api/classes/StorageUtils.md +0 -328
- package/docs/api/enums/FileCategory.md +0 -184
- package/docs/api/enums/LogLevel.md +0 -54
- package/docs/api/enums/RBACErrorCode.md +0 -228
- package/docs/api/enums/RPCFunction.md +0 -118
- package/docs/api/interfaces/AddressFieldProps.md +0 -241
- package/docs/api/interfaces/AddressFieldRef.md +0 -94
- package/docs/api/interfaces/AggregateConfig.md +0 -43
- package/docs/api/interfaces/AutocompleteOptions.md +0 -75
- package/docs/api/interfaces/AvatarProps.md +0 -128
- package/docs/api/interfaces/BadgeProps.md +0 -27
- package/docs/api/interfaces/ButtonProps.md +0 -53
- package/docs/api/interfaces/CalendarProps.md +0 -70
- package/docs/api/interfaces/CardProps.md +0 -66
- package/docs/api/interfaces/ColorPalette.md +0 -7
- package/docs/api/interfaces/ColorShade.md +0 -66
- package/docs/api/interfaces/ComplianceResult.md +0 -30
- package/docs/api/interfaces/DataAccessRecord.md +0 -96
- package/docs/api/interfaces/DataRecord.md +0 -11
- package/docs/api/interfaces/DataTableAction.md +0 -249
- package/docs/api/interfaces/DataTableColumn.md +0 -504
- package/docs/api/interfaces/DataTableProps.md +0 -625
- package/docs/api/interfaces/DataTableToolbarButton.md +0 -96
- package/docs/api/interfaces/DatabaseComplianceResult.md +0 -85
- package/docs/api/interfaces/DatabaseIssue.md +0 -41
- package/docs/api/interfaces/EmptyStateConfig.md +0 -61
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +0 -235
- package/docs/api/interfaces/EventAppRoleData.md +0 -71
- package/docs/api/interfaces/ExportColumn.md +0 -90
- package/docs/api/interfaces/ExportOptions.md +0 -126
- package/docs/api/interfaces/FileDisplayProps.md +0 -249
- package/docs/api/interfaces/FileMetadata.md +0 -129
- package/docs/api/interfaces/FileReference.md +0 -118
- package/docs/api/interfaces/FileSizeLimits.md +0 -7
- package/docs/api/interfaces/FileUploadOptions.md +0 -139
- package/docs/api/interfaces/FileUploadProps.md +0 -293
- package/docs/api/interfaces/FooterProps.md +0 -105
- package/docs/api/interfaces/FormFieldProps.md +0 -166
- package/docs/api/interfaces/FormProps.md +0 -113
- package/docs/api/interfaces/GrantEventAppRoleParams.md +0 -122
- package/docs/api/interfaces/InactivityWarningModalProps.md +0 -115
- package/docs/api/interfaces/InputProps.md +0 -53
- package/docs/api/interfaces/LabelProps.md +0 -107
- package/docs/api/interfaces/LoggerConfig.md +0 -62
- package/docs/api/interfaces/LoginFormProps.md +0 -184
- package/docs/api/interfaces/NavigationAccessRecord.md +0 -107
- package/docs/api/interfaces/NavigationContextType.md +0 -164
- package/docs/api/interfaces/NavigationGuardProps.md +0 -139
- package/docs/api/interfaces/NavigationItem.md +0 -120
- package/docs/api/interfaces/NavigationMenuProps.md +0 -221
- package/docs/api/interfaces/NavigationProviderProps.md +0 -117
- package/docs/api/interfaces/Organisation.md +0 -140
- package/docs/api/interfaces/OrganisationContextType.md +0 -388
- package/docs/api/interfaces/OrganisationMembership.md +0 -140
- package/docs/api/interfaces/OrganisationProviderProps.md +0 -76
- package/docs/api/interfaces/OrganisationSecurityError.md +0 -62
- package/docs/api/interfaces/PaceAppLayoutProps.md +0 -406
- package/docs/api/interfaces/PaceLoginPageProps.md +0 -47
- package/docs/api/interfaces/PageAccessRecord.md +0 -85
- package/docs/api/interfaces/PagePermissionContextType.md +0 -140
- package/docs/api/interfaces/PagePermissionGuardProps.md +0 -153
- package/docs/api/interfaces/PagePermissionProviderProps.md +0 -119
- package/docs/api/interfaces/PaletteData.md +0 -41
- package/docs/api/interfaces/ParsedAddress.md +0 -120
- package/docs/api/interfaces/PermissionEnforcerProps.md +0 -153
- package/docs/api/interfaces/ProgressProps.md +0 -42
- package/docs/api/interfaces/ProtectedRouteProps.md +0 -97
- package/docs/api/interfaces/PublicPageFooterProps.md +0 -112
- package/docs/api/interfaces/PublicPageHeaderProps.md +0 -125
- package/docs/api/interfaces/PublicPageLayoutProps.md +0 -198
- package/docs/api/interfaces/QuickFix.md +0 -52
- package/docs/api/interfaces/RBACAccessValidateParams.md +0 -52
- package/docs/api/interfaces/RBACAccessValidateResult.md +0 -41
- package/docs/api/interfaces/RBACAuditLogParams.md +0 -85
- package/docs/api/interfaces/RBACAuditLogResult.md +0 -52
- package/docs/api/interfaces/RBACConfig.md +0 -133
- package/docs/api/interfaces/RBACContext.md +0 -52
- package/docs/api/interfaces/RBACLogger.md +0 -112
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +0 -74
- package/docs/api/interfaces/RBACPerformanceMetrics.md +0 -138
- package/docs/api/interfaces/RBACPermissionCheckParams.md +0 -74
- package/docs/api/interfaces/RBACPermissionCheckResult.md +0 -52
- package/docs/api/interfaces/RBACPermissionsGetParams.md +0 -63
- package/docs/api/interfaces/RBACPermissionsGetResult.md +0 -63
- package/docs/api/interfaces/RBACResult.md +0 -58
- package/docs/api/interfaces/RBACRoleGrantParams.md +0 -63
- package/docs/api/interfaces/RBACRoleGrantResult.md +0 -52
- package/docs/api/interfaces/RBACRoleRevokeParams.md +0 -63
- package/docs/api/interfaces/RBACRoleRevokeResult.md +0 -52
- package/docs/api/interfaces/RBACRoleValidateParams.md +0 -52
- package/docs/api/interfaces/RBACRoleValidateResult.md +0 -63
- package/docs/api/interfaces/RBACRolesListParams.md +0 -52
- package/docs/api/interfaces/RBACRolesListResult.md +0 -74
- package/docs/api/interfaces/RBACSessionTrackParams.md +0 -74
- package/docs/api/interfaces/RBACSessionTrackResult.md +0 -52
- package/docs/api/interfaces/ResourcePermissions.md +0 -155
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +0 -100
- package/docs/api/interfaces/RoleBasedRouterContextType.md +0 -151
- package/docs/api/interfaces/RoleBasedRouterProps.md +0 -156
- package/docs/api/interfaces/RoleManagementResult.md +0 -52
- package/docs/api/interfaces/RouteAccessRecord.md +0 -107
- package/docs/api/interfaces/RouteConfig.md +0 -134
- package/docs/api/interfaces/RuntimeComplianceResult.md +0 -55
- package/docs/api/interfaces/SecureDataContextType.md +0 -168
- package/docs/api/interfaces/SecureDataProviderProps.md +0 -132
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +0 -34
- package/docs/api/interfaces/SetupIssue.md +0 -41
- package/docs/api/interfaces/StorageConfig.md +0 -41
- package/docs/api/interfaces/StorageFileInfo.md +0 -74
- package/docs/api/interfaces/StorageFileMetadata.md +0 -151
- package/docs/api/interfaces/StorageListOptions.md +0 -99
- package/docs/api/interfaces/StorageListResult.md +0 -41
- package/docs/api/interfaces/StorageUploadOptions.md +0 -101
- package/docs/api/interfaces/StorageUploadResult.md +0 -63
- package/docs/api/interfaces/StorageUrlOptions.md +0 -60
- package/docs/api/interfaces/StyleImport.md +0 -19
- package/docs/api/interfaces/SwitchProps.md +0 -34
- package/docs/api/interfaces/TabsContentProps.md +0 -9
- package/docs/api/interfaces/TabsListProps.md +0 -9
- package/docs/api/interfaces/TabsProps.md +0 -9
- package/docs/api/interfaces/TabsTriggerProps.md +0 -50
- package/docs/api/interfaces/TextareaProps.md +0 -53
- package/docs/api/interfaces/ToastActionElement.md +0 -9
- package/docs/api/interfaces/ToastProps.md +0 -9
- package/docs/api/interfaces/UnifiedAuthContextType.md +0 -820
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +0 -171
- package/docs/api/interfaces/UseFormDialogOptions.md +0 -62
- package/docs/api/interfaces/UseFormDialogReturn.md +0 -117
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +0 -136
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +0 -123
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +0 -87
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +0 -81
- package/docs/api/interfaces/UsePublicEventOptions.md +0 -34
- package/docs/api/interfaces/UsePublicEventReturn.md +0 -68
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +0 -47
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +0 -120
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +0 -94
- package/docs/api/interfaces/UseResolvedScopeOptions.md +0 -47
- package/docs/api/interfaces/UseResolvedScopeReturn.md +0 -47
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +0 -34
- package/docs/api/interfaces/UserEventAccess.md +0 -118
- package/docs/api/interfaces/UserMenuProps.md +0 -86
- package/docs/api/interfaces/UserProfile.md +0 -63
- package/docs/migration/quick-migration-guide.md +0 -356
- package/docs/migration/service-architecture.md +0 -281
- package/src/components/EventSelector/EventSelector.test.tsx +0 -720
- package/src/components/EventSelector/EventSelector.tsx +0 -420
- package/src/components/EventSelector/index.ts +0 -3
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +0 -784
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -324
- package/src/components/OrganisationSelector/index.ts +0 -9
- 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-THFPBKTP.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-ATAP5UTR.js.map → UnifiedAuthProvider-KAGUYQ4J.js.map} +0 -0
- /package/dist/{api-N774RPUA.js.map → api-IAGWF3ZG.js.map} +0 -0
- /package/dist/{audit-B5P6FFIR.js.map → audit-V53FV5AG.js.map} +0 -0
- /package/dist/{chunk-7D4SUZUM.js.map → chunk-DGUM43GV.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
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,79 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
- **Unified Context Selector**: New `ContextSelector` component that intelligently shows all accessible organisations and events in a single dropdown. Replaces the need for separate `OrganisationSelector`, `EventSelector`, and `HybridContextSelector` components.
|
|
12
|
+
- Automatically determines what to show based on user's roles and permissions
|
|
13
|
+
- Shows superset of all accessible orgs and events
|
|
14
|
+
- Works for all app types (org-based, event-based, hybrid)
|
|
15
|
+
- Used by default in `Header` and `PaceAppLayout` components
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
- **Header Component**: Now uses unified `ContextSelector` by default instead of separate `OrganisationSelector` and `EventSelector`
|
|
19
|
+
- New prop: `showContextSelector` (default: `true`) - replaces `showEventSelector` and `showOrgSelector`
|
|
20
|
+
- **PaceAppLayout Component**: Now uses unified `ContextSelector` by default
|
|
21
|
+
- New prop: `showContextSelector` (default: `true`)
|
|
22
|
+
|
|
23
|
+
### Removed
|
|
24
|
+
- **OrganisationSelector**: Removed - use `ContextSelector` instead
|
|
25
|
+
- **EventSelector**: Removed - use `ContextSelector` instead
|
|
26
|
+
- **HybridContextSelector**: Removed - use `ContextSelector` instead
|
|
27
|
+
- **Header.showEventSelector**: Removed - use `showContextSelector` instead
|
|
28
|
+
- **Header.showOrgSelector**: Removed - use `showContextSelector` instead
|
|
29
|
+
- **PaceAppLayout.showEventSelector**: Removed - use `showContextSelector` instead
|
|
30
|
+
- **PaceAppLayout.showOrgSelector**: Removed - use `showContextSelector` instead
|
|
31
|
+
|
|
32
|
+
### Breaking Changes
|
|
33
|
+
- **RBAC Scope Migration**: App-level scope (`rbac_apps.requires_event`) has been removed. All scope is now page-level only (`rbac_app_pages.scope_type`).
|
|
34
|
+
- **Removed**: `UnifiedAuthProvider.appConfig` prop - scope is now determined per page
|
|
35
|
+
- **Removed**: `useAppConfig().requiresEvent` and `useAppConfig().supportsDirectAccess` - use `getPageScopeType()` instead
|
|
36
|
+
- **Removed**: `ContextValidator.validateScope()` - use `ContextValidator.resolveScopeForPage()` instead
|
|
37
|
+
- **Removed**: `ContextValidator.resolveRequiredContext()` - use `ContextValidator.resolveScopeForPage()` instead
|
|
38
|
+
- **Removed**: `ContextValidator.isContextReady()` - context readiness is now checked per page
|
|
39
|
+
- **Removed**: `RBACSecurityValidator.validateContextRequirements()` - no longer needed
|
|
40
|
+
- **Removed**: `getAppConfigByName()` - use `getPageScopeType()` instead
|
|
41
|
+
- **Changed**: `useRBAC()` now requires `pageId` parameter for proper scope resolution
|
|
42
|
+
- **Changed**: `getPermissionMap()`, `getRoleContext()`, and `getAccessLevel()` no longer accept `appConfig` parameter
|
|
43
|
+
|
|
44
|
+
### Migration Required
|
|
45
|
+
**⚠️ CRITICAL**: All consuming apps must migrate to page-level scope. See [RBAC Scope Migration Guide](./docs/migration/RBAC_SCOPE_MIGRATION.md) for detailed instructions.
|
|
46
|
+
|
|
47
|
+
**Quick Steps:**
|
|
48
|
+
1. Run database migration: `supabase/migrations/20251231130000_migrate_scope_to_page_level.sql`
|
|
49
|
+
2. Update all pages in `rbac_app_pages` to have explicit `scope_type` set
|
|
50
|
+
3. Remove `appConfig` prop from `UnifiedAuthProvider`
|
|
51
|
+
4. Update `useRBAC(pageId)` calls to pass `pageId` parameter
|
|
52
|
+
5. Replace `useAppConfig().requiresEvent` with `getPageScopeType(pageId)`
|
|
53
|
+
6. Update any code using deprecated `ContextValidator` methods
|
|
54
|
+
|
|
55
|
+
### Removed
|
|
56
|
+
- **DataTable Debug Tools Exports**: Removed all public exports from `packages/core/src/components/DataTable/utils/debugTools.ts` as they were unused. The debug tools functionality remains available internally for development but is no longer exported. Removed exports include:
|
|
57
|
+
- `DebugLevel` enum
|
|
58
|
+
- `DebugConfig` interface
|
|
59
|
+
- `DEFAULT_DEBUG_CONFIG` constant
|
|
60
|
+
- `DebugLogEntry` interface
|
|
61
|
+
- `PerformanceTimelineEntry` interface
|
|
62
|
+
- `MemorySnapshot` interface
|
|
63
|
+
- `RenderPerformanceData` interface
|
|
64
|
+
- `DataTableDebugger` class
|
|
65
|
+
- `dataTableDebugger` instance
|
|
66
|
+
- `profile` decorator function
|
|
67
|
+
- `MemoryMonitor` class
|
|
68
|
+
- `usePerformanceDebugger` hook
|
|
69
|
+
- `setupDevTools` function
|
|
70
|
+
- **DataTable Type Exports**: Removed duplicative type exports from `packages/core/src/components/DataTable/types.ts`:
|
|
71
|
+
- `PartialDataRecord<TData>` - Use `Partial<TData>` instead
|
|
72
|
+
- `CompleteDataRecord<TData>` - Use `TData` directly instead
|
|
73
|
+
- **Flexible Import Helper Functions**: Removed unused helper functions from `packages/core/src/components/DataTable/utils/flexibleImport.ts`:
|
|
74
|
+
- `createImportOptions()` - Not used anywhere in the codebase
|
|
75
|
+
- `createRegionalImportOptions()` - Not used anywhere in the codebase
|
|
76
|
+
- `testDateParsing()` - Not used anywhere in the codebase
|
|
77
|
+
|
|
78
|
+
### Migration Notes
|
|
79
|
+
- If you were using `PartialDataRecord` or `CompleteDataRecord`, replace them with `Partial<TData>` and `TData` respectively
|
|
80
|
+
- If you were using any of the debug tools exports, they are no longer available. The debug tools remain functional internally but are not exposed as public APIs
|
|
81
|
+
- If you were using `createImportOptions()`, `createRegionalImportOptions()`, or `testDateParsing()`, you'll need to implement similar functionality yourself or use the `flexibleImport()` function directly with manual options
|
|
82
|
+
|
|
10
83
|
## [0.6.0] - 2025-01-28
|
|
11
84
|
|
|
12
85
|
### Changed
|
|
@@ -14,25 +87,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
14
87
|
- **BREAKING**: Updated peer dependencies to require React ^19.0.0
|
|
15
88
|
- **BREAKING**: Updated @types/react to ^19.2.7 and @types/react-dom to ^19.2.3
|
|
16
89
|
- **BREAKING**: Updated @vitejs/plugin-react to ^5.1.2
|
|
90
|
+
- **BREAKING**: Database schema changes (table naming standardization, person-scoped profiles)
|
|
17
91
|
- Fixed TypeScript errors related to React 19's stricter type system in Button and Select components
|
|
18
92
|
- Updated vitest.config.ts to remove duplicate configuration keys
|
|
19
93
|
|
|
20
94
|
### Added
|
|
21
95
|
- **React Compiler**: Added `babel-plugin-react-compiler` for automatic component optimizations
|
|
22
96
|
- **React Compiler Configuration**: Configured React Compiler in vite.config.ts and vitest.config.ts
|
|
23
|
-
- **Migration
|
|
24
|
-
- Updated documentation to reflect React 19 requirements
|
|
25
|
-
|
|
26
|
-
### Technical Details
|
|
27
|
-
- React Compiler automatically optimizes components during development and in consuming apps
|
|
28
|
-
- TypeScript types updated to handle React 19's stricter `child.props` typing
|
|
29
|
-
- All error boundaries verified compatible with React 19 error handling changes
|
|
30
|
-
- All tests pass with React 19 and React Compiler enabled
|
|
97
|
+
- **Migration Guides**: Added comprehensive migration documentation
|
|
31
98
|
|
|
32
99
|
### Migration Notes
|
|
100
|
+
|
|
101
|
+
**⚠️ CRITICAL**: This version includes major breaking changes. See migration guides for detailed instructions:
|
|
102
|
+
|
|
103
|
+
- **React 19 Upgrade**: See [React 19 Migration Guide](./docs/migration/V0.6.0_REACT_19_MIGRATION.md)
|
|
104
|
+
- **Complete Migration Guide**: See [v0.5.190 → v0.6.1 Migration Guide](./docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md)
|
|
105
|
+
- **Database Changes**: See [Database Changes December 2025](./docs/migration/database-changes-december-2025.md)
|
|
106
|
+
- **Table Naming**: See [Database Changes December 2025](./docs/migration/database-changes-december-2025.md#change-1-table-naming-standardization)
|
|
107
|
+
- **Person-Scoped Profiles**: See [Person-Scoped Profiles Migration Guide](./docs/migration/V0.5.190_person-scoped-profiles-migration-guide.md)
|
|
108
|
+
|
|
109
|
+
**Quick Summary:**
|
|
33
110
|
- Consuming apps must upgrade to React 19.2.3+
|
|
34
|
-
-
|
|
35
|
-
-
|
|
111
|
+
- Database migrations required for table naming and person-scoped profiles
|
|
112
|
+
- All table names updated to follow `app_entity` naming convention
|
|
113
|
+
- Profiles are now person-scoped instead of organisation-scoped
|
|
36
114
|
|
|
37
115
|
## [Unreleased]
|
|
38
116
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Enforce pace-core usage patterns and prevent custom solutions when pace-core provides functionality
|
|
3
3
|
globs: ["src/**/*.{ts,tsx,js,jsx}"]
|
|
4
|
-
alwaysApply:
|
|
5
|
-
paceCoreVersion: "0.
|
|
6
|
-
rulesVersion: "2025-01-
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
paceCoreVersion: "0.6.x"
|
|
6
|
+
rulesVersion: "2025-01-28"
|
|
7
7
|
---
|
|
8
8
|
# pace-core Compliance Guide
|
|
9
9
|
|
|
@@ -31,16 +31,8 @@ This guide ensures consuming apps use pace-core components, hooks, and utilities
|
|
|
31
31
|
|
|
32
32
|
**Example:**
|
|
33
33
|
```tsx
|
|
34
|
-
// ❌ WRONG
|
|
35
|
-
|
|
36
|
-
return <button className="btn">Click me</button>;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// ✅ CORRECT - Use pace-core
|
|
40
|
-
import { Button } from '@jmruthers/pace-core';
|
|
41
|
-
function MyComponent() {
|
|
42
|
-
return <Button>Click me</Button>;
|
|
43
|
-
}
|
|
34
|
+
// ❌ WRONG: <button className="btn">Click me</button>
|
|
35
|
+
// ✅ CORRECT: import { Button } from '@jmruthers/pace-core'; <Button>Click me</Button>
|
|
44
36
|
```
|
|
45
37
|
|
|
46
38
|
### Hooks
|
|
@@ -59,19 +51,8 @@ function MyComponent() {
|
|
|
59
51
|
|
|
60
52
|
**Example:**
|
|
61
53
|
```tsx
|
|
62
|
-
// ❌ WRONG
|
|
63
|
-
|
|
64
|
-
const [debounced, setDebounced] = useState(value);
|
|
65
|
-
useEffect(() => {
|
|
66
|
-
const timer = setTimeout(() => setDebounced(value), delay);
|
|
67
|
-
return () => clearTimeout(timer);
|
|
68
|
-
}, [value, delay]);
|
|
69
|
-
return debounced;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// ✅ CORRECT - Use pace-core
|
|
73
|
-
import { useDebounce } from '@jmruthers/pace-core';
|
|
74
|
-
const debouncedValue = useDebounce(value, 500);
|
|
54
|
+
// ❌ WRONG: Custom useDebounce hook implementation
|
|
55
|
+
// ✅ CORRECT: import { useDebounce } from '@jmruthers/pace-core'; const debouncedValue = useDebounce(value, 500);
|
|
75
56
|
```
|
|
76
57
|
|
|
77
58
|
### Utilities
|
|
@@ -90,30 +71,49 @@ const debouncedValue = useDebounce(value, 500);
|
|
|
90
71
|
|
|
91
72
|
**Example:**
|
|
92
73
|
```tsx
|
|
93
|
-
// ❌ WRONG
|
|
94
|
-
|
|
95
|
-
return new Intl.DateTimeFormat('en-US').format(date);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// ✅ CORRECT - Use pace-core
|
|
99
|
-
import { formatDate } from '@jmruthers/pace-core';
|
|
100
|
-
const formatted = formatDate(date);
|
|
74
|
+
// ❌ WRONG: Custom formatDate implementation
|
|
75
|
+
// ✅ CORRECT: import { formatDate } from '@jmruthers/pace-core'; const formatted = formatDate(date);
|
|
101
76
|
```
|
|
102
77
|
|
|
103
78
|
## MUST: Use Secure Supabase Client
|
|
104
79
|
|
|
105
80
|
**You MUST use `useSecureSupabase()` for all database operations.** Never use the base Supabase client directly.
|
|
106
81
|
|
|
82
|
+
**CRITICAL SECURITY REQUIREMENT:** Using `createClient()` from `@supabase/supabase-js` directly bypasses organisation context enforcement and RLS policies, which can lead to:
|
|
83
|
+
- Cross-organisation data access
|
|
84
|
+
- Security vulnerabilities
|
|
85
|
+
- Data leakage between organisations
|
|
86
|
+
|
|
107
87
|
```tsx
|
|
108
|
-
// ❌ WRONG
|
|
88
|
+
// ❌ WRONG: Direct Supabase client creation
|
|
109
89
|
import { createClient } from '@supabase/supabase-js';
|
|
110
|
-
const supabase = createClient(
|
|
111
|
-
|
|
90
|
+
const supabase = createClient(url, key);
|
|
91
|
+
// This bypasses organisation context and RLS policies!
|
|
112
92
|
|
|
113
|
-
// ✅ CORRECT
|
|
93
|
+
// ✅ CORRECT: Use secure Supabase client
|
|
114
94
|
import { useSecureSupabase } from '@jmruthers/pace-core/rbac';
|
|
115
95
|
const secureSupabase = useSecureSupabase();
|
|
116
|
-
|
|
96
|
+
// Organisation context is automatically enforced
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Detection and Enforcement
|
|
100
|
+
|
|
101
|
+
pace-core provides multiple layers of protection:
|
|
102
|
+
|
|
103
|
+
1. **ESLint Rule**: The `no-direct-supabase-client` rule detects `createClient` calls and reports errors
|
|
104
|
+
2. **Runtime Warnings**: Development mode warnings when insecure clients are detected
|
|
105
|
+
3. **Type Safety**: Use `isSecureClient()` to verify clients are secure
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
// Verify client is secure (optional, but recommended)
|
|
109
|
+
import { isSecureClient, warnIfInsecureClient } from '@jmruthers/pace-core/rbac/utils/clientSecurity';
|
|
110
|
+
|
|
111
|
+
const supabase = useSecureSupabase();
|
|
112
|
+
warnIfInsecureClient(supabase, 'MyComponent'); // Warns in dev if insecure
|
|
113
|
+
|
|
114
|
+
if (isSecureClient(supabase)) {
|
|
115
|
+
// Client is secure, safe to use
|
|
116
|
+
}
|
|
117
117
|
```
|
|
118
118
|
|
|
119
119
|
## MUST: Setup RBAC Before Use
|
|
@@ -124,9 +124,7 @@ await secureSupabase.from('users').select('*');
|
|
|
124
124
|
// main.tsx - MUST be first
|
|
125
125
|
import { setupRBAC } from '@jmruthers/pace-core/rbac';
|
|
126
126
|
setupRBAC(supabase);
|
|
127
|
-
|
|
128
127
|
// Then render app
|
|
129
|
-
ReactDOM.createRoot(document.getElementById('root')!).render(<App />);
|
|
130
128
|
```
|
|
131
129
|
|
|
132
130
|
## MUST: Read Documentation Before Using Components
|
|
@@ -184,27 +182,13 @@ ReactDOM.createRoot(document.getElementById('root')!).render(<App />);
|
|
|
184
182
|
|
|
185
183
|
**❌ WRONG - Guessing props:**
|
|
186
184
|
```tsx
|
|
187
|
-
|
|
188
|
-
<DataTable
|
|
189
|
-
data={data}
|
|
190
|
-
columns={columns}
|
|
191
|
-
// Missing required rbac prop - will error!
|
|
192
|
-
/>
|
|
185
|
+
<DataTable data={data} columns={columns} /> // Missing required rbac prop
|
|
193
186
|
```
|
|
194
187
|
|
|
195
188
|
**✅ CORRECT - Read documentation first:**
|
|
196
189
|
```tsx
|
|
197
|
-
// 1. Read DataTable docs in implementation-guides/data-tables.md
|
|
198
|
-
// 2. Understand required props (rbac is mandatory)
|
|
199
|
-
// 3. Use correct props
|
|
200
190
|
import { DataTable } from '@jmruthers/pace-core';
|
|
201
|
-
|
|
202
|
-
<DataTable
|
|
203
|
-
data={data}
|
|
204
|
-
columns={columns}
|
|
205
|
-
rbac={{ pageName: 'users' }} // Required - found in docs
|
|
206
|
-
features={{ search: true, pagination: true }}
|
|
207
|
-
/>
|
|
191
|
+
<DataTable data={data} columns={columns} rbac={{ pageName: 'users' }} features={{ search: true }} />
|
|
208
192
|
```
|
|
209
193
|
|
|
210
194
|
### Documentation Checklist
|
|
@@ -249,16 +233,9 @@ Before using any pace-core component:
|
|
|
249
233
|
|
|
250
234
|
```tsx
|
|
251
235
|
import { UnifiedAuthProvider, OrganisationProvider } from '@jmruthers/pace-core';
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
<UnifiedAuthProvider supabaseClient={supabase} appName="Your App">
|
|
256
|
-
<OrganisationProvider>
|
|
257
|
-
{/* Your app */}
|
|
258
|
-
</OrganisationProvider>
|
|
259
|
-
</UnifiedAuthProvider>
|
|
260
|
-
);
|
|
261
|
-
}
|
|
236
|
+
<UnifiedAuthProvider supabaseClient={supabase} appName="Your App">
|
|
237
|
+
<OrganisationProvider>{/* Your app */}</OrganisationProvider>
|
|
238
|
+
</UnifiedAuthProvider>
|
|
262
239
|
```
|
|
263
240
|
|
|
264
241
|
## MUST: Import Core Styles
|
|
@@ -296,26 +273,8 @@ import '@jmruthers/pace-core/styles/core.css';
|
|
|
296
273
|
|
|
297
274
|
**Example:**
|
|
298
275
|
```tsx
|
|
299
|
-
// ❌ WRONG
|
|
300
|
-
<
|
|
301
|
-
Content
|
|
302
|
-
</div>
|
|
303
|
-
|
|
304
|
-
// ❌ WRONG - Inline styles on pace-core component
|
|
305
|
-
<Button style={{ backgroundColor: 'red' }}>Click me</Button>
|
|
306
|
-
|
|
307
|
-
// ✅ CORRECT - Use pace-core component with Tailwind classes
|
|
308
|
-
<Card className="bg-main-500 p-4 text-white">
|
|
309
|
-
<CardContent>Content</CardContent>
|
|
310
|
-
</Card>
|
|
311
|
-
|
|
312
|
-
// ✅ CORRECT - Use pace-core component as-is (already styled)
|
|
313
|
-
<Button variant="default">Click me</Button>
|
|
314
|
-
|
|
315
|
-
// ✅ CORRECT - Use Tailwind for layout/spacing only
|
|
316
|
-
<div className="flex items-center gap-4 p-4">
|
|
317
|
-
<Button>Action</Button>
|
|
318
|
-
</div>
|
|
276
|
+
// ❌ WRONG: <div style={{ backgroundColor: 'blue' }}> or <Button style={{...}}>
|
|
277
|
+
// ✅ CORRECT: <Card className="bg-main-500 p-4"> or <Button variant="default"> or <div className="flex gap-4">
|
|
319
278
|
```
|
|
320
279
|
|
|
321
280
|
### When Tailwind Classes Are Acceptable
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Enforce compliance with all pace-core standards across architecture, API, components, code style, security, testing, and RBAC/RLS
|
|
3
3
|
globs: ["src/**/*.{ts,tsx,js,jsx}", "supabase/migrations/**/*.sql"]
|
|
4
|
-
alwaysApply:
|
|
5
|
-
paceCoreVersion: "0.
|
|
6
|
-
rulesVersion: "2025-01-
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
paceCoreVersion: "0.6.x"
|
|
6
|
+
rulesVersion: "2025-01-28"
|
|
7
7
|
---
|
|
8
8
|
# Standards Compliance Guide
|
|
9
9
|
|
|
@@ -26,34 +26,16 @@ This guide ensures consuming apps comply with all pace-core standards. Follow th
|
|
|
26
26
|
**RLS policies MUST use helper functions, NEVER subqueries.**
|
|
27
27
|
|
|
28
28
|
```sql
|
|
29
|
-
-- ❌ WRONG
|
|
30
|
-
CREATE POLICY rbac_select_users ON users
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
-- ✅ CORRECT - Helper function
|
|
39
|
-
CREATE OR REPLACE FUNCTION get_user_organisation_ids()
|
|
40
|
-
RETURNS uuid[]
|
|
41
|
-
LANGUAGE plpgsql
|
|
42
|
-
STABLE
|
|
43
|
-
SECURITY DEFINER
|
|
44
|
-
SET search_path TO public
|
|
45
|
-
AS $$
|
|
46
|
-
BEGIN
|
|
47
|
-
RETURN ARRAY(
|
|
48
|
-
SELECT organisation_id
|
|
49
|
-
FROM organisation_memberships
|
|
50
|
-
WHERE user_id = get_effective_user_id()
|
|
51
|
-
);
|
|
52
|
-
END;
|
|
29
|
+
-- ❌ WRONG: Subquery in RLS policy (causes N+1 queries)
|
|
30
|
+
CREATE POLICY rbac_select_users ON users FOR SELECT USING (
|
|
31
|
+
organisation_id IN (SELECT organisation_id FROM organisation_memberships WHERE user_id = auth.uid())
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
-- ✅ CORRECT: Helper function with STABLE SECURITY DEFINER
|
|
35
|
+
CREATE OR REPLACE FUNCTION get_user_organisation_ids() RETURNS uuid[] LANGUAGE plpgsql STABLE SECURITY DEFINER SET search_path TO public AS $$
|
|
36
|
+
BEGIN RETURN ARRAY(SELECT organisation_id FROM organisation_memberships WHERE user_id = get_effective_user_id()); END;
|
|
53
37
|
$$;
|
|
54
|
-
|
|
55
|
-
CREATE POLICY rbac_select_users ON users
|
|
56
|
-
FOR SELECT USING (organisation_id = ANY(get_user_organisation_ids()));
|
|
38
|
+
CREATE POLICY rbac_select_users ON users FOR SELECT USING (organisation_id = ANY(get_user_organisation_ids()));
|
|
57
39
|
```
|
|
58
40
|
|
|
59
41
|
### MUST: Test Database Migrations
|
|
@@ -72,14 +54,8 @@ CREATE POLICY rbac_select_users ON users
|
|
|
72
54
|
- Bulk operations: `_bulk` suffix (e.g., `app_cake_dish_create_bulk`)
|
|
73
55
|
|
|
74
56
|
```sql
|
|
75
|
-
-- ✅ CORRECT
|
|
76
|
-
|
|
77
|
-
CREATE FUNCTION app_cake_dish_create(...)
|
|
78
|
-
CREATE FUNCTION app_cake_dish_create_bulk(...)
|
|
79
|
-
|
|
80
|
-
-- ❌ WRONG
|
|
81
|
-
CREATE FUNCTION getDishes(...)
|
|
82
|
-
CREATE FUNCTION create_dish(...)
|
|
57
|
+
-- ✅ CORRECT: data_cake_dishes_list, app_cake_dish_create, app_cake_dish_create_bulk
|
|
58
|
+
-- ❌ WRONG: getDishes, create_dish (wrong naming pattern)
|
|
83
59
|
```
|
|
84
60
|
|
|
85
61
|
### MUST: Use ApiResult Shape
|
|
@@ -87,15 +63,8 @@ CREATE FUNCTION create_dish(...)
|
|
|
87
63
|
**All RPCs MUST return ApiResult shape:**
|
|
88
64
|
|
|
89
65
|
```typescript
|
|
90
|
-
type ApiResult<T> =
|
|
91
|
-
|
|
92
|
-
| { ok: false; error: ApiError };
|
|
93
|
-
|
|
94
|
-
type ApiError = {
|
|
95
|
-
code: string;
|
|
96
|
-
message: string;
|
|
97
|
-
details?: object;
|
|
98
|
-
};
|
|
66
|
+
type ApiResult<T> = { ok: true; data: T } | { ok: false; error: ApiError };
|
|
67
|
+
type ApiError = { code: string; message: string; details?: object };
|
|
99
68
|
```
|
|
100
69
|
|
|
101
70
|
### MUST: Enforce RLS in RPCs
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Define standard folder structure and file organization for consuming apps
|
|
3
|
-
globs: ["**/*.{ts,tsx,js,jsx,md}"]
|
|
4
|
-
alwaysApply:
|
|
5
|
-
paceCoreVersion: "0.
|
|
6
|
-
rulesVersion: "2025-01-
|
|
3
|
+
globs: ["**/*.{ts,tsx,js,jsx,md}", "src/**"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
paceCoreVersion: "0.6.x"
|
|
6
|
+
rulesVersion: "2025-01-28"
|
|
7
7
|
---
|
|
8
8
|
# Project Structure Standard
|
|
9
9
|
|