@therealtinhtute/baroiplayer 1.2.0 → 2.0.0-beta.1

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 (305) hide show
  1. package/README.md +91 -73
  2. package/dist/components/icons/index.d.ts +36 -0
  3. package/dist/components/icons/index.d.ts.map +1 -0
  4. package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts +4 -0
  5. package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +1 -0
  6. package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts +5 -0
  7. package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts.map +1 -0
  8. package/dist/components/icons/svg-icons/AudioIcon.d.ts +5 -0
  9. package/dist/components/icons/svg-icons/AudioIcon.d.ts.map +1 -0
  10. package/dist/components/icons/svg-icons/BackwardIcon.d.ts +5 -0
  11. package/dist/components/icons/svg-icons/BackwardIcon.d.ts.map +1 -0
  12. package/dist/components/icons/svg-icons/CameraIcon.d.ts +5 -0
  13. package/dist/components/icons/svg-icons/CameraIcon.d.ts.map +1 -0
  14. package/dist/components/icons/svg-icons/CheckIcon.d.ts +5 -0
  15. package/dist/components/icons/svg-icons/CheckIcon.d.ts.map +1 -0
  16. package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts +4 -0
  17. package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts.map +1 -0
  18. package/dist/components/icons/svg-icons/ForwardIcon.d.ts +5 -0
  19. package/dist/components/icons/svg-icons/ForwardIcon.d.ts.map +1 -0
  20. package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts +5 -0
  21. package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +1 -0
  22. package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts +5 -0
  23. package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +1 -0
  24. package/dist/components/icons/svg-icons/LoadingIcon.d.ts +5 -0
  25. package/dist/components/icons/svg-icons/LoadingIcon.d.ts.map +1 -0
  26. package/dist/components/icons/svg-icons/PauseIcon.d.ts +5 -0
  27. package/dist/components/icons/svg-icons/PauseIcon.d.ts.map +1 -0
  28. package/dist/components/icons/svg-icons/PlayIcon.d.ts +5 -0
  29. package/dist/components/icons/svg-icons/PlayIcon.d.ts.map +1 -0
  30. package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +5 -0
  31. package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +1 -0
  32. package/dist/components/icons/svg-icons/QualityIcon.d.ts +5 -0
  33. package/dist/components/icons/svg-icons/QualityIcon.d.ts.map +1 -0
  34. package/dist/components/icons/svg-icons/SettingsIcon.d.ts +5 -0
  35. package/dist/components/icons/svg-icons/SettingsIcon.d.ts.map +1 -0
  36. package/dist/components/icons/svg-icons/SliderIcon.d.ts +5 -0
  37. package/dist/components/icons/svg-icons/SliderIcon.d.ts.map +1 -0
  38. package/dist/components/icons/svg-icons/SubtitleIcon.d.ts +5 -0
  39. package/dist/components/icons/svg-icons/SubtitleIcon.d.ts.map +1 -0
  40. package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts +5 -0
  41. package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +1 -0
  42. package/dist/components/icons/svg-icons/UnPiPIcon.d.ts +4 -0
  43. package/dist/components/icons/svg-icons/UnPiPIcon.d.ts.map +1 -0
  44. package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts +5 -0
  45. package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +1 -0
  46. package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts +5 -0
  47. package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts.map +1 -0
  48. package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts +5 -0
  49. package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +1 -0
  50. package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts +5 -0
  51. package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +1 -0
  52. package/dist/components/variants/gradient/gradient-audio.d.ts +13 -0
  53. package/dist/components/variants/gradient/gradient-audio.d.ts.map +1 -0
  54. package/dist/components/variants/gradient/gradient-controls.d.ts +4 -0
  55. package/dist/components/variants/gradient/gradient-controls.d.ts.map +1 -0
  56. package/dist/components/variants/gradient/gradient-glyphs.d.ts +30 -0
  57. package/dist/components/variants/gradient/gradient-glyphs.d.ts.map +1 -0
  58. package/dist/components/variants/gradient/gradient-video.d.ts +16 -0
  59. package/dist/components/variants/gradient/gradient-video.d.ts.map +1 -0
  60. package/dist/index.css +1 -1
  61. package/dist/index.d.ts +5 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +2 -112
  64. package/dist/index.js.map +1 -1
  65. package/dist/index.mjs +786 -6271
  66. package/dist/index.mjs.map +1 -1
  67. package/dist/package.json +3 -0
  68. package/package.json +110 -108
  69. package/src/components/variants/gradient/gradient-audio.tsx +47 -0
  70. package/src/components/variants/gradient/gradient-controls.tsx +254 -0
  71. package/src/components/variants/gradient/gradient-glyphs.test.tsx +69 -0
  72. package/src/components/variants/gradient/gradient-glyphs.tsx +129 -0
  73. package/src/components/variants/gradient/gradient-skin.css +211 -0
  74. package/src/components/variants/gradient/gradient-video.tsx +70 -0
  75. package/src/index.ts +5 -198
  76. package/src/test/accessibility-utils.ts +0 -59
  77. package/dist/context/media.js +0 -2
  78. package/dist/context/media.js.map +0 -1
  79. package/dist/context/media.mjs +0 -15
  80. package/dist/context/media.mjs.map +0 -1
  81. package/dist/context/store.js +0 -2
  82. package/dist/context/store.js.map +0 -1
  83. package/dist/context/store.mjs +0 -5
  84. package/dist/context/store.mjs.map +0 -1
  85. package/dist/context-BYwDoSRX.js +0 -1172
  86. package/dist/context-BYwDoSRX.js.map +0 -1
  87. package/dist/context-eNS62_ac.cjs +0 -23
  88. package/dist/context-eNS62_ac.cjs.map +0 -1
  89. package/dist/core-events-B1iM2F46.cjs +0 -2
  90. package/dist/core-events-B1iM2F46.cjs.map +0 -1
  91. package/dist/core-events-DunPHKRE.js +0 -484
  92. package/dist/core-events-DunPHKRE.js.map +0 -1
  93. package/dist/core-plugins-By-4-kGs.cjs +0 -2
  94. package/dist/core-plugins-By-4-kGs.cjs.map +0 -1
  95. package/dist/core-plugins-DSBWcTuX.js +0 -821
  96. package/dist/core-plugins-DSBWcTuX.js.map +0 -1
  97. package/dist/core.js +0 -37
  98. package/dist/core.js.map +0 -1
  99. package/dist/core.mjs +0 -1233
  100. package/dist/core.mjs.map +0 -1
  101. package/dist/enhanced-components-B_l3cist.js +0 -1142
  102. package/dist/enhanced-components-B_l3cist.js.map +0 -1
  103. package/dist/enhanced-components-BspFs9OO.cjs +0 -2
  104. package/dist/enhanced-components-BspFs9OO.cjs.map +0 -1
  105. package/dist/hooks-BXwI8QG6.cjs +0 -4
  106. package/dist/hooks-BXwI8QG6.cjs.map +0 -1
  107. package/dist/hooks-Bpi-jDiO.js +0 -1816
  108. package/dist/hooks-Bpi-jDiO.js.map +0 -1
  109. package/dist/minimal-components-C4z900Ro.js +0 -1926
  110. package/dist/minimal-components-C4z900Ro.js.map +0 -1
  111. package/dist/minimal-components-v4qBp6jv.cjs +0 -2
  112. package/dist/minimal-components-v4qBp6jv.cjs.map +0 -1
  113. package/dist/minimal-components.css +0 -1
  114. package/dist/mona-loading.gif +0 -0
  115. package/dist/performance-monitor-C5k6FDXw.js +0 -301
  116. package/dist/performance-monitor-C5k6FDXw.js.map +0 -1
  117. package/dist/performance-monitor-lJmuUjQQ.cjs +0 -2
  118. package/dist/performance-monitor-lJmuUjQQ.cjs.map +0 -1
  119. package/dist/utils-CFOue_9K.cjs +0 -9
  120. package/dist/utils-CFOue_9K.cjs.map +0 -1
  121. package/dist/utils-Dzpl2ArK.js +0 -2844
  122. package/dist/utils-Dzpl2ArK.js.map +0 -1
  123. package/dist/utils.js +0 -2
  124. package/dist/utils.js.map +0 -1
  125. package/dist/utils.mjs +0 -11
  126. package/dist/utils.mjs.map +0 -1
  127. package/src/adapters/videojs-adapter.tsx +0 -470
  128. package/src/assets/mona-loading.gif +0 -0
  129. package/src/components/AnimateLoading.tsx +0 -107
  130. package/src/components/LoadingState.tsx +0 -239
  131. package/src/components/__tests__/media-player-accessibility.test.tsx +0 -510
  132. package/src/components/__tests__/media-player-react19.test.tsx +0 -457
  133. package/src/components/accessibility/keyboard-help-overlay.tsx +0 -207
  134. package/src/components/audio-player.tsx +0 -85
  135. package/src/components/basic/index.ts +0 -37
  136. package/src/components/enhanced/advanced-features.tsx +0 -311
  137. package/src/components/enhanced/debug-panel.tsx +0 -448
  138. package/src/components/enhanced/enhanced-controls.tsx +0 -597
  139. package/src/components/enhanced/enhanced-media-player.tsx +0 -566
  140. package/src/components/enhanced/error-handling.tsx +0 -338
  141. package/src/components/enhanced/index.ts +0 -39
  142. package/src/components/enhanced/media-player-enhanced.tsx +0 -383
  143. package/src/components/examples/basic-video-player.tsx +0 -50
  144. package/src/components/examples/custom-controls-example.tsx +0 -63
  145. package/src/components/examples/enhanced-controls-example.tsx +0 -100
  146. package/src/components/examples/enhanced-media-player-example.tsx +0 -302
  147. package/src/components/examples/loading-states-demo.tsx +0 -142
  148. package/src/components/examples/react-19-demo.tsx +0 -353
  149. package/src/components/examples/volume-orientation-demo.tsx +0 -106
  150. package/src/components/icon-demo.tsx +0 -196
  151. package/src/components/legacy.tsx +0 -87
  152. package/src/components/media-metadata-display.tsx +0 -99
  153. package/src/components/media-player-audio.tsx +0 -39
  154. package/src/components/media-player-controls.tsx +0 -223
  155. package/src/components/media-player-error.tsx +0 -163
  156. package/src/components/media-player-fullscreen.tsx +0 -109
  157. package/src/components/media-player-hls.tsx +0 -111
  158. package/src/components/media-player-loading.tsx +0 -76
  159. package/src/components/media-player-play.tsx +0 -75
  160. package/src/components/media-player-root.tsx +0 -338
  161. package/src/components/media-player-seek.tsx +0 -168
  162. package/src/components/media-player-time.tsx +0 -99
  163. package/src/components/media-player-tooltip.tsx +0 -58
  164. package/src/components/media-player-video.tsx +0 -54
  165. package/src/components/media-player-volume.tsx +0 -155
  166. package/src/components/media-player.tsx +0 -292
  167. package/src/components/media-suspense.tsx +0 -344
  168. package/src/components/player-settings-form.tsx +0 -158
  169. package/src/components/react-player-wrapper.tsx +0 -651
  170. package/src/components/simple-video-player.tsx +0 -62
  171. package/src/components/ui/blur-poster.tsx +0 -93
  172. package/src/components/ui/empty-state.tsx +0 -91
  173. package/src/components/ui/enhanced-seek-bar.tsx +0 -254
  174. package/src/components/ui/error-state.tsx +0 -124
  175. package/src/components/ui/fullscreen-button.tsx +0 -81
  176. package/src/components/ui/loading-skeleton.tsx +0 -107
  177. package/src/components/ui/media-resource-preloader.tsx +0 -458
  178. package/src/components/ui/offline-message.tsx +0 -98
  179. package/src/components/ui/play-button.tsx +0 -99
  180. package/src/components/ui/seek-bar.tsx +0 -191
  181. package/src/components/ui/time-display.tsx +0 -61
  182. package/src/components/ui/volume-control.tsx +0 -190
  183. package/src/components/unified/base-media-player.tsx +0 -252
  184. package/src/components/unified/media-player.tsx +0 -75
  185. package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +0 -587
  186. package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +0 -573
  187. package/src/components/variants/minimal/MinimalControls.tsx +0 -124
  188. package/src/components/variants/minimal/MinimalLoading.tsx +0 -28
  189. package/src/components/variants/minimal/MinimalMediaPlayer.tsx +0 -318
  190. package/src/components/variants/minimal/MinimalOverlay.tsx +0 -58
  191. package/src/components/variants/minimal/MinimalPlayButton.tsx +0 -56
  192. package/src/components/variants/minimal/MinimalSeekBar.tsx +0 -140
  193. package/src/components/variants/minimal/MinimalVolumeControl.tsx +0 -75
  194. package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +0 -206
  195. package/src/components/variants/minimal/components/CenterPlayButton.tsx +0 -22
  196. package/src/components/variants/minimal/components/ControlBar.tsx +0 -142
  197. package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +0 -412
  198. package/src/components/variants/minimal/components/PlaybackControls.tsx +0 -46
  199. package/src/components/variants/minimal/components/RightControls.tsx +0 -164
  200. package/src/components/variants/minimal/components/SeekBar.tsx +0 -127
  201. package/src/components/variants/minimal/components/SettingsDropdown.tsx +0 -68
  202. package/src/components/variants/minimal/components/SubtitleDisplay.tsx +0 -21
  203. package/src/components/variants/minimal/components/TimeDisplay.tsx +0 -15
  204. package/src/components/variants/minimal/components/VideoElement.tsx +0 -33
  205. package/src/components/variants/minimal/components/VolumeControl.tsx +0 -220
  206. package/src/components/variants/minimal/index.ts +0 -23
  207. package/src/components/video-player.tsx +0 -100
  208. package/src/context/__tests__/media-store.test.ts +0 -509
  209. package/src/context/error-handling.ts +0 -398
  210. package/src/context/media-context.tsx +0 -254
  211. package/src/context/media-provider.tsx +0 -264
  212. package/src/context/media-store.ts +0 -387
  213. package/src/context/persistence.ts +0 -462
  214. package/src/core/events/event-system.ts +0 -448
  215. package/src/core/events/hooks.ts +0 -325
  216. package/src/core/events/index.ts +0 -22
  217. package/src/core/events/middleware.ts +0 -286
  218. package/src/core/index.ts +0 -22
  219. package/src/core/optimization/bundle-optimizer.tsx +0 -312
  220. package/src/core/performance/cicd.ts +0 -98
  221. package/src/core/performance/index.ts +0 -38
  222. package/src/core/performance/media-loading-optimizer.ts +0 -544
  223. package/src/core/performance/performance-budgets.ts +0 -437
  224. package/src/core/performance/performance-monitor.tsx +0 -488
  225. package/src/core/performance/performance-testing.ts +0 -461
  226. package/src/core/plugins/__tests__/registry.test.ts +0 -595
  227. package/src/core/plugins/base-plugin.ts +0 -225
  228. package/src/core/plugins/enhanced-plugin-system.ts +0 -435
  229. package/src/core/plugins/examples/analytics-plugin.ts +0 -241
  230. package/src/core/plugins/index.ts +0 -39
  231. package/src/core/plugins/registry.ts +0 -546
  232. package/src/core/plugins/types.ts +0 -169
  233. package/src/core/plugins/utils.ts +0 -317
  234. package/src/core/progressive-loading.tsx +0 -331
  235. package/src/core/providers/enhanced-hls-provider.ts +0 -307
  236. package/src/core/providers/lazy-provider.tsx +0 -14
  237. package/src/core/providers/service-provider.tsx +0 -164
  238. package/src/core/utils.tsx +0 -34
  239. package/src/features/media-session/media-session-manager.ts +0 -411
  240. package/src/features/picture-in-picture/pip-manager.ts +0 -428
  241. package/src/features/playlist/playlist-manager.ts +0 -626
  242. package/src/features/subtitles/subtitle-manager.ts +0 -435
  243. package/src/features/subtitles/subtitle-parser.ts +0 -284
  244. package/src/features/thumbnails/thumbnail-generator.ts +0 -528
  245. package/src/hooks/__tests__/currentTime-fix.test.ts +0 -149
  246. package/src/hooks/__tests__/use-media-player.test.ts +0 -712
  247. package/src/hooks/__tests__/use-media-state.test.tsx +0 -316
  248. package/src/hooks/accessibility/index.ts +0 -27
  249. package/src/hooks/accessibility/use-accessibility-preferences.ts +0 -190
  250. package/src/hooks/accessibility/use-focus-management.ts +0 -183
  251. package/src/hooks/accessibility/use-keyboard-shortcuts.ts +0 -152
  252. package/src/hooks/accessibility/use-screen-reader.ts +0 -212
  253. package/src/hooks/core/index.ts +0 -47
  254. package/src/hooks/legacy.ts +0 -21
  255. package/src/hooks/use-buffer-health.ts +0 -218
  256. package/src/hooks/use-enhanced-media-player.ts +0 -575
  257. package/src/hooks/use-focus-trap.tsx +0 -162
  258. package/src/hooks/use-intelligent-preloading.ts +0 -387
  259. package/src/hooks/use-keyboard-controls.ts +0 -115
  260. package/src/hooks/use-keyboard-shortcuts.ts +0 -255
  261. package/src/hooks/use-media-actions.ts +0 -184
  262. package/src/hooks/use-media-metadata.ts +0 -91
  263. package/src/hooks/use-media-optimistic.ts +0 -264
  264. package/src/hooks/use-media-player.ts +0 -343
  265. package/src/hooks/use-media-state.ts +0 -194
  266. package/src/hooks/use-memory-optimization.ts +0 -360
  267. package/src/hooks/use-network-status.ts +0 -124
  268. package/src/hooks/use-optimistic-controls.ts +0 -95
  269. package/src/hooks/use-optimized-media.ts +0 -283
  270. package/src/hooks/use-smart-preload.ts +0 -229
  271. package/src/hooks/use-touch-gestures.ts +0 -461
  272. package/src/hooks/useEnhancedSubtitles.ts +0 -258
  273. package/src/hooks/useKeyboardShortcuts.ts +0 -106
  274. package/src/hooks/useMediaControls.ts +0 -52
  275. package/src/hooks/useScreenshot.ts +0 -61
  276. package/src/hooks/useSubtitles.ts +0 -91
  277. package/src/hooks/useVideoPlayer.ts +0 -278
  278. package/src/icons/components/FullscreenIcon.tsx +0 -36
  279. package/src/icons/components/SettingsIcon.tsx +0 -37
  280. package/src/icons/components/animated/LoadingIcon.tsx +0 -27
  281. package/src/icons/components/animated/PlayPauseIcon.tsx +0 -42
  282. package/src/icons/components/media/PauseIcon.tsx +0 -38
  283. package/src/icons/components/media/PlayIcon.tsx +0 -37
  284. package/src/icons/components/volume/VolumeIcon.tsx +0 -38
  285. package/src/icons/components/volume/VolumeOffIcon.tsx +0 -38
  286. package/src/icons/index.ts +0 -56
  287. package/src/icons/provider.tsx +0 -58
  288. package/src/icons/types.ts +0 -60
  289. package/src/index-enhanced.ts +0 -35
  290. package/src/index-legacy.ts +0 -324
  291. package/src/index.css +0 -102
  292. package/src/lib/__tests__/async-utils.test.ts +0 -291
  293. package/src/lib/async-utils.ts +0 -194
  294. package/src/lib/deprecation.ts +0 -51
  295. package/src/lib/format-time.ts +0 -37
  296. package/src/lib/index.ts +0 -4
  297. package/src/lib/utils.ts +0 -6
  298. package/src/styles/globals.css +0 -462
  299. package/src/styles/minimal-player.css +0 -621
  300. package/src/styles/pixel-art.css +0 -41
  301. package/src/styles/videojs.css +0 -100
  302. package/src/types/events.ts +0 -47
  303. package/src/types/formats.ts +0 -79
  304. package/src/types/index.ts +0 -203
  305. package/src/types/videojs-plugins.d.ts +0 -14
