@jmruthers/pace-core 0.6.6 → 0.6.7

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.
Files changed (246) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +12 -13
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +255 -0
  4. package/audit-tool/audits/03-architecture.cjs +196 -0
  5. package/audit-tool/audits/04-code-quality.cjs +149 -0
  6. package/audit-tool/audits/05-styling.cjs +224 -0
  7. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  9. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  10. package/audit-tool/audits/09-operations.cjs +208 -0
  11. package/audit-tool/index.cjs +291 -0
  12. package/audit-tool/utils/code-utils.cjs +218 -0
  13. package/audit-tool/utils/file-utils.cjs +230 -0
  14. package/audit-tool/utils/report-utils.cjs +241 -0
  15. package/cursor-rules/00-standards-overview.mdc +156 -0
  16. package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
  17. package/cursor-rules/02-project-structure.mdc +37 -5
  18. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
  19. package/cursor-rules/04-code-quality.mdc +419 -0
  20. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
  21. package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
  22. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  23. package/cursor-rules/08-testing-documentation.mdc +324 -0
  24. package/cursor-rules/09-operations.mdc +365 -0
  25. package/dist/DataTable-7PMH7XN7.js +15 -0
  26. package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  27. package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +26 -16
  28. package/dist/{chunk-FENMYN2U.js → chunk-5X4QLXRG.js} +1 -3
  29. package/dist/{chunk-4T7OBVTU.js → chunk-6F3IILHI.js} +1 -1
  30. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  31. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  32. package/dist/{chunk-7TYHROIV.js → chunk-BM4CQ5P3.js} +50 -8
  33. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  34. package/dist/{chunk-OHIK3MIO.js → chunk-GHYHJTYV.js} +2 -2
  35. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  36. package/dist/{chunk-LAZMKTTF.js → chunk-JGWDVX64.js} +281 -347
  37. package/dist/{chunk-MAGBIDNS.js → chunk-L4XMVJKY.js} +2 -2
  38. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  39. package/dist/{chunk-ZS5VO5JB.js → chunk-Q7Q7V5NV.js} +406 -451
  40. package/dist/{chunk-3O3WHILE.js → chunk-VBCS3DUA.js} +236 -60
  41. package/dist/{chunk-BVP2BCJF.js → chunk-ZKAWKYT4.js} +8 -8
  42. package/dist/components.d.ts +5 -4
  43. package/dist/components.js +27 -32
  44. package/dist/eslint-rules/index.cjs +22 -9
  45. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  46. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  47. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  48. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +26 -10
  49. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  50. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  51. package/dist/hooks.d.ts +5 -5
  52. package/dist/hooks.js +6 -6
  53. package/dist/index.d.ts +6 -6
  54. package/dist/index.js +18 -17
  55. package/dist/rbac/index.js +6 -6
  56. package/dist/theming/runtime.d.ts +14 -1
  57. package/dist/theming/runtime.js +1 -1
  58. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  59. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  60. package/dist/utils.d.ts +2 -2
  61. package/dist/utils.js +8 -8
  62. package/docs/README.md +1 -1
  63. package/docs/api/modules.md +47 -31
  64. package/docs/api-reference/components.md +18 -20
  65. package/docs/api-reference/hooks.md +80 -80
  66. package/docs/api-reference/types.md +1 -1
  67. package/docs/api-reference/utilities.md +1 -1
  68. package/docs/architecture/README.md +1 -1
  69. package/docs/core-concepts/events.md +3 -3
  70. package/docs/core-concepts/organisations.md +6 -6
  71. package/docs/core-concepts/permissions.md +6 -6
  72. package/docs/documentation-index.md +12 -18
  73. package/docs/getting-started/documentation-index.md +1 -1
  74. package/docs/getting-started/examples/README.md +4 -4
  75. package/docs/getting-started/examples/full-featured-app.md +1 -1
  76. package/docs/getting-started/faq.md +2 -2
  77. package/docs/getting-started/quick-reference.md +4 -4
  78. package/docs/implementation-guides/authentication.md +15 -15
  79. package/docs/implementation-guides/component-styling.md +1 -1
  80. package/docs/implementation-guides/data-tables.md +126 -33
  81. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  82. package/docs/implementation-guides/dynamic-colors.md +3 -3
  83. package/docs/implementation-guides/file-upload-storage.md +2 -2
  84. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  85. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  86. package/docs/implementation-guides/large-datasets.md +3 -2
  87. package/docs/implementation-guides/organisation-security.md +2 -2
  88. package/docs/implementation-guides/performance.md +2 -2
  89. package/docs/implementation-guides/permission-enforcement.md +1 -1
  90. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  91. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  92. package/docs/rbac/README.md +5 -5
  93. package/docs/rbac/advanced-patterns.md +6 -6
  94. package/docs/rbac/api-reference.md +20 -20
  95. package/docs/rbac/event-based-apps.md +3 -3
  96. package/docs/rbac/examples.md +41 -41
  97. package/docs/rbac/getting-started.md +37 -37
  98. package/docs/rbac/performance.md +1 -1
  99. package/docs/rbac/quick-start.md +52 -52
  100. package/docs/rbac/secure-client-protection.md +1 -1
  101. package/docs/rbac/troubleshooting.md +1 -1
  102. package/docs/security/README.md +5 -5
  103. package/docs/standards/0-standards-overview.md +220 -0
  104. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +204 -185
  105. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  106. package/docs/standards/3-architecture-standards.md +606 -0
  107. package/docs/standards/4-code-quality-standards.md +728 -0
  108. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  109. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  110. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  111. package/docs/standards/8-testing-documentation-standards.md +401 -0
  112. package/docs/standards/9-operations-standards.md +1102 -0
  113. package/docs/standards/README.md +203 -104
  114. package/docs/troubleshooting/README.md +4 -4
  115. package/docs/troubleshooting/common-issues.md +2 -2
  116. package/docs/troubleshooting/debugging.md +9 -9
  117. package/docs/troubleshooting/migration.md +4 -4
  118. package/eslint-config-pace-core.cjs +21 -10
  119. package/package.json +6 -5
  120. package/scripts/install-cursor-rules.cjs +11 -243
  121. package/scripts/install-eslint-config.cjs +284 -0
  122. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  123. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  124. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +10 -10
  125. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  126. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  127. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  128. package/src/__tests__/templates/component.test.template.tsx +18 -15
  129. package/src/components/Calendar/Calendar.tsx +201 -47
  130. package/src/components/ContextSelector/ContextSelector.tsx +137 -153
  131. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  132. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  133. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  134. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  135. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  136. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  137. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  138. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  139. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  140. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  141. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  142. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  143. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  144. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  145. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  146. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  147. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  148. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  149. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  150. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  151. package/src/components/DataTable/components/index.ts +2 -1
  152. package/src/components/DataTable/types.ts +0 -18
  153. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  154. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  155. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  156. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  157. package/src/components/Dialog/Dialog.test.tsx +1 -0
  158. package/src/components/Dialog/Dialog.tsx +25 -8
  159. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  160. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  161. package/src/components/FileUpload/FileUpload.tsx +112 -130
  162. package/src/components/Progress/Progress.tsx +2 -4
  163. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  164. package/src/components/Select/Select.tsx +86 -77
  165. package/src/components/Select/types.ts +3 -0
  166. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  167. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  168. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  169. package/src/hooks/public/usePublicEvent.ts +5 -5
  170. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  171. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  172. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  173. package/src/hooks/useAppConfig.ts +2 -2
  174. package/src/hooks/useEventTheme.test.ts +7 -7
  175. package/src/hooks/useEventTheme.ts +1 -4
  176. package/src/hooks/useFileDisplay.ts +2 -2
  177. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  178. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  179. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  180. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  181. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  182. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  183. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  184. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  185. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  186. package/src/styles/core.css +7 -0
  187. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  188. package/src/theming/parseEventColours.ts +22 -10
  189. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  190. package/src/utils/storage/README.md +1 -1
  191. package/cursor-rules/01-standards-compliance.mdc +0 -285
  192. package/cursor-rules/04-testing-standards.mdc +0 -270
  193. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  194. package/cursor-rules/06-code-quality.mdc +0 -311
  195. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  196. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  197. package/cursor-rules/11-performance-optimization.mdc +0 -169
  198. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  199. package/dist/DataTable-LRJL4IRV.js +0 -15
  200. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  201. package/dist/eslint-rules/rules/components.cjs +0 -113
  202. package/dist/eslint-rules/rules/imports.cjs +0 -102
  203. package/docs/best-practices/README.md +0 -472
  204. package/docs/best-practices/accessibility.md +0 -604
  205. package/docs/best-practices/common-patterns.md +0 -516
  206. package/docs/best-practices/deployment.md +0 -1103
  207. package/docs/best-practices/performance.md +0 -1328
  208. package/docs/best-practices/security.md +0 -940
  209. package/docs/best-practices/testing.md +0 -1034
  210. package/docs/rbac/compliance/compliance-guide.md +0 -544
  211. package/docs/standards/01-standards-compliance.md +0 -188
  212. package/docs/standards/03-solid-principles.md +0 -39
  213. package/docs/standards/04-testing-standards.md +0 -36
  214. package/docs/standards/05-bug-reports-and-features.md +0 -27
  215. package/docs/standards/06-code-quality.md +0 -34
  216. package/docs/standards/07-tech-stack-compliance.md +0 -30
  217. package/docs/standards/10-error-handling-patterns.md +0 -401
  218. package/docs/standards/11-performance-optimization.md +0 -348
  219. package/docs/standards/12-ci-cd-integration.md +0 -370
  220. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  221. package/scripts/audit/audit-compliance.cjs +0 -1295
  222. package/scripts/audit/audit-components.cjs +0 -260
  223. package/scripts/audit/audit-rbac.cjs +0 -954
  224. package/scripts/audit/audit-standards.cjs +0 -1268
  225. package/scripts/audit/index.cjs +0 -1927
  226. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  227. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  228. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  229. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  230. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  231. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  232. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  233. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  234. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  235. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  236. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  237. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  238. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  239. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  240. package/src/components/DataTable/utils/debugTools.ts +0 -514
  241. package/src/eslint-rules/index.cjs +0 -22
  242. package/src/eslint-rules/rules/components.cjs +0 -113
  243. package/src/eslint-rules/rules/imports.cjs +0 -102
  244. package/src/eslint-rules/rules/rbac.cjs +0 -790
  245. package/src/eslint-rules/utils/helpers.cjs +0 -42
  246. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -1,6 +1,6 @@
