@therealtinhtute/baroiplayer 1.2.1 → 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 (302) hide show
  1. package/README.md +90 -71
  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 +1 -41
  64. package/dist/index.js.map +1 -1
  65. package/dist/index.mjs +750 -5640
  66. package/dist/index.mjs.map +1 -1
  67. package/dist/package.json +3 -0
  68. package/package.json +110 -114
  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 -1
  78. package/dist/context/media.mjs +0 -3
  79. package/dist/context/store.js +0 -1
  80. package/dist/context/store.mjs +0 -3
  81. package/dist/context-Bzd5QCKM.cjs +0 -7
  82. package/dist/context-Bzd5QCKM.cjs.map +0 -1
  83. package/dist/context-DD_SH4tT.js +0 -1053
  84. package/dist/context-DD_SH4tT.js.map +0 -1
  85. package/dist/core-events-BRnLMB7s.cjs +0 -2
  86. package/dist/core-events-BRnLMB7s.cjs.map +0 -1
  87. package/dist/core-events-v_mKdj5p.js +0 -417
  88. package/dist/core-events-v_mKdj5p.js.map +0 -1
  89. package/dist/core-plugins-CMBv-yVh.cjs +0 -2
  90. package/dist/core-plugins-CMBv-yVh.cjs.map +0 -1
  91. package/dist/core-plugins-CqCxLkbd.js +0 -754
  92. package/dist/core-plugins-CqCxLkbd.js.map +0 -1
  93. package/dist/core.js +0 -15
  94. package/dist/core.js.map +0 -1
  95. package/dist/core.mjs +0 -960
  96. package/dist/core.mjs.map +0 -1
  97. package/dist/enhanced-components-BwjBqSA1.js +0 -2858
  98. package/dist/enhanced-components-BwjBqSA1.js.map +0 -1
  99. package/dist/enhanced-components-C-ka-XLp.cjs +0 -2
  100. package/dist/enhanced-components-C-ka-XLp.cjs.map +0 -1
  101. package/dist/hooks-B-IIWPJr.js +0 -1842
  102. package/dist/hooks-B-IIWPJr.js.map +0 -1
  103. package/dist/hooks-DcHzmBwA.cjs +0 -4
  104. package/dist/hooks-DcHzmBwA.cjs.map +0 -1
  105. package/dist/minimal-components-BYsMQde5.js +0 -1610
  106. package/dist/minimal-components-BYsMQde5.js.map +0 -1
  107. package/dist/minimal-components-CsxQbDp7.cjs +0 -2
  108. package/dist/minimal-components-CsxQbDp7.cjs.map +0 -1
  109. package/dist/minimal-components.css +0 -1
  110. package/dist/mona-loading.gif +0 -0
  111. package/dist/performance-monitor-DCSijLJg.js +0 -312
  112. package/dist/performance-monitor-DCSijLJg.js.map +0 -1
  113. package/dist/performance-monitor-wNFKmqMr.cjs +0 -2
  114. package/dist/performance-monitor-wNFKmqMr.cjs.map +0 -1
  115. package/dist/rolldown-runtime-BmowowmI.js +0 -14
  116. package/dist/rolldown-runtime-mLOUI7ql.cjs +0 -1
  117. package/dist/utils-D2gQ7c2R.js +0 -64
  118. package/dist/utils-D2gQ7c2R.js.map +0 -1
  119. package/dist/utils-DJaAwiZ9.cjs +0 -2
  120. package/dist/utils-DJaAwiZ9.cjs.map +0 -1
  121. package/dist/utils.js +0 -1
  122. package/dist/utils.mjs +0 -3
  123. package/src/adapters/videojs-adapter.tsx +0 -470
  124. package/src/assets/mona-loading.gif +0 -0
  125. package/src/components/AnimateLoading.tsx +0 -111
  126. package/src/components/LoadingState.tsx +0 -239
  127. package/src/components/__tests__/media-player-accessibility.test.tsx +0 -510
  128. package/src/components/__tests__/media-player-react19.test.tsx +0 -457
  129. package/src/components/accessibility/keyboard-help-overlay.tsx +0 -207
  130. package/src/components/audio-player.tsx +0 -85
  131. package/src/components/basic/index.ts +0 -37
  132. package/src/components/enhanced/advanced-features.tsx +0 -311
  133. package/src/components/enhanced/debug-panel.tsx +0 -448
  134. package/src/components/enhanced/enhanced-controls.tsx +0 -597
  135. package/src/components/enhanced/enhanced-media-player.tsx +0 -566
  136. package/src/components/enhanced/error-handling.tsx +0 -338
  137. package/src/components/enhanced/index.ts +0 -39
  138. package/src/components/enhanced/media-player-enhanced.tsx +0 -383
  139. package/src/components/examples/basic-video-player.tsx +0 -50
  140. package/src/components/examples/custom-controls-example.tsx +0 -63
  141. package/src/components/examples/enhanced-controls-example.tsx +0 -100
  142. package/src/components/examples/enhanced-media-player-example.tsx +0 -302
  143. package/src/components/examples/loading-states-demo.tsx +0 -141
  144. package/src/components/examples/react-19-demo.tsx +0 -349
  145. package/src/components/examples/volume-orientation-demo.tsx +0 -105
  146. package/src/components/icon-demo.tsx +0 -196
  147. package/src/components/legacy.tsx +0 -87
  148. package/src/components/media-metadata-display.tsx +0 -99
  149. package/src/components/media-player-audio.tsx +0 -39
  150. package/src/components/media-player-controls.tsx +0 -223
  151. package/src/components/media-player-error.tsx +0 -163
  152. package/src/components/media-player-fullscreen.tsx +0 -109
  153. package/src/components/media-player-hls.tsx +0 -111
  154. package/src/components/media-player-loading.tsx +0 -76
  155. package/src/components/media-player-play.tsx +0 -75
  156. package/src/components/media-player-root.tsx +0 -338
  157. package/src/components/media-player-seek.tsx +0 -168
  158. package/src/components/media-player-time.tsx +0 -99
  159. package/src/components/media-player-tooltip.tsx +0 -58
  160. package/src/components/media-player-video.tsx +0 -54
  161. package/src/components/media-player-volume.tsx +0 -155
  162. package/src/components/media-player.tsx +0 -292
  163. package/src/components/media-suspense.tsx +0 -344
  164. package/src/components/player-settings-form.tsx +0 -158
  165. package/src/components/react-player-wrapper.tsx +0 -651
  166. package/src/components/simple-video-player.tsx +0 -62
  167. package/src/components/ui/blur-poster.tsx +0 -96
  168. package/src/components/ui/empty-state.tsx +0 -91
  169. package/src/components/ui/enhanced-seek-bar.tsx +0 -254
  170. package/src/components/ui/error-state.tsx +0 -124
  171. package/src/components/ui/fullscreen-button.tsx +0 -81
  172. package/src/components/ui/loading-skeleton.tsx +0 -107
  173. package/src/components/ui/media-resource-preloader.tsx +0 -458
  174. package/src/components/ui/offline-message.tsx +0 -98
  175. package/src/components/ui/play-button.tsx +0 -99
  176. package/src/components/ui/seek-bar.tsx +0 -191
  177. package/src/components/ui/time-display.tsx +0 -61
  178. package/src/components/ui/volume-control.tsx +0 -190
  179. package/src/components/unified/base-media-player.tsx +0 -252
  180. package/src/components/unified/media-player.tsx +0 -75
  181. package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +0 -587
  182. package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +0 -573
  183. package/src/components/variants/minimal/MinimalControls.tsx +0 -124
  184. package/src/components/variants/minimal/MinimalLoading.tsx +0 -28
  185. package/src/components/variants/minimal/MinimalMediaPlayer.tsx +0 -318
  186. package/src/components/variants/minimal/MinimalOverlay.tsx +0 -58
  187. package/src/components/variants/minimal/MinimalPlayButton.tsx +0 -56
  188. package/src/components/variants/minimal/MinimalSeekBar.tsx +0 -140
  189. package/src/components/variants/minimal/MinimalVolumeControl.tsx +0 -75
  190. package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +0 -206
  191. package/src/components/variants/minimal/components/CenterPlayButton.tsx +0 -22
  192. package/src/components/variants/minimal/components/ControlBar.tsx +0 -142
  193. package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +0 -412
  194. package/src/components/variants/minimal/components/PlaybackControls.tsx +0 -46
  195. package/src/components/variants/minimal/components/RightControls.tsx +0 -164
  196. package/src/components/variants/minimal/components/SeekBar.tsx +0 -127
  197. package/src/components/variants/minimal/components/SettingsDropdown.tsx +0 -68
  198. package/src/components/variants/minimal/components/SubtitleDisplay.tsx +0 -21
  199. package/src/components/variants/minimal/components/TimeDisplay.tsx +0 -15
  200. package/src/components/variants/minimal/components/VideoElement.tsx +0 -35
  201. package/src/components/variants/minimal/components/VolumeControl.tsx +0 -220
  202. package/src/components/variants/minimal/index.ts +0 -23
  203. package/src/components/video-player.tsx +0 -100
  204. package/src/context/__tests__/media-store.test.ts +0 -509
  205. package/src/context/error-handling.ts +0 -398
  206. package/src/context/media-context.tsx +0 -254
  207. package/src/context/media-provider.tsx +0 -264
  208. package/src/context/media-store.ts +0 -387
  209. package/src/context/persistence.ts +0 -462
  210. package/src/core/events/event-system.ts +0 -448
  211. package/src/core/events/hooks.ts +0 -325
  212. package/src/core/events/index.ts +0 -22
  213. package/src/core/events/middleware.ts +0 -286
  214. package/src/core/index.ts +0 -22
  215. package/src/core/optimization/bundle-optimizer.tsx +0 -312
  216. package/src/core/performance/cicd.ts +0 -98
  217. package/src/core/performance/index.ts +0 -38
  218. package/src/core/performance/media-loading-optimizer.ts +0 -545
  219. package/src/core/performance/performance-budgets.ts +0 -437
  220. package/src/core/performance/performance-monitor.tsx +0 -488
  221. package/src/core/performance/performance-testing.ts +0 -461
  222. package/src/core/plugins/__tests__/registry.test.ts +0 -595
  223. package/src/core/plugins/base-plugin.ts +0 -225
  224. package/src/core/plugins/enhanced-plugin-system.ts +0 -435
  225. package/src/core/plugins/examples/analytics-plugin.ts +0 -241
  226. package/src/core/plugins/index.ts +0 -39
  227. package/src/core/plugins/registry.ts +0 -546
  228. package/src/core/plugins/types.ts +0 -169
  229. package/src/core/plugins/utils.ts +0 -317
  230. package/src/core/progressive-loading.tsx +0 -331
  231. package/src/core/providers/enhanced-hls-provider.ts +0 -307
  232. package/src/core/providers/lazy-provider.tsx +0 -14
  233. package/src/core/providers/service-provider.tsx +0 -164
  234. package/src/core/utils.tsx +0 -34
  235. package/src/features/media-session/media-session-manager.ts +0 -411
  236. package/src/features/picture-in-picture/pip-manager.ts +0 -428
  237. package/src/features/playlist/playlist-manager.ts +0 -626
  238. package/src/features/subtitles/subtitle-manager.ts +0 -435
  239. package/src/features/subtitles/subtitle-parser.ts +0 -284
  240. package/src/features/thumbnails/thumbnail-generator.ts +0 -528
  241. package/src/hooks/__tests__/currentTime-fix.test.ts +0 -149
  242. package/src/hooks/__tests__/use-media-player.test.ts +0 -712
  243. package/src/hooks/__tests__/use-media-state.test.tsx +0 -316
  244. package/src/hooks/accessibility/index.ts +0 -27
  245. package/src/hooks/accessibility/use-accessibility-preferences.ts +0 -190
  246. package/src/hooks/accessibility/use-focus-management.ts +0 -183
  247. package/src/hooks/accessibility/use-keyboard-shortcuts.ts +0 -152
  248. package/src/hooks/accessibility/use-screen-reader.ts +0 -212
  249. package/src/hooks/core/index.ts +0 -47
  250. package/src/hooks/legacy.ts +0 -21
  251. package/src/hooks/use-buffer-health.ts +0 -218
  252. package/src/hooks/use-enhanced-media-player.ts +0 -575
  253. package/src/hooks/use-focus-trap.tsx +0 -162
  254. package/src/hooks/use-intelligent-preloading.ts +0 -387
  255. package/src/hooks/use-keyboard-controls.ts +0 -115
  256. package/src/hooks/use-keyboard-shortcuts.ts +0 -255
  257. package/src/hooks/use-media-actions.ts +0 -184
  258. package/src/hooks/use-media-metadata.ts +0 -91
  259. package/src/hooks/use-media-optimistic.ts +0 -264
  260. package/src/hooks/use-media-player.ts +0 -343
  261. package/src/hooks/use-media-state.ts +0 -194
  262. package/src/hooks/use-memory-optimization.ts +0 -360
  263. package/src/hooks/use-network-status.ts +0 -124
  264. package/src/hooks/use-optimistic-controls.ts +0 -95
  265. package/src/hooks/use-optimized-media.ts +0 -283
  266. package/src/hooks/use-smart-preload.ts +0 -229
  267. package/src/hooks/use-touch-gestures.ts +0 -461
  268. package/src/hooks/useEnhancedSubtitles.ts +0 -258
  269. package/src/hooks/useKeyboardShortcuts.ts +0 -106
  270. package/src/hooks/useMediaControls.ts +0 -52
  271. package/src/hooks/useScreenshot.ts +0 -77
  272. package/src/hooks/useSubtitles.ts +0 -91
  273. package/src/hooks/useVideoPlayer.ts +0 -278
  274. package/src/icons/components/FullscreenIcon.tsx +0 -36
  275. package/src/icons/components/SettingsIcon.tsx +0 -37
  276. package/src/icons/components/animated/LoadingIcon.tsx +0 -27
  277. package/src/icons/components/animated/PlayPauseIcon.tsx +0 -42
  278. package/src/icons/components/media/PauseIcon.tsx +0 -38
  279. package/src/icons/components/media/PlayIcon.tsx +0 -37
  280. package/src/icons/components/volume/VolumeIcon.tsx +0 -38
  281. package/src/icons/components/volume/VolumeOffIcon.tsx +0 -38
  282. package/src/icons/index.ts +0 -56
  283. package/src/icons/provider.tsx +0 -58
  284. package/src/icons/types.ts +0 -60
  285. package/src/index-enhanced.ts +0 -35
  286. package/src/index-legacy.ts +0 -324
  287. package/src/index.css +0 -102
  288. package/src/lib/__tests__/async-utils.test.ts +0 -291
  289. package/src/lib/async-utils.ts +0 -194
  290. package/src/lib/deprecation.ts +0 -51
  291. package/src/lib/format-time.ts +0 -37
  292. package/src/lib/index.ts +0 -4
  293. package/src/lib/utils.ts +0 -6
  294. package/src/styles/globals.css +0 -462
  295. package/src/styles/minimal-player.css +0 -621
  296. package/src/styles/pixel-art.css +0 -41
  297. package/src/styles/videojs.css +0 -100
  298. package/src/types/assets.d.ts +0 -29
  299. package/src/types/events.ts +0 -47
  300. package/src/types/formats.ts +0 -79
  301. package/src/types/index.ts +0 -203
  302. 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()