@@ -1,461 +0,0 @@
1
- import { PerformanceRegressionDetector, performanceMonitor } from "./performance-monitor"
2
- import type { PerformanceMetrics } from "./performance-monitor"
3
-
4
- // Performance test configuration
5
- export interface PerformanceTestConfig {
6
- name: string
7
- iterations: number
8
- warmupIterations: number
9
- timeout: number
10
- expectedThreshold: {
11
- renderTime: number
12
- memoryUsage: number
13
- }
14
- }
15
-
16
- // Performance test result
17
- export interface PerformanceTestResult {
18
- testName: string
19
- passed: boolean
20
- metrics: {
21
- averageRenderTime: number
22
- minRenderTime: number
23
- maxRenderTime: number
24
- memoryUsage: number
25
- iterations: number
26
- }
27
- threshold: PerformanceTestConfig["expectedThreshold"]
28
- error?: string
29
- }
30
-
31
- // Performance benchmark suite
32
- export class PerformanceBenchmark {
33
- private results: PerformanceTestResult[] = []
34
- private regressionDetector = new PerformanceRegressionDetector()
35
-
36
- async runTest(
37
- config: PerformanceTestConfig,
38
- testFunction: () => any | Promise<any>
39
- ): Promise<PerformanceTestResult> {
40
- const renderTimes: number[] = []
41
- let memoryBefore = 0
42
- let memoryAfter = 0
43
- let error: string | undefined
44
-
45
- try {
46
- // Warmup iterations
47
- for (let i = 0; i < config.warmupIterations; i++) {
48
- await testFunction()
49
- }
50
-
51
- // Force garbage collection if available
52
- if (global.gc) {
53
- global.gc()
54
- }
55
-
56
- memoryBefore = this.getMemoryUsage()
57
-
58
- // Main test iterations
59
- for (let i = 0; i < config.iterations; i++) {
60
- const startTime = performance.now()
61
- await testFunction()
62
- const endTime = performance.now()
63
- renderTimes.push(endTime - startTime)
64
- }
65
-
66
- memoryAfter = this.getMemoryUsage()
67
- } catch (err) {
68
- error = err instanceof Error ? err.message : String(err)
69
- }
70
-
71
- const averageRenderTime = renderTimes.reduce((sum, time) => sum + time, 0) / renderTimes.length
72
- const minRenderTime = Math.min(...renderTimes)
73
- const maxRenderTime = Math.max(...renderTimes)
74
- const memoryUsage = memoryAfter - memoryBefore
75
-
76
- const passed =
77
- !error &&
78
- averageRenderTime <= config.expectedThreshold.renderTime &&
79
- memoryUsage <= config.expectedThreshold.memoryUsage
80
-
81
- const result: PerformanceTestResult = {
82
- testName: config.name,
83
- passed,
84
- metrics: {
85
- averageRenderTime,
86
- minRenderTime: isFinite(minRenderTime) ? minRenderTime : 0,
87
- maxRenderTime: isFinite(maxRenderTime) ? maxRenderTime : 0,
88
- memoryUsage,
89
- iterations: config.iterations
90
- },
91
- threshold: config.expectedThreshold,
92
- error
93
- }
94
-
95
- this.results.push(result)
96
- return result
97
- }
98
-
99
- private getMemoryUsage(): number {
100
- if ("memory" in performance) {
101
- return (performance as any).memory.usedJSHeapSize || 0
102
- }
103
- return 0
104
- }
105
-
106
- // Component rendering performance test
107
- async testComponentRender(
108
- componentName: string,
109
- renderFunction: () => any,
110
- expectedRenderTime = 16 // 60fps target
111
- ): Promise<PerformanceTestResult> {
112
- const config: PerformanceTestConfig = {
113
- name: `${componentName} Render Performance`,
114
- iterations: 100,
115
- warmupIterations: 10,
116
- timeout: 5000,
117
- expectedThreshold: {
118
- renderTime: expectedRenderTime,
119
- memoryUsage: 1024 * 1024 // 1MB
120
- }
121
- }
122
-
123
- return this.runTest(config, renderFunction)
124
- }
125
-
126
- // Bundle loading performance test
127
- async testBundleLoading(
128
- bundlePath: string,
129
- expectedLoadTime = 1000 // 1 second
130
- ): Promise<PerformanceTestResult> {
131
- const config: PerformanceTestConfig = {
132
- name: `Bundle Loading: ${bundlePath}`,
133
- iterations: 5,
134
- warmupIterations: 1,
135
- timeout: 10000,
136
- expectedThreshold: {
137
- renderTime: expectedLoadTime,
138
- memoryUsage: 5 * 1024 * 1024 // 5MB
139
- }
140
- }
141
-
142
- return this.runTest(config, async () => {
143
- // Simulate bundle loading
144
- const startTime = performance.now()
145
- try {
146
- // Use fetch instead of dynamic import to avoid bundler issues
147
- const response = await fetch(bundlePath)
148
- if (!response.ok) {
149
- throw new Error(`Failed to load bundle: ${response.status}`)
150
- }
151
- await response.blob() // Consume the response
152
- } catch (error) {
153
- console.warn(`Bundle loading test failed for ${bundlePath}:`, error)
154
- // Return a mock time for testing purposes
155
- }
156
- const endTime = performance.now()
157
- return endTime - startTime
158
- })
159
- }
160
-
161
- // Memory leak detection test
162
- async testMemoryLeaks(
163
- testFunction: () => any,
164
- iterations = 1000
165
- ): Promise<PerformanceTestResult> {
166
- const config: PerformanceTestConfig = {
167
- name: "Memory Leak Detection",
168
- iterations,
169
- warmupIterations: 100,
170
- timeout: 30000,
171
- expectedThreshold: {
172
- renderTime: Infinity, // Not testing render time
173
- memoryUsage: 10 * 1024 * 1024 // 10MB max increase
174
- }
175
- }
176
-
177
- const memoryBefore = this.getMemoryUsage()
178
-
179
- const result = await this.runTest(config, testFunction)
180
-
181
- const memoryAfter = this.getMemoryUsage()
182
- const memoryIncrease = memoryAfter - memoryBefore
183
-
184
- // Check for memory leaks (memory should not increase significantly)
185
- const hasMemoryLeak = memoryIncrease > config.expectedThreshold.memoryUsage
186
-
187
- return {
188
- ...result,
189
- passed: result.passed && !hasMemoryLeak,
190
- error: hasMemoryLeak
191
- ? `Potential memory leak detected: ${Math.round(memoryIncrease / 1024 / 1024)}MB increase`
192
- : result.error
193
- }
194
- }
195
-
196
- // Interaction delay test
197
- async testInteractionDelay(
198
- interactionFunction: () => any,
199
- expectedDelay = 100 // 100ms
200
- ): Promise<PerformanceTestResult> {
201
- const config: PerformanceTestConfig = {
202
- name: "Interaction Delay",
203
- iterations: 50,
204
- warmupIterations: 5,
205
- timeout: 5000,
206
- expectedThreshold: {
207
- renderTime: expectedDelay,
208
- memoryUsage: 1024 * 1024 // 1MB
209
- }
210
- }
211
-
212
- return this.runTest(config, interactionFunction)
213
- }
214
-
215
- // Regression testing
216
- async runRegressionTests(
217
- currentMetrics: PerformanceMetrics,
218
- baselineMetrics?: PerformanceMetrics
219
- ): Promise<{
220
- passed: boolean
221
- regressions: ReturnType<PerformanceRegressionDetector["detectRegression"]>
222
- }> {
223
- if (baselineMetrics) {
224
- this.regressionDetector.setBaseline(baselineMetrics)
225
- }
226
-
227
- const regressions = this.regressionDetector.detectRegression(currentMetrics)
228
- const passed = regressions.length === 0
229
-
230
- return { passed, regressions }
231
- }
232
-
233
- // Get all test results
234
- getResults(): PerformanceTestResult[] {
235
- return [...this.results]
236
- }
237
-
238
- // Get test summary
239
- getSummary(): {
240
- totalTests: number
241
- passedTests: number
242
- failedTests: number
243
- passRate: number
244
- } {
245
- const totalTests = this.results.length
246
- const passedTests = this.results.filter((result) => result.passed).length
247
- const failedTests = totalTests - passedTests
248
- const passRate = totalTests > 0 ? (passedTests / totalTests) * 100 : 0
249
-
250
- return { totalTests, passedTests, failedTests, passRate }
251
- }
252
-
253
- // Clear test results
254
- clearResults(): void {
255
- this.results = []
256
- }
257
-
258
- // Generate performance report
259
- generateReport(): string {
260
- const summary = this.getSummary()
261
- let report = `Performance Test Report\n`
262
- report += `========================\n\n`
263
- report += `Total Tests: ${summary.totalTests}\n`
264
- report += `Passed: ${summary.passedTests}\n`
265
- report += `Failed: ${summary.failedTests}\n`
266
- report += `Pass Rate: ${summary.passRate.toFixed(1)}%\n\n`
267
-
268
- if (this.results.length > 0) {
269
- report += `Detailed Results:\n`
270
- report += `-----------------\n\n`
271
-
272
- this.results.forEach((result, index) => {
273
- report += `${index + 1}. ${result.testName}\n`
274
- report += ` Status: ${result.passed ? "PASS" : "FAIL"}\n`
275
- report += ` Average Render Time: ${result.metrics.averageRenderTime.toFixed(2)}ms\n`
276
- report += ` Min/Max Render Time: ${result.metrics.minRenderTime.toFixed(2)}ms / ${result.metrics.maxRenderTime.toFixed(2)}ms\n`
277
- report += ` Memory Usage: ${Math.round(result.metrics.memoryUsage / 1024)} KB\n`
278
- report += ` Iterations: ${result.metrics.iterations}\n`
279
-
280
- if (result.error) {
281
- report += ` Error: ${result.error}\n`
282
- }
283
-
284
- report += `\n`
285
- })
286
- }
287
-
288
- return report
289
- }
290
- }
291
-
292
- // Global performance benchmark instance
293
- export const performanceBenchmark = new PerformanceBenchmark()
294
-
295
- // Utility functions for common performance tests
296
- export const performanceTestUtils = {
297
- // Test component rendering performance
298
- async testComponent(
299
- Component: any,
300
- props: any = {},
301
- expectedRenderTime = 16
302
- ): Promise<PerformanceTestResult> {
303
- return performanceBenchmark.testComponentRender(
304
- Component.displayName || Component.name || "Component",
305
- () => {
306
- // This would need React Testing Library in a real test environment
307
- // For now, we'll simulate component rendering
308
- return { type: Component, props } // Mock element
309
- },
310
- expectedRenderTime
311
- )
312
- },
313
-
314
- // Test hook performance
315
- async testHook(
316
- hookFunction: () => any,
317
- hookName: string,
318
- expectedExecutionTime = 1
319
- ): Promise<PerformanceTestResult> {
320
- const config: PerformanceTestConfig = {
321
- name: `Hook Performance: ${hookName}`,
322
- iterations: 1000,
323
- warmupIterations: 100,
324
- timeout: 5000,
325
- expectedThreshold: {
326
- renderTime: expectedExecutionTime,
327
- memoryUsage: 1024 * 1024 // 1MB
328
- }
329
- }
330
-
331
- return performanceBenchmark.runTest(config, hookFunction)
332
- },
333
-
334
- // Test async operation performance
335
- async testAsyncOperation(
336
- operation: () => Promise<any>,
337
- operationName: string,
338
- expectedTime = 1000
339
- ): Promise<PerformanceTestResult> {
340
- const config: PerformanceTestConfig = {
341
- name: `Async Operation: ${operationName}`,
342
- iterations: 10,
343
- warmupIterations: 2,
344
- timeout: 30000,
345
- expectedThreshold: {
346
- renderTime: expectedTime,
347
- memoryUsage: 2 * 1024 * 1024 // 2MB
348
- }
349
- }
350
-
351
- return performanceBenchmark.runTest(config, operation)
352
- },
353
-
354
- // Test bundle size impact
355
- async measureBundleImpact(
356
- beforeFunction: () => void,
357
- afterFunction: () => void,
358
- featureName: string
359
- ): Promise<{
360
- bundleIncrease: number
361
- memoryIncrease: number
362
- renderTimeImpact: number
363
- }> {
364
- const beforeMemory = (performance as any).memory?.usedJSHeapSize || 0
365
- const beforeTime = performance.now()
366
-
367
- beforeFunction()
368
-
369
- const midMemory = (performance as any).memory?.usedJSHeapSize || 0
370
- const midTime = performance.now()
371
-
372
- afterFunction()
373
-
374
- const afterMemory = (performance as any).memory?.usedJSHeapSize || 0
375
- const afterTime = performance.now()
376
-
377
- return {
378
- bundleIncrease: afterMemory - beforeMemory,
379
- memoryIncrease: midMemory - beforeMemory,
380
- renderTimeImpact: afterTime - midTime - (midTime - beforeTime)
381
- }
382
- }
383
- }
384
-
385
- // Performance testing framework
386
- export class PerformanceTestFramework {
387
- private benchmark = new PerformanceBenchmark()
388
- private suites: Map<string, PerformanceTestConfig[]> = new Map()
389
-
390
- // Register a test suite
391
- registerSuite(suiteName: string, tests: PerformanceTestConfig[]) {
392
- this.suites.set(suiteName, tests)
393
- }
394
-
395
- // Run all tests in a suite
396
- async runSuite(
397
- suiteName: string,
398
- testImplementations: Map<string, () => any>
399
- ): Promise<PerformanceTestResult[]> {
400
- const tests = this.suites.get(suiteName)
401
- if (!tests) {
402
- throw new Error(`Test suite '${suiteName}' not found`)
403
- }
404
-
405
- const results: PerformanceTestResult[] = []
406
-
407
- for (const test of tests) {
408
- const implementation = testImplementations.get(test.name)
409
- if (!implementation) {
410
- console.warn(`No implementation found for test '${test.name}'`)
411
- continue
412
- }
413
-
414
- const result = await this.benchmark.runTest(test, implementation)
415
- results.push(result)
416
- }
417
-
418
- return results
419
- }
420
-
421
- // Run all registered test suites
422
- async runAllSuites(
423
- implementations: Map<string, Map<string, () => any>>
424
- ): Promise<Map<string, PerformanceTestResult[]>> {
425
- const allResults = new Map<string, PerformanceTestResult[]>()
426
-
427
- for (const [suiteName] of this.suites) {
428
- const suiteImplementations = implementations.get(suiteName)
429
- if (!suiteImplementations) {
430
- console.warn(`No implementations found for suite '${suiteName}'`)
431
- continue
432
- }
433
-
434
- const results = await this.runSuite(suiteName, suiteImplementations)
435
- allResults.set(suiteName, results)
436
- }
437
-
438
- return allResults
439
- }
440
-
441
- // Generate comprehensive report
442
- generateComprehensiveReport(): string {
443
- const summary = this.benchmark.getSummary()
444
- let report = this.benchmark.generateReport()
445
-
446
- // Add suite breakdown if available
447
- if (this.suites.size > 0) {
448
- report += `\nTest Suites:\n`
449
- report += `============\n\n`
450
-
451
- for (const [suiteName, tests] of this.suites) {
452
- report += `Suite: ${suiteName}\n`
453
- report += `Tests: ${tests.length}\n\n`
454
- }
455
- }
456
-
457
- return report
458
- }
459
- }
460
-
461
- export const performanceTestFramework = new PerformanceTestFramework()