1
- # Styling Standard for Consuming Apps
1
+ # Styling Standards
2
2
 
3
- **🤖 Cursor Rule**: See [08-markup-quality.mdc](../../cursor-rules/08-markup-quality.mdc) for AI-optimized directives that automatically enforce markup quality (this rule is ALWAYS APPLIED).
3
+ **🤖 Cursor Rule**: See [05-styling.mdc](../../cursor-rules/05-styling.mdc) for AI-optimized directives that automatically enforce markup quality (this rule is ALWAYS APPLIED).
4
4
 
5
5
  ## Purpose
6
6
 
@@ -11,7 +11,8 @@ This standard defines the **REQUIRED** configuration for consuming apps to prope
11
11
  - ✅ Tailwind v4 content scanning works properly
12
12
  - ✅ Consistent styling across all PACE suite applications
13
13
 
14
- ## Component & Markup Guidance (aligns with Cursor rules)
14
+ ## Component & Markup Guidance
15
+
15
16
  - Components should be stateless when possible, fully typed, and accessibility-first.
16
17
  - Prefer semantic HTML elements; use `<div>` only when no semantic element fits or when required by a library.
17
18
  - Use React Fragments for grouping instead of wrapper nodes; keep markup minimal and avoid wrappers solely for styling.
@@ -20,12 +21,14 @@ This standard defines the **REQUIRED** configuration for consuming apps to prope
20
21
  - Apply layout utilities to existing semantic parents or pace-core layout components.
