@jmruthers/pace-core 0.5.135 → 0.5.137

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 (544) hide show
  1. package/dist/{DataTable-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
  2. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
  4. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  5. package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
  6. package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
  7. package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
  8. package/dist/{chunk-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
  9. package/dist/chunk-22WKWKRX.js.map +1 -0
  10. package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
  11. package/dist/chunk-4C7EXCAR.js.map +1 -0
  12. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  13. package/dist/chunk-56XJ3TU6.js.map +1 -0
  14. package/dist/{chunk-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
  15. package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
  16. package/dist/chunk-7QCC6MCP.js.map +1 -0
  17. package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
  18. package/dist/chunk-ANBQRTPX.js.map +1 -0
  19. package/dist/{chunk-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
  20. package/dist/chunk-BCIBECNB.js.map +1 -0
  21. package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
  22. package/dist/chunk-BESYRHQM.js.map +1 -0
  23. package/dist/chunk-BJPBT3CU.js +21 -0
  24. package/dist/chunk-BJPBT3CU.js.map +1 -0
  25. package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
  26. package/dist/chunk-BLCXZEYF.js.map +1 -0
  27. package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  28. package/dist/chunk-BVYWGZVV.js.map +1 -0
  29. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  30. package/dist/chunk-ERISIBYU.js.map +1 -0
  31. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  32. package/dist/chunk-FMUCXFII.js.map +1 -0
  33. package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
  34. package/dist/chunk-HAWZXGR2.js.map +1 -0
  35. package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
  36. package/dist/chunk-JISYG63F.js +70 -0
  37. package/dist/chunk-JISYG63F.js.map +1 -0
  38. package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
  39. package/dist/chunk-KYRHUBIU.js.map +1 -0
  40. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  41. package/dist/chunk-LS353YLY.js.map +1 -0
  42. package/dist/{chunk-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
  43. package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
  44. package/dist/chunk-OWAG3GSU.js +58 -0
  45. package/dist/chunk-OWAG3GSU.js.map +1 -0
  46. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  47. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  48. package/dist/chunk-S5OFRT4M.js +94 -0
  49. package/dist/chunk-S5OFRT4M.js.map +1 -0
  50. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  51. package/dist/chunk-SBVILCCA.js.map +1 -0
  52. package/dist/{chunk-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
  53. package/dist/chunk-T6JN6LH6.js.map +1 -0
  54. package/dist/chunk-XDNLUEXI.js +138 -0
  55. package/dist/chunk-XDNLUEXI.js.map +1 -0
  56. package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
  57. package/dist/chunk-YCWDTTUK.js.map +1 -0
  58. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  59. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  60. package/dist/components.d.ts +7 -287
  61. package/dist/components.js +27 -157
  62. package/dist/components.js.map +1 -1
  63. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  64. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  65. package/dist/hooks.d.ts +3 -3
  66. package/dist/hooks.js +21 -16
  67. package/dist/hooks.js.map +1 -1
  68. package/dist/index.d.ts +101 -9
  69. package/dist/index.js +44 -31
  70. package/dist/index.js.map +1 -1
  71. package/dist/providers.d.ts +1 -1
  72. package/dist/providers.js +4 -4
  73. package/dist/rbac/index.js +12 -12
  74. package/dist/schema-DTDZQe2u.d.ts +28 -0
  75. package/dist/styles/index.js +2 -1
  76. package/dist/theming/runtime.d.ts +2 -19
  77. package/dist/theming/runtime.js +2 -1
  78. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  79. package/dist/types.d.ts +153 -4
  80. package/dist/types.js +51 -16
  81. package/dist/types.js.map +1 -1
  82. package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
  83. package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
  84. package/dist/utils.d.ts +221 -173
  85. package/dist/utils.js +185 -225
  86. package/dist/utils.js.map +1 -1
  87. package/dist/validation.d.ts +24 -115
  88. package/dist/validation.js +19 -474
  89. package/dist/validation.js.map +1 -1
  90. package/docs/api/classes/ColumnFactory.md +1 -1
  91. package/docs/api/classes/ErrorBoundary.md +6 -6
  92. package/docs/api/classes/InvalidScopeError.md +1 -1
  93. package/docs/api/classes/MissingUserContextError.md +1 -1
  94. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  95. package/docs/api/classes/PermissionDeniedError.md +1 -1
  96. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  97. package/docs/api/classes/RBACAuditManager.md +6 -6
  98. package/docs/api/classes/RBACCache.md +1 -1
  99. package/docs/api/classes/RBACEngine.md +7 -7
  100. package/docs/api/classes/RBACError.md +1 -1
  101. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  102. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  103. package/docs/api/classes/StorageUtils.md +1 -1
  104. package/docs/api/enums/FileCategory.md +1 -1
  105. package/docs/api/interfaces/AggregateConfig.md +4 -4
  106. package/docs/api/interfaces/BadgeProps.md +27 -0
  107. package/docs/api/interfaces/ButtonProps.md +1 -1
  108. package/docs/api/interfaces/CardProps.md +1 -1
  109. package/docs/api/interfaces/ColorPalette.md +1 -1
  110. package/docs/api/interfaces/ColorShade.md +29 -4
  111. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  112. package/docs/api/interfaces/DataRecord.md +1 -1
  113. package/docs/api/interfaces/DataTableAction.md +18 -18
  114. package/docs/api/interfaces/DataTableColumn.md +61 -1
  115. package/docs/api/interfaces/DataTableProps.md +1 -1
  116. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  117. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  118. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
  119. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  120. package/docs/api/interfaces/EventLogoProps.md +152 -0
  121. package/docs/api/interfaces/ExportColumn.md +1 -1
  122. package/docs/api/interfaces/ExportOptions.md +8 -8
  123. package/docs/api/interfaces/FileDisplayProps.md +15 -15
  124. package/docs/api/interfaces/FileMetadata.md +1 -1
  125. package/docs/api/interfaces/FileReference.md +1 -1
  126. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  127. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  128. package/docs/api/interfaces/FileUploadProps.md +1 -1
  129. package/docs/api/interfaces/FooterProps.md +1 -1
  130. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  131. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  132. package/docs/api/interfaces/InputProps.md +1 -1
  133. package/docs/api/interfaces/LabelProps.md +1 -1
  134. package/docs/api/interfaces/LoginFormProps.md +1 -1
  135. package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
  136. package/docs/api/interfaces/NavigationContextType.md +9 -9
  137. package/docs/api/interfaces/NavigationGuardProps.md +10 -10
  138. package/docs/api/interfaces/NavigationItem.md +1 -1
  139. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  140. package/docs/api/interfaces/NavigationProviderProps.md +7 -7
  141. package/docs/api/interfaces/Organisation.md +1 -1
  142. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  143. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  144. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  145. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  146. package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
  147. package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
  148. package/docs/api/interfaces/PageAccessRecord.md +8 -8
  149. package/docs/api/interfaces/PagePermissionContextType.md +8 -8
  150. package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
  151. package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
  152. package/docs/api/interfaces/PaletteData.md +4 -4
  153. package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
  154. package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
  155. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  156. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  157. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  158. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  159. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  160. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  161. package/docs/api/interfaces/RBACConfig.md +1 -1
  162. package/docs/api/interfaces/RBACLogger.md +1 -1
  163. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  164. package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
  165. package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
  166. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  167. package/docs/api/interfaces/RouteAccessRecord.md +10 -10
  168. package/docs/api/interfaces/RouteConfig.md +10 -10
  169. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  170. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  171. package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
  172. package/docs/api/interfaces/StorageConfig.md +1 -1
  173. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  174. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  175. package/docs/api/interfaces/StorageListOptions.md +1 -1
  176. package/docs/api/interfaces/StorageListResult.md +1 -1
  177. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  178. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  179. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  180. package/docs/api/interfaces/StyleImport.md +1 -1
  181. package/docs/api/interfaces/SwitchProps.md +1 -1
  182. package/docs/api/interfaces/ToastActionElement.md +1 -1
  183. package/docs/api/interfaces/ToastProps.md +1 -1
  184. package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
  185. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  186. package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
  187. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  188. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  189. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  190. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  191. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
  192. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  193. package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
  194. package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
  195. package/docs/api/interfaces/UserEventAccess.md +11 -11
  196. package/docs/api/interfaces/UserMenuProps.md +1 -1
  197. package/docs/api/interfaces/UserProfile.md +1 -1
  198. package/docs/api/modules.md +591 -220
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -3
  201. package/docs/implementation-guides/data-tables.md +277 -13
  202. package/docs/implementation-guides/forms.md +1 -16
  203. package/docs/implementation-guides/permission-enforcement.md +8 -2
  204. package/docs/styles/README.md +0 -2
  205. package/examples/README.md +30 -14
  206. package/examples/STRUCTURE.md +125 -0
  207. package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
  208. package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
  209. package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
  210. package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
  211. package/examples/components 2/DataTable/index.ts +13 -0
  212. package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
  213. package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
  214. package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
  215. package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
  216. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
  217. package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
  218. package/examples/components 2/Dialog/index.ts +15 -0
  219. package/examples/components 2/index.ts +11 -0
  220. package/examples/features/index.ts +12 -0
  221. package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
  222. package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
  223. package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
  224. package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
  225. package/examples/features/public-pages/index.ts +14 -0
  226. package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
  227. package/examples/features/rbac/EventBasedApp.tsx +239 -0
  228. package/examples/features/rbac/PermissionExample.tsx +151 -0
  229. package/examples/features/rbac/index.ts +13 -0
  230. package/examples/index.ts +11 -3
  231. package/package.json +30 -19
  232. package/src/__tests__/TEST_STANDARD.md +92 -0
  233. package/src/components/Alert/Alert.tsx +1 -1
  234. package/src/components/Avatar/Avatar.tsx +1 -1
  235. package/src/components/Badge/Badge.test.tsx +314 -0
  236. package/src/components/Badge/Badge.tsx +304 -0
  237. package/src/components/Badge/index.ts +3 -0
  238. package/src/components/Button/Button.tsx +1 -1
  239. package/src/components/Card/Card.tsx +1 -1
  240. package/src/components/Checkbox/Checkbox.tsx +1 -1
  241. package/src/components/DataTable/DataTable.test.tsx +1 -1
  242. package/src/components/DataTable/DataTable.tsx +1 -30
  243. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  244. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
  245. package/src/components/DataTable/__tests__/styles.test.ts +3 -3
  246. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  247. package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
  248. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  249. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  250. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  251. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  252. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  253. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  254. package/src/components/DataTable/components/FilterRow.tsx +9 -3
  255. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  256. package/src/components/DataTable/components/PaginationControls.tsx +2 -1
  257. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  258. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  259. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
  260. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  261. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
  262. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  263. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  264. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
  265. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  266. package/src/components/DataTable/core/ActionManager.ts +235 -0
  267. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  268. package/src/components/DataTable/core/DataManager.ts +188 -0
  269. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  270. package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
  271. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  272. package/src/components/DataTable/core/StateManager.ts +311 -0
  273. package/src/components/DataTable/core/interfaces.ts +338 -0
  274. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  275. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  276. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  277. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  278. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  279. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  280. package/src/components/DataTable/index.ts +4 -0
  281. package/src/components/DataTable/styles.ts +28 -7
  282. package/src/components/DataTable/types.ts +13 -0
  283. package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
  284. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  285. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  286. package/src/components/DataTable/utils/columnUtils.ts +40 -0
  287. package/src/components/DataTable/utils/debugTools.ts +609 -0
  288. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  289. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  290. package/src/components/DataTable/utils/index.ts +2 -0
  291. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  292. package/src/components/Dialog/Dialog.tsx +2 -2
  293. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
  294. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  295. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  296. package/src/components/EventSelector/EventSelector.tsx +3 -2
  297. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  298. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  299. package/src/components/FileUpload/FileUpload.tsx +2 -2
  300. package/src/components/Footer/Footer.test.tsx +1 -1
  301. package/src/components/Footer/Footer.tsx +1 -1
  302. package/src/components/Form/Form.test.tsx +5 -510
  303. package/src/components/Form/Form.tsx +1 -1
  304. package/src/components/Form/FormField.tsx +1 -1
  305. package/src/components/Form/index.ts +0 -12
  306. package/src/components/Header/Header.tsx +1 -1
  307. package/src/components/Input/Input.tsx +1 -1
  308. package/src/components/Label/Label.tsx +1 -1
  309. package/src/components/LoginForm/LoginForm.test.tsx +1 -1
  310. package/src/components/LoginForm/LoginForm.tsx +1 -1
  311. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  312. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  313. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  314. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  315. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  316. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
  317. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  318. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  319. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  320. package/src/components/PaceLoginPage/PaceLoginPage.tsx +14 -13
  321. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  322. package/src/components/PasswordReset/index.ts +0 -2
  323. package/src/components/Progress/Progress.tsx +1 -1
  324. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  325. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  326. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  327. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  328. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  329. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  330. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  331. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  332. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  333. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
  334. package/src/components/PublicLayout/index.ts +4 -2
  335. package/src/components/Select/Select.test.tsx +1 -1
  336. package/src/components/Select/Select.tsx +21 -9
  337. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  338. package/src/components/SessionRestorationLoader/index.ts +3 -0
  339. package/src/components/Switch/Switch.tsx +1 -1
  340. package/src/components/Table/Table.tsx +1 -1
  341. package/src/components/Table/__tests__/Table.test.tsx +1 -1
  342. package/src/components/Toast/Toast.tsx +1 -1
  343. package/src/components/Tooltip/Tooltip.tsx +1 -1
  344. package/src/components/index.ts +7 -10
  345. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  346. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  347. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  348. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  349. package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
  350. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  351. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  352. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  353. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  354. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  355. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  356. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  357. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  358. package/src/hooks/public/usePublicEvent.ts +7 -6
  359. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  360. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  361. package/src/hooks/useComponentPerformance.ts +4 -1
  362. package/src/hooks/useDataTablePerformance.ts +4 -3
  363. package/src/hooks/useEventTheme.test.ts +18 -5
  364. package/src/hooks/useEventTheme.ts +4 -1
  365. package/src/hooks/useEvents.ts +2 -0
  366. package/src/hooks/useFileDisplay.ts +9 -8
  367. package/src/hooks/useFileReference.ts +4 -1
  368. package/src/hooks/useFileUrl.ts +4 -1
  369. package/src/hooks/useInactivityTracker.ts +5 -4
  370. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  371. package/src/hooks/useOrganisationSecurity.ts +8 -7
  372. package/src/hooks/usePerformanceMonitor.ts +6 -3
  373. package/src/hooks/usePermissionCache.ts +13 -6
  374. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  375. package/src/hooks/useSecureDataAccess.ts +9 -8
  376. package/src/hooks/useSessionRestoration.ts +4 -1
  377. package/src/hooks/useStorage.ts +4 -1
  378. package/src/index.ts +20 -7
  379. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  380. package/src/providers/services/EventServiceProvider.tsx +2 -1
  381. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  382. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  383. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  384. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  385. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  386. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  387. package/src/rbac/api.ts +5 -2
  388. package/src/rbac/audit-enhanced.ts +6 -6
  389. package/src/rbac/audit.test.ts +60 -38
  390. package/src/rbac/audit.ts +8 -8
  391. package/src/rbac/cache-invalidation.ts +7 -4
  392. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  393. package/src/rbac/components/NavigationGuard.tsx +7 -3
  394. package/src/rbac/components/NavigationProvider.tsx +6 -3
  395. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  396. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  397. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  398. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  399. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  400. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  401. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  402. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  403. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  404. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  405. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  406. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  407. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  408. package/src/rbac/engine.ts +15 -7
  409. package/src/rbac/hooks/usePermissions.ts +7 -3
  410. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  411. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  412. package/src/rbac/permissions.ts +5 -2
  413. package/src/rbac/security.test.ts +27 -16
  414. package/src/rbac/security.ts +5 -4
  415. package/src/services/AuthService.ts +22 -21
  416. package/src/services/EventService.ts +12 -12
  417. package/src/services/InactivityService.ts +5 -4
  418. package/src/services/OrganisationService.ts +26 -25
  419. package/src/services/__tests__/AuthService.test.ts +51 -19
  420. package/src/services/__tests__/EventService.test.ts +37 -5
  421. package/src/services/__tests__/InactivityService.test.ts +38 -4
  422. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  423. package/src/services/base/BaseService.ts +3 -1
  424. package/src/styles/core.css +3 -0
  425. package/src/theming/__tests__/runtime.test.ts +21 -12
  426. package/src/theming/parseEventColours.ts +5 -19
  427. package/src/theming/runtime.ts +8 -4
  428. package/src/types/validation.ts +2 -29
  429. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  430. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  431. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  432. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  433. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  434. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  435. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  436. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  437. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  438. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  439. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  440. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  441. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  442. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  443. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  444. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  445. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  446. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  447. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  448. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  449. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  450. package/src/utils/__tests__/security.unit.test.ts +40 -18
  451. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  452. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  453. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  454. package/src/utils/app/appConfig.ts +47 -0
  455. package/src/utils/app/appIdResolver.test.ts +497 -0
  456. package/src/utils/app/appIdResolver.ts +133 -0
  457. package/src/utils/app/appNameResolver.simple.test.ts +212 -0
  458. package/src/utils/app/appNameResolver.test.ts +121 -0
  459. package/src/utils/app/appNameResolver.ts +195 -0
  460. package/src/utils/audit/audit.ts +127 -0
  461. package/src/utils/context/organisationContext.test.ts +322 -0
  462. package/src/utils/context/organisationContext.ts +156 -0
  463. package/src/utils/context/sessionTracking.ts +125 -0
  464. package/src/utils/core/cn.ts +7 -0
  465. package/src/utils/core/debugLogger.ts +67 -0
  466. package/src/utils/core/logger.ts +181 -0
  467. package/src/utils/device/deviceFingerprint.ts +215 -0
  468. package/src/utils/dynamic/dynamicUtils.ts +105 -0
  469. package/src/utils/dynamic/lazyLoad.tsx +44 -0
  470. package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
  471. package/src/utils/file-reference/index.ts +501 -0
  472. package/src/utils/formatting/formatDate.test.ts +237 -0
  473. package/src/utils/formatting/formatting.ts +133 -0
  474. package/src/utils/index.ts +39 -54
  475. package/src/utils/performance/bundleAnalysis.ts +129 -0
  476. package/src/utils/performance/performanceBenchmark.ts +64 -0
  477. package/src/utils/performance/performanceBudgets.ts +110 -0
  478. package/src/utils/permissions/permissionTypes.ts +37 -0
  479. package/src/utils/permissions/permissionUtils.test.ts +393 -0
  480. package/src/utils/permissions/permissionUtils.ts +34 -0
  481. package/src/utils/security/auth-utils.ts +96 -0
  482. package/src/utils/security/secureDataAccess.test.ts +711 -0
  483. package/src/utils/security/secureDataAccess.ts +377 -0
  484. package/src/utils/security/secureErrors.ts +82 -0
  485. package/src/utils/security/secureStorage.ts +244 -0
  486. package/src/utils/security/security.ts +159 -0
  487. package/src/utils/security/securityMonitor.ts +45 -0
  488. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  489. package/src/utils/storage/helpers.ts +15 -8
  490. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
  491. package/src/{validation → utils/validation}/csrf.ts +1 -1
  492. package/src/utils/validation/htmlSanitization.ts +184 -0
  493. package/src/utils/validation/index.ts +79 -0
  494. package/src/utils/validation/sanitization.ts +333 -0
  495. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  496. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  497. package/src/utils/validation/validation.ts +111 -0
  498. package/src/utils/validation/validationUtils.ts +123 -0
  499. package/src/validation/index.ts +3 -34
  500. package/dist/chunk-24MKLB7U.js +0 -81
  501. package/dist/chunk-24MKLB7U.js.map +0 -1
  502. package/dist/chunk-3CG5L6RN.js.map +0 -1
  503. package/dist/chunk-3DBFLLLU.js.map +0 -1
  504. package/dist/chunk-5F3NDPJV.js.map +0 -1
  505. package/dist/chunk-66C4BSAY.js.map +0 -1
  506. package/dist/chunk-BDZUMRBD.js +0 -87
  507. package/dist/chunk-BDZUMRBD.js.map +0 -1
  508. package/dist/chunk-BYXRHAIF.js.map +0 -1
  509. package/dist/chunk-CDQ3PX7L.js +0 -18
  510. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  511. package/dist/chunk-CQZU6TFE.js.map +0 -1
  512. package/dist/chunk-F64FFPOZ.js.map +0 -1
  513. package/dist/chunk-GEVIB2UB.js.map +0 -1
  514. package/dist/chunk-GKHF54DI.js.map +0 -1
  515. package/dist/chunk-GVDR7WNV.js.map +0 -1
  516. package/dist/chunk-HMNOSGVA.js.map +0 -1
  517. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  518. package/dist/chunk-M6DDYFUD.js.map +0 -1
  519. package/dist/chunk-O3NWNXDY.js.map +0 -1
  520. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  521. package/dist/chunk-UJI6WSMD.js.map +0 -1
  522. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  523. package/dist/chunk-WP5I5GLN.js.map +0 -1
  524. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  525. package/dist/validation-DnhrNMju.d.ts +0 -159
  526. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  527. package/src/validation/__tests__/common.unit.test.ts +0 -101
  528. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  529. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  530. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  531. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  532. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  533. package/src/validation/__tests__/user.unit.test.ts +0 -440
  534. package/src/validation/sanitization.ts +0 -96
  535. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-6M4L6BI2.js.map} +0 -0
  536. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
  537. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  538. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  539. /package/dist/{chunk-CTJRBUX2.js.map → chunk-6LAAY47Q.js.map} +0 -0
  540. /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
  541. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  542. /package/src/{validation → utils/validation}/common.ts +0 -0
  543. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  544. /package/src/{validation → utils/validation}/user.ts +0 -0
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/debugLogger.ts","../src/utils/validation.ts","../src/utils/validationUtils.ts","../src/utils/sanitization.ts","../src/utils/security.ts","../src/constants/performance.ts","../src/utils/performanceBenchmark.ts","../src/utils/bundleAnalysis.ts","../src/utils/dynamicUtils.ts","../src/utils/lazyLoad.tsx","../src/utils/permissionUtils.ts","../src/utils/permissionTypes.ts","../src/utils/schemaUtils.ts","../src/utils/securityMonitor.ts","../src/utils/audit.ts","../src/utils/deviceFingerprint.ts","../src/utils/index.ts"],"sourcesContent":["/**\n * @file Debug Logger Utility\n * @package @jmruthers/pace-core\n * @module Utils/DebugLogger\n * @since 0.4.76\n */\n\n/**\n * Debug logger that respects environment settings\n * Only logs in development mode to prevent production console spam\n */\nexport class DebugLogger {\n /**\n * Check if we're in development mode\n */\n private static get isDevelopment(): boolean {\n return import.meta.env.MODE === 'development';\n }\n\n /**\n * Log debug information only in development mode\n */\n static log(component: string, message: string, ...args: any[]): void {\n if (this.isDevelopment) {\n try {\n console.log(`[${component}] ${message}`, ...args);\n } catch (e) {\n // Gracefully handle console method errors\n }\n }\n }\n\n /**\n * Log error information (always logged)\n */\n static error(component: string, message: string, ...args: any[]): void {\n try {\n console.error(`[${component}] ${message}`, ...args);\n } catch (e) {\n // Gracefully handle console method errors\n }\n }\n\n /**\n * Log warning information (always logged)\n */\n static warn(component: string, message: string, ...args: any[]): void {\n try {\n console.warn(`[${component}] ${message}`, ...args);\n } catch (e) {\n // Gracefully handle console method errors\n }\n }\n\n /**\n * Log info information only in development mode\n */\n static info(component: string, message: string, ...args: any[]): void {\n if (this.isDevelopment) {\n try {\n console.info(`[${component}] ${message}`, ...args);\n } catch (e) {\n // Gracefully handle console method errors\n }\n }\n }\n}\n","/**\n * @file Internal utilities for validation module\n * @internal This file contains implementation details that should not be used directly\n */\n\n/**\n * Utility functions for validating data in the application\n */\n\n/**\n * Check if a string is a valid email\n */\nexport function isValidEmail(email: string): boolean {\n const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailPattern.test(email);\n}\n\n/**\n * Check if a string is empty (either null, undefined, or just whitespace)\n */\nexport function isEmpty(value: string | null | undefined): boolean {\n return value === null || value === undefined || value.trim() === '';\n}\n\n/**\n * Check if a password meets minimum requirements\n */\nexport function isStrongPassword(password: string): boolean {\n // Minimum 8 characters, at least one uppercase, one lowercase, one number\n const passwordPattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{8,}$/;\n return passwordPattern.test(password);\n}\n\n/**\n * Check if a URL is valid\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a date string is valid\n */\nexport function isValidDate(dateStr: string): boolean {\n const date = new Date(dateStr);\n return !isNaN(date.getTime());\n}\n\n/**\n * Check if a value is within a range\n */\nexport function isWithinRange(value: number, min: number, max: number): boolean {\n return value >= min && value <= max;\n}\n\n/**\n * Check if a value matches a specific pattern\n */\nexport function matchesPattern(value: string, pattern: RegExp): boolean {\n return pattern.test(value);\n}\n\n/**\n * Utility function to deep merge objects for schema combination\n * @internal\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T, \n source: Record<string, unknown>\n): T {\n const output = { ...target };\n \n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach(key => {\n if (isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] });\n } else {\n // Use a type assertion to safely handle the indexing\n const targetKey = key as keyof typeof target;\n const targetValue = target[targetKey];\n \n if (isObject(targetValue)) {\n // Safe cast using type assertion\n output[targetKey] = deepMerge(\n targetValue as Record<string, unknown>,\n source[key] as Record<string, unknown>\n ) as unknown as T[keyof T];\n }\n }\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n \n return output as T;\n}\n\n/**\n * Type guard to check if a value is a plain object\n * @internal\n */\nexport function isObject(item: unknown): item is Record<string, unknown> {\n return item !== null && typeof item === 'object' && !Array.isArray(item);\n}\n","\n/**\n * @file Validation utilities\n * \n * Shared validation utilities with enhanced security\n */\n\nimport { z } from 'zod';\nimport { sanitizeUserInput, sanitizeFormData, type SanitizationOptions } from './sanitization';\n\n/**\n * Validates user input against a schema with automatic sanitization\n */\nexport function validateUserInput<T>(\n schema: z.ZodSchema<T>, \n data: unknown,\n sanitizationRules?: Record<string, SanitizationOptions>\n): { success: boolean; data?: T; error?: string } {\n return sanitizeFormData(data, schema, sanitizationRules);\n}\n\n/**\n * Sanitizes user input by removing potentially dangerous characters\n * @deprecated Use sanitizeUserInput from lib/sanitization instead\n */\nexport function sanitizeUserInput_deprecated(input: string): string {\n // Log deprecation warning\n console.warn('sanitizeUserInput is deprecated. Use sanitizeUserInput from lib/sanitization instead.');\n return sanitizeUserInput(input);\n}\n\n/**\n * Enhanced email validation with sanitization\n */\nexport const emailSchema = z.string()\n .transform(email => email.toLowerCase().trim())\n .pipe(z.string().min(1, 'Email is required').email('Invalid email format').max(254, 'Email too long'));\n\n/**\n * Enhanced password validation\n */\nexport const passwordSchema = z.string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long')\n .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')\n .regex(/[a-z]/, 'Password must contain at least one lowercase letter')\n .regex(/[0-9]/, 'Password must contain at least one number')\n .regex(/[^A-Za-z0-9]/, 'Password must contain at least one special character');\n\n/**\n * Username validation with sanitization\n */\nexport const usernameSchema = z.string()\n .transform(username => username.toLowerCase().trim())\n .pipe(z.string().min(3, 'Username must be at least 3 characters').max(30, 'Username too long').regex(/^[a-zA-Z0-9_-]+$/, 'Username can only contain letters, numbers, hyphens, and underscores'));\n\n/**\n * Name validation with sanitization\n */\nexport const nameSchema = z.string()\n .min(1, 'Name is required')\n .max(100, 'Name too long')\n .refine(name => {\n // Check for XSS attempts and other invalid patterns\n const dangerousPatterns = [\n /<script/i,\n /<img/i,\n /on\\w+\\s*=/i,\n /javascript:/i,\n /data:/i,\n /vbscript:/i\n ];\n \n return !dangerousPatterns.some(pattern => pattern.test(name));\n }, 'Name contains invalid characters')\n .transform(name => sanitizeUserInput(name, { \n allowHtml: false, \n maxLength: 100, \n trim: true \n }));\n\n/**\n * Phone number validation with sanitization\n */\nexport const phoneSchema = z.string()\n .min(10, 'Phone number must be at least 10 digits')\n .max(20, 'Phone number too long')\n .regex(/^[\\+]?[0-9\\s\\-\\(\\)\\.]+$/, 'Invalid phone number format')\n .refine(phone => {\n // Remove all non-digit characters and check length\n const digitsOnly = phone.replace(/\\D/g, '');\n return digitsOnly.length >= 10 && digitsOnly.length <= 15;\n }, 'Phone number must be between 10 and 15 digits');\n\n/**\n * URL validation with sanitization\n */\nexport const urlSchema = z.string()\n .min(1, 'URL is required')\n .max(2048, 'URL too long')\n .refine(url => {\n try {\n const parsed = new URL(url);\n return ['http:', 'https:'].includes(parsed.protocol);\n } catch {\n return false;\n }\n }, 'Invalid URL format')\n .refine(url => {\n // Additional security checks\n const dangerousPatterns = [\n /javascript:/i,\n /data:/i,\n /vbscript:/i,\n /file:/i,\n /mailto:/i\n ];\n \n return !dangerousPatterns.some(pattern => pattern.test(url));\n }, 'URL contains invalid protocol');\n","\n/**\n * @file Input Sanitization Layer\n * @package @jmruthers/pace-core\n * @module Security\n * @since 0.1.0\n * \n * Comprehensive input sanitization utilities to prevent XSS, injection attacks,\n * and other security vulnerabilities.\n */\n\nimport { z } from 'zod';\n\n/**\n * Sanitization options for different contexts\n */\nexport interface SanitizationOptions {\n allowHtml?: boolean;\n allowedTags?: string[];\n maxLength?: number;\n trim?: boolean;\n removeScripts?: boolean;\n removeEvents?: boolean;\n}\n\n/**\n * Default sanitization options\n */\nconst DEFAULT_OPTIONS: SanitizationOptions = {\n allowHtml: false,\n allowedTags: [],\n maxLength: 1000,\n trim: true,\n removeScripts: true,\n removeEvents: true\n};\n\n/**\n * Sanitizes user input by removing potentially dangerous characters and patterns\n */\nexport function sanitizeUserInput(input: string, options: SanitizationOptions = {}): string {\n if (typeof input !== 'string') {\n return '';\n }\n\n const opts = { ...DEFAULT_OPTIONS, ...options };\n let sanitized = input;\n\n // Trim whitespace if requested\n if (opts.trim) {\n sanitized = sanitized.trim();\n }\n\n // Enforce maximum length\n if (opts.maxLength && sanitized.length > opts.maxLength) {\n sanitized = sanitized.substring(0, opts.maxLength);\n }\n\n // Remove or escape HTML if not allowed\n if (!opts.allowHtml) {\n sanitized = sanitized\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;')\n .replace(/\\//g, '&#x2F;');\n } else if (opts.allowedTags && opts.allowedTags.length > 0) {\n // If HTML is allowed, only permit specific tags\n const allowedTagsRegex = new RegExp(`<(?!\\/?(?:${opts.allowedTags.join('|')})\\s*\\/?>)[^>]+>`, 'gi');\n sanitized = sanitized.replace(allowedTagsRegex, '');\n }\n\n // Remove script tags and javascript: protocols\n if (opts.removeScripts) {\n sanitized = sanitized\n .replace(/<script[^>]*>.*?<\\/script>/gi, '')\n .replace(/javascript:/gi, '')\n .replace(/vbscript:/gi, '')\n .replace(/data:/gi, '');\n }\n\n // Remove event handlers\n if (opts.removeEvents) {\n sanitized = sanitized.replace(/on\\w+\\s*=/gi, '');\n }\n\n return sanitized;\n}\n\n/**\n * Sanitizes email addresses\n */\nexport function sanitizeEmail(email: string): string {\n if (typeof email !== 'string') {\n return '';\n }\n\n return email\n .trim()\n .toLowerCase()\n .replace(/[^\\w@.-]/g, ''); // Only allow word characters, @, ., and -\n}\n\n/**\n * Sanitizes phone numbers\n */\nexport function sanitizePhoneNumber(phone: string): string {\n if (typeof phone !== 'string') {\n return '';\n }\n\n return phone.replace(/[^\\d+\\-\\s()]/g, '').trim();\n}\n\n/**\n * Sanitizes URLs\n */\nexport function sanitizeUrl(url: string): string {\n if (typeof url !== 'string') {\n return '';\n }\n\n const sanitized = url.trim();\n \n // Only allow http(s) and ftp protocols\n if (!/^https?:\\/\\/|^ftp:\\/\\//i.test(sanitized)) {\n return '';\n }\n\n // Remove javascript: and other dangerous protocols\n if (/javascript:|data:|vbscript:/i.test(sanitized)) {\n return '';\n }\n\n return sanitized;\n}\n\n/**\n * Sanitizes file names\n */\nexport function sanitizeFileName(fileName: string): string {\n if (typeof fileName !== 'string') {\n return '';\n }\n\n return fileName\n .trim()\n .replace(/[<>:\"/\\\\|?*]/g, '') // Remove invalid file name characters\n .replace(/\\.\\./g, '') // Remove directory traversal attempts\n .substring(0, 255); // Limit length\n}\n\n/**\n * Sanitizes SQL input to prevent injection\n */\nexport function sanitizeSqlInput(input: string): string {\n if (typeof input !== 'string') {\n return '';\n }\n\n return input\n .replace(/['\";\\\\]/g, '') // Remove SQL special characters\n .replace(/--.*$/gm, '') // Remove SQL comments\n .replace(/\\/\\*.*?\\*\\//g, '') // Remove SQL block comments\n .trim();\n}\n\n/**\n * Validates and sanitizes form data using Zod schemas\n */\nexport function sanitizeFormData<T>(\n data: unknown,\n schema: z.ZodSchema<T>,\n sanitizationRules?: Record<string, SanitizationOptions>\n): { success: boolean; data?: T; error?: string } {\n try {\n // First, sanitize string fields if rules are provided\n if (sanitizationRules && typeof data === 'object' && data !== null) {\n const sanitizedData = { ...data } as Record<string, unknown>;\n \n Object.entries(sanitizationRules).forEach(([field, options]) => {\n if (typeof sanitizedData[field] === 'string') {\n sanitizedData[field] = sanitizeUserInput(sanitizedData[field] as string, options);\n }\n });\n \n data = sanitizedData;\n }\n\n // Then validate with Zod schema\n const result = schema.parse(data);\n return { success: true, data: result };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return { \n success: false, \n error: error.errors.map(e => e.message).join(', ') \n };\n }\n return { \n success: false, \n error: 'Validation failed' \n };\n }\n}\n\n/**\n * Content Security Policy (CSP) utilities\n */\nexport const CSP_DIRECTIVES = {\n default: \"default-src 'self'\",\n script: \"script-src 'self' 'unsafe-inline'\",\n style: \"style-src 'self' 'unsafe-inline'\",\n img: \"img-src 'self' data: https:\",\n font: \"font-src 'self'\",\n connect: \"connect-src 'self'\",\n frame: \"frame-src 'none'\"\n};\n\nexport function generateCSPHeader(customDirectives?: Partial<typeof CSP_DIRECTIVES>): string {\n const directives = { ...CSP_DIRECTIVES, ...customDirectives };\n return Object.values(directives).join('; ');\n}\n\n/**\n * Rate limiting utilities\n */\nexport class RateLimiter {\n private attempts: Map<string, { count: number; resetTime: number }> = new Map();\n\n constructor(\n private maxAttempts: number = 5,\n private windowMs: number = 15 * 60 * 1000 // 15 minutes\n ) {}\n\n isAllowed(identifier: string): boolean {\n const now = Date.now();\n const record = this.attempts.get(identifier);\n\n if (!record || now > record.resetTime) {\n this.attempts.set(identifier, { count: 1, resetTime: now + this.windowMs });\n return true;\n }\n\n if (record.count >= this.maxAttempts) {\n return false;\n }\n\n record.count++;\n return true;\n }\n\n getRemainingAttempts(identifier: string): number {\n const record = this.attempts.get(identifier);\n if (!record || Date.now() > record.resetTime) {\n return this.maxAttempts;\n }\n return Math.max(0, this.maxAttempts - record.count);\n }\n\n reset(identifier: string): void {\n this.attempts.delete(identifier);\n }\n}\n","\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\nexport interface SecurityEvent {\n type: string;\n timestamp: Date;\n userId?: string;\n details: Record<string, unknown>;\n}\n\nexport function logSecurityEvent(event: SecurityEvent): void {\n // In production, this should log to your security monitoring system\n // For now, we'll log to console.warn for testing purposes\n console.warn('[SECURITY EVENT]', {\n ...event,\n timestamp: event.timestamp.toISOString()\n });\n}\n\nexport function validateUserSession(userId: string, sessionToken?: string): Promise<boolean> {\n // Mock implementation - replace with actual session validation\n if (!userId || typeof userId !== 'string') {\n logSecurityEvent({\n type: 'invalid_session_validation',\n timestamp: new Date(),\n details: { reason: 'Invalid userId provided' }\n });\n return Promise.resolve(false);\n }\n \n if (sessionToken && sessionToken.length < 10) {\n logSecurityEvent({\n type: 'suspicious_session_token',\n timestamp: new Date(),\n userId,\n details: { reason: 'Session token too short' }\n });\n return Promise.resolve(false);\n }\n \n return Promise.resolve(true);\n}\n\nexport function createSecureSession(\n _supabaseClient: SupabaseClient,\n sessionData: { userId: string; deviceFingerprint?: string }\n): Promise<string> {\n // Mock implementation - in production, create actual secure session\n const sessionId = `sess_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n logSecurityEvent({\n type: 'session_created',\n timestamp: new Date(),\n userId: sessionData.userId,\n details: { \n sessionId,\n hasDeviceFingerprint: !!sessionData.deviceFingerprint\n }\n });\n \n return Promise.resolve(sessionId);\n}\n\nexport function invalidateSession(\n _supabaseClient: SupabaseClient,\n sessionId: string\n): Promise<void> {\n // Mock implementation - in production, invalidate actual session\n logSecurityEvent({\n type: 'session_invalidated',\n timestamp: new Date(),\n details: { sessionId }\n });\n \n return Promise.resolve();\n}\n\nexport function getSecurityHeaders(): Record<string, string> {\n return {\n 'X-Content-Type-Options': 'nosniff',\n 'X-Frame-Options': 'DENY',\n 'X-XSS-Protection': '1; mode=block',\n 'Referrer-Policy': 'strict-origin-when-cross-origin',\n 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'\n };\n}\n\nexport function validateSecurityHeaders(headers: Record<string, string>): boolean {\n const requiredHeaders = ['X-Content-Type-Options', 'X-Frame-Options'];\n const missingHeaders = requiredHeaders.filter(header => !headers[header]);\n \n if (missingHeaders.length > 0) {\n logSecurityEvent({\n type: 'missing_security_headers',\n timestamp: new Date(),\n details: { missingHeaders }\n });\n return false;\n }\n \n return true;\n}\n\nexport function generateDeviceFingerprint(): string {\n // Basic device fingerprinting - in production, use more sophisticated methods\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillText('Device fingerprint', 2, 2);\n }\n \n const fingerprint = [\n navigator.userAgent,\n navigator.language,\n screen.width + 'x' + screen.height,\n new Date().getTimezoneOffset(),\n canvas.toDataURL()\n ].join('|');\n \n // Simple hash function for demonstration\n let hash = 0;\n for (let i = 0; i < fingerprint.length; i++) {\n const char = fingerprint.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n \n return Math.abs(hash).toString(16);\n}\n\nexport function validateDeviceFingerprint(fingerprint: string, expectedFingerprint?: string): boolean {\n if (!fingerprint || typeof fingerprint !== 'string') {\n logSecurityEvent({\n type: 'invalid_device_fingerprint',\n timestamp: new Date(),\n details: { reason: 'Invalid fingerprint format' }\n });\n return false;\n }\n \n if (expectedFingerprint && fingerprint !== expectedFingerprint) {\n logSecurityEvent({\n type: 'device_fingerprint_mismatch',\n timestamp: new Date(),\n details: { \n provided: fingerprint,\n expected: expectedFingerprint\n }\n });\n return false;\n }\n \n return true;\n}\n","/**\n * Performance thresholds and constants\n */\n\nexport const PERFORMANCE_THRESHOLDS = {\n RENDER_TIME: 16, // 60fps target\n INTERACTION_TIME: 100, // 100ms for interactions\n ANIMATION_TIME: 300, // 300ms for animations\n LOAD_TIME: 1000, // 1 second for initial load\n MEMORY_USAGE: 50 * 1024 * 1024, // 50MB memory limit\n BUNDLE_SIZE: 250 * 1024, // 250KB bundle size limit\n} as const;\n\nexport type PerformanceThreshold = keyof typeof PERFORMANCE_THRESHOLDS; ","/**\n * Performance benchmarking utilities\n */\n\nexport interface PerformanceMetrics {\n renderTime: number;\n interactionTime: number;\n memoryUsage: number;\n bundleSize: number;\n}\n\nexport function createPerformanceBenchmark(name: string) {\n const startTime = performance.now();\n const startMemory = (performance as any).memory?.usedJSHeapSize || 0;\n\n return {\n end: () => {\n const endTime = performance.now();\n const endMemory = (performance as any).memory?.usedJSHeapSize || 0;\n \n const metrics: PerformanceMetrics = {\n renderTime: endTime - startTime,\n interactionTime: 0, // Would be measured separately\n memoryUsage: endMemory - startMemory,\n bundleSize: 0, // Would be measured at build time\n };\n\n // TODO: Replace with proper logging service integration\n // For now, we'll use a no-op to prevent console pollution\n const _unused = { \n benchmark: `Performance Benchmark [${name}]`, \n metrics \n };\n \n return metrics;\n }\n };\n}\n\nexport function measureRenderPerformance(componentName: string, renderFn: () => void): PerformanceMetrics {\n const startTime = performance.now();\n const startMemory = (performance as any).memory?.usedJSHeapSize || 0;\n \n renderFn();\n \n const endTime = performance.now();\n const endMemory = (performance as any).memory?.usedJSHeapSize || 0;\n \n const metrics: PerformanceMetrics = {\n renderTime: endTime - startTime,\n interactionTime: 0,\n memoryUsage: endMemory - startMemory,\n bundleSize: 0,\n };\n \n // TODO: Replace with proper logging service integration\n // For now, we'll use a no-op to prevent console pollution\n const _unused = { \n benchmark: `Render Performance [${componentName}]`, \n metrics \n };\n \n return metrics;\n} ","\ninterface BundleStats {\n totalSize: number;\n gzippedSize: number;\n chunks: ChunkInfo[];\n treeshakingEffectiveness: number;\n}\n\ninterface ChunkInfo {\n name: string;\n size: number;\n modules: string[];\n dynamicallyImported: boolean;\n}\n\nclass BundleAnalyzer {\n private enabled = import.meta.env.MODE === 'development';\n\n analyzeBundle(): BundleStats | null {\n if (!this.enabled) return null;\n\n // In a real implementation, this would integrate with webpack-bundle-analyzer\n // or similar tools. For now, we'll simulate analysis\n \n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.log('Bundle analysis would run here in development');\n console.log('To enable real bundle analysis:');\n console.log('1. Install webpack-bundle-analyzer');\n console.log('2. Add bundle analysis to build scripts');\n console.log('3. Integrate with performance budgets');\n\n return {\n totalSize: 0,\n gzippedSize: 0,\n chunks: [],\n treeshakingEffectiveness: 0\n };\n }\n\n checkTreeshaking(): void {\n if (!this.enabled) return;\n\n const potentialIssues = [\n 'Check for unused exports in index files',\n 'Verify side-effect free modules in package.json',\n 'Ensure proper ES module syntax',\n 'Check for circular dependencies'\n ];\n\n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.group('Tree-shaking Analysis');\n potentialIssues.forEach(issue => console.log('- ' + issue));\n console.groupEnd();\n }\n\n validateExports(): void {\n if (!this.enabled) return;\n\n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.group('Export Validation');\n console.log('Checking for optimal export patterns...');\n console.log('- Prefer named exports over default exports');\n console.log('- Avoid barrel exports for large modules');\n console.log('- Use dynamic imports for large dependencies');\n console.groupEnd();\n }\n\n generateReport(): string {\n const report = `\n# Bundle Analysis Report\n\n## Recommendations for @jmruthers/pace-core\n\n### 1. Code Splitting Opportunities\n- ✅ DataTable virtualization is lazy-loaded\n- ⚠️ Consider splitting auth providers by use case\n- ⚠️ Lazy load heavy UI components (charts, complex forms)\n\n### 2. Tree-shaking Optimization\n- ✅ Using ES modules throughout\n- ✅ Proper sideEffects configuration\n- ⚠️ Check for unused utility functions\n\n### 3. Bundle Size Targets\n- Core components: < 50KB gzipped\n- Auth module: < 30KB gzipped \n- Utilities: < 20KB gzipped\n- Total package: < 150KB gzipped\n\n### 4. Performance Monitoring\n- Monitor component render times\n- Track bundle size changes\n- Validate tree-shaking effectiveness\n `;\n\n return report.trim();\n }\n}\n\nexport const bundleAnalyzer = new BundleAnalyzer();\n\n// Helper to check if imports are optimized\nexport function validateImportPattern(moduleId: string, importedItems: string[]): void {\n if (import.meta.env.MODE !== 'development') return;\n\n const largeModules = ['lodash', 'moment', 'rxjs'];\n const isLargeModule = largeModules.some(mod => moduleId.includes(mod));\n \n if (isLargeModule && importedItems.length > 5) {\n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.warn(\n 'Large import detected: importing ' + importedItems.length + ' items from ' + moduleId + '. ' +\n 'Consider splitting imports or using more specific imports.'\n );\n }\n}\n\n// Monitor dynamic imports\nexport function trackDynamicImport(moduleName: string): void {\n if (import.meta.env.MODE !== 'development') return;\n \n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.log('Dynamic import: ' + moduleName + ' - Good for code splitting!');\n}\n","\n/**\n * Dynamic utility loader to reduce initial bundle size\n * Heavy utilities are loaded on-demand\n */\n\n// Type definitions for dynamic imports\ntype DebounceFunction = <T extends (...args: unknown[]) => unknown>(\n func: T,\n wait?: number,\n options?: { leading?: boolean; maxWait?: number; trailing?: boolean }\n) => T & { cancel(): void; flush(): void };\n\ntype ThrottleFunction = <T extends (...args: unknown[]) => unknown>(\n func: T,\n wait?: number,\n options?: { leading?: boolean; trailing?: boolean }\n) => T & { cancel(): void; flush(): void };\n\n// Dynamic lodash utilities\nexport const loadLodash = async (): Promise<{\n debounce: DebounceFunction;\n throttle: ThrottleFunction;\n}> => {\n const [debounceModule, throttleModule] = await Promise.all([\n import('lodash.debounce' as any),\n import('lodash.throttle' as any)\n ]);\n \n return {\n debounce: (debounceModule.default || debounceModule) as DebounceFunction,\n throttle: (throttleModule.default || throttleModule) as ThrottleFunction\n };\n};\n\n// Dynamic date utilities\nexport const loadDateUtils = async (): Promise<typeof import('date-fns')> => {\n const dateFns = await import('date-fns');\n return dateFns;\n};\n\n// Dynamic chart utilities - using unknown type to avoid Recharts type issues\nexport const loadChartUtils = async (): Promise<unknown> => {\n const recharts = await import('recharts');\n return recharts;\n};\n\n// Dynamic form utilities\nexport const loadFormUtils = async (): Promise<{\n useForm: unknown;\n useController: unknown;\n Controller: unknown;\n FormProvider: unknown;\n useFormContext: unknown;\n useWatch: unknown;\n useFormState: unknown;\n useFieldArray: unknown;\n zodResolver: unknown;\n}> => {\n const [reactHookForm, zodResolvers] = await Promise.all([\n import('react-hook-form'),\n import('@hookform/resolvers/zod')\n ]);\n \n return {\n ...reactHookForm,\n zodResolver: zodResolvers.zodResolver\n };\n};\n\n// Dynamic CSV utilities\nexport const loadCSVUtils = async (): Promise<unknown> => {\n const papaparse = await import('papaparse');\n return papaparse.default;\n};\n\n// Utility function to create lazy utility hooks\nexport function createLazyUtility<T>(loader: () => Promise<T>) {\n let cached: T | null = null;\n let loading: Promise<T> | null = null;\n\n return {\n load: async (): Promise<T> => {\n if (cached) return cached;\n if (loading) return loading;\n\n loading = loader().then(result => {\n cached = result;\n loading = null;\n return result;\n });\n\n return loading;\n },\n getCached: (): T | null => cached,\n isLoaded: (): boolean => cached !== null\n };\n}\n\n// Pre-configured lazy utilities with explicit types\nexport const lazyLodash: ReturnType<typeof createLazyUtility<Awaited<ReturnType<typeof loadLodash>>>> = createLazyUtility(loadLodash);\nexport const lazyDateUtils: ReturnType<typeof createLazyUtility<Awaited<ReturnType<typeof loadDateUtils>>>> = createLazyUtility(loadDateUtils);\nexport const lazyChartUtils: ReturnType<typeof createLazyUtility<unknown>> = createLazyUtility(loadChartUtils);\nexport const lazyFormUtils: ReturnType<typeof createLazyUtility<Awaited<ReturnType<typeof loadFormUtils>>>> = createLazyUtility(loadFormUtils);\nexport const lazyCSVUtils: ReturnType<typeof createLazyUtility<unknown>> = createLazyUtility(loadCSVUtils);\n","import React, { Suspense, ComponentType, lazy } from 'react';\nimport { LoadingSpinner } from '../components/LoadingSpinner/LoadingSpinner';\n\ninterface LazyLoadOptions {\n fallback?: React.ReactNode;\n errorBoundary?: ComponentType<{ children: React.ReactNode }>;\n}\n\n/**\n * Create a lazy-loaded component with error boundary and loading fallback\n */\nexport function createLazyComponent<T extends ComponentType<any>>(\n importFn: () => Promise<{ default: T }>,\n componentName: string,\n options: LazyLoadOptions = {}\n): T {\n const LazyComponent = lazy(importFn);\n \n const WrappedComponent = (props: any) => {\n const content = (\n <Suspense fallback={options.fallback || <LoadingSpinner />}>\n <LazyComponent {...props} />\n </Suspense>\n );\n\n if (options.errorBoundary) {\n const ErrorBoundary = options.errorBoundary;\n return <ErrorBoundary>{content}</ErrorBoundary>;\n }\n\n return content;\n };\n \n WrappedComponent.displayName = `Lazy${componentName}`;\n return WrappedComponent as T;\n}\n\n/**\n * Lazy-loaded DataTable component\n */\nexport const LazyDataTable = createLazyComponent(\n () => import('../components/DataTable').then(module => ({ default: module.DataTable })),\n 'DataTable'\n);\n","\n/**\n * Permission utilities for transforming and managing permissions\n */\n\nexport function transformPermissionMapToBoolean(permissions: Record<string, unknown>): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n \n Object.entries(permissions).forEach(([key, value]) => {\n if (typeof value === 'string') {\n // Handle string values - 'false' should be false, empty strings are false, other non-empty strings are true\n result[key] = value !== '' && value.toLowerCase() !== 'false';\n } else {\n result[key] = Boolean(value);\n }\n });\n \n return result;\n}\n\nexport function hasPermission(permissions: Record<string, boolean>, permission: string): boolean {\n return Boolean(permissions[permission]);\n}\n\nexport function hasAnyPermission(permissions: Record<string, boolean>, permissionList: string[] | null | undefined): boolean {\n if (!permissionList || permissionList.length === 0) return false;\n return permissionList.some(permission => hasPermission(permissions, permission));\n}\n\nexport function hasAllPermissions(permissions: Record<string, boolean>, permissionList: string[] | null | undefined): boolean {\n if (!permissionList) return false;\n if (permissionList.length === 0) return true;\n return permissionList.every(permission => hasPermission(permissions, permission));\n}\n","\n/**\n * @file Permission type definitions and utilities\n */\n\nexport enum PermissionType {\n READ = 'read',\n WRITE = 'write',\n DELETE = 'delete',\n ADMIN = 'admin'\n}\n\n/**\n * Parse a permission string into components\n */\nexport function parsePermission(permission: string): { resource: string; action: string } | null {\n if (!permission || typeof permission !== 'string') {\n return null;\n }\n \n const parts = permission.split(':');\n if (parts.length !== 2) {\n return null;\n }\n \n const [action, resource] = parts;\n \n // Check that both action and resource exist and are not empty\n if (action === undefined || resource === undefined || action === '' || resource === '') {\n return null;\n }\n \n return {\n resource,\n action\n };\n}\n","import { z } from 'zod';\n\n/**\n * Creates a subset schema from a larger schema\n * \n * @param schema - Original Zod schema\n * @param keys - Array of keys to pick from the schema\n * @returns New schema with only the selected fields\n */\nexport function pickSchema<T extends z.ZodObject<any, any, any>, K extends keyof z.infer<T>>(\n schema: T,\n keys: K[]\n): z.ZodObject<any> {\n const shape = Object.entries(schema.shape)\n .filter(([key]) => keys.includes(key as K))\n .reduce((acc, [key, value]) => {\n acc[key] = value as z.ZodTypeAny;\n return acc;\n }, {} as Record<string, z.ZodTypeAny>);\n\n return z.object(shape);\n}\n\n/**\n * Combines multiple Zod schemas into one\n * \n * @param schemas - Array of Zod schemas to combine\n * @returns Combined schema\n */\nexport function combineSchemas<T extends z.ZodObject<any, any, any>[]>(\n schemas: T\n): z.ZodObject<any> {\n return schemas.reduce(\n (merged, schema) => merged.merge(schema),\n z.object({})\n );\n} ","\ninterface SecurityEvent {\n id?: string;\n action: string;\n details: Record<string, any>;\n timestamp?: number;\n}\n\ninterface SecurityAlert {\n id: string;\n type: string;\n message: string;\n timestamp: Date;\n}\n\nclass SecurityMonitor {\n private events: SecurityEvent[] = [];\n\n logEvent(event: SecurityEvent) {\n const eventWithId = {\n ...event,\n id: Math.random().toString(36).substr(2, 9),\n timestamp: Date.now()\n };\n this.events.push(eventWithId);\n }\n\n getEvents(): SecurityEvent[] {\n return [...this.events];\n }\n\n clearEvents() {\n this.events = [];\n }\n\n createAlert(alert: Omit<SecurityAlert, 'id' | 'timestamp'>): SecurityAlert {\n return {\n ...alert,\n id: Math.random().toString(36).substr(2, 9),\n timestamp: new Date()\n };\n }\n}\n\nexport const securityMonitor = new SecurityMonitor();\n","\n/**\n * @file Audit Logger - General Utility\n * \n * Moved from shared/auditLogger to lib for better organization\n */\n\nexport interface AuditEvent {\n type: 'auth' | 'permission' | 'security';\n action?: string;\n event?: string;\n user?: string;\n userId?: string;\n details?: Record<string, unknown>;\n data?: Record<string, unknown>;\n timestamp?: number;\n severity?: 'low' | 'medium' | 'high' | 'critical';\n source?: string;\n}\n\nclass AuditLogger {\n private events: AuditEvent[] = [];\n\n log(event: AuditEvent): void {\n const eventWithTimestamp = {\n ...event,\n timestamp: Date.now(),\n };\n \n this.events.push(eventWithTimestamp);\n // TODO: In production, this should send to a proper logging service\n // Console logging removed for production\n }\n\n async logPermissionEvent(event: {\n event: string;\n userId: string;\n data?: Record<string, unknown>;\n }): Promise<void> {\n this.log({\n type: 'permission',\n event: event.event,\n userId: event.userId,\n data: event.data,\n });\n }\n\n async logSecurityEvent(event: {\n event: string;\n data?: Record<string, unknown>;\n }): Promise<void> {\n this.log({\n type: 'security',\n event: event.event,\n data: event.data,\n });\n }\n\n async logAuthEvent(event: {\n event: string;\n userId?: string;\n data?: Record<string, unknown>;\n }): Promise<void> {\n this.log({\n type: 'auth',\n event: event.event,\n userId: event.userId,\n data: event.data,\n });\n }\n\n async getSecurityEvents(): Promise<AuditEvent[]> {\n return this.events.filter(event => event.type === 'security');\n }\n\n getEvents(): AuditEvent[] {\n return [...this.events];\n }\n\n clearEvents(): void {\n this.events = [];\n }\n}\n\nexport const auditLogger = new AuditLogger();\n\n// Alias for backward compatibility\nexport const auditLog = auditLogger;\n\nexport function logAuthEvent(action: string, user?: string, details?: Record<string, unknown>): void {\n auditLogger.log({\n type: 'auth',\n action,\n user,\n details,\n });\n // Console logging removed for production\n}\n\nexport function logPermissionEvent(action: string, user?: string, details?: Record<string, unknown>): void {\n auditLogger.log({\n type: 'permission',\n action,\n user,\n details,\n });\n // Console logging removed for production\n}\n\nexport function logSecurityEvent(action: string, user?: string, details?: Record<string, unknown>): void {\n auditLogger.log({\n type: 'security',\n action,\n user,\n details,\n });\n // Console logging removed for production\n}\n\nexport function logAuditEvent(action: string, user?: string, details?: Record<string, unknown>): void {\n auditLogger.log({\n type: 'auth', // Default to auth type for general audit events\n action,\n user,\n details,\n });\n}\n","/**\n * @file Secure Device Fingerprinting\n * @description Enhanced device fingerprinting with encryption and security measures\n */\n\nimport { secureStorage } from './secureStorage';\n\nexport interface DeviceFingerprint {\n hash: string;\n timestamp: number;\n components: {\n userAgent: string;\n language: string;\n platform: string;\n screen: string;\n timezone: string;\n canvas?: string;\n webgl?: string;\n };\n entropy: number;\n}\n\n/**\n * Generate a secure device fingerprint (synchronous)\n */\nexport function generateDeviceFingerprint(): DeviceFingerprint {\n try {\n const components = {\n userAgent: getHashedUserAgent(),\n language: navigator.language || 'unknown',\n platform: navigator.platform || 'unknown',\n screen: `${screen.width}x${screen.height}x${screen.colorDepth}`,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'unknown',\n canvas: getCanvasFingerprint(),\n webgl: getWebGLFingerprint(),\n };\n\n // Calculate entropy (uniqueness score)\n const entropy = calculateEntropy(components);\n \n // Create a hash from all components\n const fingerprintData = JSON.stringify(components);\n const hash = hashStringSync(fingerprintData);\n\n const fingerprint: DeviceFingerprint = {\n hash,\n timestamp: Date.now(),\n components,\n entropy,\n };\n\n // Store fingerprint asynchronously\n secureStorage.setItem('device_fingerprint', JSON.stringify(fingerprint));\n \n return fingerprint;\n } catch (error) {\n return generateFallbackFingerprint();\n }\n}\n\n/**\n * Validate device fingerprint with security checks\n */\nexport function validateDeviceFingerprint(\n storedFingerprint: DeviceFingerprint,\n currentFingerprint: DeviceFingerprint\n): {\n isValid: boolean;\n confidence: number;\n reasons: string[];\n} {\n const reasons: string[] = [];\n let matchingComponents = 0;\n const totalComponents = Object.keys(storedFingerprint.components).length;\n\n // Check each component\n Object.entries(storedFingerprint.components).forEach(([key, value]) => {\n if (currentFingerprint.components[key as keyof typeof currentFingerprint.components] === value) {\n matchingComponents++;\n } else {\n reasons.push(`Component mismatch: ${key}`);\n }\n });\n\n // Calculate confidence score\n const confidence = (matchingComponents / totalComponents) * 100;\n\n // Security thresholds\n const isValid = confidence >= 80; // Require 80% match\n \n // Additional security checks\n const timeDiff = currentFingerprint.timestamp - storedFingerprint.timestamp;\n const maxAge = 30 * 24 * 60 * 60 * 1000; // 30 days\n \n if (timeDiff > maxAge) {\n reasons.push('Fingerprint too old');\n return { isValid: false, confidence, reasons };\n }\n\n if (confidence < 60) {\n reasons.push('Device signature changed significantly');\n }\n\n return { isValid, confidence, reasons };\n}\n\n/**\n * Generate canvas fingerprint for enhanced uniqueness\n */\nfunction getCanvasFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) return 'canvas-unavailable';\n\n // Draw complex pattern for fingerprinting\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillStyle = '#f60';\n ctx.fillRect(125, 1, 62, 20);\n ctx.fillStyle = '#069';\n ctx.fillText('Device fingerprint 🔒', 2, 15);\n ctx.fillStyle = 'rgba(102, 204, 0, 0.2)';\n ctx.fillText('Device fingerprint 🔒', 4, 17);\n\n const dataURL = canvas.toDataURL();\n return hashStringSync(dataURL);\n } catch (error) {\n return 'canvas-error';\n }\n}\n\n/**\n * Get WebGL fingerprint\n */\nfunction getWebGLFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl') as WebGLRenderingContext | null;\n \n if (!gl) return 'webgl-unavailable';\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) return 'webgl-no-debug';\n\n const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n \n return `${vendor}|${renderer}`;\n } catch (error) {\n return 'webgl-error';\n }\n}\n\n/**\n * Hash user agent to prevent direct exposure\n */\nfunction getHashedUserAgent(): string {\n const ua = navigator.userAgent;\n return hashStringSync(ua).substring(0, 16); // Shorter hash for storage\n}\n\n/**\n * Calculate entropy of fingerprint components\n */\nfunction calculateEntropy(components: Record<string, string>): number {\n const values = Object.values(components).join('');\n const charCounts = new Map<string, number>();\n \n for (const char of values) {\n charCounts.set(char, (charCounts.get(char) || 0) + 1);\n }\n \n let entropy = 0;\n for (const count of charCounts.values()) {\n const probability = count / values.length;\n entropy -= probability * Math.log2(probability);\n }\n \n return entropy;\n}\n\n/**\n * Synchronous hash function for device fingerprinting\n */\nfunction hashStringSync(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Generate fallback fingerprint for error cases\n */\nfunction generateFallbackFingerprint(): DeviceFingerprint {\n const components = {\n userAgent: 'fallback',\n language: 'unknown',\n platform: 'unknown',\n screen: 'unknown',\n timezone: 'unknown',\n };\n\n return {\n hash: `fallback_${Date.now()}_${Math.random().toString(36)}`,\n timestamp: Date.now(),\n components,\n entropy: 1, // Low entropy for fallback\n };\n}\n","/**\n * @file Utility functions exports\n * @package @jmruthers/pace-core\n * @module Utils\n * @since 0.1.0\n */\n\n// Core utilities\nexport { cn } from './cn';\nexport { DebugLogger } from './debugLogger';\n\n// App configuration utilities\nexport * from './appNameResolver';\nexport * from './appConfig';\n\n// Validation and sanitization\nexport * from './validation';\nexport * from './validationUtils';\nexport * from './sanitization';\n\n// Security utilities\nexport { \n getSecurityHeaders, \n validateSecurityHeaders\n} from './security';\n\n// Note: Accessibility testing utilities are only available in test environments\n// They are not exported in production builds to avoid including test dependencies\n\n// Performance utilities\nexport { useComponentPerformance } from '../hooks/useComponentPerformance';\nexport { PERFORMANCE_THRESHOLDS } from '../constants/performance';\nexport { createPerformanceBenchmark, measureRenderPerformance } from './performanceBenchmark';\nexport type { PerformanceMetrics } from './performanceBenchmark';\n\n// Bundle analysis utilities\nexport { \n bundleAnalyzer, \n validateImportPattern, \n trackDynamicImport \n} from './bundleAnalysis';\n\n// Dynamic utility loaders\nexport { \n loadLodash, \n loadDateUtils, \n loadChartUtils,\n loadFormUtils,\n loadCSVUtils,\n createLazyUtility,\n lazyLodash,\n lazyDateUtils,\n lazyChartUtils,\n lazyFormUtils,\n lazyCSVUtils\n} from './dynamicUtils';\n\n// Performance budget utilities\nexport { \n performanceBudgetMonitor, \n PERFORMANCE_BUDGETS \n} from './performanceBudgets';\n\n// Lazy loading utilities\nexport { createLazyComponent, LazyDataTable } from './lazyLoad';\n\n// App configuration utilities\nexport { \n setAppConfig, \n getAppConfig, \n getCurrentAppName, \n getCurrentAppId \n} from './appConfig';\nexport type { AppConfig } from './appConfig';\n\n// Permission utilities\nexport { \n transformPermissionMapToBoolean, \n hasPermission, \n hasAnyPermission, \n hasAllPermissions \n} from './permissionUtils';\n\n// Permission types\nexport { \n PermissionType, \n parsePermission \n} from './permissionTypes';\n\n// Schema utilities\nexport { \n pickSchema, \n combineSchemas \n} from './schemaUtils';\n\n// Security monitoring utilities\nexport { \n securityMonitor \n} from './securityMonitor';\nexport type { SecureDataAccess } from './secureDataAccess';\n\n// Session tracking utilities\nexport { \n useSessionTracking \n} from './sessionTracking';\n\n// Audit utilities\nexport { \n auditLogger, \n auditLog,\n logAuthEvent,\n logPermissionEvent,\n logSecurityEvent,\n logAuditEvent\n} from './audit';\n\n// Device fingerprinting utilities\nexport { \n generateDeviceFingerprint, \n validateDeviceFingerprint \n} from './deviceFingerprint';\n\n\n// Formatting utilities\nexport { \n formatDate, \n formatCurrency, \n formatNumber,\n formatPercent,\n formatCompactNumber,\n formatFileSize\n} from './formatting';\n\n// Organisation context utilities\nexport { \n setOrganisationContext, \n clearOrganisationContext, \n getOrganisationContext, \n isOrganisationContextAvailable \n} from './organisationContext';\n\n// Re-export types for convenience\nexport type { \n SecurityEvent\n} from './security';\n"],"mappings":"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","names":["z","z","PermissionType","z","logSecurityEvent"]}
1
+ {"version":3,"sources":["../src/utils/core/debugLogger.ts","../src/utils/index.ts","../src/utils/validation/validationUtils.ts","../src/utils/validation/sanitization.ts","../src/utils/validation/common.ts","../src/utils/validation/passwordSchema.ts","../src/utils/security/security.ts","../src/utils/security/securityMonitor.ts","../src/constants/performance.ts","../src/utils/performance/performanceBenchmark.ts","../src/utils/performance/bundleAnalysis.ts","../src/utils/dynamic/dynamicUtils.ts","../src/utils/dynamic/lazyLoad.tsx","../src/utils/permissions/permissionUtils.ts","../src/utils/permissions/permissionTypes.ts","../src/utils/audit/audit.ts","../src/utils/device/deviceFingerprint.ts"],"sourcesContent":["/**\n * @file Debug Logger Utility\n * @package @jmruthers/pace-core\n * @module Utils/DebugLogger\n * @since 0.4.76\n */\n\n/**\n * Debug logger that respects environment settings\n * Only logs in development mode to prevent production console spam\n */\nexport class DebugLogger {\n /**\n * Check if we're in development mode\n */\n private static get isDevelopment(): boolean {\n return import.meta.env.MODE === 'development';\n }\n\n /**\n * Log debug information only in development mode\n */\n static log(component: string, message: string, ...args: any[]): void {\n if (this.isDevelopment) {\n try {\n console.log(`[${component}] ${message}`, ...args);\n } catch (e) {\n // Gracefully handle console method errors\n }\n }\n }\n\n /**\n * Log error information (always logged)\n */\n static error(component: string, message: string, ...args: any[]): void {\n try {\n console.error(`[${component}] ${message}`, ...args);\n } catch (e) {\n // Gracefully handle console method errors\n }\n }\n\n /**\n * Log warning information (always logged)\n */\n static warn(component: string, message: string, ...args: any[]): void {\n try {\n console.warn(`[${component}] ${message}`, ...args);\n } catch (e) {\n // Gracefully handle console method errors\n }\n }\n\n /**\n * Log info information only in development mode\n */\n static info(component: string, message: string, ...args: any[]): void {\n if (this.isDevelopment) {\n try {\n console.info(`[${component}] ${message}`, ...args);\n } catch (e) {\n // Gracefully handle console method errors\n }\n }\n }\n}\n","/**\n * @file Utility functions exports\n * @package @jmruthers/pace-core\n * @module Utils\n * @since 0.1.0\n */\n\n// Core utilities\nexport { cn } from './core/cn';\nexport { DebugLogger } from './core/debugLogger';\nexport { Logger, logger, createLogger, LogLevel } from './core/logger';\nexport type { LoggerConfig } from './core/logger';\n\n// App configuration utilities\nexport * from './app/appNameResolver';\nexport { setAppConfig, getAppConfig, getCurrentAppId } from './app/appConfig';\nexport * from './app/appIdResolver';\n\n// Validation and sanitization\nexport * from './validation';\n// Explicitly re-export commonly used validation utilities to ensure they're available\n// Import from source modules to avoid re-export issues\nexport { validateUserInput, usernameSchema } from './validation/validationUtils';\nexport { sanitizeUserInput, sanitizeFormData } from './validation/sanitization';\nexport { emailSchema, nameSchema, phoneSchema, urlSchema } from './validation/common';\nexport { passwordSchema } from './validation/passwordSchema';\nexport { pickSchema, combineSchemas } from './validation/schema';\n\n// Security utilities\nexport { \n getSecurityHeaders, \n validateSecurityHeaders\n} from './security/security';\nexport type { SecurityEvent } from './security/security';\n\n// Security monitoring utilities\nexport { \n securityMonitor \n} from './security/securityMonitor';\nexport type { SecureDataAccess } from './security/secureDataAccess';\n\n// Performance utilities\nexport { useComponentPerformance } from '../hooks/useComponentPerformance';\nexport { PERFORMANCE_THRESHOLDS } from '../constants/performance';\nexport { createPerformanceBenchmark, measureRenderPerformance } from './performance/performanceBenchmark';\nexport type { PerformanceMetrics } from './performance/performanceBenchmark';\n\n// Bundle analysis utilities\nexport { \n bundleAnalyzer, \n validateImportPattern, \n trackDynamicImport \n} from './performance/bundleAnalysis';\n\n// Performance budget utilities\nexport { \n performanceBudgetMonitor, \n PERFORMANCE_BUDGETS \n} from './performance/performanceBudgets';\n\n// Dynamic utility loaders\nexport { \n loadLodash, \n loadDateUtils, \n loadChartUtils,\n loadFormUtils,\n loadCSVUtils,\n createLazyUtility,\n lazyLodash,\n lazyDateUtils,\n lazyChartUtils,\n lazyFormUtils,\n lazyCSVUtils\n} from './dynamic/dynamicUtils';\n\n// Lazy loading utilities\nexport { createLazyComponent, LazyDataTable } from './dynamic/lazyLoad';\n\n// Permission utilities\nexport { \n transformPermissionMapToBoolean, \n hasPermission, \n hasAnyPermission, \n hasAllPermissions \n} from './permissions/permissionUtils';\n\n// Permission types\nexport { \n PermissionType, \n parsePermission \n} from './permissions/permissionTypes';\n\n// Session tracking utilities\nexport { \n useSessionTracking \n} from './context/sessionTracking';\n\n// Audit utilities\nexport { \n auditLogger, \n auditLog,\n logAuthEvent,\n logPermissionEvent,\n logSecurityEvent,\n logAuditEvent\n} from './audit/audit';\n\n// Device fingerprinting utilities\nexport { \n generateDeviceFingerprint, \n validateDeviceFingerprint \n} from './device/deviceFingerprint';\n\n// Formatting utilities\nexport { \n formatDate, \n formatCurrency, \n formatNumber,\n formatPercent,\n formatCompactNumber,\n formatFileSize\n} from './formatting/formatting';\n\n// Organisation context utilities\nexport { \n setOrganisationContext, \n clearOrganisationContext, \n getOrganisationContext, \n isOrganisationContextAvailable \n} from './context/organisationContext';\n","\n/**\n * @file Validation utilities\n * \n * Shared validation utilities with enhanced security\n */\n\nimport { z } from 'zod';\nimport { sanitizeUserInput, sanitizeFormData, type SanitizationOptions } from './sanitization';\nimport { createLogger } from '../core/logger';\n\nconst log = createLogger('ValidationUtils');\n\n/**\n * Validates user input against a schema with automatic sanitization\n */\nexport function validateUserInput<T>(\n schema: z.ZodSchema<T>, \n data: unknown,\n sanitizationRules?: Record<string, SanitizationOptions>\n): { success: boolean; data?: T; error?: string } {\n return sanitizeFormData(data, schema, sanitizationRules);\n}\n\n/**\n * Sanitizes user input by removing potentially dangerous characters\n * @deprecated Use sanitizeUserInput from lib/sanitization instead\n */\nexport function sanitizeUserInput_deprecated(input: string): string {\n // Log deprecation warning\n log.warn('sanitizeUserInput is deprecated. Use sanitizeUserInput from lib/sanitization instead.');\n return sanitizeUserInput(input);\n}\n\n/**\n * Enhanced email validation with sanitization\n */\nexport const emailSchema = z.string()\n .transform(email => email.toLowerCase().trim())\n .pipe(z.string().min(1, 'Email is required').email('Invalid email format').max(254, 'Email too long'));\n\n/**\n * Enhanced password validation\n */\nexport const passwordSchema = z.string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long')\n .regex(/[A-Z]/, 'Password must contain at least one uppercase letter')\n .regex(/[a-z]/, 'Password must contain at least one lowercase letter')\n .regex(/[0-9]/, 'Password must contain at least one number')\n .regex(/[^A-Za-z0-9]/, 'Password must contain at least one special character');\n\n/**\n * Username validation with sanitization\n */\nexport const usernameSchema = z.string()\n .transform(username => username.toLowerCase().trim())\n .pipe(z.string().min(3, 'Username must be at least 3 characters').max(30, 'Username too long').regex(/^[a-zA-Z0-9_-]+$/, 'Username can only contain letters, numbers, hyphens, and underscores'));\n\n/**\n * Name validation with sanitization\n */\nexport const nameSchema = z.string()\n .min(1, 'Name is required')\n .max(100, 'Name too long')\n .refine(name => {\n // Check for XSS attempts and other invalid patterns\n const dangerousPatterns = [\n /<script/i,\n /<img/i,\n /on\\w+\\s*=/i,\n /javascript:/i,\n /data:/i,\n /vbscript:/i\n ];\n \n return !dangerousPatterns.some(pattern => pattern.test(name));\n }, 'Name contains invalid characters')\n .transform(name => sanitizeUserInput(name, { \n allowHtml: false, \n maxLength: 100, \n trim: true \n }));\n\n/**\n * Phone number validation with sanitization\n */\nexport const phoneSchema = z.string()\n .min(10, 'Phone number must be at least 10 digits')\n .max(20, 'Phone number too long')\n .regex(/^[\\+]?[0-9\\s\\-\\(\\)\\.]+$/, 'Invalid phone number format')\n .refine(phone => {\n // Remove all non-digit characters and check length\n const digitsOnly = phone.replace(/\\D/g, '');\n return digitsOnly.length >= 10 && digitsOnly.length <= 15;\n }, 'Phone number must be between 10 and 15 digits');\n\n/**\n * URL validation with sanitization\n */\nexport const urlSchema = z.string()\n .min(1, 'URL is required')\n .max(2048, 'URL too long')\n .refine(url => {\n try {\n const parsed = new URL(url);\n return ['http:', 'https:'].includes(parsed.protocol);\n } catch {\n return false;\n }\n }, 'Invalid URL format')\n .refine(url => {\n // Additional security checks\n const dangerousPatterns = [\n /javascript:/i,\n /data:/i,\n /vbscript:/i,\n /file:/i,\n /mailto:/i\n ];\n \n return !dangerousPatterns.some(pattern => pattern.test(url));\n }, 'URL contains invalid protocol');\n","/**\n * @file Input Sanitization Layer\n * @package @jmruthers/pace-core\n * @module Utils/Validation/Sanitization\n * @since 0.1.0\n * \n * Comprehensive input sanitization utilities to prevent XSS, injection attacks,\n * and other security vulnerabilities.\n */\n\nimport { z } from 'zod';\n\n/**\n * Sanitization options for different contexts\n */\nexport interface SanitizationOptions {\n allowHtml?: boolean;\n allowedTags?: string[];\n maxLength?: number;\n trim?: boolean;\n removeScripts?: boolean;\n removeEvents?: boolean;\n}\n\n/**\n * Default sanitization options\n */\nconst DEFAULT_OPTIONS: SanitizationOptions = {\n allowHtml: false,\n allowedTags: [],\n maxLength: 1000,\n trim: true,\n removeScripts: true,\n removeEvents: true\n};\n\n/**\n * Sanitizes user input by removing potentially dangerous characters and patterns\n */\nexport function sanitizeUserInput(input: string, options: SanitizationOptions = {}): string {\n if (typeof input !== 'string') {\n return '';\n }\n\n const opts = { ...DEFAULT_OPTIONS, ...options };\n let sanitized = input;\n\n // Trim whitespace if requested\n if (opts.trim) {\n sanitized = sanitized.trim();\n }\n\n // Enforce maximum length\n if (opts.maxLength && sanitized.length > opts.maxLength) {\n sanitized = sanitized.substring(0, opts.maxLength);\n }\n\n // Remove or escape HTML if not allowed\n if (!opts.allowHtml) {\n sanitized = sanitized\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;')\n .replace(/\\//g, '&#x2F;');\n } else if (opts.allowedTags && opts.allowedTags.length > 0) {\n // If HTML is allowed, only permit specific tags\n const allowedTagsRegex = new RegExp(`<(?!\\/?(?:${opts.allowedTags.join('|')})\\s*\\/?>)[^>]+>`, 'gi');\n sanitized = sanitized.replace(allowedTagsRegex, '');\n }\n\n // Remove script tags and javascript: protocols\n if (opts.removeScripts) {\n sanitized = sanitized\n .replace(/<script[^>]*>.*?<\\/script>/gi, '')\n .replace(/javascript:/gi, '')\n .replace(/vbscript:/gi, '')\n .replace(/data:/gi, '');\n }\n\n // Remove event handlers\n if (opts.removeEvents) {\n sanitized = sanitized.replace(/on\\w+\\s*=/gi, '');\n }\n\n return sanitized;\n}\n\n/**\n * Sanitizes email addresses\n */\nexport function sanitizeEmail(email: string): string {\n if (typeof email !== 'string') {\n return '';\n }\n\n return email\n .trim()\n .toLowerCase()\n .replace(/[^\\w@.-]/g, ''); // Only allow word characters, @, ., and -\n}\n\n/**\n * Sanitizes phone numbers\n */\nexport function sanitizePhoneNumber(phone: string): string {\n if (typeof phone !== 'string') {\n return '';\n }\n\n return phone.replace(/[^\\d+\\-\\s()]/g, '').trim();\n}\n\n/**\n * Sanitizes URLs\n */\nexport function sanitizeUrl(url: string): string {\n if (typeof url !== 'string') {\n return '';\n }\n\n const sanitized = url.trim();\n \n // Only allow http(s) and ftp protocols\n if (!/^https?:\\/\\/|^ftp:\\/\\//i.test(sanitized)) {\n return '';\n }\n\n // Remove javascript: and other dangerous protocols\n if (/javascript:|data:|vbscript:/i.test(sanitized)) {\n return '';\n }\n\n return sanitized;\n}\n\n/**\n * Sanitizes file names\n */\nexport function sanitizeFileName(fileName: string): string {\n if (typeof fileName !== 'string') {\n return '';\n }\n\n return fileName\n .trim()\n .replace(/[<>:\"/\\\\|?*]/g, '') // Remove invalid file name characters\n .replace(/\\.\\./g, '') // Remove directory traversal attempts\n .substring(0, 255); // Limit length\n}\n\n/**\n * Sanitizes SQL input to prevent injection\n */\nexport function sanitizeSqlInput(input: string): string {\n if (typeof input !== 'string') {\n return '';\n }\n\n return input\n .replace(/['\";\\\\]/g, '') // Remove SQL special characters\n .replace(/--.*$/gm, '') // Remove SQL comments\n .replace(/\\/\\*.*?\\*\\//g, '') // Remove SQL block comments\n .trim();\n}\n\n/**\n * Validates and sanitizes form data using Zod schemas\n */\nexport function sanitizeFormData<T>(\n data: unknown,\n schema: z.ZodSchema<T>,\n sanitizationRules?: Record<string, SanitizationOptions>\n): { success: boolean; data?: T; error?: string } {\n try {\n // First, sanitize string fields if rules are provided\n if (sanitizationRules && typeof data === 'object' && data !== null) {\n const sanitizedData = { ...data } as Record<string, unknown>;\n \n Object.entries(sanitizationRules).forEach(([field, options]) => {\n if (typeof sanitizedData[field] === 'string') {\n sanitizedData[field] = sanitizeUserInput(sanitizedData[field] as string, options);\n }\n });\n \n data = sanitizedData;\n }\n\n // Then validate with Zod schema\n const result = schema.parse(data);\n return { success: true, data: result };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return { \n success: false, \n error: error.errors.map(e => e.message).join(', ') \n };\n }\n return { \n success: false, \n error: 'Validation failed' \n };\n }\n}\n\n// Re-export HTML sanitization from the consolidated module\n// The new implementation allows safe HTML tags while removing dangerous ones\nexport { sanitizeHtml } from './htmlSanitization';\n\n/**\n * Content Security Policy (CSP) utilities\n */\nexport const CSP_DIRECTIVES = {\n default: \"default-src 'self'\",\n script: \"script-src 'self' 'unsafe-inline'\",\n style: \"style-src 'self' 'unsafe-inline'\",\n img: \"img-src 'self' data: https:\",\n font: \"font-src 'self'\",\n connect: \"connect-src 'self'\",\n frame: \"frame-src 'none'\"\n};\n\nexport function generateCSPHeader(customDirectives?: Partial<typeof CSP_DIRECTIVES>): string {\n const directives = { ...CSP_DIRECTIVES, ...customDirectives };\n return Object.values(directives).join('; ');\n}\n\n/**\n * Rate limiting utilities\n */\nexport class RateLimiter {\n private attempts: Map<string, { count: number; resetTime: number }> = new Map();\n\n constructor(\n private maxAttempts: number = 5,\n private windowMs: number = 15 * 60 * 1000 // 15 minutes\n ) {}\n\n isAllowed(identifier: string): boolean {\n const now = Date.now();\n const record = this.attempts.get(identifier);\n\n if (!record || now > record.resetTime) {\n this.attempts.set(identifier, { count: 1, resetTime: now + this.windowMs });\n return true;\n }\n\n if (record.count >= this.maxAttempts) {\n return false;\n }\n\n record.count++;\n return true;\n }\n\n getRemainingAttempts(identifier: string): number {\n const record = this.attempts.get(identifier);\n if (!record || Date.now() > record.resetTime) {\n return this.maxAttempts;\n }\n return Math.max(0, this.maxAttempts - record.count);\n }\n\n reset(identifier: string): void {\n this.attempts.delete(identifier);\n }\n}\n\n// Validation schemas (kept from previous version)\n/**\n * Enhanced email schema with security checks\n */\nexport const secureEmailSchema = z\n .string()\n .min(1, 'Email is required')\n .email('Invalid email format')\n .max(254, 'Email too long')\n .refine(\n (email) => {\n if (!email || typeof email !== 'string') return false;\n // Basic domain validation\n const domain = email.split('@')[1];\n return domain && domain.includes('.') && domain.length > 3;\n },\n 'Invalid email domain'\n )\n .transform((email) => sanitizeEmail(email));\n\n/**\n * Basic email schema for common use\n */\nexport const emailSchema = z\n .string()\n .min(1, 'Email is required')\n .email('Invalid email format');\n\n/**\n * Name validation schema\n */\nexport const nameSchema = z\n .string()\n .min(1, 'Name is required')\n .max(100, 'Name too long')\n .regex(/^[a-zA-Z\\s'-]+$/, 'Name contains invalid characters');\n\n/**\n * Phone validation schema\n */\nexport const phoneSchema = z\n .string()\n .regex(/^[\\+]?[1-9][\\d]{0,15}$/, 'Invalid phone number format');\n\n/**\n * URL validation schema\n */\nexport const urlSchema = z\n .string()\n .url('Invalid URL format');\n\n/**\n * Date validation schema\n */\nexport const dateSchema = z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Invalid date format (YYYY-MM-DD)');\n\n/**\n * Secure login schema\n */\nexport const secureLoginSchema = z.object({\n email: secureEmailSchema,\n password: z.string().min(1, 'Password is required'),\n});\n","\n/**\n * @file Common validation schemas\n * @description Reusable validation schemas for common data types\n */\n\nimport { z } from 'zod';\n\n/**\n * Email validation schema\n */\nexport const emailSchema = z\n .string()\n .min(1, 'Email is required')\n .email('Invalid email format')\n .max(254, 'Email too long');\n\n/**\n * Name validation schema\n */\nexport const nameSchema = z\n .string()\n .min(1, 'Name is required')\n .max(100, 'Name too long')\n .regex(/^[a-zA-Z\\s'-]+$/, 'Name contains invalid characters');\n\n/**\n * Phone number validation schema\n */\nexport const phoneSchema = z\n .string()\n .regex(/^\\+?[\\d\\s\\-\\(\\)]+$/, 'Invalid phone number format')\n .min(10, 'Phone number too short')\n .max(20, 'Phone number too long');\n\n/**\n * URL validation schema\n */\nexport const urlSchema = z\n .string()\n .url('Invalid URL format')\n .max(2048, 'URL too long');\n\n/**\n * Date validation schema\n */\nexport const dateSchema = z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Date must be in YYYY-MM-DD format')\n .refine((date) => {\n const parsed = new Date(date);\n return !isNaN(parsed.getTime());\n }, 'Invalid date');\n","\n/**\n * @file Enhanced Password Schema with Security Validations\n * @description Comprehensive password validation with security checks\n */\n\nimport { z } from 'zod';\n\n// Common weak passwords to check against\nconst COMMON_PASSWORDS = new Set([\n 'password', '123456', '123456789', 'qwerty', 'abc123', 'password123',\n 'admin', 'letmein', 'welcome', 'monkey', '1234567890', 'password1'\n]);\n\n// Common password patterns to avoid\nconst WEAK_PATTERNS = [\n /^(.)\\1+$/, // All same character\n /^(012|123|234|345|456|567|678|789|890|987|876|765|654|543|432|321|210)+/, // Sequential numbers\n /^(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz)+/i, // Sequential letters\n];\n\n/**\n * Enhanced password validation schema with security checks\n */\nexport const securePasswordSchema = z\n .string()\n .min(8, 'Password must be at least 8 characters long')\n .max(128, 'Password must not exceed 128 characters')\n .refine(\n (password) => /[a-z]/.test(password),\n 'Password must contain at least one lowercase letter'\n )\n .refine(\n (password) => /[A-Z]/.test(password),\n 'Password must contain at least one uppercase letter'\n )\n .refine(\n (password) => /\\d/.test(password),\n 'Password must contain at least one number'\n )\n .refine(\n (password) => /[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password),\n 'Password must contain at least one special character'\n )\n .refine(\n (password) => !COMMON_PASSWORDS.has(password.toLowerCase()),\n 'Password is too common. Please choose a stronger password'\n )\n .refine(\n (password) => !WEAK_PATTERNS.some(pattern => pattern.test(password)),\n 'Password contains weak patterns. Please choose a more complex password'\n )\n .refine(\n (password) => {\n // Check for keyboard patterns (qwerty, asdf, etc.)\n const keyboardPatterns = ['qwerty', 'asdfgh', 'zxcvbn', '1234567890'];\n return !keyboardPatterns.some(pattern => \n password.toLowerCase().includes(pattern)\n );\n },\n 'Password contains keyboard patterns. Please choose a more secure password'\n );\n\n/**\n * Basic password schema for less strict requirements\n */\nexport const passwordSchema = z\n .string()\n .min(6, 'Password must be at least 6 characters long')\n .max(128, 'Password must not exceed 128 characters');\n\n/**\n * Password strength calculator\n */\nexport function calculatePasswordStrength(password: string): {\n score: number;\n feedback: string[];\n level: 'very-weak' | 'weak' | 'fair' | 'good' | 'strong';\n} {\n let score = 0;\n const feedback: string[] = [];\n\n // Length check\n if (password.length >= 8) score += 20;\n else if (password.length >= 6) score += 10;\n else feedback.push('Use at least 8 characters');\n\n // Character variety\n if (/[a-z]/.test(password)) score += 15;\n else feedback.push('Add lowercase letters');\n\n if (/[A-Z]/.test(password)) score += 15;\n else feedback.push('Add uppercase letters');\n\n if (/\\d/.test(password)) score += 15;\n else feedback.push('Add numbers');\n\n if (/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)) score += 15;\n else feedback.push('Add special characters');\n\n // Additional complexity\n if (password.length >= 12) score += 10;\n if (/[^a-zA-Z0-9]/.test(password)) score += 10;\n\n // Penalties\n if (COMMON_PASSWORDS.has(password.toLowerCase())) {\n score -= 30;\n feedback.push('Avoid common passwords');\n }\n\n if (WEAK_PATTERNS.some(pattern => pattern.test(password))) {\n score -= 20;\n feedback.push('Avoid predictable patterns');\n }\n\n // Determine level\n let level: 'very-weak' | 'weak' | 'fair' | 'good' | 'strong';\n if (score < 30) level = 'very-weak';\n else if (score < 50) level = 'weak';\n else if (score < 70) level = 'fair';\n else if (score < 90) level = 'good';\n else level = 'strong';\n\n return { score: Math.max(0, Math.min(100, score)), feedback, level };\n}\n","\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { createLogger } from '../core/logger';\n\nconst log = createLogger('Security');\n\nexport interface SecurityEvent {\n type: string;\n timestamp: Date;\n userId?: string;\n details: Record<string, unknown>;\n}\n\nexport function logSecurityEvent(event: SecurityEvent): void {\n // In production, this should log to your security monitoring system\n // Using Logger.warn for now - can be upgraded to audit system later\n log.warn('Security event:', {\n ...event,\n timestamp: event.timestamp.toISOString()\n });\n}\n\nexport function validateUserSession(userId: string, sessionToken?: string): Promise<boolean> {\n // Mock implementation - replace with actual session validation\n if (!userId || typeof userId !== 'string') {\n logSecurityEvent({\n type: 'invalid_session_validation',\n timestamp: new Date(),\n details: { reason: 'Invalid userId provided' }\n });\n return Promise.resolve(false);\n }\n \n if (sessionToken && sessionToken.length < 10) {\n logSecurityEvent({\n type: 'suspicious_session_token',\n timestamp: new Date(),\n userId,\n details: { reason: 'Session token too short' }\n });\n return Promise.resolve(false);\n }\n \n return Promise.resolve(true);\n}\n\nexport function createSecureSession(\n _supabaseClient: SupabaseClient,\n sessionData: { userId: string; deviceFingerprint?: string }\n): Promise<string> {\n // Mock implementation - in production, create actual secure session\n const sessionId = `sess_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n logSecurityEvent({\n type: 'session_created',\n timestamp: new Date(),\n userId: sessionData.userId,\n details: { \n sessionId,\n hasDeviceFingerprint: !!sessionData.deviceFingerprint\n }\n });\n \n return Promise.resolve(sessionId);\n}\n\nexport function invalidateSession(\n _supabaseClient: SupabaseClient,\n sessionId: string\n): Promise<void> {\n // Mock implementation - in production, invalidate actual session\n logSecurityEvent({\n type: 'session_invalidated',\n timestamp: new Date(),\n details: { sessionId }\n });\n \n return Promise.resolve();\n}\n\nexport function getSecurityHeaders(): Record<string, string> {\n return {\n 'X-Content-Type-Options': 'nosniff',\n 'X-Frame-Options': 'DENY',\n 'X-XSS-Protection': '1; mode=block',\n 'Referrer-Policy': 'strict-origin-when-cross-origin',\n 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'\n };\n}\n\nexport function validateSecurityHeaders(headers: Record<string, string>): boolean {\n const requiredHeaders = ['X-Content-Type-Options', 'X-Frame-Options'];\n const missingHeaders = requiredHeaders.filter(header => !headers[header]);\n \n if (missingHeaders.length > 0) {\n logSecurityEvent({\n type: 'missing_security_headers',\n timestamp: new Date(),\n details: { missingHeaders }\n });\n return false;\n }\n \n return true;\n}\n\nexport function generateDeviceFingerprint(): string {\n // Basic device fingerprinting - in production, use more sophisticated methods\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillText('Device fingerprint', 2, 2);\n }\n \n const fingerprint = [\n navigator.userAgent,\n navigator.language,\n screen.width + 'x' + screen.height,\n new Date().getTimezoneOffset(),\n canvas.toDataURL()\n ].join('|');\n \n // Simple hash function for demonstration\n let hash = 0;\n for (let i = 0; i < fingerprint.length; i++) {\n const char = fingerprint.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n \n return Math.abs(hash).toString(16);\n}\n\nexport function validateDeviceFingerprint(fingerprint: string, expectedFingerprint?: string): boolean {\n if (!fingerprint || typeof fingerprint !== 'string') {\n logSecurityEvent({\n type: 'invalid_device_fingerprint',\n timestamp: new Date(),\n details: { reason: 'Invalid fingerprint format' }\n });\n return false;\n }\n \n if (expectedFingerprint && fingerprint !== expectedFingerprint) {\n logSecurityEvent({\n type: 'device_fingerprint_mismatch',\n timestamp: new Date(),\n details: { \n provided: fingerprint,\n expected: expectedFingerprint\n }\n });\n return false;\n }\n \n return true;\n}\n","\ninterface SecurityEvent {\n id?: string;\n action: string;\n details: Record<string, any>;\n timestamp?: number;\n}\n\ninterface SecurityAlert {\n id: string;\n type: string;\n message: string;\n timestamp: Date;\n}\n\nclass SecurityMonitor {\n private events: SecurityEvent[] = [];\n\n logEvent(event: SecurityEvent) {\n const eventWithId = {\n ...event,\n id: Math.random().toString(36).substr(2, 9),\n timestamp: Date.now()\n };\n this.events.push(eventWithId);\n }\n\n getEvents(): SecurityEvent[] {\n return [...this.events];\n }\n\n clearEvents() {\n this.events = [];\n }\n\n createAlert(alert: Omit<SecurityAlert, 'id' | 'timestamp'>): SecurityAlert {\n return {\n ...alert,\n id: Math.random().toString(36).substr(2, 9),\n timestamp: new Date()\n };\n }\n}\n\nexport const securityMonitor = new SecurityMonitor();\n","/**\n * Performance thresholds and constants\n */\n\nexport const PERFORMANCE_THRESHOLDS = {\n RENDER_TIME: 16, // 60fps target\n INTERACTION_TIME: 100, // 100ms for interactions\n ANIMATION_TIME: 300, // 300ms for animations\n LOAD_TIME: 1000, // 1 second for initial load\n MEMORY_USAGE: 50 * 1024 * 1024, // 50MB memory limit\n BUNDLE_SIZE: 250 * 1024, // 250KB bundle size limit\n} as const;\n\nexport type PerformanceThreshold = keyof typeof PERFORMANCE_THRESHOLDS; ","/**\n * Performance benchmarking utilities\n */\n\nexport interface PerformanceMetrics {\n renderTime: number;\n interactionTime: number;\n memoryUsage: number;\n bundleSize: number;\n}\n\nexport function createPerformanceBenchmark(name: string) {\n const startTime = performance.now();\n const startMemory = (performance as any).memory?.usedJSHeapSize || 0;\n\n return {\n end: () => {\n const endTime = performance.now();\n const endMemory = (performance as any).memory?.usedJSHeapSize || 0;\n \n const metrics: PerformanceMetrics = {\n renderTime: endTime - startTime,\n interactionTime: 0, // Would be measured separately\n memoryUsage: endMemory - startMemory,\n bundleSize: 0, // Would be measured at build time\n };\n\n // TODO: Replace with proper logging service integration\n // For now, we'll use a no-op to prevent console pollution\n const _unused = { \n benchmark: `Performance Benchmark [${name}]`, \n metrics \n };\n \n return metrics;\n }\n };\n}\n\nexport function measureRenderPerformance(componentName: string, renderFn: () => void): PerformanceMetrics {\n const startTime = performance.now();\n const startMemory = (performance as any).memory?.usedJSHeapSize || 0;\n \n renderFn();\n \n const endTime = performance.now();\n const endMemory = (performance as any).memory?.usedJSHeapSize || 0;\n \n const metrics: PerformanceMetrics = {\n renderTime: endTime - startTime,\n interactionTime: 0,\n memoryUsage: endMemory - startMemory,\n bundleSize: 0,\n };\n \n // TODO: Replace with proper logging service integration\n // For now, we'll use a no-op to prevent console pollution\n const _unused = { \n benchmark: `Render Performance [${componentName}]`, \n metrics \n };\n \n return metrics;\n} ","\ninterface BundleStats {\n totalSize: number;\n gzippedSize: number;\n chunks: ChunkInfo[];\n treeshakingEffectiveness: number;\n}\n\ninterface ChunkInfo {\n name: string;\n size: number;\n modules: string[];\n dynamicallyImported: boolean;\n}\n\nclass BundleAnalyzer {\n private enabled = import.meta.env.MODE === 'development';\n\n analyzeBundle(): BundleStats | null {\n if (!this.enabled) return null;\n\n // In a real implementation, this would integrate with webpack-bundle-analyzer\n // or similar tools. For now, we'll simulate analysis\n \n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.log('Bundle analysis would run here in development');\n console.log('To enable real bundle analysis:');\n console.log('1. Install webpack-bundle-analyzer');\n console.log('2. Add bundle analysis to build scripts');\n console.log('3. Integrate with performance budgets');\n\n return {\n totalSize: 0,\n gzippedSize: 0,\n chunks: [],\n treeshakingEffectiveness: 0\n };\n }\n\n checkTreeshaking(): void {\n if (!this.enabled) return;\n\n const potentialIssues = [\n 'Check for unused exports in index files',\n 'Verify side-effect free modules in package.json',\n 'Ensure proper ES module syntax',\n 'Check for circular dependencies'\n ];\n\n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.group('Tree-shaking Analysis');\n potentialIssues.forEach(issue => console.log('- ' + issue));\n console.groupEnd();\n }\n\n validateExports(): void {\n if (!this.enabled) return;\n\n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.group('Export Validation');\n console.log('Checking for optimal export patterns...');\n console.log('- Prefer named exports over default exports');\n console.log('- Avoid barrel exports for large modules');\n console.log('- Use dynamic imports for large dependencies');\n console.groupEnd();\n }\n\n generateReport(): string {\n const report = `\n# Bundle Analysis Report\n\n## Recommendations for @jmruthers/pace-core\n\n### 1. Code Splitting Opportunities\n- ✅ DataTable virtualization is lazy-loaded\n- ⚠️ Consider splitting auth providers by use case\n- ⚠️ Lazy load heavy UI components (charts, complex forms)\n\n### 2. Tree-shaking Optimization\n- ✅ Using ES modules throughout\n- ✅ Proper sideEffects configuration\n- ⚠️ Check for unused utility functions\n\n### 3. Bundle Size Targets\n- Core components: < 50KB gzipped\n- Auth module: < 30KB gzipped \n- Utilities: < 20KB gzipped\n- Total package: < 150KB gzipped\n\n### 4. Performance Monitoring\n- Monitor component render times\n- Track bundle size changes\n- Validate tree-shaking effectiveness\n `;\n\n return report.trim();\n }\n}\n\nexport const bundleAnalyzer = new BundleAnalyzer();\n\n// Helper to check if imports are optimized\nexport function validateImportPattern(moduleId: string, importedItems: string[]): void {\n if (import.meta.env.MODE !== 'development') return;\n\n const largeModules = ['lodash', 'moment', 'rxjs'];\n const isLargeModule = largeModules.some(mod => moduleId.includes(mod));\n \n if (isLargeModule && importedItems.length > 5) {\n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.warn(\n 'Large import detected: importing ' + importedItems.length + ' items from ' + moduleId + '. ' +\n 'Consider splitting imports or using more specific imports.'\n );\n }\n}\n\n// Monitor dynamic imports\nexport function trackDynamicImport(moduleName: string): void {\n if (import.meta.env.MODE !== 'development') return;\n \n // TODO: Replace with proper logging service integration\n // For now, we'll log to console for testing purposes\n console.log('Dynamic import: ' + moduleName + ' - Good for code splitting!');\n}\n","\n/**\n * Dynamic utility loader to reduce initial bundle size\n * Heavy utilities are loaded on-demand\n */\n\n// Type definitions for dynamic imports\ntype DebounceFunction = <T extends (...args: unknown[]) => unknown>(\n func: T,\n wait?: number,\n options?: { leading?: boolean; maxWait?: number; trailing?: boolean }\n) => T & { cancel(): void; flush(): void };\n\ntype ThrottleFunction = <T extends (...args: unknown[]) => unknown>(\n func: T,\n wait?: number,\n options?: { leading?: boolean; trailing?: boolean }\n) => T & { cancel(): void; flush(): void };\n\n// Dynamic lodash utilities\nexport const loadLodash = async (): Promise<{\n debounce: DebounceFunction;\n throttle: ThrottleFunction;\n}> => {\n const [debounceModule, throttleModule] = await Promise.all([\n import('lodash.debounce' as any),\n import('lodash.throttle' as any)\n ]);\n \n return {\n debounce: (debounceModule.default || debounceModule) as DebounceFunction,\n throttle: (throttleModule.default || throttleModule) as ThrottleFunction\n };\n};\n\n// Dynamic date utilities\nexport const loadDateUtils = async (): Promise<typeof import('date-fns')> => {\n const dateFns = await import('date-fns');\n return dateFns;\n};\n\n// Dynamic chart utilities - using unknown type to avoid Recharts type issues\nexport const loadChartUtils = async (): Promise<unknown> => {\n const recharts = await import('recharts');\n return recharts;\n};\n\n// Dynamic form utilities\nexport const loadFormUtils = async (): Promise<{\n useForm: unknown;\n useController: unknown;\n Controller: unknown;\n FormProvider: unknown;\n useFormContext: unknown;\n useWatch: unknown;\n useFormState: unknown;\n useFieldArray: unknown;\n zodResolver: unknown;\n}> => {\n const [reactHookForm, zodResolvers] = await Promise.all([\n import('react-hook-form'),\n import('@hookform/resolvers/zod')\n ]);\n \n return {\n ...reactHookForm,\n zodResolver: zodResolvers.zodResolver\n };\n};\n\n// Dynamic CSV utilities\nexport const loadCSVUtils = async (): Promise<unknown> => {\n const papaparse = await import('papaparse');\n return papaparse.default;\n};\n\n// Utility function to create lazy utility hooks\nexport function createLazyUtility<T>(loader: () => Promise<T>) {\n let cached: T | null = null;\n let loading: Promise<T> | null = null;\n\n return {\n load: async (): Promise<T> => {\n if (cached) return cached;\n if (loading) return loading;\n\n loading = loader().then(result => {\n cached = result;\n loading = null;\n return result;\n });\n\n return loading;\n },\n getCached: (): T | null => cached,\n isLoaded: (): boolean => cached !== null\n };\n}\n\n// Pre-configured lazy utilities with explicit types\nexport const lazyLodash: ReturnType<typeof createLazyUtility<Awaited<ReturnType<typeof loadLodash>>>> = createLazyUtility(loadLodash);\nexport const lazyDateUtils: ReturnType<typeof createLazyUtility<Awaited<ReturnType<typeof loadDateUtils>>>> = createLazyUtility(loadDateUtils);\nexport const lazyChartUtils: ReturnType<typeof createLazyUtility<unknown>> = createLazyUtility(loadChartUtils);\nexport const lazyFormUtils: ReturnType<typeof createLazyUtility<Awaited<ReturnType<typeof loadFormUtils>>>> = createLazyUtility(loadFormUtils);\nexport const lazyCSVUtils: ReturnType<typeof createLazyUtility<unknown>> = createLazyUtility(loadCSVUtils);\n","import React, { Suspense, ComponentType, lazy } from 'react';\nimport { LoadingSpinner } from '../../components/LoadingSpinner/LoadingSpinner';\n\ninterface LazyLoadOptions {\n fallback?: React.ReactNode;\n errorBoundary?: ComponentType<{ children: React.ReactNode }>;\n}\n\n/**\n * Create a lazy-loaded component with error boundary and loading fallback\n */\nexport function createLazyComponent<T extends ComponentType<any>>(\n importFn: () => Promise<{ default: T }>,\n componentName: string,\n options: LazyLoadOptions = {}\n): T {\n const LazyComponent = lazy(importFn);\n \n const WrappedComponent = (props: any) => {\n const content = (\n <Suspense fallback={options.fallback || <LoadingSpinner />}>\n <LazyComponent {...props} />\n </Suspense>\n );\n\n if (options.errorBoundary) {\n const ErrorBoundary = options.errorBoundary;\n return <ErrorBoundary>{content}</ErrorBoundary>;\n }\n\n return content;\n };\n \n WrappedComponent.displayName = `Lazy${componentName}`;\n return WrappedComponent as T;\n}\n\n/**\n * Lazy-loaded DataTable component\n */\nexport const LazyDataTable = createLazyComponent(\n () => import('../../components/DataTable').then(module => ({ default: module.DataTable })),\n 'DataTable'\n);\n","\n/**\n * Permission utilities for transforming and managing permissions\n */\n\nexport function transformPermissionMapToBoolean(permissions: Record<string, unknown>): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n \n Object.entries(permissions).forEach(([key, value]) => {\n if (typeof value === 'string') {\n // Handle string values - 'false' should be false, empty strings are false, other non-empty strings are true\n result[key] = value !== '' && value.toLowerCase() !== 'false';\n } else {\n result[key] = Boolean(value);\n }\n });\n \n return result;\n}\n\nexport function hasPermission(permissions: Record<string, boolean>, permission: string): boolean {\n return Boolean(permissions[permission]);\n}\n\nexport function hasAnyPermission(permissions: Record<string, boolean>, permissionList: string[] | null | undefined): boolean {\n if (!permissionList || permissionList.length === 0) return false;\n return permissionList.some(permission => hasPermission(permissions, permission));\n}\n\nexport function hasAllPermissions(permissions: Record<string, boolean>, permissionList: string[] | null | undefined): boolean {\n if (!permissionList) return false;\n if (permissionList.length === 0) return true;\n return permissionList.every(permission => hasPermission(permissions, permission));\n}\n","\n/**\n * @file Permission type definitions and utilities\n */\n\nexport enum PermissionType {\n READ = 'read',\n WRITE = 'write',\n DELETE = 'delete',\n ADMIN = 'admin'\n}\n\n/**\n * Parse a permission string into components\n */\nexport function parsePermission(permission: string): { resource: string; action: string } | null {\n if (!permission || typeof permission !== 'string') {\n return null;\n }\n \n const parts = permission.split(':');\n if (parts.length !== 2) {\n return null;\n }\n \n const [action, resource] = parts;\n \n // Check that both action and resource exist and are not empty\n if (action === undefined || resource === undefined || action === '' || resource === '') {\n return null;\n }\n \n return {\n resource,\n action\n };\n}\n","\n/**\n * @file Audit Logger - General Utility\n * \n * Moved from shared/auditLogger to lib for better organization\n */\n\nexport interface AuditEvent {\n type: 'auth' | 'permission' | 'security';\n action?: string;\n event?: string;\n user?: string;\n userId?: string;\n details?: Record<string, unknown>;\n data?: Record<string, unknown>;\n timestamp?: number;\n severity?: 'low' | 'medium' | 'high' | 'critical';\n source?: string;\n}\n\nclass AuditLogger {\n private events: AuditEvent[] = [];\n\n log(event: AuditEvent): void {\n const eventWithTimestamp = {\n ...event,\n timestamp: Date.now(),\n };\n \n this.events.push(eventWithTimestamp);\n // TODO: In production, this should send to a proper logging service\n // Console logging removed for production\n }\n\n async logPermissionEvent(event: {\n event: string;\n userId: string;\n data?: Record<string, unknown>;\n }): Promise<void> {\n this.log({\n type: 'permission',\n event: event.event,\n userId: event.userId,\n data: event.data,\n });\n }\n\n async logSecurityEvent(event: {\n event: string;\n data?: Record<string, unknown>;\n }): Promise<void> {\n this.log({\n type: 'security',\n event: event.event,\n data: event.data,\n });\n }\n\n async logAuthEvent(event: {\n event: string;\n userId?: string;\n data?: Record<string, unknown>;\n }): Promise<void> {\n this.log({\n type: 'auth',\n event: event.event,\n userId: event.userId,\n data: event.data,\n });\n }\n\n async getSecurityEvents(): Promise<AuditEvent[]> {\n return this.events.filter(event => event.type === 'security');\n }\n\n getEvents(): AuditEvent[] {\n return [...this.events];\n }\n\n clearEvents(): void {\n this.events = [];\n }\n}\n\nexport const auditLogger = new AuditLogger();\n\n// Alias for backward compatibility\nexport const auditLog = auditLogger;\n\nexport function logAuthEvent(action: string, user?: string, details?: Record<string, unknown>): void {\n auditLogger.log({\n type: 'auth',\n action,\n user,\n details,\n });\n // Console logging removed for production\n}\n\nexport function logPermissionEvent(action: string, user?: string, details?: Record<string, unknown>): void {\n auditLogger.log({\n type: 'permission',\n action,\n user,\n details,\n });\n // Console logging removed for production\n}\n\nexport function logSecurityEvent(action: string, user?: string, details?: Record<string, unknown>): void {\n auditLogger.log({\n type: 'security',\n action,\n user,\n details,\n });\n // Console logging removed for production\n}\n\nexport function logAuditEvent(action: string, user?: string, details?: Record<string, unknown>): void {\n auditLogger.log({\n type: 'auth', // Default to auth type for general audit events\n action,\n user,\n details,\n });\n}\n","/**\n * @file Secure Device Fingerprinting\n * @description Enhanced device fingerprinting with encryption and security measures\n */\n\nimport { secureStorage } from '../security/secureStorage';\n\nexport interface DeviceFingerprint {\n hash: string;\n timestamp: number;\n components: {\n userAgent: string;\n language: string;\n platform: string;\n screen: string;\n timezone: string;\n canvas?: string;\n webgl?: string;\n };\n entropy: number;\n}\n\n/**\n * Generate a secure device fingerprint (synchronous)\n */\nexport function generateDeviceFingerprint(): DeviceFingerprint {\n try {\n const components = {\n userAgent: getHashedUserAgent(),\n language: navigator.language || 'unknown',\n platform: navigator.platform || 'unknown',\n screen: `${screen.width}x${screen.height}x${screen.colorDepth}`,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'unknown',\n canvas: getCanvasFingerprint(),\n webgl: getWebGLFingerprint(),\n };\n\n // Calculate entropy (uniqueness score)\n const entropy = calculateEntropy(components);\n \n // Create a hash from all components\n const fingerprintData = JSON.stringify(components);\n const hash = hashStringSync(fingerprintData);\n\n const fingerprint: DeviceFingerprint = {\n hash,\n timestamp: Date.now(),\n components,\n entropy,\n };\n\n // Store fingerprint asynchronously\n secureStorage.setItem('device_fingerprint', JSON.stringify(fingerprint));\n \n return fingerprint;\n } catch (error) {\n return generateFallbackFingerprint();\n }\n}\n\n/**\n * Validate device fingerprint with security checks\n */\nexport function validateDeviceFingerprint(\n storedFingerprint: DeviceFingerprint,\n currentFingerprint: DeviceFingerprint\n): {\n isValid: boolean;\n confidence: number;\n reasons: string[];\n} {\n const reasons: string[] = [];\n let matchingComponents = 0;\n const totalComponents = Object.keys(storedFingerprint.components).length;\n\n // Check each component\n Object.entries(storedFingerprint.components).forEach(([key, value]) => {\n if (currentFingerprint.components[key as keyof typeof currentFingerprint.components] === value) {\n matchingComponents++;\n } else {\n reasons.push(`Component mismatch: ${key}`);\n }\n });\n\n // Calculate confidence score\n const confidence = (matchingComponents / totalComponents) * 100;\n\n // Security thresholds\n const isValid = confidence >= 80; // Require 80% match\n \n // Additional security checks\n const timeDiff = currentFingerprint.timestamp - storedFingerprint.timestamp;\n const maxAge = 30 * 24 * 60 * 60 * 1000; // 30 days\n \n if (timeDiff > maxAge) {\n reasons.push('Fingerprint too old');\n return { isValid: false, confidence, reasons };\n }\n\n if (confidence < 60) {\n reasons.push('Device signature changed significantly');\n }\n\n return { isValid, confidence, reasons };\n}\n\n/**\n * Generate canvas fingerprint for enhanced uniqueness\n */\nfunction getCanvasFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) return 'canvas-unavailable';\n\n // Draw complex pattern for fingerprinting\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillStyle = '#f60';\n ctx.fillRect(125, 1, 62, 20);\n ctx.fillStyle = '#069';\n ctx.fillText('Device fingerprint 🔒', 2, 15);\n ctx.fillStyle = 'rgba(102, 204, 0, 0.2)';\n ctx.fillText('Device fingerprint 🔒', 4, 17);\n\n const dataURL = canvas.toDataURL();\n return hashStringSync(dataURL);\n } catch (error) {\n return 'canvas-error';\n }\n}\n\n/**\n * Get WebGL fingerprint\n */\nfunction getWebGLFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl') as WebGLRenderingContext | null;\n \n if (!gl) return 'webgl-unavailable';\n\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (!debugInfo) return 'webgl-no-debug';\n\n const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n \n return `${vendor}|${renderer}`;\n } catch (error) {\n return 'webgl-error';\n }\n}\n\n/**\n * Hash user agent to prevent direct exposure\n */\nfunction getHashedUserAgent(): string {\n const ua = navigator.userAgent;\n return hashStringSync(ua).substring(0, 16); // Shorter hash for storage\n}\n\n/**\n * Calculate entropy of fingerprint components\n */\nfunction calculateEntropy(components: Record<string, string>): number {\n const values = Object.values(components).join('');\n const charCounts = new Map<string, number>();\n \n for (const char of values) {\n charCounts.set(char, (charCounts.get(char) || 0) + 1);\n }\n \n let entropy = 0;\n for (const count of charCounts.values()) {\n const probability = count / values.length;\n entropy -= probability * Math.log2(probability);\n }\n \n return entropy;\n}\n\n/**\n * Synchronous hash function for device fingerprinting\n */\nfunction hashStringSync(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Generate fallback fingerprint for error cases\n */\nfunction generateFallbackFingerprint(): DeviceFingerprint {\n const components = {\n userAgent: 'fallback',\n language: 'unknown',\n platform: 'unknown',\n screen: 'unknown',\n timezone: 'unknown',\n };\n\n return {\n hash: `fallback_${Date.now()}_${Math.random().toString(36)}`,\n timestamp: Date.now(),\n components,\n entropy: 1, // Low entropy for fallback\n };\n}\n"],"mappings":"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","names":["z","emailSchema","z","nameSchema","phoneSchema","urlSchema","z","emailSchema","nameSchema","phoneSchema","urlSchema","dateSchema","z","passwordSchema","log","PermissionType","logSecurityEvent"]}
@@ -1,138 +1,47 @@
1
- import { z } from 'zod';
2
- export { g as changePasswordSchema, w as combineSchemas, i as contactFormSchema, d as dateSchema, e as emailSchema, l as loginSchema, n as nameSchema, f as passwordResetSchema, b as passwordSchema, p as phoneSchema, v as pickSchema, r as registrationSchema, c as secureLoginSchema, s as securePasswordSchema, u as urlSchema, h as userProfileSchema } from './validation-DnhrNMju.js';
3
-
4
- /**
5
- * @file Input sanitization and validation schemas
6
- * @description Enhanced validation schemas with security features
7
- */
8
-
9
- /**
10
- * Enhanced email schema with security checks
11
- */
12
- declare const secureEmailSchema: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
13
1
  /**
14
- * Sanitize email input
2
+ * @file Internal utilities for validation module
3
+ * @internal This file contains implementation details that should not be used directly
15
4
  */
16
- declare function sanitizeEmail(email: string): string;
17
5
  /**
18
- * Sanitize string input
6
+ * Utility functions for validating data in the application
19
7
  */
20
- declare function sanitizeString(input: string): string;
21
-
22
8
  /**
23
- * @file CSRF Protection Implementation
24
- * @description Session-based CSRF token management with security enhancements
9
+ * Check if a string is a valid email
25
10
  */
26
- interface CSRFTokenData {
27
- token: string;
28
- sessionId: string;
29
- timestamp: number;
30
- used: boolean;
31
- }
32
- declare class CSRFManager {
33
- private tokenCache;
34
- private readonly TOKEN_EXPIRY;
35
- private readonly MAX_TOKENS_PER_SESSION;
36
- /**
37
- * Generate a new CSRF token for the current session
38
- */
39
- generateToken(sessionId: string): Promise<string>;
40
- /**
41
- * Validate and consume a CSRF token
42
- */
43
- validateToken(token: string, sessionId: string): Promise<boolean>;
44
- /**
45
- * Get current valid token for session
46
- */
47
- getCurrentToken(sessionId: string): Promise<string | null>;
48
- /**
49
- * Clean up expired and used tokens
50
- */
51
- private cleanupExpiredTokens;
52
- /**
53
- * Persist tokens to secure storage
54
- */
55
- private persistTokens;
56
- /**
57
- * Load tokens from secure storage
58
- */
59
- private loadTokens;
60
- /**
61
- * Clear all tokens for session
62
- */
63
- clearSession(sessionId: string): Promise<void>;
64
- }
65
- declare const csrfManager: CSRFManager;
66
- declare function generateCSRFToken(sessionId: string): Promise<string>;
67
- declare function validateCSRFToken(token: string, sessionId: string): Promise<boolean>;
68
- declare function getCSRFToken(sessionId: string): Promise<string | null>;
69
-
11
+ declare function isValidEmail(email: string): boolean;
70
12
  /**
71
- * @file SQL Injection Protection
72
- * @description Utilities to prevent SQL injection attacks in dynamic queries
13
+ * Check if a string is empty (either null, undefined, or just whitespace)
73
14
  */
74
-
15
+ declare function isEmpty(value: string | null | undefined): boolean;
75
16
  /**
76
- * Schema for validating and sanitizing search queries
17
+ * Check if a password meets minimum requirements
77
18
  */
78
- declare const searchQuerySchema: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
19
+ declare function isStrongPassword(password: string): boolean;
79
20
  /**
80
- * Schema for validating table/column names
21
+ * Check if a URL is valid
81
22
  */
82
- declare const sqlIdentifierSchema: z.ZodEffects<z.ZodString, string, string>;
23
+ declare function isValidUrl(url: string): boolean;
83
24
  /**
84
- * Schema for validating order by clauses
25
+ * Check if a date string is valid
85
26
  */
86
- declare const orderBySchema: z.ZodString;
27
+ declare function isValidDate(dateStr: string): boolean;
87
28
  /**
88
- * Schema for validating limit/offset values
29
+ * Check if a value is within a range
89
30
  */
90
- declare const limitOffsetSchema: z.ZodNumber;
31
+ declare function isWithinRange(value: number, min: number, max: number): boolean;
91
32
  /**
92
- * Sanitize search query by removing dangerous characters
33
+ * Check if a value matches a specific pattern
93
34
  */
94
- declare function sanitizeSearchQuery(query: string): string;
35
+ declare function matchesPattern(value: string, pattern: RegExp): boolean;
95
36
  /**
96
- * Escape special characters for LIKE queries
37
+ * Utility function to deep merge objects for schema combination
38
+ * @internal
97
39
  */
98
- declare function escapeLikeQuery(query: string): string;
99
- /**
100
- * Validate and sanitize a dynamic filter object
101
- */
102
- declare function sanitizeFilters(filters: Record<string, unknown>): Record<string, unknown>;
103
- /**
104
- * Build safe query parameters for Supabase
105
- */
106
- interface SafeQueryParams {
107
- select?: string;
108
- filters?: Record<string, unknown>;
109
- orderBy?: string;
110
- limit?: number;
111
- offset?: number;
112
- search?: string;
113
- }
114
- declare function buildSafeQueryParams(params: SafeQueryParams): SafeQueryParams;
115
- /**
116
- * Detect potential SQL injection attempts
117
- */
118
- declare function detectSQLInjection(input: string): {
119
- isSuspicious: boolean;
120
- patterns: string[];
121
- riskLevel: 'low' | 'medium' | 'high' | 'critical';
122
- };
123
-
124
- /**
125
- * @file Enhanced Password Schema with Security Validations
126
- * @description Comprehensive password validation with security checks
127
- */
128
-
40
+ declare function deepMerge<T extends Record<string, unknown>>(target: T, source: Record<string, unknown>): T;
129
41
  /**
130
- * Password strength calculator
42
+ * Type guard to check if a value is a plain object
43
+ * @internal
131
44
  */
132
- declare function calculatePasswordStrength(password: string): {
133
- score: number;
134
- feedback: string[];
135
- level: 'very-weak' | 'weak' | 'fair' | 'good' | 'strong';
136
- };
45
+ declare function isObject(item: unknown): item is Record<string, unknown>;
137
46
 
138
- export { type CSRFTokenData, type SafeQueryParams, buildSafeQueryParams, calculatePasswordStrength, csrfManager, detectSQLInjection, escapeLikeQuery, generateCSRFToken, getCSRFToken, limitOffsetSchema, orderBySchema, sanitizeEmail, sanitizeFilters, sanitizeSearchQuery, sanitizeString, searchQuerySchema, secureEmailSchema, sqlIdentifierSchema, validateCSRFToken };
47
+ export { deepMerge, isEmpty, isObject, isStrongPassword, isValidDate, isValidEmail, isValidUrl, isWithinRange, matchesPattern };