@jmruthers/pace-core 0.5.181 → 0.5.183
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +16 -2
- package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
- package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
- package/dist/{DataTable-UA6CL4JI.js → DataTable-QAB34V6K.js} +14 -15
- package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
- package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
- package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
- package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
- package/dist/auth-BZOJqrdd.d.ts +49 -0
- package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
- package/dist/chunk-5DRSZLL2.js.map +1 -0
- package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
- package/dist/chunk-6C4YBBJM.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
- package/dist/{chunk-HRO5HWN2.js → chunk-CSOFYHAG.js} +55 -162
- package/dist/chunk-CSOFYHAG.js.map +1 -0
- package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
- package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
- package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
- package/dist/chunk-F2IMUDXZ.js.map +1 -0
- package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
- package/dist/chunk-FSFQFJCU.js.map +1 -0
- package/dist/chunk-FUEYYMX5.js +2296 -0
- package/dist/chunk-FUEYYMX5.js.map +1 -0
- package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
- package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
- package/dist/chunk-KQCRWDSA.js +1 -0
- package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
- package/dist/chunk-KUEN3HFB.js.map +1 -0
- package/dist/chunk-LMC26NLJ.js +84 -0
- package/dist/chunk-LMC26NLJ.js.map +1 -0
- package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
- package/dist/chunk-M7W4CP3M.js.map +1 -0
- package/dist/{chunk-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
- package/dist/chunk-MI7HBHN3.js.map +1 -0
- package/dist/{chunk-PPMP5J6T.js → chunk-PWAHJW4G.js} +180 -29
- package/dist/chunk-PWAHJW4G.js.map +1 -0
- package/dist/chunk-PWLANIRT.js +127 -0
- package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
- package/dist/chunk-QCDXODCA.js +75 -0
- package/dist/chunk-QCDXODCA.js.map +1 -0
- package/dist/{chunk-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
- package/dist/chunk-QETLRQI6.js.map +1 -0
- package/dist/{chunk-5MT24GKJ.js → chunk-QUVSNGIP.js} +264 -262
- package/dist/chunk-QUVSNGIP.js.map +1 -0
- package/dist/chunk-QXHPKYJV.js +113 -0
- package/dist/chunk-QXHPKYJV.js.map +1 -0
- package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
- package/dist/chunk-R77UEZ4E.js.map +1 -0
- package/dist/{chunk-ZYTYSTO5.js → chunk-RA3JUFMW.js} +314 -161
- package/dist/chunk-RA3JUFMW.js.map +1 -0
- package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
- package/dist/chunk-SQGMNID3.js.map +1 -0
- package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
- package/dist/chunk-UHNYIBXL.js.map +1 -0
- package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
- package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
- package/dist/{chunk-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
- package/dist/{chunk-VZ4VDGTB.js.map → chunk-W22JP75J.js.map} +1 -1
- package/dist/components.d.ts +12 -93
- package/dist/components.js +23 -106
- package/dist/components.js.map +1 -1
- package/dist/core-CUElvH_C.d.ts +164 -0
- package/dist/database.generated-CBmg2950.d.ts +8284 -0
- package/dist/event-CW5YB_2p.d.ts +239 -0
- package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
- package/dist/functions-D_kgHktt.d.ts +208 -0
- package/dist/hooks.d.ts +54 -7
- package/dist/hooks.js +204 -17
- package/dist/hooks.js.map +1 -1
- package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
- package/dist/index.d.ts +94 -261
- package/dist/index.js +314 -126
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +7 -8
- package/dist/providers.js +6 -13
- package/dist/rbac/index.d.ts +171 -101
- package/dist/rbac/index.js +23 -17
- package/dist/styles/index.d.ts +1 -3
- package/dist/styles/index.js +2 -17
- package/dist/theming/runtime.js +3 -3
- package/dist/types-UU913iLA.d.ts +102 -0
- package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
- package/dist/types.d.ts +88 -227
- package/dist/types.js +64 -112
- package/dist/types.js.map +1 -1
- package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
- package/dist/utils.d.ts +299 -13
- package/dist/utils.js +481 -55
- package/dist/utils.js.map +1 -1
- package/dist/validation-643vUDZW.d.ts +177 -0
- package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
- package/docs/README.md +9 -8
- package/docs/api/README.md +16 -2
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +4 -4
- package/docs/api/classes/MissingUserContextError.md +4 -4
- package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
- package/docs/api/classes/PermissionDeniedError.md +4 -4
- package/docs/api/classes/RBACAuditManager.md +14 -14
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +2 -2
- package/docs/api/classes/RBACError.md +4 -4
- package/docs/api/classes/RBACNotInitializedError.md +4 -4
- package/docs/api/classes/SecureSupabaseClient.md +29 -9
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +17 -17
- package/docs/api/enums/RBACErrorCode.md +228 -0
- package/docs/api/enums/RPCFunction.md +118 -0
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/BadgeProps.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CalendarProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +29 -3
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +2 -2
- package/docs/api/interfaces/DataTableColumn.md +6 -6
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +1 -1
- package/docs/api/interfaces/ExportColumn.md +5 -5
- package/docs/api/interfaces/ExportOptions.md +4 -4
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +13 -13
- package/docs/api/interfaces/FileReference.md +12 -12
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +10 -10
- package/docs/api/interfaces/FileUploadProps.md +19 -19
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/FormFieldProps.md +166 -0
- package/docs/api/interfaces/FormProps.md +113 -0
- package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +8 -8
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +17 -73
- package/docs/api/interfaces/NavigationMenuProps.md +38 -53
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +13 -13
- package/docs/api/interfaces/OrganisationContextType.md +21 -21
- package/docs/api/interfaces/OrganisationMembership.md +15 -15
- package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
- package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
- package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProgressProps.md +50 -0
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
- package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
- package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
- package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
- package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
- package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
- package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
- package/docs/api/interfaces/RBACConfig.md +2 -2
- package/docs/api/interfaces/RBACContext.md +52 -0
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
- package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
- package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
- package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
- package/docs/api/interfaces/RBACResult.md +58 -0
- package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
- package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
- package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
- package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
- package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
- package/docs/api/interfaces/RBACRolesListParams.md +52 -0
- package/docs/api/interfaces/RBACRolesListResult.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
- package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
- package/docs/api/interfaces/ResourcePermissions.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/TabsContentProps.md +1 -1
- package/docs/api/interfaces/TabsListProps.md +1 -1
- package/docs/api/interfaces/TabsProps.md +1 -1
- package/docs/api/interfaces/TabsTriggerProps.md +43 -2
- package/docs/api/interfaces/TextareaProps.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
- package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +4 -4
- package/docs/api/interfaces/UserProfile.md +7 -7
- package/docs/api/modules.md +484 -462
- package/docs/api-reference/components.md +186 -15
- package/docs/api-reference/deprecated.md +376 -0
- package/docs/api-reference/hooks.md +149 -19
- package/docs/api-reference/providers.md +61 -6
- package/docs/api-reference/rpc-functions.md +397 -0
- package/docs/api-reference/types.md +135 -78
- package/docs/api-reference/utilities.md +51 -380
- package/docs/architecture/README.md +49 -3
- package/docs/architecture/database-schema-requirements.md +40 -3
- package/docs/architecture/rbac-security-architecture.md +41 -4
- package/docs/architecture/services.md +127 -42
- package/docs/best-practices/README.md +51 -5
- package/docs/best-practices/accessibility.md +32 -3
- package/docs/best-practices/common-patterns.md +50 -3
- package/docs/best-practices/deployment.md +50 -4
- package/docs/best-practices/performance.md +50 -3
- package/docs/best-practices/security.md +94 -41
- package/docs/best-practices/testing.md +33 -4
- package/docs/core-concepts/authentication.md +5 -5
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +3 -3
- package/docs/core-concepts/permissions.md +3 -3
- package/docs/core-concepts/rbac-system.md +5 -5
- package/docs/documentation-index.md +30 -8
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +7 -5
- package/docs/getting-started/examples/basic-auth-app.md +3 -0
- package/docs/getting-started/examples/full-featured-app.md +5 -3
- package/docs/getting-started/faq.md +6 -6
- package/docs/getting-started/installation-guide.md +192 -13
- package/docs/getting-started/local-development.md +303 -0
- package/docs/getting-started/quick-reference.md +3 -3
- package/docs/getting-started/quick-start.md +517 -0
- package/docs/implementation-guides/app-layout.md +45 -3
- package/docs/implementation-guides/authentication.md +66 -7
- package/docs/implementation-guides/component-styling.md +53 -3
- package/docs/implementation-guides/data-tables.md +76 -7
- package/docs/implementation-guides/datatable-filtering.md +1 -2
- package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
- package/docs/implementation-guides/dynamic-colors.md +155 -4
- package/docs/implementation-guides/file-reference-system.md +72 -3
- package/docs/implementation-guides/file-upload-storage.md +72 -3
- package/docs/implementation-guides/forms.md +53 -3
- package/docs/implementation-guides/inactivity-tracking.md +53 -3
- package/docs/implementation-guides/large-datasets.md +1 -1
- package/docs/implementation-guides/navigation.md +55 -5
- package/docs/implementation-guides/organisation-security.md +72 -3
- package/docs/implementation-guides/performance.md +57 -1
- package/docs/implementation-guides/permission-enforcement.md +81 -8
- package/docs/implementation-guides/public-pages.md +560 -14
- package/docs/migration/MIGRATION_GUIDE.md +409 -50
- package/docs/migration/README.md +37 -3
- package/docs/migration/organisation-context-timing-fix.md +39 -4
- package/docs/migration/quick-migration-guide.md +41 -5
- package/docs/migration/rbac-migration.md +59 -3
- package/docs/migration/service-architecture.md +77 -14
- package/docs/rbac/README.md +79 -3
- package/docs/rbac/advanced-patterns.md +47 -3
- package/docs/rbac/api-reference.md +77 -8
- package/docs/rbac/event-based-apps.md +50 -5
- package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
- package/docs/rbac/examples.md +39 -3
- package/docs/rbac/getting-started.md +63 -4
- package/docs/rbac/quick-start.md +57 -5
- package/docs/rbac/rbac-rls-integration.md +68 -6
- package/docs/rbac/super-admin-guide.md +47 -3
- package/docs/rbac/troubleshooting.md +3 -3
- package/docs/security/README.md +68 -3
- package/docs/security/checklist.md +50 -3
- package/docs/standards/01-architecture-standard.md +39 -0
- package/docs/standards/02-api-and-rpc-standard.md +39 -0
- package/docs/standards/03-component-standard.md +32 -0
- package/docs/standards/04-code-style-standard.md +32 -0
- package/docs/standards/05-security-standard.md +30 -0
- package/docs/standards/06-testing-and-docs-standard.md +29 -0
- package/docs/standards/README.md +35 -0
- package/docs/styles/README.md +89 -8
- package/docs/testing/README.md +175 -24
- package/docs/troubleshooting/README.md +50 -3
- package/docs/troubleshooting/common-issues.md +271 -5
- package/docs/troubleshooting/debugging.md +54 -1
- package/docs/troubleshooting/migration.md +54 -1
- package/docs/troubleshooting/organisation-context-setup.md +29 -3
- package/docs/troubleshooting/styling-issues.md +246 -4
- package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
- package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
- package/{src/components/DataTable/examples → examples/DataTable}/HierarchicalExample.tsx +8 -6
- package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
- package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
- package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
- package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
- package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
- package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
- package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
- package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
- package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
- package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
- package/examples/README.md +81 -33
- package/examples/index.ts +14 -12
- package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
- package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
- package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
- package/package.json +21 -27
- package/src/__tests__/helpers/test-utils.tsx +29 -3
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
- package/src/components/Alert/Alert.test.tsx +2 -2
- package/src/components/Alert/Alert.tsx +4 -4
- package/src/components/Avatar/Avatar.test.tsx +17 -6
- package/src/components/Badge/Badge.test.tsx +1 -1
- package/src/components/Badge/Badge.tsx +2 -2
- package/src/components/Button/Button.test.tsx +2 -2
- package/src/components/Button/Button.tsx +11 -7
- package/src/components/Calendar/Calendar.test.tsx +41 -8
- package/src/components/Calendar/Calendar.tsx +39 -36
- package/src/components/Card/Card.tsx +51 -13
- package/src/components/Checkbox/Checkbox.test.tsx +36 -12
- package/src/components/DataTable/DataTable.test.tsx +1 -1
- package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
- package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
- package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
- package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
- package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
- package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
- package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
- package/src/components/DataTable/components/DataTableBody.tsx +10 -25
- package/src/components/DataTable/components/DataTableCore.tsx +1 -1
- package/src/components/DataTable/components/FilterRow.tsx +3 -1
- package/src/components/DataTable/components/ImportModal.tsx +1 -1
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
- package/src/components/DataTable/core/ColumnFactory.ts +6 -6
- package/src/components/DataTable/core/DataTableContext.tsx +14 -10
- package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
- package/src/components/DataTable/core/PluginRegistry.ts +3 -3
- package/src/components/DataTable/core/StateManager.ts +12 -11
- package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
- package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
- package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
- package/src/components/DataTable/core/interfaces.ts +17 -17
- package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
- package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
- package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
- package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
- package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
- package/src/components/DataTable/types.ts +5 -5
- package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
- package/src/components/DataTable/utils/columnUtils.ts +3 -2
- package/src/components/DataTable/utils/debugTools.ts +1 -1
- package/src/components/DataTable/utils/exportUtils.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
- package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
- package/src/components/DataTable/utils/index.ts +0 -1
- package/src/components/DataTable/utils/performanceUtils.ts +9 -4
- package/src/components/Dialog/Dialog.test.tsx +49 -27
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
- package/src/components/EventSelector/EventSelector.test.tsx +60 -12
- package/src/components/EventSelector/EventSelector.tsx +38 -15
- package/src/components/EventSelector/index.ts +2 -2
- package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
- package/src/components/FileDisplay/FileDisplay.tsx +1 -0
- package/src/components/FileUpload/FileUpload.test.tsx +532 -152
- package/src/components/FileUpload/FileUpload.tsx +43 -8
- package/src/components/Footer/Footer.test.tsx +19 -14
- package/src/components/Form/Form.test.tsx +96 -14
- package/src/components/Form/Form.tsx +210 -1
- package/src/components/Form/index.ts +3 -7
- package/src/components/Header/Header.test.tsx +24 -17
- package/src/components/Header/Header.tsx +3 -1
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
- package/src/components/Input/Input.test.tsx +61 -36
- package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
- package/src/components/Label/Label.tsx +2 -3
- package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
- package/src/components/LoginForm/LoginForm.test.tsx +14 -13
- package/src/components/LoginForm/LoginForm.tsx +1 -1
- package/src/components/LoginForm/index.ts +7 -0
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
- package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
- package/src/components/NavigationMenu/index.ts +1 -1
- package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
- package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
- package/src/components/PaceAppLayout/test-setup.tsx +192 -0
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
- package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
- package/src/components/PasswordChange/index.ts +2 -0
- package/src/components/Progress/Progress.test.tsx +11 -0
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/Progress/index.ts +10 -0
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
- package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
- package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
- package/src/components/PublicLayout/index.ts +10 -28
- package/src/components/Select/Select.test.tsx +7 -7
- package/src/components/Select/Select.tsx +277 -11
- package/src/components/Select/index.ts +1 -2
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
- package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
- package/src/components/Tabs/Tabs.test.tsx +10 -9
- package/src/components/Tabs/Tabs.tsx +61 -33
- package/src/components/Textarea/Textarea.test.tsx +31 -18
- package/src/components/Toast/Toast.tsx +2 -2
- package/src/components/Tooltip/Tooltip.test.tsx +1 -1
- package/src/components/UserMenu/UserMenu.test.tsx +7 -6
- package/src/components/UserMenu/UserMenu.tsx +2 -2
- package/src/components/index.ts +5 -4
- package/src/constants/performance.ts +19 -8
- package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
- package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
- package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
- package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
- package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
- package/src/hooks/index.ts +4 -0
- package/src/hooks/public/index.ts +2 -0
- package/src/hooks/public/usePublicEvent.ts +4 -6
- package/src/hooks/public/usePublicEventLogo.test.ts +147 -0
- package/src/hooks/public/usePublicRouteParams.ts +1 -1
- package/src/hooks/services/useAuth.ts +2 -4
- package/src/hooks/services/useCurrentEvent.ts +1 -1
- package/src/hooks/useAppConfig.ts +1 -1
- package/src/hooks/useDataTablePerformance.ts +2 -2
- package/src/hooks/useEventTheme.ts +1 -1
- package/src/hooks/useEvents.ts +51 -10
- package/src/hooks/useOrganisationPermissions.test.ts +3 -3
- package/src/hooks/useOrganisationPermissions.ts +1 -1
- package/src/hooks/useOrganisationSecurity.ts +2 -2
- package/src/hooks/usePermissionCache.test.ts +9 -9
- package/src/hooks/usePermissionCache.ts +2 -2
- package/src/index.ts +19 -12
- package/src/providers/OrganisationProvider.tsx +73 -9
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
- package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
- package/src/providers/__tests__/EventProvider.test.tsx +24 -15
- package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
- package/src/providers/index.ts +0 -3
- package/src/providers/services/AuthServiceProvider.tsx +2 -17
- package/src/providers/services/EventServiceProvider.tsx +11 -16
- package/src/providers/services/InactivityServiceProvider.tsx +9 -12
- package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
- package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
- package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
- package/src/rbac/adapters.tsx +1 -1
- package/src/rbac/api.ts +20 -4
- package/src/rbac/audit-enhanced.ts +47 -2
- package/src/rbac/audit.ts +47 -2
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.test.tsx +7 -6
- package/src/rbac/components/NavigationProvider.tsx +1 -1
- package/src/rbac/components/PagePermissionGuard.tsx +1 -1
- package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +1 -1
- package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
- package/src/rbac/components/SecureDataProvider.tsx +1 -1
- package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
- package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
- package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
- package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
- package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
- package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
- package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
- package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
- package/src/rbac/hooks/index.ts +3 -0
- package/src/rbac/hooks/usePermissions.ts +31 -85
- package/src/rbac/hooks/useRBAC.test.ts +13 -1
- package/src/rbac/hooks/useRBAC.ts +13 -67
- package/src/rbac/hooks/useResolvedScope.ts +11 -0
- package/src/rbac/hooks/useSecureSupabase.ts +308 -0
- package/src/rbac/index.ts +3 -0
- package/src/rbac/secureClient.ts +53 -6
- package/src/rbac/security.ts +37 -1
- package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
- package/src/rbac/types.ts +3 -2
- package/src/services/AuthService.ts +33 -25
- package/src/services/EventService.ts +56 -44
- package/src/services/InactivityService.ts +33 -53
- package/src/services/OrganisationService.ts +36 -40
- package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
- package/src/services/__tests__/EventService.test.ts +67 -33
- package/src/services/interfaces/IEventService.ts +1 -1
- package/src/styles/core.css +2 -2
- package/src/styles/index.test.ts +21 -0
- package/src/styles/index.ts +1 -5
- package/src/types/__tests__/guards.test.ts +1 -1
- package/src/types/__tests__/organisation.roles.test.ts +55 -0
- package/src/types/__tests__/type-validation.test.ts +0 -1
- package/src/types/auth.ts +42 -2
- package/src/types/core.ts +251 -0
- package/src/types/database.ts +11 -496
- package/src/types/event.ts +102 -0
- package/src/types/file-reference.ts +6 -4
- package/src/types/guards.ts +2 -1
- package/src/types/index.ts +48 -14
- package/src/types/lodash.debounce.d.ts +15 -0
- package/src/types/organisation.ts +14 -10
- package/src/types/supabase.ts +15 -17
- package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
- package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
- package/src/utils/app/appNameResolver.ts +1 -1
- package/src/utils/audit/audit.test.ts +65 -0
- package/src/utils/device/deviceFingerprint.test.ts +171 -0
- package/src/utils/dynamic/dynamicUtils.ts +3 -2
- package/src/utils/file-reference/index.ts +25 -6
- package/src/utils/security/secureErrors.ts +1 -1
- package/src/utils/validation/__tests__/validationUtils.test.ts +72 -0
- package/src/utils/validation/index.ts +6 -12
- package/src/utils/validation/validationUtils.ts +0 -13
- package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
- package/dist/auth-DReDSLq9.d.ts +0 -16
- package/dist/chunk-3JI76CYK.js +0 -2444
- package/dist/chunk-3JI76CYK.js.map +0 -1
- package/dist/chunk-56XJ3TU6.js +0 -11
- package/dist/chunk-56XJ3TU6.js.map +0 -1
- package/dist/chunk-5MT24GKJ.js.map +0 -1
- package/dist/chunk-7QCC6MCP.js +0 -288
- package/dist/chunk-BESYRHQM.js.map +0 -1
- package/dist/chunk-BJPBT3CU.js +0 -21
- package/dist/chunk-BJPBT3CU.js.map +0 -1
- package/dist/chunk-BVYWGZVV.js.map +0 -1
- package/dist/chunk-CX5M4ZAG.js.map +0 -1
- package/dist/chunk-D7LCGMVS.js.map +0 -1
- package/dist/chunk-EGI6MUL6.js +0 -27
- package/dist/chunk-EGI6MUL6.js.map +0 -1
- package/dist/chunk-ERISIBYU.js.map +0 -1
- package/dist/chunk-HRO5HWN2.js.map +0 -1
- package/dist/chunk-HZLDFOE4.js.map +0 -1
- package/dist/chunk-JISYG63F.js +0 -70
- package/dist/chunk-JISYG63F.js.map +0 -1
- package/dist/chunk-LIMSTKYD.js +0 -61
- package/dist/chunk-LIMSTKYD.js.map +0 -1
- package/dist/chunk-OWAG3GSU.js.map +0 -1
- package/dist/chunk-PPMP5J6T.js.map +0 -1
- package/dist/chunk-Q5QRDWKI.js.map +0 -1
- package/dist/chunk-S5OFRT4M.js.map +0 -1
- package/dist/chunk-SBVILCCA.js.map +0 -1
- package/dist/chunk-TUMEWN34.js +0 -15
- package/dist/chunk-TUMEWN34.js.map +0 -1
- package/dist/chunk-XDNLUEXI.js +0 -138
- package/dist/chunk-XJ2HZOBU.js.map +0 -1
- package/dist/chunk-ZYTYSTO5.js.map +0 -1
- package/dist/chunk-ZZ2SS7NI.js +0 -237
- package/dist/chunk-ZZ2SS7NI.js.map +0 -1
- package/dist/database-C6jy7EOu.d.ts +0 -500
- package/dist/organisation-D6qRDtbF.d.ts +0 -93
- package/dist/schema-DTDZQe2u.d.ts +0 -28
- package/dist/unified-DQ4VcT7H.d.ts +0 -198
- package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
- package/dist/validation.d.ts +0 -47
- package/dist/validation.js +0 -24
- package/dist/validation.js.map +0 -1
- package/docs/DOCUMENTATION_AUDIT.md +0 -172
- package/docs/DOCUMENTATION_STANDARD.md +0 -137
- package/docs/api/classes/PublicErrorBoundary.md +0 -132
- package/docs/api/interfaces/EventLogoProps.md +0 -152
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
- package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
- package/docs/architecture/rpc-function-standards.md +0 -1106
- package/docs/getting-started/consuming-app-vite-config.md +0 -239
- package/docs/implementation-guides/event-theming-summary.md +0 -226
- package/docs/implementation-guides/public-pages-advanced.md +0 -1038
- package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
- package/docs/migration/v0.4.16-css-first-approach.md +0 -312
- package/docs/migration/v0.4.17-source-path-fix.md +0 -235
- package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
- package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
- package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
- package/docs/rbac/README-rbac-rls-integration.md +0 -374
- package/docs/styles/usage.md +0 -227
- package/docs/testing/visual-testing.md +0 -120
- package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
- package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
- package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
- package/docs/troubleshooting/database-view-compatibility.md +0 -125
- package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
- package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
- package/examples/RBAC/EventBasedApp.tsx +0 -239
- package/examples/RBAC/PermissionExample.tsx +0 -151
- package/examples/STRUCTURE.md +0 -125
- package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
- package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
- package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
- package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
- package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
- package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
- package/examples/components 2/index.ts +0 -11
- package/examples/features/index.ts +0 -12
- package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
- package/examples/features/rbac/index.ts +0 -13
- package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
- package/examples/public-pages/PublicEventPage.tsx +0 -274
- package/examples/public-pages/PublicPageApp.tsx +0 -308
- package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
- package/examples/public-pages/index.ts +0 -14
- package/src/__tests__/TEST_STANDARD.md +0 -1008
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
- package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
- package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
- package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
- package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
- package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
- package/src/components/Dialog/README.md +0 -804
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
- package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
- package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
- package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
- package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
- package/src/components/Dialog/utils/safeHtml.ts +0 -185
- package/src/components/EventSelector/types.ts +0 -79
- package/src/components/Form/FormErrorSummary.tsx +0 -113
- package/src/components/Form/FormField.tsx +0 -249
- package/src/components/Form/FormFieldset.tsx +0 -127
- package/src/components/Form/FormLiveRegion.tsx +0 -198
- package/src/components/Input/__mocks__/Input.tsx +0 -2
- package/src/components/NavigationMenu/types.ts +0 -85
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
- package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
- package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
- package/src/components/PasswordReset/index.ts +0 -2
- package/src/components/ProtectedRoute/README.md +0 -164
- package/src/components/PublicLayout/EventLogo.tsx +0 -175
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
- package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
- package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
- package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
- package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
- package/src/components/Select/hooks.ts +0 -289
- package/src/hooks/useCounter.test.ts +0 -131
- package/src/hooks/useDebounce.test.ts +0 -375
- package/src/providers/AuthProvider.tsx +0 -15
- package/src/providers/EventProvider.tsx +0 -16
- package/src/providers/InactivityProvider.tsx +0 -15
- package/src/providers/OrganisationProvider.context.test.tsx +0 -169
- package/src/providers/UnifiedAuthProvider.tsx +0 -15
- package/src/types/theme.ts +0 -6
- package/src/types/unified.ts +0 -265
- package/src/utils/appConfig.ts +0 -47
- package/src/utils/appIdResolver.test.ts +0 -499
- package/src/utils/appIdResolver.ts +0 -130
- package/src/utils/appNameResolver.simple.test.ts +0 -212
- package/src/utils/appNameResolver.test.ts +0 -121
- package/src/utils/appNameResolver.ts +0 -191
- package/src/utils/audit.ts +0 -127
- package/src/utils/auth-utils.ts +0 -96
- package/src/utils/bundleAnalysis.ts +0 -129
- package/src/utils/debugLogger.ts +0 -67
- package/src/utils/deviceFingerprint.ts +0 -215
- package/src/utils/dynamicUtils.ts +0 -105
- package/src/utils/file-reference.test.ts +0 -788
- package/src/utils/file-reference.ts +0 -519
- package/src/utils/formatDate.test.ts +0 -237
- package/src/utils/formatting.ts +0 -170
- package/src/utils/lazyLoad.tsx +0 -44
- package/src/utils/logger.ts +0 -179
- package/src/utils/organisationContext.test.ts +0 -322
- package/src/utils/organisationContext.ts +0 -153
- package/src/utils/performanceBenchmark.ts +0 -64
- package/src/utils/performanceBudgets.ts +0 -110
- package/src/utils/permissionTypes.ts +0 -37
- package/src/utils/permissionUtils.test.ts +0 -393
- package/src/utils/permissionUtils.ts +0 -34
- package/src/utils/sanitization.ts +0 -264
- package/src/utils/schemaUtils.ts +0 -37
- package/src/utils/secureDataAccess.test.ts +0 -711
- package/src/utils/secureDataAccess.ts +0 -377
- package/src/utils/secureErrors.ts +0 -79
- package/src/utils/security.ts +0 -156
- package/src/utils/securityMonitor.ts +0 -45
- package/src/utils/sessionTracking.ts +0 -126
- package/src/utils/validation.ts +0 -111
- package/src/utils/validationUtils.ts +0 -120
- package/src/validation/index.ts +0 -12
- /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
- /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
- /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
- /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
- /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
- /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
- /package/examples/{RBAC → rbac}/index.ts +0 -0
package/src/utils/auth-utils.ts
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Authentication utilities
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { User, SupabaseClient } from '@supabase/supabase-js';
|
|
6
|
-
|
|
7
|
-
export interface LoginCredentials {
|
|
8
|
-
email: string;
|
|
9
|
-
password: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface SignUpData {
|
|
13
|
-
email: string;
|
|
14
|
-
password: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface AuthResponse {
|
|
18
|
-
user?: User;
|
|
19
|
-
error?: Error;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export async function signInWithEmail(credentials: LoginCredentials): Promise<AuthResponse> {
|
|
23
|
-
try {
|
|
24
|
-
// TODO: Implement actual authentication logic
|
|
25
|
-
// For now, return a proper error response indicating this needs implementation
|
|
26
|
-
return {
|
|
27
|
-
error: new Error('Authentication not yet implemented - placeholder function')
|
|
28
|
-
};
|
|
29
|
-
} catch (error) {
|
|
30
|
-
return { error: error instanceof Error ? error : new Error('Unknown authentication error') };
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export async function signUpWithEmail(data: SignUpData): Promise<AuthResponse> {
|
|
35
|
-
try {
|
|
36
|
-
// TODO: Implement actual registration logic
|
|
37
|
-
// For now, return a proper error response indicating this needs implementation
|
|
38
|
-
return {
|
|
39
|
-
error: new Error('Registration not yet implemented - placeholder function')
|
|
40
|
-
};
|
|
41
|
-
} catch (error) {
|
|
42
|
-
return { error: error instanceof Error ? error : new Error('Unknown registration error') };
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export async function resetPassword(email: string): Promise<{ error?: Error }> {
|
|
47
|
-
try {
|
|
48
|
-
// TODO: Implement actual password reset logic
|
|
49
|
-
// For now, return a proper error response indicating this needs implementation
|
|
50
|
-
return {
|
|
51
|
-
error: new Error('Password reset not yet implemented - placeholder function')
|
|
52
|
-
};
|
|
53
|
-
} catch (error) {
|
|
54
|
-
return { error: error instanceof Error ? error : new Error('Unknown password reset error') };
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export async function updatePassword(supabaseClient: SupabaseClient, newPassword: string): Promise<{ error?: Error }> {
|
|
59
|
-
try {
|
|
60
|
-
const { error } = await supabaseClient.auth.updateUser({
|
|
61
|
-
password: newPassword
|
|
62
|
-
});
|
|
63
|
-
return { error: error || undefined };
|
|
64
|
-
} catch (err) {
|
|
65
|
-
return { error: err as Error };
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Audit logger implementation - using proper types instead of any
|
|
70
|
-
export interface AuditEventDetails {
|
|
71
|
-
[key: string]: unknown;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export interface AuditEventData {
|
|
75
|
-
action: string;
|
|
76
|
-
details?: AuditEventDetails;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export const auditLogger = {
|
|
80
|
-
log: (event: string, details?: AuditEventDetails) => {
|
|
81
|
-
// TODO: Implement proper audit logging service integration
|
|
82
|
-
// Console logging removed for production
|
|
83
|
-
},
|
|
84
|
-
logAuthEvent: (userId: string, action: string, details?: AuditEventDetails) => {
|
|
85
|
-
// TODO: Implement proper auth event logging
|
|
86
|
-
// Console logging removed for production
|
|
87
|
-
},
|
|
88
|
-
logPermissionEvent: (userId: string, permission: string, granted: boolean) => {
|
|
89
|
-
// TODO: Implement proper permission event logging
|
|
90
|
-
// Console logging removed for production
|
|
91
|
-
},
|
|
92
|
-
logEvent: (eventData: AuditEventData) => {
|
|
93
|
-
// TODO: Implement proper event logging
|
|
94
|
-
// Console logging removed for production
|
|
95
|
-
}
|
|
96
|
-
};
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
interface BundleStats {
|
|
3
|
-
totalSize: number;
|
|
4
|
-
gzippedSize: number;
|
|
5
|
-
chunks: ChunkInfo[];
|
|
6
|
-
treeshakingEffectiveness: number;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
interface ChunkInfo {
|
|
10
|
-
name: string;
|
|
11
|
-
size: number;
|
|
12
|
-
modules: string[];
|
|
13
|
-
dynamicallyImported: boolean;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
class BundleAnalyzer {
|
|
17
|
-
private enabled = import.meta.env.MODE === 'development';
|
|
18
|
-
|
|
19
|
-
analyzeBundle(): BundleStats | null {
|
|
20
|
-
if (!this.enabled) return null;
|
|
21
|
-
|
|
22
|
-
// In a real implementation, this would integrate with webpack-bundle-analyzer
|
|
23
|
-
// or similar tools. For now, we'll simulate analysis
|
|
24
|
-
|
|
25
|
-
// TODO: Replace with proper logging service integration
|
|
26
|
-
// For now, we'll log to console for testing purposes
|
|
27
|
-
console.log('Bundle analysis would run here in development');
|
|
28
|
-
console.log('To enable real bundle analysis:');
|
|
29
|
-
console.log('1. Install webpack-bundle-analyzer');
|
|
30
|
-
console.log('2. Add bundle analysis to build scripts');
|
|
31
|
-
console.log('3. Integrate with performance budgets');
|
|
32
|
-
|
|
33
|
-
return {
|
|
34
|
-
totalSize: 0,
|
|
35
|
-
gzippedSize: 0,
|
|
36
|
-
chunks: [],
|
|
37
|
-
treeshakingEffectiveness: 0
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
checkTreeshaking(): void {
|
|
42
|
-
if (!this.enabled) return;
|
|
43
|
-
|
|
44
|
-
const potentialIssues = [
|
|
45
|
-
'Check for unused exports in index files',
|
|
46
|
-
'Verify side-effect free modules in package.json',
|
|
47
|
-
'Ensure proper ES module syntax',
|
|
48
|
-
'Check for circular dependencies'
|
|
49
|
-
];
|
|
50
|
-
|
|
51
|
-
// TODO: Replace with proper logging service integration
|
|
52
|
-
// For now, we'll log to console for testing purposes
|
|
53
|
-
console.group('Tree-shaking Analysis');
|
|
54
|
-
potentialIssues.forEach(issue => console.log('- ' + issue));
|
|
55
|
-
console.groupEnd();
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
validateExports(): void {
|
|
59
|
-
if (!this.enabled) return;
|
|
60
|
-
|
|
61
|
-
// TODO: Replace with proper logging service integration
|
|
62
|
-
// For now, we'll log to console for testing purposes
|
|
63
|
-
console.group('Export Validation');
|
|
64
|
-
console.log('Checking for optimal export patterns...');
|
|
65
|
-
console.log('- Prefer named exports over default exports');
|
|
66
|
-
console.log('- Avoid barrel exports for large modules');
|
|
67
|
-
console.log('- Use dynamic imports for large dependencies');
|
|
68
|
-
console.groupEnd();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
generateReport(): string {
|
|
72
|
-
const report = `
|
|
73
|
-
# Bundle Analysis Report
|
|
74
|
-
|
|
75
|
-
## Recommendations for @jmruthers/pace-core
|
|
76
|
-
|
|
77
|
-
### 1. Code Splitting Opportunities
|
|
78
|
-
- ✅ DataTable virtualization is lazy-loaded
|
|
79
|
-
- ⚠️ Consider splitting auth providers by use case
|
|
80
|
-
- ⚠️ Lazy load heavy UI components (charts, complex forms)
|
|
81
|
-
|
|
82
|
-
### 2. Tree-shaking Optimization
|
|
83
|
-
- ✅ Using ES modules throughout
|
|
84
|
-
- ✅ Proper sideEffects configuration
|
|
85
|
-
- ⚠️ Check for unused utility functions
|
|
86
|
-
|
|
87
|
-
### 3. Bundle Size Targets
|
|
88
|
-
- Core components: < 50KB gzipped
|
|
89
|
-
- Auth module: < 30KB gzipped
|
|
90
|
-
- Utilities: < 20KB gzipped
|
|
91
|
-
- Total package: < 150KB gzipped
|
|
92
|
-
|
|
93
|
-
### 4. Performance Monitoring
|
|
94
|
-
- Monitor component render times
|
|
95
|
-
- Track bundle size changes
|
|
96
|
-
- Validate tree-shaking effectiveness
|
|
97
|
-
`;
|
|
98
|
-
|
|
99
|
-
return report.trim();
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export const bundleAnalyzer = new BundleAnalyzer();
|
|
104
|
-
|
|
105
|
-
// Helper to check if imports are optimized
|
|
106
|
-
export function validateImportPattern(moduleId: string, importedItems: string[]): void {
|
|
107
|
-
if (import.meta.env.MODE !== 'development') return;
|
|
108
|
-
|
|
109
|
-
const largeModules = ['lodash', 'moment', 'rxjs'];
|
|
110
|
-
const isLargeModule = largeModules.some(mod => moduleId.includes(mod));
|
|
111
|
-
|
|
112
|
-
if (isLargeModule && importedItems.length > 5) {
|
|
113
|
-
// TODO: Replace with proper logging service integration
|
|
114
|
-
// For now, we'll log to console for testing purposes
|
|
115
|
-
console.warn(
|
|
116
|
-
'Large import detected: importing ' + importedItems.length + ' items from ' + moduleId + '. ' +
|
|
117
|
-
'Consider splitting imports or using more specific imports.'
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Monitor dynamic imports
|
|
123
|
-
export function trackDynamicImport(moduleName: string): void {
|
|
124
|
-
if (import.meta.env.MODE !== 'development') return;
|
|
125
|
-
|
|
126
|
-
// TODO: Replace with proper logging service integration
|
|
127
|
-
// For now, we'll log to console for testing purposes
|
|
128
|
-
console.log('Dynamic import: ' + moduleName + ' - Good for code splitting!');
|
|
129
|
-
}
|
package/src/utils/debugLogger.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Debug Logger Utility
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Utils/DebugLogger
|
|
5
|
-
* @since 0.4.76
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Debug logger that respects environment settings
|
|
10
|
-
* Only logs in development mode to prevent production console spam
|
|
11
|
-
*/
|
|
12
|
-
export class DebugLogger {
|
|
13
|
-
/**
|
|
14
|
-
* Check if we're in development mode
|
|
15
|
-
*/
|
|
16
|
-
private static get isDevelopment(): boolean {
|
|
17
|
-
return import.meta.env.MODE === 'development';
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Log debug information only in development mode
|
|
22
|
-
*/
|
|
23
|
-
static log(component: string, message: string, ...args: any[]): void {
|
|
24
|
-
if (this.isDevelopment) {
|
|
25
|
-
try {
|
|
26
|
-
console.log(`[${component}] ${message}`, ...args);
|
|
27
|
-
} catch (e) {
|
|
28
|
-
// Gracefully handle console method errors
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Log error information (always logged)
|
|
35
|
-
*/
|
|
36
|
-
static error(component: string, message: string, ...args: any[]): void {
|
|
37
|
-
try {
|
|
38
|
-
console.error(`[${component}] ${message}`, ...args);
|
|
39
|
-
} catch (e) {
|
|
40
|
-
// Gracefully handle console method errors
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Log warning information (always logged)
|
|
46
|
-
*/
|
|
47
|
-
static warn(component: string, message: string, ...args: any[]): void {
|
|
48
|
-
try {
|
|
49
|
-
console.warn(`[${component}] ${message}`, ...args);
|
|
50
|
-
} catch (e) {
|
|
51
|
-
// Gracefully handle console method errors
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Log info information only in development mode
|
|
57
|
-
*/
|
|
58
|
-
static info(component: string, message: string, ...args: any[]): void {
|
|
59
|
-
if (this.isDevelopment) {
|
|
60
|
-
try {
|
|
61
|
-
console.info(`[${component}] ${message}`, ...args);
|
|
62
|
-
} catch (e) {
|
|
63
|
-
// Gracefully handle console method errors
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Secure Device Fingerprinting
|
|
3
|
-
* @description Enhanced device fingerprinting with encryption and security measures
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { secureStorage } from './secureStorage';
|
|
7
|
-
|
|
8
|
-
export interface DeviceFingerprint {
|
|
9
|
-
hash: string;
|
|
10
|
-
timestamp: number;
|
|
11
|
-
components: {
|
|
12
|
-
userAgent: string;
|
|
13
|
-
language: string;
|
|
14
|
-
platform: string;
|
|
15
|
-
screen: string;
|
|
16
|
-
timezone: string;
|
|
17
|
-
canvas?: string;
|
|
18
|
-
webgl?: string;
|
|
19
|
-
};
|
|
20
|
-
entropy: number;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Generate a secure device fingerprint (synchronous)
|
|
25
|
-
*/
|
|
26
|
-
export function generateDeviceFingerprint(): DeviceFingerprint {
|
|
27
|
-
try {
|
|
28
|
-
const components = {
|
|
29
|
-
userAgent: getHashedUserAgent(),
|
|
30
|
-
language: navigator.language || 'unknown',
|
|
31
|
-
platform: navigator.platform || 'unknown',
|
|
32
|
-
screen: `${screen.width}x${screen.height}x${screen.colorDepth}`,
|
|
33
|
-
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'unknown',
|
|
34
|
-
canvas: getCanvasFingerprint(),
|
|
35
|
-
webgl: getWebGLFingerprint(),
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// Calculate entropy (uniqueness score)
|
|
39
|
-
const entropy = calculateEntropy(components);
|
|
40
|
-
|
|
41
|
-
// Create a hash from all components
|
|
42
|
-
const fingerprintData = JSON.stringify(components);
|
|
43
|
-
const hash = hashStringSync(fingerprintData);
|
|
44
|
-
|
|
45
|
-
const fingerprint: DeviceFingerprint = {
|
|
46
|
-
hash,
|
|
47
|
-
timestamp: Date.now(),
|
|
48
|
-
components,
|
|
49
|
-
entropy,
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
// Store fingerprint asynchronously
|
|
53
|
-
secureStorage.setItem('device_fingerprint', JSON.stringify(fingerprint));
|
|
54
|
-
|
|
55
|
-
return fingerprint;
|
|
56
|
-
} catch (error) {
|
|
57
|
-
return generateFallbackFingerprint();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Validate device fingerprint with security checks
|
|
63
|
-
*/
|
|
64
|
-
export function validateDeviceFingerprint(
|
|
65
|
-
storedFingerprint: DeviceFingerprint,
|
|
66
|
-
currentFingerprint: DeviceFingerprint
|
|
67
|
-
): {
|
|
68
|
-
isValid: boolean;
|
|
69
|
-
confidence: number;
|
|
70
|
-
reasons: string[];
|
|
71
|
-
} {
|
|
72
|
-
const reasons: string[] = [];
|
|
73
|
-
let matchingComponents = 0;
|
|
74
|
-
const totalComponents = Object.keys(storedFingerprint.components).length;
|
|
75
|
-
|
|
76
|
-
// Check each component
|
|
77
|
-
Object.entries(storedFingerprint.components).forEach(([key, value]) => {
|
|
78
|
-
if (currentFingerprint.components[key as keyof typeof currentFingerprint.components] === value) {
|
|
79
|
-
matchingComponents++;
|
|
80
|
-
} else {
|
|
81
|
-
reasons.push(`Component mismatch: ${key}`);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
// Calculate confidence score
|
|
86
|
-
const confidence = (matchingComponents / totalComponents) * 100;
|
|
87
|
-
|
|
88
|
-
// Security thresholds
|
|
89
|
-
const isValid = confidence >= 80; // Require 80% match
|
|
90
|
-
|
|
91
|
-
// Additional security checks
|
|
92
|
-
const timeDiff = currentFingerprint.timestamp - storedFingerprint.timestamp;
|
|
93
|
-
const maxAge = 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
94
|
-
|
|
95
|
-
if (timeDiff > maxAge) {
|
|
96
|
-
reasons.push('Fingerprint too old');
|
|
97
|
-
return { isValid: false, confidence, reasons };
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (confidence < 60) {
|
|
101
|
-
reasons.push('Device signature changed significantly');
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return { isValid, confidence, reasons };
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Generate canvas fingerprint for enhanced uniqueness
|
|
109
|
-
*/
|
|
110
|
-
function getCanvasFingerprint(): string {
|
|
111
|
-
try {
|
|
112
|
-
const canvas = document.createElement('canvas');
|
|
113
|
-
const ctx = canvas.getContext('2d');
|
|
114
|
-
|
|
115
|
-
if (!ctx) return 'canvas-unavailable';
|
|
116
|
-
|
|
117
|
-
// Draw complex pattern for fingerprinting
|
|
118
|
-
ctx.textBaseline = 'top';
|
|
119
|
-
ctx.font = '14px Arial';
|
|
120
|
-
ctx.fillStyle = '#f60';
|
|
121
|
-
ctx.fillRect(125, 1, 62, 20);
|
|
122
|
-
ctx.fillStyle = '#069';
|
|
123
|
-
ctx.fillText('Device fingerprint 🔒', 2, 15);
|
|
124
|
-
ctx.fillStyle = 'rgba(102, 204, 0, 0.2)';
|
|
125
|
-
ctx.fillText('Device fingerprint 🔒', 4, 17);
|
|
126
|
-
|
|
127
|
-
const dataURL = canvas.toDataURL();
|
|
128
|
-
return hashStringSync(dataURL);
|
|
129
|
-
} catch (error) {
|
|
130
|
-
return 'canvas-error';
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Get WebGL fingerprint
|
|
136
|
-
*/
|
|
137
|
-
function getWebGLFingerprint(): string {
|
|
138
|
-
try {
|
|
139
|
-
const canvas = document.createElement('canvas');
|
|
140
|
-
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl') as WebGLRenderingContext | null;
|
|
141
|
-
|
|
142
|
-
if (!gl) return 'webgl-unavailable';
|
|
143
|
-
|
|
144
|
-
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
|
|
145
|
-
if (!debugInfo) return 'webgl-no-debug';
|
|
146
|
-
|
|
147
|
-
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
|
|
148
|
-
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
|
|
149
|
-
|
|
150
|
-
return `${vendor}|${renderer}`;
|
|
151
|
-
} catch (error) {
|
|
152
|
-
return 'webgl-error';
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Hash user agent to prevent direct exposure
|
|
158
|
-
*/
|
|
159
|
-
function getHashedUserAgent(): string {
|
|
160
|
-
const ua = navigator.userAgent;
|
|
161
|
-
return hashStringSync(ua).substring(0, 16); // Shorter hash for storage
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Calculate entropy of fingerprint components
|
|
166
|
-
*/
|
|
167
|
-
function calculateEntropy(components: Record<string, string>): number {
|
|
168
|
-
const values = Object.values(components).join('');
|
|
169
|
-
const charCounts = new Map<string, number>();
|
|
170
|
-
|
|
171
|
-
for (const char of values) {
|
|
172
|
-
charCounts.set(char, (charCounts.get(char) || 0) + 1);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
let entropy = 0;
|
|
176
|
-
for (const count of charCounts.values()) {
|
|
177
|
-
const probability = count / values.length;
|
|
178
|
-
entropy -= probability * Math.log2(probability);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return entropy;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Synchronous hash function for device fingerprinting
|
|
186
|
-
*/
|
|
187
|
-
function hashStringSync(str: string): string {
|
|
188
|
-
let hash = 0;
|
|
189
|
-
for (let i = 0; i < str.length; i++) {
|
|
190
|
-
const char = str.charCodeAt(i);
|
|
191
|
-
hash = ((hash << 5) - hash) + char;
|
|
192
|
-
hash = hash & hash;
|
|
193
|
-
}
|
|
194
|
-
return Math.abs(hash).toString(36);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Generate fallback fingerprint for error cases
|
|
199
|
-
*/
|
|
200
|
-
function generateFallbackFingerprint(): DeviceFingerprint {
|
|
201
|
-
const components = {
|
|
202
|
-
userAgent: 'fallback',
|
|
203
|
-
language: 'unknown',
|
|
204
|
-
platform: 'unknown',
|
|
205
|
-
screen: 'unknown',
|
|
206
|
-
timezone: 'unknown',
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
return {
|
|
210
|
-
hash: `fallback_${Date.now()}_${Math.random().toString(36)}`,
|
|
211
|
-
timestamp: Date.now(),
|
|
212
|
-
components,
|
|
213
|
-
entropy: 1, // Low entropy for fallback
|
|
214
|
-
};
|
|
215
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* Dynamic utility loader to reduce initial bundle size
|
|
4
|
-
* Heavy utilities are loaded on-demand
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// Type definitions for dynamic imports
|
|
8
|
-
type DebounceFunction = <T extends (...args: unknown[]) => unknown>(
|
|
9
|
-
func: T,
|
|
10
|
-
wait?: number,
|
|
11
|
-
options?: { leading?: boolean; maxWait?: number; trailing?: boolean }
|
|
12
|
-
) => T & { cancel(): void; flush(): void };
|
|
13
|
-
|
|
14
|
-
type ThrottleFunction = <T extends (...args: unknown[]) => unknown>(
|
|
15
|
-
func: T,
|
|
16
|
-
wait?: number,
|
|
17
|
-
options?: { leading?: boolean; trailing?: boolean }
|
|
18
|
-
) => T & { cancel(): void; flush(): void };
|
|
19
|
-
|
|
20
|
-
// Dynamic lodash utilities
|
|
21
|
-
export const loadLodash = async (): Promise<{
|
|
22
|
-
debounce: DebounceFunction;
|
|
23
|
-
throttle: ThrottleFunction;
|
|
24
|
-
}> => {
|
|
25
|
-
const [debounceModule, throttleModule] = await Promise.all([
|
|
26
|
-
import('lodash.debounce' as any),
|
|
27
|
-
import('lodash.throttle' as any)
|
|
28
|
-
]);
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
debounce: (debounceModule.default || debounceModule) as DebounceFunction,
|
|
32
|
-
throttle: (throttleModule.default || throttleModule) as ThrottleFunction
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
// Dynamic date utilities
|
|
37
|
-
export const loadDateUtils = async (): Promise<typeof import('date-fns')> => {
|
|
38
|
-
const dateFns = await import('date-fns');
|
|
39
|
-
return dateFns;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
// Dynamic chart utilities - using unknown type to avoid Recharts type issues
|
|
43
|
-
export const loadChartUtils = async (): Promise<unknown> => {
|
|
44
|
-
const recharts = await import('recharts');
|
|
45
|
-
return recharts;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// Dynamic form utilities
|
|
49
|
-
export const loadFormUtils = async (): Promise<{
|
|
50
|
-
useForm: unknown;
|
|
51
|
-
useController: unknown;
|
|
52
|
-
Controller: unknown;
|
|
53
|
-
FormProvider: unknown;
|
|
54
|
-
useFormContext: unknown;
|
|
55
|
-
useWatch: unknown;
|
|
56
|
-
useFormState: unknown;
|
|
57
|
-
useFieldArray: unknown;
|
|
58
|
-
zodResolver: unknown;
|
|
59
|
-
}> => {
|
|
60
|
-
const [reactHookForm, zodResolvers] = await Promise.all([
|
|
61
|
-
import('react-hook-form'),
|
|
62
|
-
import('@hookform/resolvers/zod')
|
|
63
|
-
]);
|
|
64
|
-
|
|
65
|
-
return {
|
|
66
|
-
...reactHookForm,
|
|
67
|
-
zodResolver: zodResolvers.zodResolver
|
|
68
|
-
};
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
// Dynamic CSV utilities
|
|
72
|
-
export const loadCSVUtils = async (): Promise<unknown> => {
|
|
73
|
-
const papaparse = await import('papaparse');
|
|
74
|
-
return papaparse.default;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
// Utility function to create lazy utility hooks
|
|
78
|
-
export function createLazyUtility<T>(loader: () => Promise<T>) {
|
|
79
|
-
let cached: T | null = null;
|
|
80
|
-
let loading: Promise<T> | null = null;
|
|
81
|
-
|
|
82
|
-
return {
|
|
83
|
-
load: async (): Promise<T> => {
|
|
84
|
-
if (cached) return cached;
|
|
85
|
-
if (loading) return loading;
|
|
86
|
-
|
|
87
|
-
loading = loader().then(result => {
|
|
88
|
-
cached = result;
|
|
89
|
-
loading = null;
|
|
90
|
-
return result;
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
return loading;
|
|
94
|
-
},
|
|
95
|
-
getCached: (): T | null => cached,
|
|
96
|
-
isLoaded: (): boolean => cached !== null
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Pre-configured lazy utilities with explicit types
|
|
101
|
-
export const lazyLodash: ReturnType<typeof createLazyUtility<Awaited<ReturnType<typeof loadLodash>>>> = createLazyUtility(loadLodash);
|
|
102
|
-
export const lazyDateUtils: ReturnType<typeof createLazyUtility<Awaited<ReturnType<typeof loadDateUtils>>>> = createLazyUtility(loadDateUtils);
|
|
103
|
-
export const lazyChartUtils: ReturnType<typeof createLazyUtility<unknown>> = createLazyUtility(loadChartUtils);
|
|
104
|
-
export const lazyFormUtils: ReturnType<typeof createLazyUtility<Awaited<ReturnType<typeof loadFormUtils>>>> = createLazyUtility(loadFormUtils);
|
|
105
|
-
export const lazyCSVUtils: ReturnType<typeof createLazyUtility<unknown>> = createLazyUtility(loadCSVUtils);
|