21
22
 
22
23
  ### Component Principles
24
+
23
25
  - Stateless when possible; keep surface area small and composable.
24
26
  - Accessible by default with correct roles, keyboard support, and visible focus.
25
27
  - UI primitives only; never add domain logic or data fetching inside components.
26
28
  - Support controlled + uncontrolled usage where applicable.
27
29
 
28
30
  ### Testing Expectations
31
+
29
32
  - Use React Testing Library + userEvent.
30
33
  - Test key interactions; snapshots only for simple components.
31
34
  - Keep components small—move non-UI logic to hooks/services.
@@ -185,7 +188,7 @@ import '@jmruthers/pace-core/styles/core.css'; /* ❌ WRONG */
185
188
 
186
189
  **All shades (50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950) plus `-raw` are REQUIRED.**
187
190
 
188
- ## Required Import in Entry Point (and avoiding duplicate imports)
191
+ ## Required Import in Entry Point
189
192
 
190
193
  **MUST** import `app.css` in your entry point (e.g., `src/main.tsx`):
191
194
 
@@ -209,7 +212,7 @@ When you have additional entry points (storybook, tests, preview servers):
209
212
  - If you need raw styles for non-React tooling, **import `@jmruthers/pace-core/styles/core.css` once** in that tool-specific stylesheet, never alongside `app.css`.
