@jmruthers/pace-core 0.6.10 → 0.6.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/audit-tool/00-dependencies.cjs +46 -13
- package/audit-tool/audits/01-pace-core-compliance.cjs +96 -21
- package/audit-tool/audits/02-project-structure.cjs +13 -3
- package/audit-tool/audits/03-architecture.cjs +78 -4
- package/audit-tool/audits/04-code-quality.cjs +9 -2
- package/audit-tool/audits/05-styling.cjs +19 -7
- package/audit-tool/audits/06-security-rbac.cjs +105 -14
- package/audit-tool/audits/07-api-tech-stack.cjs +31 -15
- package/audit-tool/audits/08-testing-documentation.cjs +11 -3
- package/audit-tool/audits/09-operations.cjs +19 -7
- package/audit-tool/index.cjs +22 -11
- package/audit-tool/utils/report-utils.cjs +4 -0
- package/cursor-rules/01-pace-core-compliance.mdc +1 -0
- package/cursor-rules/02-project-structure.mdc +1 -0
- package/cursor-rules/03-architecture.mdc +3 -1
- package/cursor-rules/04-code-quality.mdc +1 -0
- package/cursor-rules/05-styling.mdc +41 -7
- package/cursor-rules/06-security-rbac.mdc +2 -1
- package/cursor-rules/07-api-tech-stack.mdc +1 -0
- package/cursor-rules/08-testing-documentation.mdc +1 -0
- package/cursor-rules/09-operations.mdc +1 -0
- package/dist/{DataTable-SAXFG4XI.js → DataTable-EFYP2QLE.js} +10 -7
- package/dist/{InactivityServiceProvider-DHryoh6K.d.ts → InactivityServiceProvider-BbxwwDz1.d.ts} +10 -1
- package/dist/{UnifiedAuthProvider-CiBAl9-s.d.ts → UnifiedAuthProvider-Bkt_tzdS.d.ts} +56 -24
- package/dist/{api-F47QJ7FX.js → api-BZR2CYXL.js} +3 -2
- package/dist/api-result-USV1Czr-.d.ts +51 -0
- package/dist/{audit-Z6ZZBWLU.js → audit-HI2DHUVU.js} +2 -1
- package/dist/{auth-BZOJqrdd.d.ts → auth-JvdRVaud.d.ts} +1 -1
- package/dist/{chunk-KSNLMI7N.js → chunk-2DL2WSOE.js} +1 -155
- package/dist/{chunk-MPY44PWB.js → chunk-2OEVOGGR.js} +4648 -3560
- package/dist/chunk-44CNXN4P.js +15 -0
- package/dist/{chunk-Y4PF6HIM.js → chunk-4R3T5ENU.js} +867 -786
- package/dist/{chunk-LNHFAF4X.js → chunk-7A6IMHH2.js} +289 -247
- package/dist/chunk-CU2BU2MQ.js +2 -0
- package/dist/{chunk-JJEYZ3DX.js → chunk-D6BMFMQZ.js} +37 -2
- package/dist/{chunk-BCTXBU6U.js → chunk-ENLXB7GP.js} +88 -71
- package/dist/{chunk-FBZ7U3ID.js → chunk-J2KQK6DG.js} +937 -987
- package/dist/{chunk-TFIPNIPE.js → chunk-KJXRL3XE.js} +3300 -2245
- package/dist/{chunk-3GWSPISD.js → chunk-L5LFKKLJ.js} +1 -1
- package/dist/{chunk-X5EAU5G7.js → chunk-PCSHBLPB.js} +132 -114
- package/dist/{chunk-NIU6DPQV.js → chunk-QRYSEPHB.js} +2 -0
- package/dist/{chunk-KYURMOQM.js → chunk-V7FTM2LU.js} +423 -320
- package/dist/chunk-WY6Y7KC3.js +264 -0
- package/dist/{chunk-FN52B75D.js → chunk-XOJME5T7.js} +176 -15
- package/dist/{chunk-7YDC7LMU.js → chunk-XPFVT3GN.js} +71 -66
- package/dist/{chunk-66R6RLUZ.js → chunk-YFTFFJIV.js} +3 -3
- package/dist/{chunk-W46INAVW.js → chunk-YYTWKVHO.js} +688 -570
- package/dist/components.d.ts +8 -7
- package/dist/components.js +17 -15
- package/dist/{database.generated-DT8JTZiP.d.ts → database.generated-qkdoiVrJ.d.ts} +45 -10
- package/dist/eslint-rules/index.cjs +3 -0
- package/dist/eslint-rules/rules/03-architecture.cjs +74 -0
- package/dist/eslint-rules/rules/06-security-rbac.cjs +74 -0
- package/dist/{event-WTAQuGcq.d.ts → event-BfCox3N2.d.ts} +36 -10
- package/dist/{file-reference-BavO2eQj.d.ts → file-reference-DU1hcawx.d.ts} +29 -13
- package/dist/hooks.d.ts +22 -9
- package/dist/hooks.js +34 -25
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +1 -0
- package/dist/index.d.ts +66 -177
- package/dist/index.js +316 -340
- package/dist/pagination-BW1mqywp.d.ts +201 -0
- package/dist/providers.d.ts +6 -5
- package/dist/providers.js +5 -3
- package/dist/rbac/index.d.ts +123 -138
- package/dist/rbac/index.js +10 -8
- package/dist/theming/runtime.d.ts +19 -2
- package/dist/theming/runtime.js +1 -1
- package/dist/{timezone-K-ptz3HO.d.ts → timezone-BTWWXKVY.d.ts} +1 -1
- package/dist/types.d.ts +17 -10
- package/dist/types.js +1 -0
- package/dist/{usePublicPageContext-vxBlEHO9.d.ts → usePublicPageContext-B91dGYW1.d.ts} +433 -356
- package/dist/{usePublicRouteParams-G3Ks53mk.d.ts → usePublicRouteParams-BgV6VhMi.d.ts} +73 -4
- package/dist/utils.d.ts +163 -145
- package/dist/utils.js +42 -25
- package/docs/api/modules.md +782 -643
- package/docs/api-reference/rpc-functions.md +12 -3
- package/docs/core-concepts/rbac-system.md +8 -0
- package/docs/getting-started/cursor-rules.md +17 -20
- package/docs/getting-started/dependencies.md +1 -1
- package/docs/getting-started/setup.md +235 -0
- package/docs/implementation-guides/authentication.md +27 -0
- package/docs/implementation-guides/data-tables.md +176 -3
- package/docs/migration/ApiResult-migration.md +25 -0
- package/docs/rbac/api-reference.md +33 -31
- package/docs/standards/0-standards-overview.md +50 -15
- package/docs/standards/1-pace-core-compliance-standards.md +62 -57
- package/docs/standards/2-project-structure-standards.md +33 -16
- package/docs/standards/3-architecture-standards.md +41 -1
- package/docs/standards/4-code-quality-standards.md +26 -6
- package/docs/standards/5-styling-standards.md +35 -1
- package/docs/standards/6-security-rbac-standards.md +66 -0
- package/docs/standards/7-api-tech-stack-standards.md +25 -14
- package/docs/standards/8-testing-documentation-standards.md +31 -0
- package/docs/standards/9-operations-standards.md +19 -0
- package/docs/standards/README.md +20 -201
- package/docs/testing/test-setup-for-consumers.md +2 -0
- package/docs/troubleshooting/common-issues.md +17 -1
- package/docs/troubleshooting/organisation-context-setup.md +8 -0
- package/docs/troubleshooting/print-event-name-css-variable-analysis.md +217 -0
- package/eslint-config-pace-core.cjs +20 -0
- package/package.json +14 -20
- package/scripts/{build-docs-incremental.js → build-docs.js} +3 -2
- package/scripts/setup.cjs +536 -0
- package/scripts/validate.cjs +480 -0
- package/src/__tests__/helpers/{__tests__/component-test-utils.test.tsx → component-test-utils.test.tsx} +3 -3
- package/src/__tests__/helpers/{__tests__/optimized-test-setup.test.ts → optimized-test-setup.test.ts} +2 -2
- package/src/__tests__/helpers/{__tests__/supabaseMock.test.ts → supabaseMock.test.ts} +2 -2
- package/src/__tests__/helpers/{__tests__/test-providers.test.tsx → test-providers.test.tsx} +1 -1
- package/src/__tests__/helpers/test-providers.tsx +37 -39
- package/src/__tests__/helpers/{__tests__/test-utils.test.tsx → test-utils.test.tsx} +4 -3
- package/src/__tests__/helpers/{__tests__/timer-utils.test.ts → timer-utils.test.ts} +2 -2
- package/src/assets/app-icons/index.test.ts +304 -0
- package/src/components/AddressField/AddressField.test.tsx +1 -1
- package/src/components/AddressField/AddressField.tsx +238 -212
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/Card/Card.test.tsx +172 -17
- package/src/components/Card/Card.tsx +19 -10
- package/src/components/ContextSelector/ContextSelector.internals.tsx +204 -0
- package/src/components/ContextSelector/{__tests__/ContextSelector.test.tsx → ContextSelector.test.tsx} +6 -6
- package/src/components/ContextSelector/ContextSelector.tsx +66 -280
- package/src/components/ContextSelector/ContextSelector.types.ts +35 -0
- package/src/components/ContextSelector/useContextSelectorState.tsx +195 -0
- package/src/components/DataTable/AUDIT_REPORT.md +59 -44
- package/src/components/DataTable/{__tests__/DataTable.comprehensive.test.tsx → DataTable.comprehensive.test.tsx} +6 -6
- package/src/components/DataTable/{__tests__/DataTable.default-state.test.tsx → DataTable.default-state.test.tsx} +5 -5
- package/src/components/DataTable/{__tests__/DataTable.export.test.tsx → DataTable.export.test.tsx} +10 -10
- package/src/components/DataTable/{__tests__/DataTable.grouping-aggregation.test.tsx → DataTable.grouping-aggregation.test.tsx} +6 -6
- package/src/components/DataTable/{__tests__/DataTable.hooks.test.tsx → DataTable.hooks.test.tsx} +6 -6
- package/src/components/DataTable/{__tests__/DataTable.select-label-display.test.tsx → DataTable.select-label-display.test.tsx} +6 -6
- package/src/components/DataTable/DataTable.test.tsx +787 -416
- package/src/components/DataTable/DataTable.tsx +12 -12
- package/src/components/DataTable/DataTableCore.integration.test.tsx +458 -0
- package/src/components/DataTable/{__tests__/DataTableCore.test-setup.ts → DataTableCore.test-setup.ts} +10 -9
- package/src/components/DataTable/{__tests__/DataTableCore.test.tsx → DataTableCore.test.tsx} +8 -8
- package/src/components/DataTable/{__tests__/README.md → README.md} +17 -7
- package/src/components/DataTable/TESTING.md +101 -0
- package/src/components/DataTable/{__tests__/a11y.basic.test.tsx → a11y.basic.test.tsx} +34 -34
- package/src/components/DataTable/components/DataTableCore.tsx +104 -864
- package/src/components/DataTable/components/{__tests__/GroupingDropdown.test.tsx → GroupingDropdown.test.tsx} +17 -8
- package/src/components/DataTable/components/GroupingDropdown.tsx +2 -2
- package/src/components/DataTable/components/ImportModal.tsx +61 -559
- package/src/components/DataTable/components/ImportModalFileSection.tsx +148 -0
- package/src/components/DataTable/context/{__tests__/DataTableContext.test.tsx → DataTableContext.test.tsx} +2 -2
- package/src/components/DataTable/context/DataTableContext.tsx +7 -6
- package/src/components/DataTable/core/{__tests__/ColumnFactory.test.ts → ColumnFactory.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useColumnOrderPersistence.test.ts → useColumnOrderPersistence.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useColumnVisibilityPersistence.test.ts → useColumnVisibilityPersistence.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useDataTableConfiguration.test.ts → useDataTableConfiguration.test.ts} +3 -3
- package/src/components/DataTable/hooks/useDataTableConfiguration.ts +14 -2
- package/src/components/DataTable/hooks/{__tests__/useDataTableDataPipeline.test.ts → useDataTableDataPipeline.test.ts} +6 -6
- package/src/components/DataTable/hooks/useDataTableDeletionBatching.test.ts +127 -0
- package/src/components/DataTable/hooks/useDataTableDeletionBatching.ts +106 -0
- package/src/components/DataTable/hooks/useDataTableEffectiveActions.test.ts +461 -0
- package/src/components/DataTable/hooks/useDataTableEffectiveActions.ts +238 -0
- package/src/components/DataTable/hooks/useDataTableLayoutHandlers.test.ts +296 -0
- package/src/components/DataTable/hooks/useDataTableLayoutHandlers.ts +175 -0
- package/src/components/DataTable/hooks/useDataTablePaginationSync.test.ts +203 -0
- package/src/components/DataTable/hooks/useDataTablePaginationSync.ts +109 -0
- package/src/components/DataTable/hooks/{__tests__/useDataTablePermissions.test.ts → useDataTablePermissions.test.ts} +11 -11
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +79 -247
- package/src/components/DataTable/hooks/useDataTablePipeline.test.tsx +219 -0
- package/src/components/DataTable/hooks/useDataTablePipeline.tsx +239 -0
- package/src/components/DataTable/hooks/useDataTableRenderGuard.test.tsx +316 -0
- package/src/components/DataTable/hooks/useDataTableRenderGuard.tsx +195 -0
- package/src/components/DataTable/hooks/useDataTableScope.test.ts +110 -0
- package/src/components/DataTable/hooks/useDataTableScope.ts +123 -0
- package/src/components/DataTable/hooks/{__tests__/useDataTableState.test.ts → useDataTableState.test.ts} +47 -5
- package/src/components/DataTable/hooks/useDataTableState.ts +145 -94
- package/src/components/DataTable/hooks/useDataTableStateAndPersistence.test.ts +277 -0
- package/src/components/DataTable/hooks/useDataTableStateAndPersistence.ts +222 -0
- package/src/components/DataTable/hooks/useDataTableSuperAdmin.test.ts +93 -0
- package/src/components/DataTable/hooks/useDataTableSuperAdmin.ts +86 -0
- package/src/components/DataTable/hooks/useDataTableTableInstance.test.ts +185 -0
- package/src/components/DataTable/hooks/useDataTableTableInstance.ts +178 -0
- package/src/components/DataTable/hooks/{__tests__/useEffectiveColumnOrder.test.ts → useEffectiveColumnOrder.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useHierarchicalState.test.ts → useHierarchicalState.test.ts} +2 -2
- package/src/components/DataTable/{components/hooks → hooks}/useImportModalFocus.test.ts +3 -3
- package/src/components/DataTable/{components/hooks → hooks}/useImportModalFocus.ts +2 -2
- package/src/components/DataTable/hooks/useImportModalState.test.ts +390 -0
- package/src/components/DataTable/hooks/useImportModalState.ts +345 -0
- package/src/components/DataTable/hooks/{__tests__/useKeyboardNavigation.test.ts → useKeyboardNavigation.test.ts} +3 -3
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +309 -269
- package/src/components/DataTable/{components/hooks → hooks}/usePermissionTracking.test.ts +3 -3
- package/src/components/DataTable/{components/hooks → hooks}/usePermissionTracking.ts +3 -3
- package/src/components/DataTable/hooks/{__tests__/useServerSideDataEffect.test.ts → useServerSideDataEffect.test.ts} +2 -2
- package/src/components/DataTable/hooks/useServerSideDataEffect.ts +14 -3
- package/src/components/DataTable/hooks/{__tests__/useTableColumns.test.ts → useTableColumns.test.ts} +2 -2
- package/src/components/DataTable/hooks/{__tests__/useTableHandlers.test.ts → useTableHandlers.test.ts} +25 -4
- package/src/components/DataTable/hooks/useTableHandlers.ts +5 -2
- package/src/components/DataTable/index.ts +18 -17
- package/src/components/DataTable/{__tests__/keyboard.test.tsx → keyboard.test.tsx} +41 -63
- package/src/components/DataTable/{__tests__/mocks → mocks}/MockRBACProvider.tsx +1 -1
- package/src/components/DataTable/{__tests__/pagination.modes.test.tsx → pagination.modes.test.tsx} +6 -6
- package/src/components/DataTable/{__tests__/ssr.strict-mode.test.tsx → ssr.strict-mode.test.tsx} +2 -2
- package/src/components/DataTable/{__tests__/styles.test.ts → styles.test.ts} +1 -4
- package/src/components/DataTable/styles.ts +0 -1
- package/src/components/DataTable/test-utils/MockDataTableComponents.tsx +55 -0
- package/src/components/DataTable/{__tests__/test-utils → test-utils}/dataFactories.ts +2 -2
- package/src/components/DataTable/test-utils/featureConfig.ts +10 -0
- package/src/components/DataTable/{__tests__/test-utils/sharedTestUtils.tsx → test-utils/sharedTestUtils.ts} +97 -66
- package/src/components/DataTable/{__tests__/test-utils.ts → test-utils.ts} +1 -1
- package/src/components/DataTable/types/actions.ts +71 -0
- package/src/components/DataTable/types/base.ts +39 -0
- package/src/components/DataTable/types/columns.ts +125 -0
- package/src/components/DataTable/types/export.ts +32 -0
- package/src/components/DataTable/types/features.ts +81 -0
- package/src/components/DataTable/types/hierarchical.ts +44 -0
- package/src/components/DataTable/types/index.ts +43 -0
- package/src/components/DataTable/types/pagination.ts +85 -0
- package/src/components/DataTable/types/performance.ts +47 -0
- package/src/components/DataTable/types/props.ts +62 -0
- package/src/components/DataTable/types/rbac.ts +45 -0
- package/src/components/DataTable/{components/__tests__ → ui/layout}/DataTableCore.test.tsx +430 -28
- package/src/components/DataTable/ui/layout/DataTableCore.tsx +345 -0
- package/src/components/DataTable/{components/__tests__ → ui/layout}/DataTableErrorBoundary.test.tsx +4 -4
- package/src/components/DataTable/{components → ui/layout}/DataTableErrorBoundary.tsx +7 -7
- package/src/components/DataTable/ui/layout/DataTableLayout.test.tsx +1352 -0
- package/src/components/DataTable/ui/layout/DataTableLayout.tsx +661 -0
- package/src/components/DataTable/ui/modals/BulkDeleteConfirmDialog.test.tsx +91 -0
- package/src/components/DataTable/ui/modals/BulkDeleteConfirmDialog.tsx +43 -0
- package/src/components/DataTable/ui/modals/DataTableModals.test.tsx +749 -0
- package/src/components/DataTable/{components → ui/modals}/DataTableModals.tsx +36 -28
- package/src/components/DataTable/ui/modals/ImportModal.test.tsx +1834 -0
- package/src/components/DataTable/ui/modals/ImportModal.tsx +197 -0
- package/src/components/DataTable/ui/modals/ImportModalFailedRowsSection.tsx +60 -0
- package/src/components/DataTable/ui/modals/ImportModalFileSection.tsx +148 -0
- package/src/components/DataTable/ui/modals/ImportModalPreviewSection.tsx +60 -0
- package/src/components/DataTable/ui/modals/ImportModalSummarySection.tsx +59 -0
- package/src/components/DataTable/ui/modals/importModalPersistence.ts +73 -0
- package/src/components/DataTable/{components/__tests__ → ui/shared}/AccessDeniedPage.test.tsx +2 -2
- package/src/components/DataTable/{components → ui/shared}/AccessDeniedPage.tsx +2 -2
- package/src/components/DataTable/{components/__tests__ → ui/shared}/ActionButtons.test.tsx +6 -4
- package/src/components/DataTable/{components → ui/shared}/ActionButtons.tsx +4 -4
- package/src/components/DataTable/{components/__tests__ → ui/shared}/ColumnFilter.test.tsx +29 -16
- package/src/components/DataTable/{components → ui/shared}/ColumnFilter.tsx +4 -4
- package/src/components/DataTable/{components/__tests__ → ui/shared}/PaginationControls.test.tsx +38 -16
- package/src/components/DataTable/{components → ui/shared}/PaginationControls.tsx +21 -15
- package/src/components/DataTable/{components/__tests__ → ui/shared}/SortIndicator.test.tsx +2 -2
- package/src/components/DataTable/{components → ui/shared}/SortIndicator.tsx +1 -1
- package/src/components/DataTable/{components/__tests__ → ui/table}/EditFields.test.tsx +3 -3
- package/src/components/DataTable/{components → ui/table}/EditFields.tsx +138 -69
- package/src/components/DataTable/{components/__tests__ → ui/table}/EditableRow.test.tsx +36 -27
- package/src/components/DataTable/{components → ui/table}/EditableRow.tsx +86 -104
- package/src/components/DataTable/{components/__tests__ → ui/table}/EmptyState.test.tsx +2 -62
- package/src/components/DataTable/{components → ui/table}/EmptyState.tsx +7 -15
- package/src/components/DataTable/{components/__tests__ → ui/table}/FilterRow.test.tsx +5 -4
- package/src/components/DataTable/{components → ui/table}/FilterRow.tsx +3 -3
- package/src/components/DataTable/{components/__tests__ → ui/table}/LoadingState.test.tsx +6 -10
- package/src/components/DataTable/{components → ui/table}/LoadingState.tsx +4 -4
- package/src/components/DataTable/{components/__tests__ → ui/table}/RowComponent.test.tsx +412 -17
- package/src/components/DataTable/{components → ui/table}/RowComponent.tsx +183 -177
- package/src/components/DataTable/{components/__tests__ → ui/table}/UnifiedTableBody.test.tsx +425 -16
- package/src/components/DataTable/ui/table/UnifiedTableBody.tsx +440 -0
- package/src/components/DataTable/{components/__tests__ → ui/table}/cellValueUtils.test.ts +2 -2
- package/src/components/DataTable/{components → ui/table}/cellValueUtils.ts +1 -1
- package/src/components/DataTable/{components/__tests__ → ui/toolbar}/BulkOperationsDropdown.test.tsx +12 -5
- package/src/components/DataTable/{components → ui/toolbar}/BulkOperationsDropdown.tsx +3 -3
- package/src/components/DataTable/{components/__tests__ → ui/toolbar}/ColumnVisibilityDropdown.test.tsx +7 -4
- package/src/components/DataTable/{components → ui/toolbar}/ColumnVisibilityDropdown.tsx +7 -7
- package/src/components/DataTable/{components/__tests__ → ui/toolbar}/DataTableToolbar.test.tsx +4 -4
- package/src/components/DataTable/{components → ui/toolbar}/DataTableToolbar.tsx +4 -4
- package/src/components/DataTable/ui/toolbar/GroupingDropdown.test.tsx +621 -0
- package/src/components/DataTable/ui/toolbar/GroupingDropdown.tsx +107 -0
- package/src/components/DataTable/utils/{__tests__/a11yUtils.test.ts → a11yUtils.test.ts} +2 -2
- package/src/components/DataTable/utils/{__tests__/aggregationUtils.test.ts → aggregationUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/columnUtils.test.ts → columnUtils.test.ts} +2 -2
- package/src/components/DataTable/utils/csvParse.test.ts +74 -0
- package/src/components/DataTable/utils/csvParse.ts +65 -0
- package/src/components/DataTable/utils/{__tests__/errorHandling.test.ts → errorHandling.test.ts} +2 -2
- package/src/components/DataTable/utils/{__tests__/exportUtils.test.ts → exportUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/flexibleImport.test.ts → flexibleImport.test.ts} +2 -2
- package/src/components/DataTable/utils/flexibleImport.ts +3 -186
- package/src/components/DataTable/utils/{__tests__/hierarchicalSorting.test.ts → hierarchicalSorting.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/hierarchicalUtils.test.ts → hierarchicalUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/importDateParser.test.ts +162 -0
- package/src/components/DataTable/utils/importDateParser.ts +114 -0
- package/src/components/DataTable/utils/importValueParser.test.ts +138 -0
- package/src/components/DataTable/utils/importValueParser.ts +91 -0
- package/src/components/DataTable/utils/{__tests__/paginationUtils.test.ts → paginationUtils.test.ts} +2 -2
- package/src/components/DataTable/utils/paginationUtils.ts +6 -3
- package/src/components/DataTable/utils/{__tests__/performanceUtils.test.ts → performanceUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/rowUtils.test.ts → rowUtils.test.ts} +3 -3
- package/src/components/DataTable/utils/{__tests__/selectFieldUtils.test.ts → selectFieldUtils.test.ts} +66 -3
- package/src/components/DataTable/utils/selectFieldUtils.ts +97 -60
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
- package/src/components/DateTimeField/DateTimeField.test.tsx +1 -1
- package/src/components/Dialog/Dialog.test-utils.ts +49 -0
- package/src/components/Dialog/Dialog.test.tsx +896 -89
- package/src/components/Dialog/Dialog.tsx +174 -882
- package/src/components/Dialog/dialogLock.test.ts +238 -0
- package/src/components/Dialog/dialogLock.ts +98 -0
- package/src/components/Dialog/index.ts +2 -0
- package/src/components/Dialog/useDialogDimensions.test.ts +163 -0
- package/src/components/Dialog/useDialogDimensions.ts +140 -0
- package/src/components/Dialog/useDialogLifecycle.test.ts +358 -0
- package/src/components/Dialog/useDialogLifecycle.ts +135 -0
- package/src/components/Dialog/useDialogPersistence.test.ts +381 -0
- package/src/components/Dialog/useDialogPersistence.ts +357 -0
- package/src/components/FileDisplay/FileDisplay.test.tsx +40 -40
- package/src/components/FileDisplay/FileDisplay.tsx +24 -656
- package/src/components/FileDisplay/FileDisplayContent.test.tsx +395 -0
- package/src/components/FileDisplay/FileDisplayContent.tsx +242 -0
- package/src/components/FileDisplay/FileDisplayDeleteConfirmDialog.test.tsx +74 -0
- package/src/components/FileDisplay/FileDisplayDeleteConfirmDialog.tsx +38 -0
- package/src/components/FileDisplay/FileDisplayEmptyView.test.tsx +33 -0
- package/src/components/FileDisplay/FileDisplayEmptyView.tsx +33 -0
- package/src/components/FileDisplay/FileDisplayErrorView.test.tsx +71 -0
- package/src/components/FileDisplay/FileDisplayErrorView.tsx +50 -0
- package/src/components/FileDisplay/FileDisplayLoadingFallbackView.test.tsx +22 -0
- package/src/components/FileDisplay/FileDisplayLoadingFallbackView.tsx +22 -0
- package/src/components/FileDisplay/FileDisplayLoadingView.test.tsx +21 -0
- package/src/components/FileDisplay/FileDisplayLoadingView.tsx +23 -0
- package/src/components/FileDisplay/FileDisplayMultipleFilesView.test.tsx +101 -0
- package/src/components/FileDisplay/FileDisplayMultipleFilesView.tsx +109 -0
- package/src/components/FileDisplay/FileDisplaySingleDocumentLinkView.test.tsx +58 -0
- package/src/components/FileDisplay/FileDisplaySingleDocumentLinkView.tsx +48 -0
- package/src/components/FileDisplay/FileDisplaySingleFileWithActionsView.test.tsx +111 -0
- package/src/components/FileDisplay/FileDisplaySingleFileWithActionsView.tsx +270 -0
- package/src/components/FileDisplay/FileDisplaySingleImageView.test.tsx +78 -0
- package/src/components/FileDisplay/FileDisplaySingleImageView.tsx +67 -0
- package/src/components/FileDisplay/fallbackUtils.test.ts +50 -0
- package/src/components/FileDisplay/fallbackUtils.ts +44 -0
- package/src/components/FileDisplay/fetchFileDisplayData.ts +24 -0
- package/src/components/FileDisplay/fetchFileDisplayData.unit.test.ts +183 -0
- package/src/components/FileDisplay/fileDisplayUtils.test.ts +58 -0
- package/src/components/FileDisplay/fileDisplayUtils.ts +24 -0
- package/src/{hooks/__tests__ → components/FileDisplay}/useFileDisplay.test.ts +40 -42
- package/src/components/FileDisplay/useFileDisplay.ts +515 -0
- package/src/{hooks/__tests__ → components/FileDisplay}/useFileDisplay.unit.test.ts +406 -77
- package/src/components/FileDisplay/useFileDisplayData.ts +126 -0
- package/src/{hooks/public → components/FileDisplay}/usePublicFileDisplay.test.ts +94 -88
- package/src/components/FileDisplay/usePublicFileDisplay.ts +579 -0
- package/src/components/FileUpload/FileUpload.test.tsx +16 -10
- package/src/components/FileUpload/FileUpload.tsx +107 -525
- package/src/components/FileUpload/FileUploadDropZone.tsx +112 -0
- package/src/components/FileUpload/FileUploadProgressItem.tsx +86 -0
- package/src/components/FileUpload/FileUploadProgressList.tsx +40 -0
- package/src/components/FileUpload/useFileUploadManager.test.ts +308 -0
- package/src/components/FileUpload/useFileUploadManager.ts +454 -0
- package/src/components/FileUpload/useResolvedAppId.test.ts +102 -0
- package/src/components/FileUpload/useResolvedAppId.ts +77 -0
- package/src/components/Footer/Footer.test.tsx +6 -292
- package/src/components/Footer/Footer.tsx +8 -125
- package/src/components/Form/Form.test.tsx +44 -27
- package/src/components/Form/Form.tsx +64 -287
- package/src/components/Form/useFormPersistence.ts +257 -0
- package/src/components/Header/Header.test.tsx +17 -18
- package/src/components/Header/Header.tsx +10 -1
- package/src/components/Input/Input.tsx +1 -1
- package/src/components/Label/Label.test.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +1 -1
- package/src/components/NavigationMenu/HierarchicalNavItem.tsx +104 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +1029 -26
- package/src/components/NavigationMenu/NavigationMenu.tsx +61 -361
- package/src/components/NavigationMenu/index.ts +6 -1
- package/src/components/NavigationMenu/navigationPermissionHelper.ts +188 -0
- package/src/components/NavigationMenu/{__tests__/useNavigationFiltering.test.ts → useNavigationFiltering.test.ts} +68 -53
- package/src/components/NavigationMenu/useNavigationFiltering.ts +197 -296
- package/src/components/NavigationMenu/useNavigationScope.ts +125 -0
- package/src/components/PaceAppLayout/PaceAppLayout.edge-cases.test.tsx +77 -62
- package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +3 -3
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +16 -19
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +529 -5
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +280 -756
- package/src/components/PaceAppLayout/useFilteredNavItems.ts +304 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutConfig.ts +142 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutGate.tsx +150 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutPermissions.ts +162 -0
- package/src/components/PaceAppLayout/usePaceAppLayoutScope.ts +79 -0
- package/src/components/PaceAppLayout/useRoleBasedRouteAccess.ts +157 -0
- package/src/components/PaceAppLayout/useSuperAdminFallback.ts +58 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +31 -25
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +31 -122
- package/src/components/PaceLoginPage/useLoginAppAccess.ts +153 -0
- package/src/components/Progress/Progress.tsx +1 -2
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +29 -235
- package/src/components/ProtectedRoute/useProtectedRouteState.ts +128 -0
- package/src/components/ProtectedRoute/useVisibilityRedirectGrace.ts +89 -0
- package/src/components/PublicLayout/PublicLayout.test.tsx +217 -36
- package/src/components/PublicLayout/PublicPageLayout.tsx +132 -73
- package/src/components/PublicLayout/PublicPageProvider.tsx +5 -1
- package/src/components/Select/Select.test.tsx +1 -1
- package/src/components/Select/Select.tsx +28 -18
- package/src/components/Select/{__tests__/context.test.tsx → context.test.tsx} +3 -3
- package/src/components/Select/{utils/__tests__/text.test.tsx → text.test.tsx} +2 -2
- package/src/components/Select/{utils/text.ts → text.ts} +1 -1
- package/src/components/Select/{hooks/__tests__/useSelectEvents.test.ts → useSelectEvents.test.ts} +5 -5
- package/src/components/Select/{hooks/useSelectEvents.ts → useSelectEvents.ts} +2 -2
- package/src/components/Select/{hooks/__tests__/useSelectSearch.test.tsx → useSelectSearch.test.tsx} +7 -7
- package/src/components/Select/{hooks/useSelectSearch.ts → useSelectSearch.ts} +2 -2
- package/src/components/Select/{hooks/__tests__/useSelectState.test.ts → useSelectState.test.ts} +16 -2
- package/src/components/Select/{hooks/useSelectState.ts → useSelectState.ts} +3 -3
- package/src/components/Table/Table.test.tsx +348 -0
- package/src/components/Tabs/Tabs.test.tsx +270 -0
- package/src/components/Tabs/Tabs.tsx +1 -1
- package/src/components/Toast/Toast.test.tsx +420 -0
- package/src/components/{__tests__/index.test.ts → index.test.ts} +2 -2
- package/src/constants/{__tests__/performance.test.ts → performance.test.ts} +2 -2
- package/src/hooks/{__tests__/ServiceHooks.test.tsx → ServiceHooks.test.tsx} +8 -8
- package/src/hooks/{__tests__/hooks.integration.test.tsx → hooks.integration.test.tsx} +11 -11
- package/src/hooks/index.ts +7 -4
- package/src/hooks/{__tests__/index.unit.test.ts → index.unit.test.ts} +2 -2
- package/src/hooks/public/usePublicEvent.test.ts +1 -1
- package/src/hooks/public/usePublicEventLogo.test.ts +1 -1
- package/src/hooks/public/usePublicRouteParams.test.ts +1 -1
- package/src/hooks/services/useAuth.ts +9 -7
- package/src/hooks/useAddressAutocomplete.test.ts +22 -22
- package/src/hooks/useAddressAutocomplete.ts +90 -75
- package/src/hooks/{__tests__/useAppConfig.unit.test.ts → useAppConfig.unit.test.ts} +328 -22
- package/src/hooks/{__tests__/useComponentPerformance.unit.test.tsx → useComponentPerformance.unit.test.tsx} +27 -41
- package/src/hooks/useDataTablePerformance.ts +100 -120
- package/src/hooks/{__tests__/useDataTablePerformance.unit.test.ts → useDataTablePerformance.unit.test.ts} +5 -5
- package/src/hooks/{__tests__/useDataTableState.test.ts → useDataTableState.test.ts} +2 -2
- package/src/hooks/{__tests__/useDebounce.unit.test.ts → useDebounce.unit.test.ts} +2 -2
- package/src/hooks/useEventTheme.test.ts +4 -1
- package/src/hooks/useEventTheme.ts +49 -21
- package/src/hooks/useEvents.ts +41 -1
- package/src/hooks/{__tests__/useEvents.unit.test.ts → useEvents.unit.test.ts} +5 -5
- package/src/hooks/useFileReference.test.ts +44 -41
- package/src/hooks/useFileReference.ts +182 -173
- package/src/hooks/useFileUrl.ts +1 -1
- package/src/hooks/{__tests__/useFileUrl.unit.test.ts → useFileUrl.unit.test.ts} +26 -36
- package/src/hooks/{__tests__/useFileUrlCache.test.ts → useFileUrlCache.test.ts} +8 -8
- package/src/hooks/useFileUrlCache.ts +1 -1
- package/src/hooks/{__tests__/useFocusManagement.unit.test.ts → useFocusManagement.unit.test.ts} +2 -2
- package/src/hooks/{__tests__/useFocusTrap.unit.test.tsx → useFocusTrap.unit.test.tsx} +2 -2
- package/src/hooks/{__tests__/useFormDialog.test.ts → useFormDialog.test.ts} +2 -2
- package/src/hooks/useInactivityTracker.ts +138 -131
- package/src/hooks/{__tests__/useInactivityTracker.unit.test.ts → useInactivityTracker.unit.test.ts} +3 -3
- package/src/hooks/{__tests__/useIsMobile.unit.test.ts → useIsMobile.unit.test.ts} +2 -2
- package/src/hooks/useIsPrint.ts +62 -0
- package/src/hooks/useIsPrint.unit.test.ts +545 -0
- package/src/hooks/{__tests__/useKeyboardShortcuts.unit.test.ts → useKeyboardShortcuts.unit.test.ts} +2 -2
- package/src/hooks/{__tests__/useOrganisationPermissions.unit.test.tsx → useOrganisationPermissions.unit.test.tsx} +4 -4
- package/src/hooks/useOrganisationSecurity.test.ts +3 -3
- package/src/hooks/useOrganisationSecurity.ts +190 -201
- package/src/hooks/{__tests__/useOrganisationSecurity.unit.test.tsx → useOrganisationSecurity.unit.test.tsx} +61 -63
- package/src/hooks/{__tests__/useOrganisations.unit.test.ts → useOrganisations.unit.test.ts} +5 -5
- package/src/hooks/{__tests__/usePerformanceMonitor.unit.test.ts → usePerformanceMonitor.unit.test.ts} +13 -14
- package/src/hooks/{__tests__/usePermissionCache.test.ts → usePermissionCache.test.ts} +26 -27
- package/src/hooks/usePermissionCache.ts +276 -271
- package/src/hooks/{__tests__/usePreventTabReload.test.ts → usePreventTabReload.test.ts} +2 -2
- package/src/hooks/{__tests__/usePublicEvent.simple.test.ts → usePublicEvent.simple.test.ts} +4 -4
- package/src/hooks/{__tests__/usePublicEvent.test.ts → usePublicEvent.test.ts} +4 -4
- package/src/hooks/{__tests__/usePublicEvent.unit.test.ts → usePublicEvent.unit.test.ts} +4 -4
- package/src/hooks/{__tests__/usePublicFileDisplay.test.ts → usePublicFileDisplay.test.ts} +12 -12
- package/src/hooks/{__tests__/usePublicRouteParams.unit.test.ts → usePublicRouteParams.unit.test.ts} +3 -3
- package/src/hooks/{__tests__/useQueryCache.test.ts → useQueryCache.test.ts} +2 -2
- package/src/hooks/useQueryCache.ts +0 -2
- package/src/hooks/{__tests__/useRBAC.unit.test.ts → useRBAC.unit.test.ts} +55 -38
- package/src/hooks/{__tests__/useSessionDraft.test.ts → useSessionDraft.test.ts} +2 -2
- package/src/hooks/{__tests__/useSessionRestoration.unit.test.tsx → useSessionRestoration.unit.test.tsx} +10 -19
- package/src/hooks/useStorage.ts +21 -16
- package/src/hooks/{__tests__/useStorage.unit.test.ts → useStorage.unit.test.ts} +38 -75
- package/src/hooks/{__tests__/useToast.test.ts → useToast.test.ts} +2 -2
- package/src/hooks/{__tests__/useToast.unit.test.tsx → useToast.unit.test.tsx} +2 -2
- package/src/hooks/{__tests__/useZodForm.unit.test.tsx → useZodForm.unit.test.tsx} +2 -2
- package/src/icons/{__tests__/index.test.ts → index.test.ts} +2 -2
- package/src/icons/index.ts +2 -0
- package/src/{__tests__/index.test.ts → index.test.ts} +3 -7
- package/src/index.ts +15 -7
- package/src/providers/{__tests__/AuthProvider.test.tsx → AuthProvider.test.tsx} +3 -3
- package/src/providers/{__tests__/EventProvider.test.tsx → EventProvider.test.tsx} +3 -3
- package/src/providers/InactivityProvider.test-helper.tsx +40 -0
- package/src/providers/{__tests__/InactivityProvider.test.tsx → InactivityProvider.test.tsx} +14 -21
- package/src/providers/{__tests__/ProviderLifecycle.test.tsx → ProviderLifecycle.test.tsx} +4 -4
- package/src/providers/{__tests__/UnifiedAuthProvider.test.tsx → UnifiedAuthProvider.test.tsx} +1 -1
- package/src/providers/{__tests__/index.test.ts → index.test.ts} +2 -2
- package/src/providers/services/{__tests__/AuthServiceProvider.integration.test.tsx → AuthServiceProvider.integration.test.tsx} +4 -4
- package/src/providers/services/{__tests__/AuthServiceProvider.test.tsx → AuthServiceProvider.test.tsx} +7 -7
- package/src/providers/services/{__tests__/EventServiceProvider.test.tsx → EventServiceProvider.test.tsx} +7 -7
- package/src/providers/services/{__tests__/InactivityServiceProvider.test.tsx → InactivityServiceProvider.test.tsx} +5 -5
- package/src/providers/services/{__tests__/OrganisationServiceProvider.test.tsx → OrganisationServiceProvider.test.tsx} +6 -6
- package/src/providers/services/UnifiedAuthContext.ts +30 -27
- package/src/providers/services/{__tests__/UnifiedAuthProvider.advanced.test.tsx → UnifiedAuthProvider.advanced.test.tsx} +8 -9
- package/src/providers/services/{__tests__/UnifiedAuthProvider.appId.test.tsx → UnifiedAuthProvider.appId.test.tsx} +25 -25
- package/src/providers/services/{__tests__/UnifiedAuthProvider.integration.test.tsx → UnifiedAuthProvider.integration.test.tsx} +14 -11
- package/src/providers/services/UnifiedAuthProvider.tsx +115 -360
- package/src/providers/services/{__tests__/contexts.test.tsx → contexts.test.tsx} +6 -6
- package/src/providers/services/{__tests__/useUnifiedAuth.test.tsx → useUnifiedAuth.test.tsx} +6 -6
- package/src/providers/services/useUnifiedAuthContextValue.ts +279 -0
- package/src/providers/useInactivity.test-helper.ts +27 -0
- package/src/rbac/{__tests__/adapters.comprehensive.test.tsx → adapters.comprehensive.test.tsx} +24 -24
- package/src/rbac/adapters.test.tsx +22 -22
- package/src/rbac/adapters.tsx +29 -29
- package/src/rbac/api.test.ts +973 -42
- package/src/rbac/api.ts +228 -253
- package/src/rbac/{__tests__/audit-batched.test.ts → audit-batched.test.ts} +6 -6
- package/src/rbac/audit.ts +4 -1
- package/src/rbac/{__tests__/auth-rbac-security.integration.test.tsx → auth-rbac-security.integration.test.tsx} +1 -1
- package/src/rbac/{__tests__/auth-rbac.e2e.test.tsx → auth-rbac.e2e.test.tsx} +27 -34
- package/src/rbac/cache-invalidation.test.ts +715 -0
- package/src/rbac/components/{__tests__/AccessDenied.test.tsx → AccessDenied.test.tsx} +3 -3
- package/src/rbac/components/{__tests__/NavigationGuard.test.tsx → NavigationGuard.test.tsx} +13 -11
- package/src/{__tests__/rbac/PagePermissionGuard.test.tsx → rbac/components/PagePermissionGuard.guard.test.tsx} +33 -19
- package/src/rbac/components/{__tests__/PagePermissionGuard.performance.test.tsx → PagePermissionGuard.performance.test.tsx} +30 -9
- package/src/rbac/components/{__tests__/PagePermissionGuard.race-condition.test.tsx → PagePermissionGuard.race-condition.test.tsx} +7 -7
- package/src/rbac/components/{__tests__/PagePermissionGuard.test.tsx → PagePermissionGuard.test.tsx} +10 -10
- package/src/rbac/components/PagePermissionGuard.tsx +177 -372
- package/src/rbac/components/{__tests__/PagePermissionGuard.verification.test.tsx → PagePermissionGuard.verification.test.tsx} +7 -7
- package/src/rbac/config.ts +58 -18
- package/src/rbac/{__tests__/engine.comprehensive.test.ts → engine.comprehensive.test.ts} +3 -3
- package/src/rbac/engine.test.ts +494 -0
- package/src/rbac/errors.ts +89 -55
- package/src/rbac/hooks/permissions/runPermissionCheck.ts +77 -0
- package/src/rbac/hooks/permissions/{__tests__/useAccessLevel.test.ts → useAccessLevel.test.ts} +40 -40
- package/src/rbac/hooks/permissions/useAccessLevel.ts +16 -6
- package/src/rbac/hooks/permissions/{__tests__/useCan.test.ts → useCan.test.ts} +41 -41
- package/src/rbac/hooks/permissions/useCan.ts +170 -252
- package/src/rbac/hooks/permissions/{__tests__/useMultiplePermissions.test.ts → useMultiplePermissions.test.ts} +49 -49
- package/src/rbac/hooks/permissions/useMultiplePermissions.ts +6 -2
- package/src/rbac/hooks/permissions/{__tests__/usePermissions.test.ts → usePermissions.test.ts} +10 -12
- package/src/rbac/hooks/permissions/usePermissions.ts +36 -65
- package/src/rbac/hooks/useCan.test.ts +42 -42
- package/src/rbac/hooks/usePageAccessLogging.ts +160 -0
- package/src/rbac/hooks/usePageGuardScope.ts +117 -0
- package/src/rbac/hooks/usePagePermissionCheck.ts +67 -0
- package/src/rbac/hooks/{__tests__/usePermissions.integration.test.ts → usePermissions.integration.test.ts} +9 -9
- package/src/{__tests__/hooks/usePermissions.test.ts → rbac/hooks/usePermissions.stability.test.ts} +18 -18
- package/src/rbac/hooks/usePermissions.test.ts +54 -54
- package/src/rbac/hooks/useRBAC.test.ts +313 -217
- package/src/rbac/hooks/useRBAC.ts +145 -81
- package/src/rbac/hooks/useResourcePermissions.test.ts +25 -25
- package/src/rbac/hooks/useResourcePermissions.ts +68 -134
- package/src/rbac/hooks/useResourcePermissionsSuperAdmin.ts +67 -0
- package/src/rbac/hooks/useRoleManagement.test.ts +27 -112
- package/src/rbac/hooks/useRoleManagement.ts +153 -585
- package/src/rbac/hooks/{__tests__/useSecureSupabase.test.ts → useSecureSupabase.test.ts} +17 -17
- package/src/rbac/hooks/useSecureSupabase.ts +10 -2
- package/src/rbac/hooks/useSuperAdminCheck.ts +80 -0
- package/src/rbac/{__tests__/performance.test.ts → performance.test.ts} +1 -1
- package/src/rbac/{__tests__/rbac-core.test.tsx → rbac-core.test.tsx} +3 -3
- package/src/rbac/{__tests__/rbac-engine-core-logic.test.ts → rbac-engine-core-logic.test.ts} +2 -2
- package/src/rbac/{__tests__/rbac-engine-simplified.test.ts → rbac-engine-simplified.test.ts} +3 -3
- package/src/rbac/{__tests__/rbac-functions.test.ts → rbac-functions.test.ts} +57 -0
- package/src/rbac/{__tests__/rbac-role-isolation.test.ts → rbac-role-isolation.test.ts} +2 -2
- package/src/rbac/request-deduplication.test.ts +14 -9
- package/src/rbac/request-deduplication.ts +5 -4
- package/src/rbac/{__tests__/scenarios.user-role.test.tsx → scenarios.user-role.test.tsx} +23 -23
- package/src/rbac/secureClient.test.ts +514 -83
- package/src/rbac/secureClient.ts +8 -2
- package/src/rbac/security.test.ts +323 -0
- package/src/rbac/types/roleManagement.ts +66 -0
- package/src/rbac/utils/{__tests__/clientSecurity.test.ts → clientSecurity.test.ts} +4 -4
- package/src/rbac/utils/{__tests__/contextValidator.test.ts → contextValidator.test.ts} +4 -4
- package/src/rbac/utils/contextValidator.ts +5 -1
- package/src/rbac/utils/{__tests__/deep-equal.test.ts → deep-equal.test.ts} +1 -1
- package/src/rbac/utils/{__tests__/eventContext.test.ts → eventContext.test.ts} +36 -21
- package/src/rbac/utils/eventContext.ts +37 -33
- package/src/rbac/utils/fetchPermissionMap.ts +13 -0
- package/src/rbac/utils/permissionMapHelpers.ts +34 -0
- package/src/rbac/utils/roleManagementRpc.ts +303 -0
- package/src/services/{__tests__/AuthService.edge-cases.test.ts → AuthService.edge-cases.test.ts} +19 -19
- package/src/services/{__tests__/AuthService.restoreSession.test.ts → AuthService.restoreSession.test.ts} +2 -2
- package/src/services/{__tests__/AuthService.test.ts → AuthService.test.ts} +89 -55
- package/src/services/AuthService.ts +184 -205
- package/src/services/{__tests__/BaseService.edge-cases.test.ts → BaseService.edge-cases.test.ts} +3 -3
- package/src/services/{__tests__/BaseService.test.ts → BaseService.test.ts} +2 -2
- package/src/services/{__tests__/EventService.edge-cases.test.ts → EventService.edge-cases.test.ts} +27 -24
- package/src/services/{__tests__/EventService.eventColours.test.ts → EventService.eventColours.test.ts} +1 -1
- package/src/services/{__tests__/EventService.test.ts → EventService.test.ts} +256 -24
- package/src/services/EventService.ts +242 -312
- package/src/services/{__tests__/InactivityService.edge-cases.test.ts → InactivityService.edge-cases.test.ts} +3 -3
- package/src/services/{__tests__/InactivityService.lifecycle.test.ts → InactivityService.lifecycle.test.ts} +2 -2
- package/src/services/{__tests__/InactivityService.test.ts → InactivityService.test.ts} +179 -4
- package/src/services/InactivityService.ts +172 -213
- package/src/services/{__tests__/OrganisationService.edge-cases.test.ts → OrganisationService.edge-cases.test.ts} +5 -5
- package/src/services/{__tests__/OrganisationService.pagination.test.ts → OrganisationService.pagination.test.ts} +4 -4
- package/src/services/{__tests__/OrganisationService.test.ts → OrganisationService.test.ts} +410 -7
- package/src/services/OrganisationService.ts +184 -238
- package/src/services/base/BaseService.test.ts +1 -1
- package/src/services/interfaces/{__tests__/IAuthService.test.ts → IAuthService.test.ts} +21 -27
- package/src/services/interfaces/IAuthService.ts +10 -9
- package/src/services/interfaces/{__tests__/IEventService.test.ts → IEventService.test.ts} +4 -4
- package/src/services/interfaces/{__tests__/IInactivityService.test.ts → IInactivityService.test.ts} +3 -3
- package/src/services/interfaces/{__tests__/IOrganisationService.test.ts → IOrganisationService.test.ts} +3 -3
- package/src/styles/core.css +243 -12
- package/src/theming/{__tests__/parseEventColours.test.ts → parseEventColours.test.ts} +1 -1
- package/src/theming/{__tests__/runtime.test.ts → runtime.test.ts} +8 -17
- package/src/theming/runtime.ts +71 -2
- package/src/types/api-result.ts +53 -0
- package/src/types/{__tests__/core.test.ts → core.test.ts} +2 -2
- package/src/types/{__tests__/database-generated.test.ts → database-generated.test.ts} +3 -3
- package/src/types/database.generated.ts +45 -10
- package/src/types/event.ts +38 -18
- package/src/types/{__tests__/file-reference.test.ts → file-reference.test.ts} +13 -13
- package/src/types/file-reference.ts +37 -12
- package/src/types/{__tests__/guards.test.ts → guards.test.ts} +2 -2
- package/src/types/{__tests__/index.test.ts → index.test.ts} +2 -2
- package/src/types/index.ts +3 -0
- package/src/types/{__tests__/organisation.roles.test.ts → organisation.roles.test.ts} +1 -1
- package/src/types/{__tests__/organisation.test.ts → organisation.test.ts} +3 -31
- package/src/types/organisation.ts +15 -15
- package/src/types/supabase.ts +13 -4
- package/src/types/{__tests__/theme.test.ts → theme.test.ts} +1 -1
- package/src/types/{__tests__/type-validation.test.ts → type-validation.test.ts} +1 -1
- package/src/types/{__tests__/validation.test.ts → validation.test.ts} +2 -2
- package/src/utils/app/appIdResolver.test.ts +98 -71
- package/src/utils/app/appIdResolver.ts +31 -20
- package/src/utils/{__tests__/appConfig.unit.test.ts → appConfig.unit.test.ts} +1 -1
- package/src/utils/{__tests__/audit.unit.test.ts → audit.unit.test.ts} +1 -1
- package/src/utils/{__tests__/auth-utils.unit.test.ts → auth-utils.unit.test.ts} +16 -17
- package/src/utils/{__tests__/bundleAnalysis.unit.test.ts → bundleAnalysis.unit.test.ts} +35 -35
- package/src/utils/{__tests__/cn.unit.test.ts → cn.unit.test.ts} +1 -1
- package/src/utils/context/organisationContext.test.ts +105 -91
- package/src/utils/context/organisationContext.ts +29 -40
- package/src/utils/core/{__tests__/cn.test.ts → cn.test.ts} +3 -3
- package/src/utils/core/{__tests__/debugLogger.test.ts → debugLogger.test.ts} +2 -2
- package/src/utils/core/{__tests__/logger.test.ts → logger.test.ts} +2 -2
- package/src/utils/core/mergeRefs.ts +24 -0
- package/src/utils/{__tests__/debugLogger.test.ts → debugLogger.test.ts} +1 -1
- package/src/utils/{__tests__/deviceFingerprint.unit.test.ts → deviceFingerprint.unit.test.ts} +1 -1
- package/src/utils/dynamic/createLazyComponent.tsx +9 -1
- package/src/utils/dynamic/{__tests__/dynamicUtils.test.ts → dynamicUtils.test.ts} +2 -2
- package/src/utils/dynamic/{__tests__/lazyLoad.test.tsx → lazyLoad.test.tsx} +2 -2
- package/src/utils/{__tests__/dynamicUtils.unit.test.ts → dynamicUtils.unit.test.ts} +1 -1
- package/src/utils/file-reference/{__tests__/file-reference.test.ts → file-reference.test.ts} +214 -289
- package/src/utils/file-reference/index.ts +330 -347
- package/src/utils/{__tests__/formatDate.unit.test.ts → formatDate.unit.test.ts} +2 -2
- package/src/utils/formatting/formatDateTimeTimezone.test.ts +1 -1
- package/src/utils/formatting/formatNumber.test.ts +1 -1
- package/src/utils/{__tests__/formatting.unit.test.ts → formatting.unit.test.ts} +1 -1
- package/src/utils/google-places/googlePlacesUtils.test.ts +70 -48
- package/src/utils/google-places/googlePlacesUtils.ts +67 -99
- package/src/utils/google-places/loadGoogleMapsScript.test.ts +25 -22
- package/src/utils/google-places/loadGoogleMapsScript.ts +138 -117
- package/src/utils/{__tests__/index.unit.test.ts → index.unit.test.ts} +1 -1
- package/src/utils/{__tests__/lazyLoad.unit.test.tsx → lazyLoad.unit.test.tsx} +13 -14
- package/src/utils/location/location.test.ts +1 -1
- package/src/utils/{__tests__/logger.unit.test.ts → logger.unit.test.ts} +1 -1
- package/src/utils/{__tests__/organisationContext.unit.test.ts → organisationContext.unit.test.ts} +37 -48
- package/src/utils/performance/{__tests__/bundleAnalysis.test.ts → bundleAnalysis.test.ts} +2 -2
- package/src/utils/performance/{__tests__/performanceBenchmark.test.ts → performanceBenchmark.test.ts} +2 -2
- package/src/utils/performance/{__tests__/performanceBudgets.test.ts → performanceBudgets.test.ts} +2 -2
- package/src/utils/{__tests__/performanceBenchmark.test.ts → performanceBenchmark.test.ts} +2 -2
- package/src/utils/{__tests__/performanceBudgets.unit.test.ts → performanceBudgets.unit.test.ts} +2 -2
- package/src/utils/{__tests__/permissionTypes.unit.test.ts → permissionTypes.unit.test.ts} +1 -1
- package/src/utils/{__tests__/permissionUtils.unit.test.ts → permissionUtils.unit.test.ts} +1 -1
- package/src/utils/permissions/{__tests__/permissionTypes.test.ts → permissionTypes.test.ts} +2 -2
- package/src/utils/persistence/{__tests__/keyDerivation.test.ts → keyDerivation.test.ts} +2 -2
- package/src/utils/persistence/{__tests__/sensitiveFieldDetection.test.ts → sensitiveFieldDetection.test.ts} +2 -2
- package/src/utils/{__tests__/request-deduplication.test.ts → request-deduplication.test.ts} +2 -2
- package/src/utils/{__tests__/sanitization.unit.test.ts → sanitization.unit.test.ts} +1 -1
- package/src/utils/{__tests__/schemaUtils.unit.test.ts → schemaUtils.unit.test.ts} +1 -1
- package/src/utils/{__tests__/secureDataAccess.unit.test.ts → secureDataAccess.unit.test.ts} +2 -2
- package/src/utils/{__tests__/secureErrors.unit.test.ts → secureErrors.unit.test.ts} +4 -4
- package/src/utils/{__tests__/secureStorage.unit.test.ts → secureStorage.unit.test.ts} +1 -1
- package/src/utils/security/auth-utils.ts +34 -23
- package/src/utils/security/secureDataAccess.ts +241 -281
- package/src/utils/security/secureErrors.test.ts +1 -1
- package/src/utils/security/secureStorage.test.ts +1 -1
- package/src/utils/security/security.test.ts +25 -17
- package/src/utils/security/security.ts +15 -18
- package/src/utils/security/securityMonitor.test.ts +1 -1
- package/src/utils/{__tests__/security.unit.test.ts → security.unit.test.ts} +21 -15
- package/src/utils/{__tests__/securityMonitor.unit.test.ts → securityMonitor.unit.test.ts} +1 -1
- package/src/utils/{__tests__/sessionTracking.unit.test.ts → sessionTracking.unit.test.ts} +12 -12
- package/src/utils/storage/{__tests__/config.unit.test.ts → config.unit.test.ts} +2 -2
- package/src/utils/storage/helpers.test.ts +88 -102
- package/src/utils/storage/helpers.ts +173 -251
- package/src/utils/storage/{__tests__/index.unit.test.ts → index.unit.test.ts} +3 -3
- package/src/utils/storage/types.ts +7 -0
- package/src/utils/supabase/createBaseClient.test.ts +1 -1
- package/src/utils/timezone/timezone.test.ts +1 -1
- package/src/utils/{__tests__/timezone.test.ts → timezone.test.ts} +2 -2
- package/src/utils/validation/{__tests__/common.test.ts → common.test.ts} +2 -2
- package/src/utils/validation/{__tests__/csrf.test.ts → csrf.test.ts} +56 -28
- package/src/utils/validation/csrf.ts +42 -41
- package/src/utils/validation/{__tests__/htmlSanitization.unit.test.ts → htmlSanitization.unit.test.ts} +2 -2
- package/src/utils/validation/{__tests__/passwordSchema.test.ts → passwordSchema.test.ts} +2 -2
- package/src/utils/validation/{__tests__/schema.test.ts → schema.test.ts} +2 -2
- package/src/utils/validation/{__tests__/sqlInjectionProtection.test.ts → sqlInjectionProtection.test.ts} +2 -2
- package/src/utils/validation/{__tests__/user.test.ts → user.test.ts} +2 -2
- package/src/utils/validation/{__tests__/validation.test.ts → validation.test.ts} +2 -2
- package/src/utils/validation/{__tests__/validationUtils.test.ts → validationUtils.test.ts} +2 -2
- package/src/utils/{__tests__/validation.unit.test.ts → validation.unit.test.ts} +1 -1
- package/src/utils/{__tests__/validationUtils.unit.test.ts → validationUtils.unit.test.ts} +5 -2
- package/dist/UnifiedAuthProvider-BBD2PS3Q.js +0 -7
- package/dist/chunk-KPYQWGFQ.js +0 -183
- package/dist/types-D05dCGma.d.ts +0 -521
- package/scripts/eslint-audit.cjs +0 -222
- package/scripts/generate-docs.js +0 -157
- package/scripts/install-cursor-rules.cjs +0 -255
- package/scripts/install-eslint-config.cjs +0 -349
- package/scripts/setup-build-cache.js +0 -73
- package/scripts/validate-pre-publish.js +0 -145
- package/src/__tests__/integration/UserProfile.test.tsx +0 -124
- package/src/__tests__/public-recipe-view.test.ts +0 -228
- package/src/__tests__/rls-policies.test.ts +0 -472
- package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -876
- package/src/components/DataTable/components/DataTableLayout.tsx +0 -584
- package/src/components/DataTable/components/UnifiedTableBody.tsx +0 -395
- package/src/components/DataTable/components/__tests__/DataTableLayout.test.tsx +0 -467
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +0 -358
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +0 -957
- package/src/components/DataTable/core/ActionManager.ts +0 -235
- package/src/components/DataTable/core/ColumnManager.ts +0 -204
- package/src/components/DataTable/core/DataManager.ts +0 -190
- package/src/components/DataTable/core/LocalDataAdapter.ts +0 -274
- package/src/components/DataTable/core/PluginRegistry.ts +0 -229
- package/src/components/DataTable/core/StateManager.ts +0 -312
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +0 -235
- package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +0 -141
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +0 -178
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +0 -133
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +0 -142
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +0 -158
- package/src/components/DataTable/core/interfaces.ts +0 -338
- package/src/components/DataTable/types.ts +0 -764
- package/src/hooks/public/usePublicFileDisplay.ts +0 -534
- package/src/hooks/useFileDisplay.ts +0 -748
- package/src/providers/OrganisationProvider.test.tsx +0 -40
- package/src/providers/OrganisationProvider.tsx +0 -92
- package/src/providers/__tests__/InactivityProvider.test-helper.tsx +0 -65
- package/src/providers/__tests__/OrganisationProvider.test.tsx +0 -616
- package/src/providers/__tests__/OrganisationProvider.wrapper.test.tsx +0 -591
- package/src/rbac/__tests__/cache-invalidation.test.ts +0 -393
- /package/src/components/DataTable/{components/__tests__ → ui}/COVERAGE_NOTE.md +0 -0
- /package/src/components/DataTable/utils/{__tests__/COVERAGE_NOTE.md → COVERAGE_NOTE.md} +0 -0
- /package/src/hooks/{__tests__/useApiFetch.unit.test.ts → useApiFetch.unit.test.ts} +0 -0
- /package/src/providers/{__tests__/README.md → README.md} +0 -0
- /package/src/rbac/{__tests__/index.test.ts → index.test.ts} +0 -0
- /package/src/rbac/{__tests__/rbac-integration.test.ts → rbac-integration.test.ts} +0 -0
- /package/src/types/{__tests__/README.md → README.md} +0 -0
|
@@ -41,6 +41,7 @@ function checkAppCssStructure(consumingAppPath) {
|
|
|
41
41
|
message: 'app.css file not found. Required for pace-core styling.',
|
|
42
42
|
severity: 'error',
|
|
43
43
|
fix: 'Create src/app.css with required imports and @source directives',
|
|
44
|
+
standardSection: 'Required File: src/app.css (Verification Checklist)',
|
|
44
45
|
});
|
|
45
46
|
return issues;
|
|
46
47
|
}
|
|
@@ -67,6 +68,7 @@ function checkAppCssStructure(consumingAppPath) {
|
|
|
67
68
|
message: `Missing required import: ${name}`,
|
|
68
69
|
severity: required ? 'error' : 'warning',
|
|
69
70
|
fix: `Add ${name}; to app.css`,
|
|
71
|
+
standardSection: 'Required File: src/app.css; CSS Import Path',
|
|
70
72
|
});
|
|
71
73
|
}
|
|
72
74
|
});
|
|
@@ -81,6 +83,7 @@ function checkAppCssStructure(consumingAppPath) {
|
|
|
81
83
|
message: 'Missing @source directives for Tailwind v4 content scanning',
|
|
82
84
|
severity: 'error',
|
|
83
85
|
fix: 'Add @source directives: @source "./**/*.{js,ts,jsx,tsx}"; @source "../node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}";',
|
|
86
|
+
standardSection: 'CRITICAL: @source Directive Paths',
|
|
84
87
|
});
|
|
85
88
|
} else {
|
|
86
89
|
// Check for correct @source paths (relative to CSS file location)
|
|
@@ -102,11 +105,12 @@ function checkAppCssStructure(consumingAppPath) {
|
|
|
102
105
|
message: '@source directive missing for app source files',
|
|
103
106
|
severity: 'error',
|
|
104
107
|
fix: 'Add: @source "./**/*.{js,ts,jsx,tsx}"; (if app.css is in src/)',
|
|
108
|
+
standardSection: 'CRITICAL: @source Directive Paths',
|
|
105
109
|
});
|
|
106
110
|
}
|
|
107
|
-
|
|
108
|
-
// Check if pace-core source files are included
|
|
109
|
-
const hasPaceCoreSource = foundSources.some(src => src.includes('@jmruthers/pace-core') || src.includes('pace-core/src'));
|
|
111
|
+
|
|
112
|
+
// Check if pace-core source files are included (package path or monorepo packages/core)
|
|
113
|
+
const hasPaceCoreSource = foundSources.some(src => src.includes('@jmruthers/pace-core') || src.includes('pace-core/src') || src.includes('packages/core/src'));
|
|
110
114
|
if (!hasPaceCoreSource) {
|
|
111
115
|
issues.push({
|
|
112
116
|
type: 'appCss',
|
|
@@ -115,6 +119,7 @@ function checkAppCssStructure(consumingAppPath) {
|
|
|
115
119
|
message: '@source directive missing for pace-core source files',
|
|
116
120
|
severity: 'error',
|
|
117
121
|
fix: 'Add: @source "../node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}"; (if app.css is in src/)',
|
|
122
|
+
standardSection: 'CRITICAL: @source Directive Paths',
|
|
118
123
|
});
|
|
119
124
|
}
|
|
120
125
|
}
|
|
@@ -129,6 +134,7 @@ function checkAppCssStructure(consumingAppPath) {
|
|
|
129
134
|
message: 'Missing @theme block for color palettes. Required for pace-core styling.',
|
|
130
135
|
severity: 'error',
|
|
131
136
|
fix: 'Add @theme static { /* color palettes here */ } block to app.css',
|
|
137
|
+
standardSection: 'Required Color Palettes (@theme static)',
|
|
132
138
|
});
|
|
133
139
|
} else {
|
|
134
140
|
// Check for required color palettes (main, sec, acc)
|
|
@@ -151,11 +157,12 @@ function checkAppCssStructure(consumingAppPath) {
|
|
|
151
157
|
message: `Missing required color palettes in @theme block: ${missing.join(', ')}`,
|
|
152
158
|
severity: 'error',
|
|
153
159
|
fix: `Add ${missing.join(', ')} color palettes to @theme block (all shades 50-950)`,
|
|
160
|
+
standardSection: 'Required Color Palettes (main, sec, acc)',
|
|
154
161
|
});
|
|
155
162
|
}
|
|
156
163
|
}
|
|
157
164
|
}
|
|
158
|
-
|
|
165
|
+
|
|
159
166
|
return issues;
|
|
160
167
|
}
|
|
161
168
|
|
|
@@ -189,6 +196,7 @@ function checkTailwindV4Config(consumingAppPath) {
|
|
|
189
196
|
message: 'Tailwind v4 plugin not found in vite.config.ts. Required for Tailwind v4.',
|
|
190
197
|
severity: 'error',
|
|
191
198
|
fix: 'Add: import tailwindcss from "@tailwindcss/vite"; and add tailwindcss() to plugins array',
|
|
199
|
+
standardSection: 'Verification Checklist / Tailwind v4 (Troubleshooting)',
|
|
192
200
|
});
|
|
193
201
|
}
|
|
194
202
|
|
|
@@ -198,13 +206,17 @@ function checkTailwindV4Config(consumingAppPath) {
|
|
|
198
206
|
/**
|
|
199
207
|
* Run audit for Standard 5: Styling
|
|
200
208
|
* @param {string} consumingAppPath - Path to consuming app
|
|
209
|
+
* @param {{ isPaceCorePackage?: boolean }} [auditContext] - When isPaceCorePackage, skip app.css check (package does not have app.css)
|
|
201
210
|
* @returns {object} - Audit results with issues array
|
|
202
211
|
*/
|
|
203
|
-
function runStandard5Audit(consumingAppPath) {
|
|
212
|
+
function runStandard5Audit(consumingAppPath, auditContext = {}) {
|
|
204
213
|
const issues = [];
|
|
205
|
-
|
|
214
|
+
const isPaceCorePackage = auditContext.isPaceCorePackage === true;
|
|
215
|
+
|
|
206
216
|
try {
|
|
207
|
-
|
|
217
|
+
if (!isPaceCorePackage) {
|
|
218
|
+
issues.push(...checkAppCssStructure(consumingAppPath));
|
|
219
|
+
}
|
|
208
220
|
issues.push(...checkTailwindV4Config(consumingAppPath));
|
|
209
221
|
} catch (error) {
|
|
210
222
|
return {
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
* Standard 6: Security & RBAC Audit
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
4
|
* @module Audit/Standard6
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
6
|
* Audits consuming apps for compliance with Standard 6: Security & RBAC.
|
|
7
|
-
* Validates
|
|
8
|
-
*
|
|
7
|
+
* Validates PagePermissionGuard coverage and Edge Functions RBAC. RLS policy compliance
|
|
8
|
+
* (naming, super-admin checks, schema-qualification, etc.) is audited by a separate
|
|
9
|
+
* DB audit tool that connects to the database directly; this file-based audit does
|
|
10
|
+
* not scan supabase/migrations.
|
|
11
|
+
*
|
|
9
12
|
* Reference: packages/core/docs/standards/6-security-rbac-standards.md
|
|
10
13
|
*/
|
|
11
14
|
|
|
@@ -15,22 +18,22 @@ const { findSQLFiles, findSourceFiles, readFileSafe, getRelativePath, directoryE
|
|
|
15
18
|
const { getLineNumber, getCodeSnippet, isInCommentOrStringSQL, isInCommentOrString, importsFromPaceCore } = require('../utils/code-utils.cjs');
|
|
16
19
|
|
|
17
20
|
/**
|
|
18
|
-
* Check RLS policy compliance in SQL migrations
|
|
21
|
+
* Check RLS policy compliance in SQL migrations.
|
|
22
|
+
* SKIPPED: This audit does not scan migration files. RLS policy compliance (naming,
|
|
23
|
+
* super-admin checks, schema-qualification, helper functions) is audited by a separate
|
|
24
|
+
* DB audit tool that connects to the database directly.
|
|
19
25
|
*/
|
|
20
26
|
function checkRLSPolicies(consumingAppPath) {
|
|
27
|
+
return [];
|
|
28
|
+
/* Migration-based RLS checks disabled - see DB audit tool
|
|
21
29
|
const issues = [];
|
|
22
|
-
|
|
23
|
-
// Find SQL migration files
|
|
24
30
|
const migrationsPath = path.join(consumingAppPath, 'supabase', 'migrations');
|
|
25
31
|
const altMigrationsPath = path.join(consumingAppPath, 'migrations');
|
|
26
|
-
|
|
27
|
-
const migrationsDir = fs.existsSync(migrationsPath) ? migrationsPath :
|
|
32
|
+
const migrationsDir = fs.existsSync(migrationsPath) ? migrationsPath :
|
|
28
33
|
(fs.existsSync(altMigrationsPath) ? altMigrationsPath : null);
|
|
29
|
-
|
|
30
34
|
if (!migrationsDir) {
|
|
31
|
-
return issues;
|
|
35
|
+
return issues;
|
|
32
36
|
}
|
|
33
|
-
|
|
34
37
|
const sqlFiles = findSQLFiles(migrationsDir);
|
|
35
38
|
|
|
36
39
|
sqlFiles.forEach(filePath => {
|
|
@@ -63,6 +66,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
63
66
|
code: getCodeSnippet(content, policyStart, 0, 100),
|
|
64
67
|
severity: 'error',
|
|
65
68
|
fix: `Rename policy to follow pattern: rbac_${operation}_${tableName}`,
|
|
69
|
+
standardSection: 'Policy Naming Convention (RLS Policy Patterns)',
|
|
66
70
|
});
|
|
67
71
|
}
|
|
68
72
|
|
|
@@ -83,6 +87,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
83
87
|
code: getCodeSnippet(content, policyStart, 0, 200),
|
|
84
88
|
severity: 'error',
|
|
85
89
|
fix: 'Replace auth.uid() with helper function like get_effective_user_id(). Helper functions must be STABLE SECURITY DEFINER.',
|
|
90
|
+
standardSection: 'Forbidden Patterns / Helper Function Requirements',
|
|
86
91
|
});
|
|
87
92
|
}
|
|
88
93
|
|
|
@@ -97,6 +102,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
97
102
|
code: getCodeSnippet(content, policyStart, 0, 200),
|
|
98
103
|
severity: 'error',
|
|
99
104
|
fix: 'Replace subquery with helper function. Helper functions must be STABLE SECURITY DEFINER SET search_path TO public.',
|
|
105
|
+
standardSection: 'Forbidden Patterns / Helper Function Requirements',
|
|
100
106
|
});
|
|
101
107
|
}
|
|
102
108
|
|
|
@@ -111,6 +117,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
111
117
|
code: getCodeSnippet(content, policyStart, 0, 200),
|
|
112
118
|
severity: 'error',
|
|
113
119
|
fix: 'Replace current_setting() with helper function. Helper functions must be STABLE SECURITY DEFINER.',
|
|
120
|
+
standardSection: 'Forbidden Patterns / Helper Function Requirements',
|
|
114
121
|
});
|
|
115
122
|
}
|
|
116
123
|
|
|
@@ -125,6 +132,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
125
132
|
code: getCodeSnippet(content, policyStart, 0, 200),
|
|
126
133
|
severity: 'error',
|
|
127
134
|
fix: 'Replace is_super_admin() with is_super_admin(safe_get_user_id_for_rls()) to require explicit parameter passing.',
|
|
135
|
+
standardSection: 'Standard Helper Functions (is_super_admin)',
|
|
128
136
|
});
|
|
129
137
|
}
|
|
130
138
|
|
|
@@ -149,6 +157,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
149
157
|
code: getCodeSnippet(content, policyStart, 0, 200),
|
|
150
158
|
severity: 'error',
|
|
151
159
|
fix: 'Add is_super_admin(safe_get_user_id_for_rls()) check. Pattern: (is_super_admin(safe_get_user_id_for_rls()) OR ...other checks...)',
|
|
160
|
+
standardSection: 'Standard Organisation-Scoped Policy / Policy Best Practices',
|
|
152
161
|
});
|
|
153
162
|
}
|
|
154
163
|
}
|
|
@@ -180,6 +189,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
180
189
|
code: getCodeSnippet(content, policyStart, 0, 200),
|
|
181
190
|
severity: 'error',
|
|
182
191
|
fix: `Replace ${usesEventAccess ? 'check_user_event_access(event_id)' : 'check_user_is_event_creator(event_id)'} with check_rbac_permission_with_context('${operation}:page.{page_name}', '{page_name}', organisation_id, event_id::text, get_app_id('{app_name}')). See RBAC compliance standard for page name mapping.`,
|
|
192
|
+
standardSection: 'RBAC Permission-Based Policy / Helper Selection Quick Guide',
|
|
183
193
|
});
|
|
184
194
|
}
|
|
185
195
|
|
|
@@ -205,6 +215,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
205
215
|
code: getCodeSnippet(content, policyStart, 0, 200),
|
|
206
216
|
severity: 'error',
|
|
207
217
|
fix: 'Add event_id IS NOT NULL check to WITH CHECK clause. Pattern: event_id IS NOT NULL AND ...',
|
|
218
|
+
standardSection: 'Policy Best Practices / Standard Organisation-Scoped Policy',
|
|
208
219
|
});
|
|
209
220
|
}
|
|
210
221
|
|
|
@@ -224,6 +235,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
224
235
|
code: getCodeSnippet(content, policyStart, 0, 200),
|
|
225
236
|
severity: 'warning',
|
|
226
237
|
fix: 'Add organisation_id IS NOT NULL check. Pattern: organisation_id IS NOT NULL AND ...',
|
|
238
|
+
standardSection: 'Policy Best Practices / Standard Organisation-Scoped Policy',
|
|
227
239
|
});
|
|
228
240
|
}
|
|
229
241
|
}
|
|
@@ -270,6 +282,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
270
282
|
code: getCodeSnippet(content, funcStart, 0, 300),
|
|
271
283
|
severity: 'error',
|
|
272
284
|
fix: 'Remove DEFAULT NULL parameter and all fallback logic. Function should require explicit parameter and return false if parameter is NULL (fail secure).',
|
|
285
|
+
standardSection: 'Security Anti-Patterns / Forbidden Patterns',
|
|
273
286
|
});
|
|
274
287
|
}
|
|
275
288
|
}
|
|
@@ -290,6 +303,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
290
303
|
code: getCodeSnippet(content, funcStart, 0, 150),
|
|
291
304
|
severity: 'error',
|
|
292
305
|
fix: 'Add STABLE attribute to function definition.',
|
|
306
|
+
standardSection: 'RLS Policy Performance Requirements / Helper Function Requirements',
|
|
293
307
|
});
|
|
294
308
|
}
|
|
295
309
|
|
|
@@ -318,6 +332,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
318
332
|
code: getCodeSnippet(content, funcStart, 0, 150),
|
|
319
333
|
severity: 'error',
|
|
320
334
|
fix: 'Add SECURITY DEFINER attribute to function definition. Also ensure SET search_path TO public is present.',
|
|
335
|
+
standardSection: 'SECURITY DEFINER Requirements & Security',
|
|
321
336
|
});
|
|
322
337
|
} else {
|
|
323
338
|
// Function doesn't query RLS-protected tables, SECURITY DEFINER might not be needed
|
|
@@ -334,6 +349,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
334
349
|
code: getCodeSnippet(content, funcStart, 0, 150),
|
|
335
350
|
severity: 'error',
|
|
336
351
|
fix: 'Add SET search_path TO public to function definition. This is MANDATORY for SECURITY DEFINER functions to prevent search path hijacking.',
|
|
352
|
+
standardSection: 'Helper Function Template / Security Risks & Mitigations',
|
|
337
353
|
});
|
|
338
354
|
}
|
|
339
355
|
|
|
@@ -367,6 +383,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
367
383
|
code: getCodeSnippet(content, funcStart + tableMatch.index, 0, 100),
|
|
368
384
|
severity: 'error',
|
|
369
385
|
fix: `Schema-qualify the table reference: public.${tableName}`,
|
|
386
|
+
standardSection: 'Security Anti-Patterns / Schema-qualify references',
|
|
370
387
|
});
|
|
371
388
|
}
|
|
372
389
|
}
|
|
@@ -394,6 +411,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
394
411
|
code: getCodeSnippet(content, funcStart, 0, 200),
|
|
395
412
|
severity: 'warning',
|
|
396
413
|
fix: 'Add COMMENT ON FUNCTION explaining why SECURITY DEFINER is needed, or remove SECURITY DEFINER if not required.',
|
|
414
|
+
standardSection: 'Required Mitigations (Document rationale)',
|
|
397
415
|
});
|
|
398
416
|
}
|
|
399
417
|
} else if (queriesRLSProtected && !hasComment) {
|
|
@@ -408,6 +426,7 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
408
426
|
code: getCodeSnippet(content, funcStart, 0, 200),
|
|
409
427
|
severity: 'warning',
|
|
410
428
|
fix: 'Add COMMENT ON FUNCTION documenting that SECURITY DEFINER is required to avoid circular RLS dependencies when querying RLS-protected tables.',
|
|
429
|
+
standardSection: 'Required Mitigations (Document rationale)',
|
|
411
430
|
});
|
|
412
431
|
}
|
|
413
432
|
}
|
|
@@ -420,8 +439,8 @@ function checkRLSPolicies(consumingAppPath) {
|
|
|
420
439
|
// Skip files that can't be read
|
|
421
440
|
}
|
|
422
441
|
});
|
|
423
|
-
|
|
424
442
|
return issues;
|
|
443
|
+
*/
|
|
425
444
|
}
|
|
426
445
|
|
|
427
446
|
/**
|
|
@@ -470,6 +489,11 @@ function checkPagePermissionGuardCoverage(consumingAppPath) {
|
|
|
470
489
|
return;
|
|
471
490
|
}
|
|
472
491
|
|
|
492
|
+
// Exclude test files - they don't need PagePermissionGuard
|
|
493
|
+
if (filePath.includes('.test.') || filePath.includes('.spec.')) {
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
|
|
473
497
|
if (!isPageComponent(filePath, content)) {
|
|
474
498
|
return;
|
|
475
499
|
}
|
|
@@ -479,8 +503,13 @@ function checkPagePermissionGuardCoverage(consumingAppPath) {
|
|
|
479
503
|
|
|
480
504
|
// Exclude public/error pages that don't need RBAC protection
|
|
481
505
|
// NotFound, 404, Error, Unauthorized, Forbidden, AccessDenied pages are public
|
|
506
|
+
// Showcase/demo pages (UI, DataTable, Styles, Public, Organisation, Storage, etc.) are intentionally public
|
|
482
507
|
const isPublicPage = /NotFound|not.*found|404|Error|Unauthorized|Forbidden|AccessDenied/i.test(fileName) ||
|
|
483
|
-
/public|error|unauthorized|forbidden|access.*denied/i.test(relativePath)
|
|
508
|
+
/public|error|unauthorized|forbidden|access.*denied/i.test(relativePath) ||
|
|
509
|
+
/Showcase|showcase|StylesShowcase|DataTableShowcase|UIShowcase|OrganisationShowcase|StorageShowcase|PublicPage|CalendarTest|SuperAdmin|HomePage/i.test(fileName) ||
|
|
510
|
+
/showcase|public.*page/i.test(relativePath) ||
|
|
511
|
+
/PaceLoginPage|Login|login/i.test(fileName) ||
|
|
512
|
+
/login/i.test(relativePath);
|
|
484
513
|
|
|
485
514
|
if (isPublicPage) {
|
|
486
515
|
return; // Skip public/error pages - they don't need PagePermissionGuard
|
|
@@ -509,6 +538,7 @@ function checkPagePermissionGuardCoverage(consumingAppPath) {
|
|
|
509
538
|
message: 'Page component missing PagePermissionGuard wrapper. Pages using RBAC hooks must be protected.',
|
|
510
539
|
severity: 'error',
|
|
511
540
|
fix: 'Wrap page content with <PagePermissionGuard pageName="page-name" operation="read">',
|
|
541
|
+
standardSection: 'Security Baseline (page protection)',
|
|
512
542
|
});
|
|
513
543
|
} else {
|
|
514
544
|
// Might be a public page, but flag for review
|
|
@@ -519,6 +549,7 @@ function checkPagePermissionGuardCoverage(consumingAppPath) {
|
|
|
519
549
|
message: 'Page component does not use PagePermissionGuard. Verify if this page should be protected.',
|
|
520
550
|
severity: 'warning',
|
|
521
551
|
fix: 'If page should be protected, wrap with <PagePermissionGuard pageName="page-name" operation="read">',
|
|
552
|
+
standardSection: 'Security Baseline (page protection)',
|
|
522
553
|
});
|
|
523
554
|
}
|
|
524
555
|
}
|
|
@@ -545,6 +576,7 @@ function checkPagePermissionGuardCoverage(consumingAppPath) {
|
|
|
545
576
|
code: guardProps,
|
|
546
577
|
severity: 'error',
|
|
547
578
|
fix: 'Add required props: <PagePermissionGuard pageName="page-name" operation="read">',
|
|
579
|
+
standardSection: 'Security Baseline (page protection)',
|
|
548
580
|
});
|
|
549
581
|
}
|
|
550
582
|
}
|
|
@@ -554,6 +586,62 @@ function checkPagePermissionGuardCoverage(consumingAppPath) {
|
|
|
554
586
|
return issues;
|
|
555
587
|
}
|
|
556
588
|
|
|
589
|
+
/**
|
|
590
|
+
* Check organisation ID resolution in consuming app source.
|
|
591
|
+
* When both selectedOrganisation and selectedEvent are in scope, RPC/params that pass
|
|
592
|
+
* organisation context (p_organisation_id, organisation_id, selectedOrganisationId) must use
|
|
593
|
+
* a derived organisationId (selectedOrganisation?.id ?? selectedEvent?.organisation_id) so that
|
|
594
|
+
* org is resolved correctly when an event is selected without an explicit org in the context selector.
|
|
595
|
+
* Reference: Standard 6 data isolation; pace-core Event has organisation_id.
|
|
596
|
+
*/
|
|
597
|
+
function checkOrganisationIdResolution(consumingAppPath) {
|
|
598
|
+
const issues = [];
|
|
599
|
+
const srcDir = path.join(consumingAppPath, 'src');
|
|
600
|
+
if (!directoryExists(srcDir)) {
|
|
601
|
+
return issues;
|
|
602
|
+
}
|
|
603
|
+
const sourceFiles = findSourceFiles(srcDir);
|
|
604
|
+
const orgParamKeys = ['p_organisation_id', 'organisation_id', 'selectedOrganisationId'];
|
|
605
|
+
const orgParamKeyPattern = new RegExp(
|
|
606
|
+
'\\b(' + orgParamKeys.join('|') + ')\\s*:\\s*([^,}\\n]+)',
|
|
607
|
+
'g'
|
|
608
|
+
);
|
|
609
|
+
const usesSelectedOrgIdInValue = /selectedOrganisation\s*(\?\.id|\.id)/;
|
|
610
|
+
|
|
611
|
+
sourceFiles.forEach((filePath) => {
|
|
612
|
+
if (filePath.includes('.test.') || filePath.includes('.spec.')) {
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
const content = readFileSafe(filePath);
|
|
616
|
+
if (!content) return;
|
|
617
|
+
const hasOrg = /selectedOrganisation|useOrganisations\s*\(/.test(content);
|
|
618
|
+
const hasEvent = /selectedEvent|useEvents\s*\(/.test(content);
|
|
619
|
+
if (!hasOrg || !hasEvent) return;
|
|
620
|
+
|
|
621
|
+
let match;
|
|
622
|
+
orgParamKeyPattern.lastIndex = 0;
|
|
623
|
+
while ((match = orgParamKeyPattern.exec(content)) !== null) {
|
|
624
|
+
const key = match[1];
|
|
625
|
+
const valuePart = match[2].trim();
|
|
626
|
+
if (!usesSelectedOrgIdInValue.test(valuePart)) continue;
|
|
627
|
+
if (/organisationId\b/.test(valuePart)) continue;
|
|
628
|
+
if (isInCommentOrString(content, match.index)) continue;
|
|
629
|
+
const lineNum = getLineNumber(content, match.index);
|
|
630
|
+
issues.push({
|
|
631
|
+
type: 'organisationIdResolution',
|
|
632
|
+
file: getRelativePath(filePath, consumingAppPath),
|
|
633
|
+
line: lineNum,
|
|
634
|
+
message: `Organisation context (${key}) is set from selectedOrganisation?.id while selectedEvent is also in scope. Use a derived organisationId (e.g. selectedOrganisation?.id ?? selectedEvent?.organisation_id) so org is resolved correctly when an event is selected without an explicit org.`,
|
|
635
|
+
code: getCodeSnippet(content, match.index, 0, 120),
|
|
636
|
+
severity: 'error',
|
|
637
|
+
fix: 'Derive organisationId = selectedOrganisation?.id ?? selectedEvent?.organisation_id ?? undefined (in a useMemo with [selectedOrganisation?.id, selectedEvent]) and use organisationId for all p_organisation_id, organisation_id, and selectedOrganisationId values.',
|
|
638
|
+
standardSection: 'Data isolation (organisation context resolution)',
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
});
|
|
642
|
+
return issues;
|
|
643
|
+
}
|
|
644
|
+
|
|
557
645
|
/**
|
|
558
646
|
* Check Edge Functions RBAC setup
|
|
559
647
|
*/
|
|
@@ -615,6 +703,7 @@ function checkEdgeFunctionsRBAC(consumingAppPath) {
|
|
|
615
703
|
message: 'Edge function uses isPermitted() but does not call setupRBAC(). Must call setupRBAC() before using RBAC functions.',
|
|
616
704
|
severity: 'error',
|
|
617
705
|
fix: 'Add: import { setupRBAC, isPermitted } from \'@jmruthers/pace-core/rbac\'; and call setupRBAC() at the start of the handler.',
|
|
706
|
+
standardSection: 'Edge Functions and Serverless Functions',
|
|
618
707
|
});
|
|
619
708
|
}
|
|
620
709
|
});
|
|
@@ -625,14 +714,16 @@ function checkEdgeFunctionsRBAC(consumingAppPath) {
|
|
|
625
714
|
/**
|
|
626
715
|
* Run audit for Standard 6: Security & RBAC
|
|
627
716
|
* @param {string} consumingAppPath - Path to consuming app
|
|
717
|
+
* @param {{ isPaceCorePackage?: boolean }} [auditContext] - Optional context (PaceLoginPage/Login are in public-page list)
|
|
628
718
|
* @returns {object} - Audit results with issues array
|
|
629
719
|
*/
|
|
630
|
-
function runStandard6Audit(consumingAppPath) {
|
|
720
|
+
function runStandard6Audit(consumingAppPath, auditContext = {}) {
|
|
631
721
|
const issues = [];
|
|
632
722
|
|
|
633
723
|
try {
|
|
634
724
|
issues.push(...checkRLSPolicies(consumingAppPath));
|
|
635
725
|
issues.push(...checkPagePermissionGuardCoverage(consumingAppPath));
|
|
726
|
+
issues.push(...checkOrganisationIdResolution(consumingAppPath));
|
|
636
727
|
issues.push(...checkEdgeFunctionsRBAC(consumingAppPath));
|
|
637
728
|
} catch (error) {
|
|
638
729
|
return {
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* Standard 7: API & Tech Stack Audit
|
|
3
3
|
* @package @jmruthers/pace-core
|
|
4
4
|
* @module Audit/Standard7
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
6
|
* Audits consuming apps for compliance with Standard 7: API & Tech Stack.
|
|
7
|
-
* Validates
|
|
8
|
-
*
|
|
7
|
+
* Validates tech stack versions and Vite configuration. RPC naming compliance
|
|
8
|
+
* (data_/app_ prefix, verbs) is audited by a separate DB audit tool that connects
|
|
9
|
+
* to the database directly; this file-based audit does not scan supabase/migrations.
|
|
10
|
+
*
|
|
9
11
|
* Reference: packages/core/docs/standards/7-api-tech-stack-standards.md
|
|
10
12
|
*/
|
|
11
13
|
|
|
@@ -15,24 +17,22 @@ const { findSQLFiles, findConfigFiles, readFileSafe, getRelativePath, findPaceCo
|
|
|
15
17
|
const { getLineNumber, getCodeSnippet, isInCommentOrStringSQL } = require('../utils/code-utils.cjs');
|
|
16
18
|
|
|
17
19
|
/**
|
|
18
|
-
* Check RPC naming in SQL migrations (data_* for reads, app_* for writes)
|
|
20
|
+
* Check RPC naming in SQL migrations (data_* for reads, app_* for writes).
|
|
21
|
+
* SKIPPED: This audit does not scan migration files. RPC naming compliance is
|
|
22
|
+
* audited by a separate DB audit tool that connects to the database directly.
|
|
19
23
|
*/
|
|
20
24
|
function checkRPCNaming(consumingAppPath) {
|
|
25
|
+
return [];
|
|
26
|
+
/* Migration-based RPC checks disabled - see DB audit tool
|
|
21
27
|
const issues = [];
|
|
22
|
-
|
|
23
|
-
// Find SQL migration files
|
|
24
28
|
const migrationsPath = path.join(consumingAppPath, 'supabase', 'migrations');
|
|
25
29
|
const altMigrationsPath = path.join(consumingAppPath, 'migrations');
|
|
26
|
-
|
|
27
|
-
const migrationsDir = fs.existsSync(migrationsPath) ? migrationsPath :
|
|
30
|
+
const migrationsDir = fs.existsSync(migrationsPath) ? migrationsPath :
|
|
28
31
|
(fs.existsSync(altMigrationsPath) ? altMigrationsPath : null);
|
|
29
|
-
|
|
30
32
|
if (!migrationsDir) {
|
|
31
|
-
return issues;
|
|
33
|
+
return issues;
|
|
32
34
|
}
|
|
33
|
-
|
|
34
35
|
const sqlFiles = findSQLFiles(migrationsDir);
|
|
35
|
-
|
|
36
36
|
sqlFiles.forEach(filePath => {
|
|
37
37
|
try {
|
|
38
38
|
const content = readFileSafe(filePath);
|
|
@@ -76,6 +76,7 @@ function checkRPCNaming(consumingAppPath) {
|
|
|
76
76
|
code: getCodeSnippet(content, functionStart, 0, 100),
|
|
77
77
|
severity: 'error',
|
|
78
78
|
fix: `Rename function to follow pattern: data_${functionName} (for read) or app_${functionName} (for write)`,
|
|
79
|
+
standardSection: 'API & RPC Naming Conventions (RPC Naming Pattern / Naming Rules)',
|
|
79
80
|
});
|
|
80
81
|
continue;
|
|
81
82
|
}
|
|
@@ -97,6 +98,7 @@ function checkRPCNaming(consumingAppPath) {
|
|
|
97
98
|
code: getCodeSnippet(content, functionStart, 0, 100),
|
|
98
99
|
severity: 'error',
|
|
99
100
|
fix: `Rename RPC to use valid verb: ${functionName.replace(verb, validVerbs[0])}`,
|
|
101
|
+
standardSection: 'API & RPC Naming Conventions (RPC Naming Pattern / Naming Rules)',
|
|
100
102
|
});
|
|
101
103
|
continue;
|
|
102
104
|
}
|
|
@@ -116,9 +118,10 @@ function checkRPCNaming(consumingAppPath) {
|
|
|
116
118
|
code: getCodeSnippet(content, functionStart, 0, 100),
|
|
117
119
|
severity: 'error',
|
|
118
120
|
fix: `Rename to app_${functionName.replace('data_', '')}`,
|
|
121
|
+
standardSection: 'API & RPC Naming Conventions (RPC Naming Pattern / Naming Rules)',
|
|
119
122
|
});
|
|
120
123
|
}
|
|
121
|
-
|
|
124
|
+
|
|
122
125
|
if (hasAppPrefix && isReadOperation) {
|
|
123
126
|
issues.push({
|
|
124
127
|
type: 'rpcNaming',
|
|
@@ -128,6 +131,7 @@ function checkRPCNaming(consumingAppPath) {
|
|
|
128
131
|
code: getCodeSnippet(content, functionStart, 0, 100),
|
|
129
132
|
severity: 'error',
|
|
130
133
|
fix: `Rename to data_${functionName.replace('app_', '')}`,
|
|
134
|
+
standardSection: 'API & RPC Naming Conventions (RPC Naming Pattern / Naming Rules)',
|
|
131
135
|
});
|
|
132
136
|
}
|
|
133
137
|
}
|
|
@@ -135,8 +139,8 @@ function checkRPCNaming(consumingAppPath) {
|
|
|
135
139
|
// Skip files that can't be read
|
|
136
140
|
}
|
|
137
141
|
});
|
|
138
|
-
|
|
139
142
|
return issues;
|
|
143
|
+
*/
|
|
140
144
|
}
|
|
141
145
|
|
|
142
146
|
/**
|
|
@@ -163,6 +167,11 @@ function checkTechStackVersions(consumingAppPath) {
|
|
|
163
167
|
...(packageJson.dependencies || {}),
|
|
164
168
|
...(packageJson.devDependencies || {}),
|
|
165
169
|
};
|
|
170
|
+
|
|
171
|
+
// When auditing the pace-core package, its peerDependencies satisfy required dependency check
|
|
172
|
+
if (packageJson.name === '@jmruthers/pace-core' && packageJson.peerDependencies) {
|
|
173
|
+
Object.assign(allDeps, packageJson.peerDependencies);
|
|
174
|
+
}
|
|
166
175
|
|
|
167
176
|
// Get pace-core package.json for peer dependencies
|
|
168
177
|
const paceCorePath = findPaceCorePackageJson(consumingAppPath);
|
|
@@ -185,6 +194,7 @@ function checkTechStackVersions(consumingAppPath) {
|
|
|
185
194
|
message: `Missing required dependency: ${dep}. Required version: ${peerDeps[dep] || 'latest'}`,
|
|
186
195
|
severity: 'error',
|
|
187
196
|
fix: `Install ${dep}: npm install ${dep}@${peerDeps[dep] || 'latest'}`,
|
|
197
|
+
standardSection: 'Required Tech Stack / Version Requirements',
|
|
188
198
|
});
|
|
189
199
|
}
|
|
190
200
|
});
|
|
@@ -202,6 +212,7 @@ function checkTechStackVersions(consumingAppPath) {
|
|
|
202
212
|
message: `React version ${reactVersion} is below required version 19+. pace-core requires React 19+.`,
|
|
203
213
|
severity: 'error',
|
|
204
214
|
fix: 'Upgrade React: npm install react@^19.0.0 react-dom@^19.0.0',
|
|
215
|
+
standardSection: 'Required Tech Stack (React 19+)',
|
|
205
216
|
});
|
|
206
217
|
}
|
|
207
218
|
}
|
|
@@ -239,6 +250,7 @@ function checkViteConfig(consumingAppPath) {
|
|
|
239
250
|
message: 'vite.config.ts missing optimizeDeps.exclude. Should exclude @jmruthers/pace-core and react-router-dom to prevent React context mismatches.',
|
|
240
251
|
severity: 'warning',
|
|
241
252
|
fix: 'Add: optimizeDeps: { exclude: [\'@jmruthers/pace-core\', \'react-router-dom\'] }',
|
|
253
|
+
standardSection: 'Tech Stack Configuration (Vite Configuration)',
|
|
242
254
|
});
|
|
243
255
|
} else {
|
|
244
256
|
// Check if pace-core is excluded
|
|
@@ -251,6 +263,7 @@ function checkViteConfig(consumingAppPath) {
|
|
|
251
263
|
message: 'vite.config.ts optimizeDeps.exclude should include @jmruthers/pace-core to prevent React context mismatches.',
|
|
252
264
|
severity: 'warning',
|
|
253
265
|
fix: 'Add \'@jmruthers/pace-core\' to optimizeDeps.exclude array',
|
|
266
|
+
standardSection: 'Tech Stack Configuration (Vite Configuration)',
|
|
254
267
|
});
|
|
255
268
|
}
|
|
256
269
|
}
|
|
@@ -304,6 +317,7 @@ function checkViteConfig(consumingAppPath) {
|
|
|
304
317
|
message: 'vite.config.ts resolve.dedupe is missing required dependencies. Should include: react, react-dom, react-router-dom',
|
|
305
318
|
severity: 'warning',
|
|
306
319
|
fix: 'Update resolve.dedupe to include: [\'react\', \'react-dom\', \'react-router-dom\']',
|
|
320
|
+
standardSection: 'Tech Stack Configuration (Vite Configuration)',
|
|
307
321
|
});
|
|
308
322
|
}
|
|
309
323
|
}
|
|
@@ -319,6 +333,7 @@ function checkViteConfig(consumingAppPath) {
|
|
|
319
333
|
message: 'vite.config.ts missing resolve.dedupe. Should dedupe React dependencies to prevent context mismatches.',
|
|
320
334
|
severity: 'warning',
|
|
321
335
|
fix: 'Add: resolve: { dedupe: [\'react\', \'react-dom\', \'react-router-dom\'] }',
|
|
336
|
+
standardSection: 'Tech Stack Configuration (Vite Configuration)',
|
|
322
337
|
});
|
|
323
338
|
}
|
|
324
339
|
|
|
@@ -328,9 +343,10 @@ function checkViteConfig(consumingAppPath) {
|
|
|
328
343
|
/**
|
|
329
344
|
* Run audit for Standard 7: API & Tech Stack
|
|
330
345
|
* @param {string} consumingAppPath - Path to consuming app
|
|
346
|
+
* @param {{ isPaceCorePackage?: boolean }} [auditContext] - Optional context (peerDeps satisfy required deps when package is pace-core)
|
|
331
347
|
* @returns {object} - Audit results with issues array
|
|
332
348
|
*/
|
|
333
|
-
function runStandard7Audit(consumingAppPath) {
|
|
349
|
+
function runStandard7Audit(consumingAppPath, auditContext = {}) {
|
|
334
350
|
const issues = [];
|
|
335
351
|
|
|
336
352
|
try {
|
|
@@ -47,6 +47,7 @@ function checkTestTimeoutConfig(consumingAppPath) {
|
|
|
47
47
|
message: 'vitest.config.ts missing test timeout configuration. Tests may hang indefinitely without timeouts.',
|
|
48
48
|
severity: 'error',
|
|
49
49
|
fix: 'Add: test: { testTimeout: 10000, hookTimeout: 10000, teardownTimeout: 5000 }',
|
|
50
|
+
standardSection: 'Test Timeouts',
|
|
50
51
|
});
|
|
51
52
|
}
|
|
52
53
|
}
|
|
@@ -74,6 +75,7 @@ function checkTestTimeoutConfig(consumingAppPath) {
|
|
|
74
75
|
message: 'Test scripts missing timeout configuration. Tests may hang indefinitely without timeouts.',
|
|
75
76
|
severity: 'error',
|
|
76
77
|
fix: 'Add --test-timeout=10000 to test scripts or configure in vitest.config.ts',
|
|
78
|
+
standardSection: 'Test Timeouts',
|
|
77
79
|
});
|
|
78
80
|
}
|
|
79
81
|
} catch (error) {
|
|
@@ -125,6 +127,7 @@ function checkTestingTools(consumingAppPath) {
|
|
|
125
127
|
message: `Missing required testing tool: ${name} (${description})`,
|
|
126
128
|
severity: 'warning',
|
|
127
129
|
fix: `Install: npm install --save-dev ${name}`,
|
|
130
|
+
standardSection: 'Testing Tools',
|
|
128
131
|
});
|
|
129
132
|
}
|
|
130
133
|
});
|
|
@@ -165,6 +168,7 @@ function checkTestStructure(consumingAppPath) {
|
|
|
165
168
|
message: 'Test file uses .spec extension. Should use .test extension for consistency.',
|
|
166
169
|
severity: 'warning',
|
|
167
170
|
fix: `Rename to ${testFile.replace('.spec.', '.test.')}`,
|
|
171
|
+
standardSection: 'Test Structure / Test File Naming',
|
|
168
172
|
});
|
|
169
173
|
}
|
|
170
174
|
});
|
|
@@ -175,14 +179,18 @@ function checkTestStructure(consumingAppPath) {
|
|
|
175
179
|
/**
|
|
176
180
|
* Run audit for Standard 8: Testing & Documentation
|
|
177
181
|
* @param {string} consumingAppPath - Path to consuming app
|
|
182
|
+
* @param {{ isPaceCorePackage?: boolean }} [auditContext] - When isPaceCorePackage, skip checkTestingTools (vitest may be at workspace root)
|
|
178
183
|
* @returns {object} - Audit results with issues array
|
|
179
184
|
*/
|
|
180
|
-
function runStandard8Audit(consumingAppPath) {
|
|
185
|
+
function runStandard8Audit(consumingAppPath, auditContext = {}) {
|
|
181
186
|
const issues = [];
|
|
182
|
-
|
|
187
|
+
const isPaceCorePackage = auditContext.isPaceCorePackage === true;
|
|
188
|
+
|
|
183
189
|
try {
|
|
184
190
|
issues.push(...checkTestTimeoutConfig(consumingAppPath));
|
|
185
|
-
|
|
191
|
+
if (!isPaceCorePackage) {
|
|
192
|
+
issues.push(...checkTestingTools(consumingAppPath));
|
|
193
|
+
}
|
|
186
194
|
issues.push(...checkTestStructure(consumingAppPath));
|
|
187
195
|
} catch (error) {
|
|
188
196
|
return {
|