@jmruthers/pace-core 0.5.180 → 0.5.182

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 (750) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +16 -2
  3. package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
  4. package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
  5. package/dist/{DataTable-4VSEJQ7D.js → DataTable-QAB34V6K.js} +14 -15
  6. package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
  7. package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
  8. package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
  9. package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
  10. package/dist/auth-BZOJqrdd.d.ts +49 -0
  11. package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
  12. package/dist/chunk-5DRSZLL2.js.map +1 -0
  13. package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
  14. package/dist/chunk-6C4YBBJM.js.map +1 -0
  15. package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
  16. package/dist/{chunk-6HLVGAZG.js → chunk-CSOFYHAG.js} +55 -162
  17. package/dist/chunk-CSOFYHAG.js.map +1 -0
  18. package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
  19. package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
  20. package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
  21. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  22. package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
  23. package/dist/chunk-FSFQFJCU.js.map +1 -0
  24. package/dist/chunk-FUEYYMX5.js +2296 -0
  25. package/dist/chunk-FUEYYMX5.js.map +1 -0
  26. package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
  27. package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
  28. package/dist/chunk-KQCRWDSA.js +1 -0
  29. package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
  30. package/dist/chunk-KUEN3HFB.js.map +1 -0
  31. package/dist/chunk-LMC26NLJ.js +84 -0
  32. package/dist/chunk-LMC26NLJ.js.map +1 -0
  33. package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
  34. package/dist/chunk-M7W4CP3M.js.map +1 -0
  35. package/dist/{chunk-CPTUD43C.js → chunk-MI7HBHN3.js} +164 -243
  36. package/dist/chunk-MI7HBHN3.js.map +1 -0
  37. package/dist/{chunk-N5YCCUG5.js → chunk-PWAHJW4G.js} +180 -29
  38. package/dist/chunk-PWAHJW4G.js.map +1 -0
  39. package/dist/chunk-PWLANIRT.js +127 -0
  40. package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
  41. package/dist/chunk-QCDXODCA.js +75 -0
  42. package/dist/chunk-QCDXODCA.js.map +1 -0
  43. package/dist/{chunk-P6UUHOIF.js → chunk-QETLRQI6.js} +526 -887
  44. package/dist/chunk-QETLRQI6.js.map +1 -0
  45. package/dist/{chunk-GQA2LIAE.js → chunk-QUVSNGIP.js} +264 -262
  46. package/dist/chunk-QUVSNGIP.js.map +1 -0
  47. package/dist/chunk-QXHPKYJV.js +113 -0
  48. package/dist/chunk-QXHPKYJV.js.map +1 -0
  49. package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
  50. package/dist/chunk-R77UEZ4E.js.map +1 -0
  51. package/dist/{chunk-ONI7Y733.js → chunk-RA3JUFMW.js} +314 -161
  52. package/dist/chunk-RA3JUFMW.js.map +1 -0
  53. package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
  54. package/dist/chunk-SQGMNID3.js.map +1 -0
  55. package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
  56. package/dist/chunk-UHNYIBXL.js.map +1 -0
  57. package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
  58. package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
  59. package/dist/{chunk-R53TUSFK.js → chunk-W22JP75J.js} +5 -13
  60. package/dist/{chunk-R53TUSFK.js.map → chunk-W22JP75J.js.map} +1 -1
  61. package/dist/components.d.ts +12 -93
  62. package/dist/components.js +23 -106
  63. package/dist/components.js.map +1 -1
  64. package/dist/core-CUElvH_C.d.ts +164 -0
  65. package/dist/database.generated-CBmg2950.d.ts +8284 -0
  66. package/dist/event-CW5YB_2p.d.ts +239 -0
  67. package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
  68. package/dist/functions-D_kgHktt.d.ts +208 -0
  69. package/dist/hooks.d.ts +54 -7
  70. package/dist/hooks.js +204 -17
  71. package/dist/hooks.js.map +1 -1
  72. package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
  73. package/dist/index.d.ts +94 -261
  74. package/dist/index.js +314 -126
  75. package/dist/index.js.map +1 -1
  76. package/dist/providers.d.ts +7 -8
  77. package/dist/providers.js +6 -13
  78. package/dist/rbac/index.d.ts +171 -101
  79. package/dist/rbac/index.js +23 -17
  80. package/dist/styles/index.d.ts +1 -3
  81. package/dist/styles/index.js +2 -17
  82. package/dist/theming/runtime.js +3 -3
  83. package/dist/types-UU913iLA.d.ts +102 -0
  84. package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
  85. package/dist/types.d.ts +88 -227
  86. package/dist/types.js +64 -112
  87. package/dist/types.js.map +1 -1
  88. package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
  89. package/dist/utils.d.ts +299 -13
  90. package/dist/utils.js +481 -55
  91. package/dist/utils.js.map +1 -1
  92. package/dist/validation-643vUDZW.d.ts +177 -0
  93. package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
  94. package/docs/README.md +9 -8
  95. package/docs/api/README.md +16 -2
  96. package/docs/api/classes/ColumnFactory.md +1 -1
  97. package/docs/api/classes/ErrorBoundary.md +1 -1
  98. package/docs/api/classes/InvalidScopeError.md +4 -4
  99. package/docs/api/classes/MissingUserContextError.md +4 -4
  100. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  101. package/docs/api/classes/PermissionDeniedError.md +4 -4
  102. package/docs/api/classes/RBACAuditManager.md +14 -14
  103. package/docs/api/classes/RBACCache.md +1 -1
  104. package/docs/api/classes/RBACEngine.md +2 -2
  105. package/docs/api/classes/RBACError.md +4 -4
  106. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  107. package/docs/api/classes/SecureSupabaseClient.md +29 -9
  108. package/docs/api/classes/StorageUtils.md +1 -1
  109. package/docs/api/enums/FileCategory.md +17 -17
  110. package/docs/api/enums/RBACErrorCode.md +228 -0
  111. package/docs/api/enums/RPCFunction.md +118 -0
  112. package/docs/api/interfaces/AggregateConfig.md +1 -1
  113. package/docs/api/interfaces/BadgeProps.md +1 -1
  114. package/docs/api/interfaces/ButtonProps.md +2 -2
  115. package/docs/api/interfaces/CalendarProps.md +1 -1
  116. package/docs/api/interfaces/CardProps.md +29 -3
  117. package/docs/api/interfaces/ColorPalette.md +1 -1
  118. package/docs/api/interfaces/ColorShade.md +1 -1
  119. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  120. package/docs/api/interfaces/DataRecord.md +1 -1
  121. package/docs/api/interfaces/DataTableAction.md +2 -2
  122. package/docs/api/interfaces/DataTableColumn.md +6 -6
  123. package/docs/api/interfaces/DataTableProps.md +1 -1
  124. package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
  125. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  126. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  127. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  128. package/docs/api/interfaces/ExportColumn.md +5 -5
  129. package/docs/api/interfaces/ExportOptions.md +4 -4
  130. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  131. package/docs/api/interfaces/FileMetadata.md +13 -13
  132. package/docs/api/interfaces/FileReference.md +12 -12
  133. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  134. package/docs/api/interfaces/FileUploadOptions.md +10 -10
  135. package/docs/api/interfaces/FileUploadProps.md +19 -19
  136. package/docs/api/interfaces/FooterProps.md +1 -1
  137. package/docs/api/interfaces/FormFieldProps.md +166 -0
  138. package/docs/api/interfaces/FormProps.md +113 -0
  139. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  140. package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
  141. package/docs/api/interfaces/InputProps.md +2 -2
  142. package/docs/api/interfaces/LabelProps.md +8 -8
  143. package/docs/api/interfaces/LoginFormProps.md +1 -1
  144. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  145. package/docs/api/interfaces/NavigationContextType.md +1 -1
  146. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  147. package/docs/api/interfaces/NavigationItem.md +17 -73
  148. package/docs/api/interfaces/NavigationMenuProps.md +38 -53
  149. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  150. package/docs/api/interfaces/Organisation.md +13 -13
  151. package/docs/api/interfaces/OrganisationContextType.md +21 -21
  152. package/docs/api/interfaces/OrganisationMembership.md +15 -15
  153. package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
  154. package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
  155. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
  156. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  157. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  158. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  159. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  160. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  161. package/docs/api/interfaces/PaletteData.md +1 -1
  162. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  163. package/docs/api/interfaces/ProgressProps.md +50 -0
  164. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  165. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  166. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  167. package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
  168. package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
  169. package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
  170. package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
  171. package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
  172. package/docs/api/interfaces/RBACConfig.md +2 -2
  173. package/docs/api/interfaces/RBACContext.md +52 -0
  174. package/docs/api/interfaces/RBACLogger.md +1 -1
  175. package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
  176. package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
  177. package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
  178. package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
  179. package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
  180. package/docs/api/interfaces/RBACResult.md +58 -0
  181. package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
  182. package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
  183. package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
  184. package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
  185. package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
  186. package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
  187. package/docs/api/interfaces/RBACRolesListParams.md +52 -0
  188. package/docs/api/interfaces/RBACRolesListResult.md +74 -0
  189. package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
  190. package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
  191. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  192. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  193. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  194. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  195. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  196. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  197. package/docs/api/interfaces/RouteConfig.md +1 -1
  198. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  199. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  200. package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
  201. package/docs/api/interfaces/StorageConfig.md +1 -1
  202. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  203. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  204. package/docs/api/interfaces/StorageListOptions.md +1 -1
  205. package/docs/api/interfaces/StorageListResult.md +1 -1
  206. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  207. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  208. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  209. package/docs/api/interfaces/StyleImport.md +1 -1
  210. package/docs/api/interfaces/SwitchProps.md +1 -1
  211. package/docs/api/interfaces/TabsContentProps.md +1 -1
  212. package/docs/api/interfaces/TabsListProps.md +1 -1
  213. package/docs/api/interfaces/TabsProps.md +1 -1
  214. package/docs/api/interfaces/TabsTriggerProps.md +43 -2
  215. package/docs/api/interfaces/TextareaProps.md +2 -2
  216. package/docs/api/interfaces/ToastActionElement.md +1 -1
  217. package/docs/api/interfaces/ToastProps.md +1 -1
  218. package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
  219. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  220. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  221. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  222. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  223. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  224. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  225. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  226. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
  227. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  228. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  229. package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
  230. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  231. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  232. package/docs/api/interfaces/UserEventAccess.md +1 -1
  233. package/docs/api/interfaces/UserMenuProps.md +4 -4
  234. package/docs/api/interfaces/UserProfile.md +7 -7
  235. package/docs/api/modules.md +484 -462
  236. package/docs/api-reference/components.md +186 -15
  237. package/docs/api-reference/deprecated.md +376 -0
  238. package/docs/api-reference/hooks.md +149 -19
  239. package/docs/api-reference/providers.md +61 -6
  240. package/docs/api-reference/rpc-functions.md +397 -0
  241. package/docs/api-reference/types.md +135 -78
  242. package/docs/api-reference/utilities.md +51 -380
  243. package/docs/architecture/README.md +49 -3
  244. package/docs/architecture/database-schema-requirements.md +40 -3
  245. package/docs/architecture/rbac-security-architecture.md +41 -4
  246. package/docs/architecture/services.md +127 -42
  247. package/docs/best-practices/README.md +51 -5
  248. package/docs/best-practices/accessibility.md +32 -3
  249. package/docs/best-practices/common-patterns.md +50 -3
  250. package/docs/best-practices/deployment.md +50 -4
  251. package/docs/best-practices/performance.md +50 -3
  252. package/docs/best-practices/security.md +94 -41
  253. package/docs/best-practices/testing.md +33 -4
  254. package/docs/core-concepts/authentication.md +5 -5
  255. package/docs/core-concepts/events.md +3 -3
  256. package/docs/core-concepts/organisations.md +3 -3
  257. package/docs/core-concepts/permissions.md +3 -3
  258. package/docs/core-concepts/rbac-system.md +5 -5
  259. package/docs/documentation-index.md +30 -8
  260. package/docs/getting-started/documentation-index.md +1 -1
  261. package/docs/getting-started/examples/README.md +7 -5
  262. package/docs/getting-started/examples/basic-auth-app.md +3 -0
  263. package/docs/getting-started/examples/full-featured-app.md +5 -3
  264. package/docs/getting-started/faq.md +6 -6
  265. package/docs/getting-started/installation-guide.md +192 -13
  266. package/docs/getting-started/local-development.md +303 -0
  267. package/docs/getting-started/quick-reference.md +3 -3
  268. package/docs/getting-started/quick-start.md +517 -0
  269. package/docs/implementation-guides/app-layout.md +45 -3
  270. package/docs/implementation-guides/authentication.md +66 -7
  271. package/docs/implementation-guides/component-styling.md +53 -3
  272. package/docs/implementation-guides/data-tables.md +76 -7
  273. package/docs/implementation-guides/datatable-filtering.md +1 -2
  274. package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
  275. package/docs/implementation-guides/dynamic-colors.md +155 -4
  276. package/docs/implementation-guides/file-reference-system.md +72 -3
  277. package/docs/implementation-guides/file-upload-storage.md +72 -3
  278. package/docs/implementation-guides/forms.md +53 -3
  279. package/docs/implementation-guides/inactivity-tracking.md +53 -3
  280. package/docs/implementation-guides/large-datasets.md +1 -1
  281. package/docs/implementation-guides/navigation.md +55 -5
  282. package/docs/implementation-guides/organisation-security.md +72 -3
  283. package/docs/implementation-guides/performance.md +57 -1
  284. package/docs/implementation-guides/permission-enforcement.md +81 -8
  285. package/docs/implementation-guides/public-pages.md +560 -14
  286. package/docs/migration/MIGRATION_GUIDE.md +409 -50
  287. package/docs/migration/README.md +37 -3
  288. package/docs/migration/organisation-context-timing-fix.md +39 -4
  289. package/docs/migration/quick-migration-guide.md +41 -5
  290. package/docs/migration/rbac-migration.md +59 -3
  291. package/docs/migration/service-architecture.md +77 -14
  292. package/docs/rbac/README.md +79 -3
  293. package/docs/rbac/advanced-patterns.md +47 -3
  294. package/docs/rbac/api-reference.md +77 -8
  295. package/docs/rbac/event-based-apps.md +50 -5
  296. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  297. package/docs/rbac/examples.md +39 -3
  298. package/docs/rbac/getting-started.md +63 -4
  299. package/docs/rbac/quick-start.md +57 -5
  300. package/docs/rbac/rbac-rls-integration.md +68 -6
  301. package/docs/rbac/super-admin-guide.md +47 -3
  302. package/docs/rbac/troubleshooting.md +3 -3
  303. package/docs/security/README.md +68 -3
  304. package/docs/security/checklist.md +50 -3
  305. package/docs/standards/01-architecture-standard.md +39 -0
  306. package/docs/standards/02-api-and-rpc-standard.md +39 -0
  307. package/docs/standards/03-component-standard.md +32 -0
  308. package/docs/standards/04-code-style-standard.md +32 -0
  309. package/docs/standards/05-security-standard.md +30 -0
  310. package/docs/standards/06-testing-and-docs-standard.md +29 -0
  311. package/docs/standards/README.md +35 -0
  312. package/docs/styles/README.md +89 -8
  313. package/docs/testing/README.md +175 -24
  314. package/docs/troubleshooting/README.md +50 -3
  315. package/docs/troubleshooting/common-issues.md +271 -5
  316. package/docs/troubleshooting/debugging.md +54 -1
  317. package/docs/troubleshooting/migration.md +54 -1
  318. package/docs/troubleshooting/organisation-context-setup.md +29 -3
  319. package/docs/troubleshooting/styling-issues.md +246 -4
  320. package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
  321. package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
  322. package/examples/{components 2/DataTable/HierarchicalExample.tsx → DataTable/HierarchicalExample.tsx} +8 -6
  323. package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
  324. package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
  325. package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
  326. package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
  327. package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
  328. package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
  329. package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
  330. package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
  331. package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
  332. package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
  333. package/examples/README.md +81 -33
  334. package/examples/index.ts +14 -12
  335. package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
  336. package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
  337. package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
  338. package/package.json +21 -27
  339. package/src/__tests__/helpers/test-utils.tsx +29 -3
  340. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
  341. package/src/components/Alert/Alert.test.tsx +2 -2
  342. package/src/components/Alert/Alert.tsx +4 -4
  343. package/src/components/Avatar/Avatar.test.tsx +17 -6
  344. package/src/components/Badge/Badge.test.tsx +1 -1
  345. package/src/components/Badge/Badge.tsx +2 -2
  346. package/src/components/Button/Button.test.tsx +2 -2
  347. package/src/components/Button/Button.tsx +11 -7
  348. package/src/components/Calendar/Calendar.test.tsx +41 -8
  349. package/src/components/Calendar/Calendar.tsx +39 -36
  350. package/src/components/Card/Card.tsx +51 -13
  351. package/src/components/Checkbox/Checkbox.test.tsx +36 -12
  352. package/src/components/DataTable/DataTable.test.tsx +1 -1
  353. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
  354. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
  355. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
  356. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
  357. package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
  358. package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
  359. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
  360. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
  361. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
  362. package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
  363. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
  364. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
  365. package/src/components/DataTable/components/DataTableBody.tsx +10 -25
  366. package/src/components/DataTable/components/DataTableCore.tsx +1 -1
  367. package/src/components/DataTable/components/FilterRow.tsx +3 -1
  368. package/src/components/DataTable/components/ImportModal.tsx +1 -1
  369. package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
  370. package/src/components/DataTable/core/ColumnFactory.ts +6 -6
  371. package/src/components/DataTable/core/DataTableContext.tsx +14 -10
  372. package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
  373. package/src/components/DataTable/core/PluginRegistry.ts +3 -3
  374. package/src/components/DataTable/core/StateManager.ts +12 -11
  375. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
  376. package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
  377. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
  378. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
  379. package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
  380. package/src/components/DataTable/core/interfaces.ts +17 -17
  381. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
  382. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
  383. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
  384. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
  385. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
  386. package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
  387. package/src/components/DataTable/types.ts +5 -5
  388. package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
  389. package/src/components/DataTable/utils/columnUtils.ts +3 -2
  390. package/src/components/DataTable/utils/debugTools.ts +1 -1
  391. package/src/components/DataTable/utils/exportUtils.ts +6 -6
  392. package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
  393. package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
  394. package/src/components/DataTable/utils/index.ts +0 -1
  395. package/src/components/DataTable/utils/performanceUtils.ts +9 -4
  396. package/src/components/Dialog/Dialog.test.tsx +49 -27
  397. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
  398. package/src/components/EventSelector/EventSelector.test.tsx +60 -12
  399. package/src/components/EventSelector/EventSelector.tsx +38 -15
  400. package/src/components/EventSelector/index.ts +2 -2
  401. package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
  402. package/src/components/FileDisplay/FileDisplay.tsx +1 -0
  403. package/src/components/FileUpload/FileUpload.test.tsx +532 -152
  404. package/src/components/FileUpload/FileUpload.tsx +43 -8
  405. package/src/components/Footer/Footer.test.tsx +19 -14
  406. package/src/components/Form/Form.test.tsx +96 -14
  407. package/src/components/Form/Form.tsx +210 -1
  408. package/src/components/Form/index.ts +3 -7
  409. package/src/components/Header/Header.test.tsx +24 -17
  410. package/src/components/Header/Header.tsx +3 -1
  411. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
  412. package/src/components/Input/Input.test.tsx +61 -36
  413. package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
  414. package/src/components/Label/Label.tsx +2 -3
  415. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
  416. package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
  417. package/src/components/LoginForm/LoginForm.test.tsx +14 -13
  418. package/src/components/LoginForm/LoginForm.tsx +1 -1
  419. package/src/components/LoginForm/index.ts +7 -0
  420. package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
  421. package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
  422. package/src/components/NavigationMenu/index.ts +1 -1
  423. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
  424. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  425. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
  426. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
  427. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
  428. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
  429. package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
  430. package/src/components/PaceAppLayout/test-setup.tsx +192 -0
  431. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
  432. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
  433. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
  434. package/src/components/PasswordChange/index.ts +2 -0
  435. package/src/components/Progress/Progress.test.tsx +11 -0
  436. package/src/components/Progress/Progress.tsx +1 -1
  437. package/src/components/Progress/index.ts +10 -0
  438. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
  439. package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
  440. package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
  441. package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
  442. package/src/components/PublicLayout/index.ts +10 -28
  443. package/src/components/Select/Select.test.tsx +7 -7
  444. package/src/components/Select/Select.tsx +277 -11
  445. package/src/components/Select/index.ts +1 -2
  446. package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
  447. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
  448. package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
  449. package/src/components/Tabs/Tabs.test.tsx +10 -9
  450. package/src/components/Tabs/Tabs.tsx +61 -33
  451. package/src/components/Textarea/Textarea.test.tsx +31 -18
  452. package/src/components/Toast/Toast.tsx +2 -2
  453. package/src/components/Tooltip/Tooltip.test.tsx +1 -1
  454. package/src/components/UserMenu/UserMenu.test.tsx +7 -6
  455. package/src/components/UserMenu/UserMenu.tsx +2 -2
  456. package/src/components/index.ts +5 -4
  457. package/src/constants/performance.ts +19 -8
  458. package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
  459. package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
  460. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  461. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
  462. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
  463. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
  464. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
  465. package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
  466. package/src/hooks/index.ts +4 -0
  467. package/src/hooks/public/index.ts +2 -0
  468. package/src/hooks/public/usePublicEvent.ts +4 -6
  469. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  470. package/src/hooks/services/useAuth.ts +2 -4
  471. package/src/hooks/services/useCurrentEvent.ts +1 -1
  472. package/src/hooks/useAppConfig.ts +1 -1
  473. package/src/hooks/useDataTablePerformance.ts +2 -2
  474. package/src/hooks/useEventTheme.ts +1 -1
  475. package/src/hooks/useEvents.ts +51 -10
  476. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  477. package/src/hooks/useOrganisationPermissions.ts +1 -1
  478. package/src/hooks/useOrganisationSecurity.ts +2 -2
  479. package/src/hooks/usePermissionCache.test.ts +9 -9
  480. package/src/hooks/usePermissionCache.ts +2 -2
  481. package/src/index.ts +19 -12
  482. package/src/providers/OrganisationProvider.tsx +73 -9
  483. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  484. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  485. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  486. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  487. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  488. package/src/providers/index.ts +0 -3
  489. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  490. package/src/providers/services/EventServiceProvider.tsx +11 -16
  491. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  492. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  493. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  494. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  495. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  496. package/src/rbac/adapters.tsx +1 -1
  497. package/src/rbac/api.ts +20 -4
  498. package/src/rbac/audit-enhanced.ts +47 -2
  499. package/src/rbac/audit.ts +47 -2
  500. package/src/rbac/components/NavigationGuard.tsx +1 -1
  501. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  502. package/src/rbac/components/NavigationProvider.tsx +1 -1
  503. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  504. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  505. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  506. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  507. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  508. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  509. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  510. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  511. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  512. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  513. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  514. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  515. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  516. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  517. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  518. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  519. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  520. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  521. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  522. package/src/rbac/hooks/index.ts +3 -0
  523. package/src/rbac/hooks/usePermissions.ts +31 -85
  524. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  525. package/src/rbac/hooks/useRBAC.ts +13 -67
  526. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  527. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  528. package/src/rbac/index.ts +3 -0
  529. package/src/rbac/secureClient.ts +53 -6
  530. package/src/rbac/security.ts +37 -1
  531. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  532. package/src/rbac/types.ts +3 -2
  533. package/src/services/AuthService.ts +33 -25
  534. package/src/services/EventService.ts +57 -31
  535. package/src/services/InactivityService.ts +33 -53
  536. package/src/services/OrganisationService.ts +36 -40
  537. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  538. package/src/services/__tests__/EventService.test.ts +67 -33
  539. package/src/services/interfaces/IEventService.ts +1 -1
  540. package/src/styles/core.css +2 -2
  541. package/src/styles/index.ts +1 -5
  542. package/src/types/__tests__/guards.test.ts +1 -1
  543. package/src/types/__tests__/type-validation.test.ts +0 -1
  544. package/src/types/auth.ts +42 -2
  545. package/src/types/core.ts +251 -0
  546. package/src/types/database.ts +11 -496
  547. package/src/types/event.ts +102 -0
  548. package/src/types/file-reference.ts +6 -4
  549. package/src/types/guards.ts +2 -1
  550. package/src/types/index.ts +48 -14
  551. package/src/types/lodash.debounce.d.ts +15 -0
  552. package/src/types/organisation.ts +14 -10
  553. package/src/types/supabase.ts +15 -17
  554. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  555. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  556. package/src/utils/app/appNameResolver.ts +1 -1
  557. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  558. package/src/utils/file-reference/index.ts +25 -6
  559. package/src/utils/security/secureErrors.ts +1 -1
  560. package/src/utils/validation/index.ts +6 -12
  561. package/src/utils/validation/validationUtils.ts +0 -13
  562. package/dist/UnifiedAuthProvider-BMJAP6Z7.js +0 -16
  563. package/dist/auth-DReDSLq9.d.ts +0 -16
  564. package/dist/chunk-56XJ3TU6.js +0 -11
  565. package/dist/chunk-56XJ3TU6.js.map +0 -1
  566. package/dist/chunk-6HLVGAZG.js.map +0 -1
  567. package/dist/chunk-7QCC6MCP.js +0 -288
  568. package/dist/chunk-BESYRHQM.js.map +0 -1
  569. package/dist/chunk-BJPBT3CU.js +0 -21
  570. package/dist/chunk-BJPBT3CU.js.map +0 -1
  571. package/dist/chunk-BVYWGZVV.js.map +0 -1
  572. package/dist/chunk-CPTUD43C.js.map +0 -1
  573. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  574. package/dist/chunk-ERGKJX4D.js +0 -15
  575. package/dist/chunk-ERGKJX4D.js.map +0 -1
  576. package/dist/chunk-ERISIBYU.js.map +0 -1
  577. package/dist/chunk-GQA2LIAE.js.map +0 -1
  578. package/dist/chunk-JISYG63F.js +0 -70
  579. package/dist/chunk-JISYG63F.js.map +0 -1
  580. package/dist/chunk-MSHEVJXS.js +0 -27
  581. package/dist/chunk-MSHEVJXS.js.map +0 -1
  582. package/dist/chunk-N5YCCUG5.js.map +0 -1
  583. package/dist/chunk-ONI7Y733.js.map +0 -1
  584. package/dist/chunk-OWAG3GSU.js.map +0 -1
  585. package/dist/chunk-P6UUHOIF.js.map +0 -1
  586. package/dist/chunk-PKW27QVS.js +0 -61
  587. package/dist/chunk-PKW27QVS.js.map +0 -1
  588. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  589. package/dist/chunk-S5OFRT4M.js.map +0 -1
  590. package/dist/chunk-SBVILCCA.js.map +0 -1
  591. package/dist/chunk-WM26XK7I.js +0 -2432
  592. package/dist/chunk-WM26XK7I.js.map +0 -1
  593. package/dist/chunk-XDNLUEXI.js +0 -138
  594. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  595. package/dist/chunk-ZZ2SS7NI.js +0 -237
  596. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  597. package/dist/database-C6jy7EOu.d.ts +0 -500
  598. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  599. package/dist/schema-DTDZQe2u.d.ts +0 -28
  600. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  601. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  602. package/dist/validation.d.ts +0 -47
  603. package/dist/validation.js +0 -24
  604. package/dist/validation.js.map +0 -1
  605. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  606. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  607. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  608. package/docs/api/interfaces/EventLogoProps.md +0 -152
  609. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  610. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  611. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  612. package/docs/architecture/rpc-function-standards.md +0 -1106
  613. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  614. package/docs/implementation-guides/event-theming-summary.md +0 -226
  615. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  616. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  617. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  618. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  619. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  620. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  621. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  622. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  623. package/docs/styles/usage.md +0 -227
  624. package/docs/testing/visual-testing.md +0 -120
  625. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  626. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  627. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  628. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  629. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  630. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  631. package/examples/RBAC/EventBasedApp.tsx +0 -239
  632. package/examples/RBAC/PermissionExample.tsx +0 -151
  633. package/examples/STRUCTURE.md +0 -125
  634. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  635. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  636. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  637. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  638. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  639. package/examples/components 2/index.ts +0 -11
  640. package/examples/features/index.ts +0 -12
  641. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  642. package/examples/features/rbac/index.ts +0 -13
  643. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  644. package/examples/public-pages/PublicEventPage.tsx +0 -274
  645. package/examples/public-pages/PublicPageApp.tsx +0 -308
  646. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  647. package/examples/public-pages/index.ts +0 -14
  648. package/src/__tests__/TEST_STANDARD.md +0 -1008
  649. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  650. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  651. package/src/components/DataTable/examples/HierarchicalExample.tsx +0 -475
  652. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  653. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  654. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  655. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  656. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  657. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  658. package/src/components/Dialog/README.md +0 -804
  659. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  660. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  661. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  662. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  663. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  664. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  665. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  666. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  667. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  668. package/src/components/EventSelector/types.ts +0 -79
  669. package/src/components/Form/FormErrorSummary.tsx +0 -113
  670. package/src/components/Form/FormField.tsx +0 -249
  671. package/src/components/Form/FormFieldset.tsx +0 -127
  672. package/src/components/Form/FormLiveRegion.tsx +0 -198
  673. package/src/components/Input/__mocks__/Input.tsx +0 -2
  674. package/src/components/NavigationMenu/types.ts +0 -85
  675. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  676. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  677. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  678. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  679. package/src/components/PasswordReset/index.ts +0 -2
  680. package/src/components/ProtectedRoute/README.md +0 -164
  681. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  682. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  683. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  684. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  685. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  686. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  687. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  688. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  689. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  690. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  691. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  692. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  693. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  694. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  695. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  696. package/src/components/Select/hooks.ts +0 -289
  697. package/src/hooks/useCounter.test.ts +0 -131
  698. package/src/hooks/useDebounce.test.ts +0 -375
  699. package/src/providers/AuthProvider.tsx +0 -15
  700. package/src/providers/EventProvider.tsx +0 -16
  701. package/src/providers/InactivityProvider.tsx +0 -15
  702. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  703. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  704. package/src/types/theme.ts +0 -6
  705. package/src/types/unified.ts +0 -265
  706. package/src/utils/appConfig.ts +0 -47
  707. package/src/utils/appIdResolver.test.ts +0 -499
  708. package/src/utils/appIdResolver.ts +0 -130
  709. package/src/utils/appNameResolver.simple.test.ts +0 -212
  710. package/src/utils/appNameResolver.test.ts +0 -121
  711. package/src/utils/appNameResolver.ts +0 -191
  712. package/src/utils/audit.ts +0 -127
  713. package/src/utils/auth-utils.ts +0 -96
  714. package/src/utils/bundleAnalysis.ts +0 -129
  715. package/src/utils/debugLogger.ts +0 -67
  716. package/src/utils/deviceFingerprint.ts +0 -215
  717. package/src/utils/dynamicUtils.ts +0 -105
  718. package/src/utils/file-reference.test.ts +0 -788
  719. package/src/utils/file-reference.ts +0 -519
  720. package/src/utils/formatDate.test.ts +0 -237
  721. package/src/utils/formatting.ts +0 -170
  722. package/src/utils/lazyLoad.tsx +0 -44
  723. package/src/utils/logger.ts +0 -179
  724. package/src/utils/organisationContext.test.ts +0 -322
  725. package/src/utils/organisationContext.ts +0 -153
  726. package/src/utils/performanceBenchmark.ts +0 -64
  727. package/src/utils/performanceBudgets.ts +0 -110
  728. package/src/utils/permissionTypes.ts +0 -37
  729. package/src/utils/permissionUtils.test.ts +0 -393
  730. package/src/utils/permissionUtils.ts +0 -34
  731. package/src/utils/sanitization.ts +0 -264
  732. package/src/utils/schemaUtils.ts +0 -37
  733. package/src/utils/secureDataAccess.test.ts +0 -711
  734. package/src/utils/secureDataAccess.ts +0 -377
  735. package/src/utils/secureErrors.ts +0 -79
  736. package/src/utils/security.ts +0 -156
  737. package/src/utils/securityMonitor.ts +0 -45
  738. package/src/utils/sessionTracking.ts +0 -126
  739. package/src/utils/validation.ts +0 -111
  740. package/src/utils/validationUtils.ts +0 -120
  741. package/src/validation/index.ts +0 -12
  742. /package/dist/{DataTable-4VSEJQ7D.js.map → DataTable-QAB34V6K.js.map} +0 -0
  743. /package/dist/{UnifiedAuthProvider-BMJAP6Z7.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  744. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  745. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  746. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  747. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  748. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  749. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  750. /package/examples/{RBAC → rbac}/index.ts +0 -0
@@ -1,611 +0,0 @@
1
- /**
2
- * @file Safe HTML Utilities Unit Tests
3
- * @package @jmruthers/pace-core
4
- * @module Components/Dialog/Utils/Tests
5
- * @since 0.4.36
6
- */
7
-
8
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
9
- import { sanitizeHtml, validateHtml, renderSafeHtml } from '../safeHtml';
10
-
11
- // Mock console methods to avoid noise in test output
12
- const originalConsoleLog = console.log;
13
- const originalConsoleWarn = console.warn;
14
-
15
- describe('Safe HTML Utilities', () => {
16
- beforeEach(() => {
17
- vi.clearAllMocks();
18
- // Mock console methods
19
- console.log = vi.fn();
20
- console.warn = vi.fn();
21
- });
22
-
23
- afterEach(() => {
24
- // Restore console methods
25
- console.log = originalConsoleLog;
26
- console.warn = originalConsoleWarn;
27
- });
28
-
29
- describe('sanitizeHtml', () => {
30
- describe('Input validation', () => {
31
- it('should return empty string for null input', () => {
32
- const result = sanitizeHtml(null as any);
33
- expect(result).toBe('');
34
- });
35
-
36
- it('should return empty string for undefined input', () => {
37
- const result = sanitizeHtml(undefined as any);
38
- expect(result).toBe('');
39
- });
40
-
41
- it('should return empty string for non-string input', () => {
42
- const result = sanitizeHtml(123 as any);
43
- expect(result).toBe('');
44
- });
45
-
46
- it('should return empty string for empty string', () => {
47
- const result = sanitizeHtml('');
48
- expect(result).toBe('');
49
- });
50
-
51
- it('should handle whitespace-only strings', () => {
52
- const result = sanitizeHtml(' \n\t ');
53
- expect(result).toBe(' \n\t ');
54
- });
55
- });
56
-
57
- describe('Basic HTML sanitization', () => {
58
- it('should preserve safe HTML tags', () => {
59
- const html = '<p>Hello <strong>world</strong>!</p>';
60
- const result = sanitizeHtml(html);
61
- expect(result).toBe(html);
62
- });
63
-
64
- it('should preserve safe HTML with attributes', () => {
65
- const html = '<div class="container" id="main">Content</div>';
66
- const result = sanitizeHtml(html);
67
- expect(result).toBe(html);
68
- });
69
-
70
- it('should preserve complex safe HTML structures', () => {
71
- const html = `
72
- <section>
73
- <h1>Title</h1>
74
- <p>Paragraph with <em>emphasis</em> and <a href="/link">link</a></p>
75
- <ul>
76
- <li>Item 1</li>
77
- <li>Item 2</li>
78
- </ul>
79
- </section>
80
- `;
81
- const result = sanitizeHtml(html);
82
- expect(result).toBe(html);
83
- });
84
-
85
- it('should preserve table structures', () => {
86
- const html = `
87
- <table>
88
- <thead>
89
- <tr>
90
- <th>Header 1</th>
91
- <th>Header 2</th>
92
- </tr>
93
- </thead>
94
- <tbody>
95
- <tr>
96
- <td>Data 1</td>
97
- <td>Data 2</td>
98
- </tr>
99
- </tbody>
100
- </table>
101
- `;
102
- const result = sanitizeHtml(html);
103
- expect(result).toBe(html);
104
- });
105
- });
106
-
107
- describe('Dangerous content removal', () => {
108
- it('should remove script tags', () => {
109
- const html = '<p>Safe content</p><script>alert("xss")</script><p>More content</p>';
110
- const result = sanitizeHtml(html);
111
- expect(result).toBe('<p>Safe content</p><p>More content</p>');
112
- });
113
-
114
- it('should remove script tags with attributes', () => {
115
- const html = '<p>Safe</p><script type="text/javascript" src="malicious.js">alert("xss")</script><p>Content</p>';
116
- const result = sanitizeHtml(html);
117
- expect(result).toBe('<p>Safe</p><p>Content</p>');
118
- });
119
-
120
- it('should remove iframe tags', () => {
121
- const html = '<p>Safe content</p><iframe src="malicious.com"></iframe><p>More content</p>';
122
- const result = sanitizeHtml(html);
123
- expect(result).toBe('<p>Safe content</p><p>More content</p>');
124
- });
125
-
126
- it('should remove iframe tags with attributes', () => {
127
- const html = '<p>Safe</p><iframe width="100" height="100" src="evil.com"></iframe><p>Content</p>';
128
- const result = sanitizeHtml(html);
129
- expect(result).toBe('<p>Safe</p><p>Content</p>');
130
- });
131
-
132
- it('should partially remove event handlers (basic implementation)', () => {
133
- const html = '<p onclick="alert(\'xss\')">Click me</p>';
134
- const result = sanitizeHtml(html);
135
- // The basic implementation may not fully remove event handlers with nested quotes
136
- expect(result).toContain('<p');
137
- expect(result).toContain('Click me</p>');
138
- expect(result).not.toContain('<script>');
139
- });
140
-
141
- it('should partially remove multiple event handlers (basic implementation)', () => {
142
- const html = '<div onmouseover="evil()" onload="bad()" onclick="alert(\'xss\')">Content</div>';
143
- const result = sanitizeHtml(html);
144
- // The basic implementation may not fully remove event handlers with nested quotes
145
- expect(result).toContain('<div');
146
- expect(result).toContain('Content</div>');
147
- expect(result).not.toContain('<script>');
148
- });
149
-
150
- it('should partially remove javascript: protocols (basic implementation)', () => {
151
- const html = '<a href="javascript:alert(\'xss\')">Link</a>';
152
- const result = sanitizeHtml(html);
153
- // The basic implementation may not fully remove protocols with nested quotes
154
- expect(result).toContain('<a href=');
155
- expect(result).toContain('Link</a>');
156
- expect(result).not.toContain('<script>');
157
- });
158
-
159
- it('should partially remove data: protocols (basic implementation)', () => {
160
- const html = '<img src="data:text/html,<script>alert(\'xss\')</script>">';
161
- const result = sanitizeHtml(html);
162
- // The basic implementation may not fully remove protocols with nested quotes
163
- expect(result).toContain('<img src=');
164
- expect(result).not.toContain('<script>');
165
- });
166
-
167
- it('should handle case-insensitive dangerous content', () => {
168
- const html = '<SCRIPT>alert("xss")</SCRIPT><IFRAME src="evil.com"></IFRAME>';
169
- const result = sanitizeHtml(html);
170
- expect(result).toBe('');
171
- });
172
-
173
- it('should partially handle mixed case event handlers (basic implementation)', () => {
174
- const html = '<div OnClick="alert(\'xss\')" ONMOUSEOVER="evil()">Content</div>';
175
- const result = sanitizeHtml(html);
176
- // The basic implementation may not fully remove event handlers with nested quotes
177
- expect(result).toContain('<div');
178
- expect(result).toContain('Content</div>');
179
- expect(result).not.toContain('<script>');
180
- });
181
- });
182
-
183
- describe('Edge cases and complex scenarios', () => {
184
- it('should handle nested dangerous content', () => {
185
- const html = '<div><script>alert("outer")</script><p>Safe</p><script>alert("inner")</script></div>';
186
- const result = sanitizeHtml(html);
187
- expect(result).toBe('<div><p>Safe</p></div>');
188
- });
189
-
190
- it('should handle malformed script tags', () => {
191
- const html = '<p>Safe</p><script>alert("xss")<script>alert("more")</script><p>Content</p>';
192
- const result = sanitizeHtml(html);
193
- expect(result).toBe('<p>Safe</p><p>Content</p>');
194
- });
195
-
196
- it('should handle script tags with no content', () => {
197
- const html = '<p>Safe</p><script></script><p>Content</p>';
198
- const result = sanitizeHtml(html);
199
- expect(result).toBe('<p>Safe</p><p>Content</p>');
200
- });
201
-
202
- it('should handle self-closing script tags', () => {
203
- const html = '<p>Safe</p><script src="evil.js" /><p>Content</p>';
204
- const result = sanitizeHtml(html);
205
- expect(result).toBe('<p>Safe</p><p>Content</p>');
206
- });
207
-
208
- it('should preserve safe content while partially removing dangerous content (basic implementation)', () => {
209
- const html = `
210
- <div>
211
- <h1>Title</h1>
212
- <script>alert("xss")</script>
213
- <p>This is <strong>safe</strong> content</p>
214
- <iframe src="evil.com"></iframe>
215
- <ul>
216
- <li>Safe item</li>
217
- <li onclick="alert('xss')">Dangerous item</li>
218
- </ul>
219
- </div>
220
- `;
221
- const result = sanitizeHtml(html);
222
- expect(result).toContain('<h1>Title</h1>');
223
- expect(result).toContain('<p>This is <strong>safe</strong> content</p>');
224
- expect(result).toContain('<li>Safe item</li>');
225
- expect(result).toContain('<li'); // May have partial event handler removal
226
- expect(result).not.toContain('<script>');
227
- expect(result).not.toContain('<iframe>');
228
- });
229
- });
230
-
231
- describe('Console logging', () => {
232
- it('should log input and output for debugging', () => {
233
- const html = '<p>Test content</p>';
234
- sanitizeHtml(html);
235
-
236
- expect(console.log).toHaveBeenCalledWith('🔍 sanitizeHtml input:', html);
237
- expect(console.log).toHaveBeenCalledWith('🔍 sanitizeHtml output:', html);
238
- });
239
- });
240
- });
241
-
242
- describe('validateHtml', () => {
243
- describe('Input validation', () => {
244
- it('should return invalid for null input', () => {
245
- const result = validateHtml(null as any);
246
- expect(result.isValid).toBe(false);
247
- expect(result.warnings).toContain('HTML content must be a non-empty string');
248
- });
249
-
250
- it('should return invalid for undefined input', () => {
251
- const result = validateHtml(undefined as any);
252
- expect(result.isValid).toBe(false);
253
- expect(result.warnings).toContain('HTML content must be a non-empty string');
254
- });
255
-
256
- it('should return invalid for non-string input', () => {
257
- const result = validateHtml(123 as any);
258
- expect(result.isValid).toBe(false);
259
- expect(result.warnings).toContain('HTML content must be a non-empty string');
260
- });
261
-
262
- it('should return invalid for empty string', () => {
263
- const result = validateHtml('');
264
- expect(result.isValid).toBe(false);
265
- expect(result.warnings).toContain('HTML content must be a non-empty string');
266
- });
267
-
268
- it('should return valid for whitespace-only strings', () => {
269
- const result = validateHtml(' \n\t ');
270
- expect(result.isValid).toBe(true);
271
- expect(result.warnings).toEqual([]);
272
- });
273
- });
274
-
275
- describe('Safe content validation', () => {
276
- it('should validate safe HTML content', () => {
277
- const html = '<p>Hello <strong>world</strong>!</p>';
278
- const result = validateHtml(html);
279
- expect(result.isValid).toBe(true);
280
- expect(result.warnings).toEqual([]);
281
- });
282
-
283
- it('should validate complex safe HTML structures', () => {
284
- const html = `
285
- <section>
286
- <h1>Title</h1>
287
- <p>Paragraph with <em>emphasis</em> and <a href="/link">link</a></p>
288
- <ul>
289
- <li>Item 1</li>
290
- <li>Item 2</li>
291
- </ul>
292
- </section>
293
- `;
294
- const result = validateHtml(html);
295
- expect(result.isValid).toBe(true);
296
- expect(result.warnings).toEqual([]);
297
- });
298
-
299
- it('should validate table structures', () => {
300
- const html = `
301
- <table>
302
- <thead>
303
- <tr>
304
- <th>Header 1</th>
305
- <th>Header 2</th>
306
- </tr>
307
- </thead>
308
- <tbody>
309
- <tr>
310
- <td>Data 1</td>
311
- <td>Data 2</td>
312
- </tr>
313
- </tbody>
314
- </table>
315
- `;
316
- const result = validateHtml(html);
317
- expect(result.isValid).toBe(true);
318
- expect(result.warnings).toEqual([]);
319
- });
320
- });
321
-
322
- describe('Dangerous content detection', () => {
323
- it('should detect script tags', () => {
324
- const html = '<p>Safe content</p><script>alert("xss")</script>';
325
- const result = validateHtml(html);
326
- expect(result.isValid).toBe(false);
327
- expect(result.warnings).toContain('Script tags are not allowed');
328
- });
329
-
330
- it('should detect iframe tags', () => {
331
- const html = '<p>Safe content</p><iframe src="malicious.com"></iframe>';
332
- const result = validateHtml(html);
333
- expect(result.isValid).toBe(false);
334
- expect(result.warnings).toContain('Iframe tags are not allowed');
335
- });
336
-
337
- it('should detect object tags', () => {
338
- const html = '<p>Safe content</p><object data="malicious.swf"></object>';
339
- const result = validateHtml(html);
340
- expect(result.isValid).toBe(false);
341
- expect(result.warnings).toContain('Object tags are not allowed');
342
- });
343
-
344
- it('should detect embed tags', () => {
345
- const html = '<p>Safe content</p><embed src="malicious.swf">';
346
- const result = validateHtml(html);
347
- expect(result.isValid).toBe(false);
348
- expect(result.warnings).toContain('Embed tags are not allowed');
349
- });
350
-
351
- it('should detect form tags', () => {
352
- const html = '<p>Safe content</p><form action="/submit"><input type="text"></form>';
353
- const result = validateHtml(html);
354
- expect(result.isValid).toBe(false);
355
- expect(result.warnings).toContain('Form tags are not allowed');
356
- });
357
-
358
- it('should detect input tags', () => {
359
- const html = '<p>Safe content</p><input type="text" value="test">';
360
- const result = validateHtml(html);
361
- expect(result.isValid).toBe(false);
362
- expect(result.warnings).toContain('Input tags are not allowed');
363
- });
364
-
365
- it('should detect button tags', () => {
366
- const html = '<p>Safe content</p><button onclick="alert(\'xss\')">Click me</button>';
367
- const result = validateHtml(html);
368
- expect(result.isValid).toBe(false);
369
- expect(result.warnings).toContain('Button tags are not allowed');
370
- });
371
-
372
- it('should detect event handlers', () => {
373
- const html = '<p onclick="alert(\'xss\')">Click me</p>';
374
- const result = validateHtml(html);
375
- expect(result.isValid).toBe(false);
376
- expect(result.warnings).toContain('Event handlers are not allowed');
377
- });
378
-
379
- it('should detect javascript protocols', () => {
380
- const html = '<a href="javascript:alert(\'xss\')">Link</a>';
381
- const result = validateHtml(html);
382
- expect(result.isValid).toBe(false);
383
- expect(result.warnings).toContain('JavaScript protocols are not allowed');
384
- });
385
-
386
- it('should detect data protocols', () => {
387
- const html = '<img src="data:text/html,<script>alert(\'xss\')</script>">';
388
- const result = validateHtml(html);
389
- expect(result.isValid).toBe(false);
390
- expect(result.warnings).toContain('Data protocols are not allowed');
391
- });
392
- });
393
-
394
- describe('Multiple warnings', () => {
395
- it('should collect multiple warnings', () => {
396
- const html = '<script>alert("xss")</script><iframe src="evil.com"></iframe><p onclick="alert(\'xss\')">Click</p>';
397
- const result = validateHtml(html);
398
- expect(result.isValid).toBe(false);
399
- expect(result.warnings).toHaveLength(3);
400
- expect(result.warnings).toContain('Script tags are not allowed');
401
- expect(result.warnings).toContain('Iframe tags are not allowed');
402
- expect(result.warnings).toContain('Event handlers are not allowed');
403
- });
404
-
405
- it('should handle case-insensitive detection', () => {
406
- const html = '<SCRIPT>alert("xss")</SCRIPT><IFRAME src="evil.com"></IFRAME><P ONCLICK="alert(\'xss\')">Click</P>';
407
- const result = validateHtml(html);
408
- expect(result.isValid).toBe(false);
409
- expect(result.warnings).toHaveLength(3);
410
- expect(result.warnings).toContain('Script tags are not allowed');
411
- expect(result.warnings).toContain('Iframe tags are not allowed');
412
- expect(result.warnings).toContain('Event handlers are not allowed');
413
- });
414
- });
415
-
416
- describe('Edge cases', () => {
417
- it('should handle malformed dangerous tags', () => {
418
- const html = '<script>alert("xss")<script>alert("more")</script>';
419
- const result = validateHtml(html);
420
- expect(result.isValid).toBe(false);
421
- expect(result.warnings).toContain('Script tags are not allowed');
422
- });
423
-
424
- it('should handle self-closing dangerous tags', () => {
425
- const html = '<script src="evil.js" /><iframe src="evil.com" />';
426
- const result = validateHtml(html);
427
- expect(result.isValid).toBe(false);
428
- expect(result.warnings).toContain('Script tags are not allowed');
429
- expect(result.warnings).toContain('Iframe tags are not allowed');
430
- });
431
-
432
- it('should handle dangerous content in attributes', () => {
433
- const html = '<p title="javascript:alert(\'xss\')">Content</p>';
434
- const result = validateHtml(html);
435
- expect(result.isValid).toBe(false);
436
- expect(result.warnings).toContain('JavaScript protocols are not allowed');
437
- });
438
- });
439
- });
440
-
441
- describe('renderSafeHtml', () => {
442
- describe('Basic functionality', () => {
443
- it('should return sanitized HTML and validation info', () => {
444
- const html = '<p>Hello <strong>world</strong>!</p>';
445
- const result = renderSafeHtml(html);
446
-
447
- expect(result.html).toBe(html);
448
- expect(result.isValid).toBe(true);
449
- expect(result.warnings).toEqual([]);
450
- });
451
-
452
- it('should handle dangerous content', () => {
453
- const html = '<p>Safe content</p><script>alert("xss")</script><p>More content</p>';
454
- const result = renderSafeHtml(html);
455
-
456
- expect(result.html).toBe('<p>Safe content</p><p>More content</p>');
457
- expect(result.isValid).toBe(false);
458
- expect(result.warnings).toContain('Script tags are not allowed');
459
- });
460
- });
461
-
462
- describe('Options handling', () => {
463
- it('should use default options when none provided', () => {
464
- const html = '<p>Safe content</p><script>alert("xss")</script>';
465
- const result = renderSafeHtml(html);
466
-
467
- expect(result.html).toBe('<p>Safe content</p>');
468
- expect(result.isValid).toBe(false);
469
- expect(result.warnings).toContain('Script tags are not allowed');
470
- });
471
-
472
- it('should respect strict option (default true)', () => {
473
- const html = '<p>Safe content</p><script>alert("xss")</script>';
474
- const result = renderSafeHtml(html, { strict: true });
475
-
476
- expect(result.isValid).toBe(false);
477
- expect(result.warnings).toContain('Script tags are not allowed');
478
- });
479
-
480
- it('should respect logWarnings option (default false)', () => {
481
- const html = '<p>Safe content</p><script>alert("xss")</script>';
482
- renderSafeHtml(html, { logWarnings: false });
483
-
484
- expect(console.warn).not.toHaveBeenCalled();
485
- });
486
-
487
- it('should log warnings when logWarnings is true', () => {
488
- const html = '<p>Safe content</p><script>alert("xss")</script>';
489
- renderSafeHtml(html, { logWarnings: true });
490
-
491
- expect(console.warn).toHaveBeenCalledWith('Dialog HTML content warnings:', ['Script tags are not allowed']);
492
- });
493
-
494
- it('should handle both options together', () => {
495
- const html = '<p>Safe content</p><script>alert("xss")</script><iframe src="evil.com"></iframe>';
496
- const result = renderSafeHtml(html, { strict: true, logWarnings: true });
497
-
498
- expect(result.isValid).toBe(false);
499
- expect(result.warnings).toHaveLength(2);
500
- expect(console.warn).toHaveBeenCalledWith('Dialog HTML content warnings:', expect.arrayContaining(['Script tags are not allowed', 'Iframe tags are not allowed']));
501
- });
502
- });
503
-
504
- describe('Edge cases', () => {
505
- it('should handle null input', () => {
506
- const result = renderSafeHtml(null as any);
507
-
508
- expect(result.html).toBe('');
509
- expect(result.isValid).toBe(false);
510
- expect(result.warnings).toContain('HTML content must be a non-empty string');
511
- });
512
-
513
- it('should handle undefined input', () => {
514
- const result = renderSafeHtml(undefined as any);
515
-
516
- expect(result.html).toBe('');
517
- expect(result.isValid).toBe(false);
518
- expect(result.warnings).toContain('HTML content must be a non-empty string');
519
- });
520
-
521
- it('should handle empty string', () => {
522
- const result = renderSafeHtml('');
523
-
524
- expect(result.html).toBe('');
525
- expect(result.isValid).toBe(false);
526
- expect(result.warnings).toContain('HTML content must be a non-empty string');
527
- });
528
-
529
- it('should handle non-string input', () => {
530
- const result = renderSafeHtml(123 as any);
531
-
532
- expect(result.html).toBe('');
533
- expect(result.isValid).toBe(false);
534
- expect(result.warnings).toContain('HTML content must be a non-empty string');
535
- });
536
-
537
- it('should handle whitespace-only input', () => {
538
- const result = renderSafeHtml(' \n\t ');
539
-
540
- expect(result.html).toBe(' \n\t ');
541
- expect(result.isValid).toBe(true);
542
- expect(result.warnings).toEqual([]);
543
- });
544
- });
545
-
546
- describe('Integration scenarios', () => {
547
- it('should handle complex mixed content (basic implementation)', () => {
548
- const html = `
549
- <div>
550
- <h1>Title</h1>
551
- <script>alert("xss")</script>
552
- <p>This is <strong>safe</strong> content</p>
553
- <iframe src="evil.com"></iframe>
554
- <ul>
555
- <li>Safe item</li>
556
- <li onclick="alert('xss')">Dangerous item</li>
557
- </ul>
558
- <a href="javascript:alert('xss')">Dangerous link</a>
559
- </div>
560
- `;
561
- const result = renderSafeHtml(html, { logWarnings: true });
562
-
563
- expect(result.html).toContain('<h1>Title</h1>');
564
- expect(result.html).toContain('<p>This is <strong>safe</strong> content</p>');
565
- expect(result.html).toContain('<li>Safe item</li>');
566
- expect(result.html).toContain('<li'); // May have partial event handler removal
567
- expect(result.html).not.toContain('<script>');
568
- expect(result.html).not.toContain('<iframe>');
569
- expect(result.html).toContain('<a href='); // May have partial protocol removal
570
-
571
- expect(result.isValid).toBe(false);
572
- expect(result.warnings.length).toBeGreaterThan(0);
573
- expect(console.warn).toHaveBeenCalled();
574
- });
575
-
576
- it('should preserve safe content while removing all dangerous elements', () => {
577
- const html = `
578
- <article>
579
- <header>
580
- <h1>Article Title</h1>
581
- <p class="meta">Published on <time datetime="2023-01-01">January 1, 2023</time></p>
582
- </header>
583
- <main>
584
- <p>This is a <em>safe</em> article with <a href="/safe-link">safe links</a>.</p>
585
- <blockquote>
586
- <p>This is a <strong>safe</strong> quote.</p>
587
- </blockquote>
588
- <script>alert("xss")</script>
589
- <pre><code>console.log("safe code");</code></pre>
590
- </main>
591
- <footer>
592
- <p>Safe footer content</p>
593
- </footer>
594
- </article>
595
- `;
596
- const result = renderSafeHtml(html);
597
-
598
- expect(result.html).toContain('<h1>Article Title</h1>');
599
- expect(result.html).toContain('<p class="meta">Published on <time datetime="2023-01-01">January 1, 2023</time></p>');
600
- expect(result.html).toContain('<p>This is a <em>safe</em> article with <a href="/safe-link">safe links</a>.</p>');
601
- expect(result.html).toContain('<blockquote>');
602
- expect(result.html).toContain('<pre><code>console.log("safe code");</code></pre>');
603
- expect(result.html).toContain('<p>Safe footer content</p>');
604
- expect(result.html).not.toContain('<script>');
605
-
606
- expect(result.isValid).toBe(false);
607
- expect(result.warnings).toContain('Script tags are not allowed');
608
- });
609
- });
610
- });
611
- });