210
213
  - If you are unsure, default to a single `app.css` import and remove any extra `core.css` imports.
211
214
 
212
- ## Styling & Markup Rules (aligns with Cursor)
215
+ ## Styling & Markup Rules
213
216
 
214
217
  - **No inline styles**: Do not use `style={{ ... }}` except when a third-party library strictly requires it. Prefer pace-core variants + Tailwind utilities.
215
218
  - **Use theme tokens only**: Avoid arbitrary Tailwind colors (`text-gray-500`, `bg-red-500`) and bracket syntax (`bg-[oklch(...)]`). Use `main-*`, `sec-*`, `acc-*`, or semantic tokens like `text-foreground`.
@@ -334,12 +337,12 @@ import './app.css';
334
337
 
335
338
  ## Related Documentation
336
339
 
337
- - [PACE Core Styling Guide](../styles/README.md) - Complete styling documentation
338
- - [Project Structure Guide](./00-project-structure-guide.md) - File organization standards
339
- - [Component Standard](./03-component-standard.md) - Component development standards
340
+ - [Standards Overview](./0-standards-overview.md) - Standards system overview
341
+ - [Project Structure](./2-project-structure-standards.md) - File organization standards
342
+ - [Architecture](./3-architecture-standards.md) - Component development standards
340
343
 
341
344
  ---
342
345
 
343
346
  **Last Updated:** 2025-01-28
344
- **Version:** 1.0.0
347
+ **Version:** 2.0.0
345
348
  **Applies to:** All consuming apps using `@jmruthers/pace-core`
@@ -1,17 +1,13 @@
1
- ---
2
- lastUpdated: 2025-01-28T00:00:00+11:00
3
- version: 0.5.182
4
- reviewedBy: rls-audit-and-fixes
5
- ---
6
-
7
- # RBAC and RLS Standard
1
+ # Security & RBAC Standards
8
2
 
9
- **🤖 Cursor Rule**: See [09-rbac-compliance.mdc](../../cursor-rules/09-rbac-compliance.mdc) for AI-optimized directives that automatically enforce RBAC contract compliance (ESLint-enforced).
3
+ **🤖 Cursor Rule**: See [06-security-rbac.mdc](../../cursor-rules/06-security-rbac.mdc) for AI-optimized directives that automatically enforce RBAC contract compliance (ESLint-enforced).
10
4
 
11
5
  ## Purpose
12
6
 
13
7
  Define standards for Row-Level Security (RLS) policies and Role-Based Access Control (RBAC) integration to ensure security, performance, and maintainability.
14
8
 
9
+ **Note:** General performance optimization patterns (React, caching, bundle size) are covered in [Operations Standards](./9-operations-standards.md). This document focuses on RLS-specific performance requirements.
10
+
15
11
  ## Principles
16
12
 
17
13
  - **Performance First**: All RLS policies must use optimized helper functions
@@ -426,6 +422,52 @@ USING (
426
422
 
427
423
  **Example:** `file_references`, `pace_address` (can be either organisation or user-scoped)
428
424
 
425
+ **Real-World Example: File References Table**
426
+
427
+ ```sql
428
+ -- Real-world example: file_references table supports both organisation and user-scoped files
429
+ CREATE POLICY "rbac_select_file_references" ON file_references
430
+ FOR SELECT
431
+ USING (
432
+ -- Service role can access all files (for system operations)
433
+ is_service_role()
434
+ OR
435
+ -- Organisation-scoped files (shared within organisation)
436
+ (
437
+ organisation_id IS NOT NULL
438
+ AND is_authenticated_user()
439
+ AND (
440
+ is_super_admin(safe_get_user_id_for_rls())
441
+ OR check_user_organisation_access(organisation_id)
442
+ )
443
+ )
444
+ OR
445
+ -- User-scoped files (personal files)
446
+ (
447
+ organisation_id IS NULL
448
+ AND is_authenticated_user()
449
+ AND get_effective_user_id() = user_id
450
+ )
451
+ );
452
+
453
+ -- INSERT policy: Users can upload files to their organisation or personal storage
454
+ CREATE POLICY "rbac_insert_file_references" ON file_references
455
+ FOR INSERT TO authenticated
456
+ WITH CHECK (
457
+ -- Organisation-scoped: Must have organisation access
458
+ (
459
+ organisation_id IS NOT NULL
460
+ AND check_user_organisation_access(organisation_id)
461
+ )
462
+ OR
463
+ -- User-scoped: Must be own user_id
464
+ (
465
+ organisation_id IS NULL
466
+ AND get_effective_user_id() = user_id
467
+ )
468
+ );
469
+ ```
470
+
429
471
  ### Service Role Policy
430
472
 
431
473
  **Use Case:** Allow service_role to bypass RLS for system operations.
@@ -476,6 +518,66 @@ USING (
476
518
 
477
519
  **Example:** `event` (public events), `forms` (published forms)
478
520
 
521
+ **Real-World Example: Public Event Registration**
522
+
523
+ ```sql
524
+ -- Real-world example: Events table with public registration
525
+ -- Public users can view and register for public events
526
+ -- Authenticated users can view all events in their organisation
527
+
528
+ -- Public access: Anonymous users can view public events
529
+ CREATE POLICY "public_select_events" ON events
530
+ FOR SELECT TO anon
531
+ USING (
532
+ is_public = true
533
+ AND organisation_id IS NOT NULL
534
+ AND status = 'published'
535
+ );
536
+
537
+ -- Authenticated access: Users can view events in their organisation
538
+ CREATE POLICY "rbac_select_events" ON events
539
+ FOR SELECT TO authenticated
540
+ USING (
541
+ -- Public events (anyone can see)
542
+ (is_public = true AND organisation_id IS NOT NULL)
543
+ OR
544
+ -- Organisation events (members can see)
545
+ (
546
+ organisation_id IS NOT NULL
547
+ AND (
548
+ is_super_admin(safe_get_user_id_for_rls())
549
+ OR check_user_organisation_access(organisation_id)
550
+ )
551
+ )
552
+ );
553
+
554
+ -- Public registration: Anonymous users can create registrations for public events
555
+ CREATE POLICY "public_insert_event_registrations" ON event_registrations
556
+ FOR INSERT TO anon
557
+ WITH CHECK (
558
+ -- Only for public events
559
+ event_id IN (
560
+ SELECT id FROM events
561
+ WHERE is_public = true AND status = 'published'
562
+ )
563
+ );
564
+
565
+ -- Authenticated registration: Users can register for events in their organisation
566
+ CREATE POLICY "rbac_insert_event_registrations" ON event_registrations
567
+ FOR INSERT TO authenticated
568
+ WITH CHECK (
569
+ -- Must have access to the event's organisation
570
+ event_id IN (
571
+ SELECT id FROM events
572
+ WHERE organisation_id IS NOT NULL
573
+ AND (
574
+ is_super_admin(safe_get_user_id_for_rls())
575
+ OR check_user_organisation_access(organisation_id)
576
+ )
577
+ )
578
+ );
579
+ ```
580
+
479
581
  **Combined Public + Authenticated Pattern:**
480
582
  ```sql
481
583
  -- Public access
@@ -494,7 +596,7 @@ USING (
494
596
  OR (
495
597
  organisation_id IS NOT NULL
496
598
  AND (
497
- is_super_admin()
599
+ is_super_admin(safe_get_user_id_for_rls())
498
600
  OR check_user_organisation_access(organisation_id)
499
601
  )
500
602
  )
@@ -519,7 +621,7 @@ USING (
519
621
  is_authenticated_user()
520
622
  AND organisation_id IS NOT NULL
521
623
  AND (
522
- is_super_admin()
624
+ is_super_admin(safe_get_user_id_for_rls())
523
625
  OR check_user_organisation_access(organisation_id)
524
626
  )
525
627
  )
@@ -710,7 +812,8 @@ export async function checkPermission(userId: string, permission: string) {
710
812
  5. **MUST NOT** create custom RBAC helper functions
711
813
  6. **MUST NOT** call `rbac_check_permission_simplified` RPC directly
712
814
 
713
- ## Security Baseline (aligns with Security Standard)
815
+ ## Security Baseline
816
+
714
817
  - Never bypass RLS; validate all inputs and sanitize logs (no tokens/PII).
715
818
  - Use safe, user-friendly error messaging.
716
819
  - Prefer pace-core security helpers and secure clients (`useSecureSupabase`, RBAC helpers) over custom implementations.
@@ -779,17 +882,17 @@ Tables are assigned to specific apps for RBAC permission checking:
779
882
  supabase advisors security
780
883
  ```
781
884
 
782
- 3. **Run Database Tests**:
885
+ 2. **Run Database Tests**:
783
886
  ```bash
784
887
  timeout 120 npm run test:db
785
888
  ```
786
889
 
787
- 4. **Run Application Tests**:
890
+ 3. **Run Application Tests**:
788
891
  ```bash
789
892
  timeout 60 npm run test
790
893
  ```
791
894
 
792
- 5. **Verify Performance**:
895
+ 4. **Verify Performance**:
793
896
  - Use EXPLAIN ANALYZE to verify no InitPlan nodes
794
897
  - Verify queries complete in < 1 second
795
898
  - Check Supabase Advisors show zero `auth_rls_initplan` warnings
@@ -868,7 +971,12 @@ date +"%Y%m%d%H%M%S"
868
971
 
869
972
  ## Related Documentation
870
973
 
871
- - Security baseline (see section above)
872
- - [RLS Policy Remediation Plan](../troubleshooting/rls-policy-remediation-plan-combined.md)
873
- - [Database Unhealthiness Diagnosis](../troubleshooting/database-unhealthiness-diagnosis.md)
874
- - [RBAC-RLS Integration Guide](../rbac/rbac-rls-integration.md)
974
+ - [Standards Overview](./0-standards-overview.md) - Standards system overview
975
+ - [pace-core Compliance](./1-pace-core-compliance-standards.md) - Secure Supabase client usage
976
+ - [Operations](./9-operations-standards.md) - General performance patterns (React, caching, etc.)
977
+
978
+ ---
979
+
980
+ **Last Updated:** 2025-01-28
981
+ **Version:** 2.0.0
982
+ **Applies to:** All pace-core and consuming apps