@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.
- package/README.md +90 -71
- package/dist/components/icons/index.d.ts +36 -0
- package/dist/components/icons/index.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts +4 -0
- package/dist/components/icons/svg-icons/ArrowLeftIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/ArrowRightIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/AudioIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/AudioIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/BackwardIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/BackwardIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/CameraIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/CameraIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/CheckIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/CheckIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts +4 -0
- package/dist/components/icons/svg-icons/EnablePiPIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/ForwardIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/ForwardIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/FullscreenEnterIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/FullscreenExitIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/LoadingIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/LoadingIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/PauseIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/PauseIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/PlayIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/PlayIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/PlaybackSpeedIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/QualityIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/QualityIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SettingsIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SettingsIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SliderIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SliderIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SubtitleIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SubtitleIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/SubtitleOffIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/UnPiPIcon.d.ts +4 -0
- package/dist/components/icons/svg-icons/UnPiPIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeMutedIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeOneIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeThreeIcon.d.ts.map +1 -0
- package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts +5 -0
- package/dist/components/icons/svg-icons/VolumeTwoIcon.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-audio.d.ts +13 -0
- package/dist/components/variants/gradient/gradient-audio.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-controls.d.ts +4 -0
- package/dist/components/variants/gradient/gradient-controls.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-glyphs.d.ts +30 -0
- package/dist/components/variants/gradient/gradient-glyphs.d.ts.map +1 -0
- package/dist/components/variants/gradient/gradient-video.d.ts +16 -0
- package/dist/components/variants/gradient/gradient-video.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -41
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +750 -5640
- package/dist/index.mjs.map +1 -1
- package/dist/package.json +3 -0
- package/package.json +110 -114
- package/src/components/variants/gradient/gradient-audio.tsx +47 -0
- package/src/components/variants/gradient/gradient-controls.tsx +254 -0
- package/src/components/variants/gradient/gradient-glyphs.test.tsx +69 -0
- package/src/components/variants/gradient/gradient-glyphs.tsx +129 -0
- package/src/components/variants/gradient/gradient-skin.css +211 -0
- package/src/components/variants/gradient/gradient-video.tsx +70 -0
- package/src/index.ts +5 -198
- package/src/test/accessibility-utils.ts +0 -59
- package/dist/context/media.js +0 -1
- package/dist/context/media.mjs +0 -3
- package/dist/context/store.js +0 -1
- package/dist/context/store.mjs +0 -3
- package/dist/context-Bzd5QCKM.cjs +0 -7
- package/dist/context-Bzd5QCKM.cjs.map +0 -1
- package/dist/context-DD_SH4tT.js +0 -1053
- package/dist/context-DD_SH4tT.js.map +0 -1
- package/dist/core-events-BRnLMB7s.cjs +0 -2
- package/dist/core-events-BRnLMB7s.cjs.map +0 -1
- package/dist/core-events-v_mKdj5p.js +0 -417
- package/dist/core-events-v_mKdj5p.js.map +0 -1
- package/dist/core-plugins-CMBv-yVh.cjs +0 -2
- package/dist/core-plugins-CMBv-yVh.cjs.map +0 -1
- package/dist/core-plugins-CqCxLkbd.js +0 -754
- package/dist/core-plugins-CqCxLkbd.js.map +0 -1
- package/dist/core.js +0 -15
- package/dist/core.js.map +0 -1
- package/dist/core.mjs +0 -960
- package/dist/core.mjs.map +0 -1
- package/dist/enhanced-components-BwjBqSA1.js +0 -2858
- package/dist/enhanced-components-BwjBqSA1.js.map +0 -1
- package/dist/enhanced-components-C-ka-XLp.cjs +0 -2
- package/dist/enhanced-components-C-ka-XLp.cjs.map +0 -1
- package/dist/hooks-B-IIWPJr.js +0 -1842
- package/dist/hooks-B-IIWPJr.js.map +0 -1
- package/dist/hooks-DcHzmBwA.cjs +0 -4
- package/dist/hooks-DcHzmBwA.cjs.map +0 -1
- package/dist/minimal-components-BYsMQde5.js +0 -1610
- package/dist/minimal-components-BYsMQde5.js.map +0 -1
- package/dist/minimal-components-CsxQbDp7.cjs +0 -2
- package/dist/minimal-components-CsxQbDp7.cjs.map +0 -1
- package/dist/minimal-components.css +0 -1
- package/dist/mona-loading.gif +0 -0
- package/dist/performance-monitor-DCSijLJg.js +0 -312
- package/dist/performance-monitor-DCSijLJg.js.map +0 -1
- package/dist/performance-monitor-wNFKmqMr.cjs +0 -2
- package/dist/performance-monitor-wNFKmqMr.cjs.map +0 -1
- package/dist/rolldown-runtime-BmowowmI.js +0 -14
- package/dist/rolldown-runtime-mLOUI7ql.cjs +0 -1
- package/dist/utils-D2gQ7c2R.js +0 -64
- package/dist/utils-D2gQ7c2R.js.map +0 -1
- package/dist/utils-DJaAwiZ9.cjs +0 -2
- package/dist/utils-DJaAwiZ9.cjs.map +0 -1
- package/dist/utils.js +0 -1
- package/dist/utils.mjs +0 -3
- package/src/adapters/videojs-adapter.tsx +0 -470
- package/src/assets/mona-loading.gif +0 -0
- package/src/components/AnimateLoading.tsx +0 -111
- package/src/components/LoadingState.tsx +0 -239
- package/src/components/__tests__/media-player-accessibility.test.tsx +0 -510
- package/src/components/__tests__/media-player-react19.test.tsx +0 -457
- package/src/components/accessibility/keyboard-help-overlay.tsx +0 -207
- package/src/components/audio-player.tsx +0 -85
- package/src/components/basic/index.ts +0 -37
- package/src/components/enhanced/advanced-features.tsx +0 -311
- package/src/components/enhanced/debug-panel.tsx +0 -448
- package/src/components/enhanced/enhanced-controls.tsx +0 -597
- package/src/components/enhanced/enhanced-media-player.tsx +0 -566
- package/src/components/enhanced/error-handling.tsx +0 -338
- package/src/components/enhanced/index.ts +0 -39
- package/src/components/enhanced/media-player-enhanced.tsx +0 -383
- package/src/components/examples/basic-video-player.tsx +0 -50
- package/src/components/examples/custom-controls-example.tsx +0 -63
- package/src/components/examples/enhanced-controls-example.tsx +0 -100
- package/src/components/examples/enhanced-media-player-example.tsx +0 -302
- package/src/components/examples/loading-states-demo.tsx +0 -141
- package/src/components/examples/react-19-demo.tsx +0 -349
- package/src/components/examples/volume-orientation-demo.tsx +0 -105
- package/src/components/icon-demo.tsx +0 -196
- package/src/components/legacy.tsx +0 -87
- package/src/components/media-metadata-display.tsx +0 -99
- package/src/components/media-player-audio.tsx +0 -39
- package/src/components/media-player-controls.tsx +0 -223
- package/src/components/media-player-error.tsx +0 -163
- package/src/components/media-player-fullscreen.tsx +0 -109
- package/src/components/media-player-hls.tsx +0 -111
- package/src/components/media-player-loading.tsx +0 -76
- package/src/components/media-player-play.tsx +0 -75
- package/src/components/media-player-root.tsx +0 -338
- package/src/components/media-player-seek.tsx +0 -168
- package/src/components/media-player-time.tsx +0 -99
- package/src/components/media-player-tooltip.tsx +0 -58
- package/src/components/media-player-video.tsx +0 -54
- package/src/components/media-player-volume.tsx +0 -155
- package/src/components/media-player.tsx +0 -292
- package/src/components/media-suspense.tsx +0 -344
- package/src/components/player-settings-form.tsx +0 -158
- package/src/components/react-player-wrapper.tsx +0 -651
- package/src/components/simple-video-player.tsx +0 -62
- package/src/components/ui/blur-poster.tsx +0 -96
- package/src/components/ui/empty-state.tsx +0 -91
- package/src/components/ui/enhanced-seek-bar.tsx +0 -254
- package/src/components/ui/error-state.tsx +0 -124
- package/src/components/ui/fullscreen-button.tsx +0 -81
- package/src/components/ui/loading-skeleton.tsx +0 -107
- package/src/components/ui/media-resource-preloader.tsx +0 -458
- package/src/components/ui/offline-message.tsx +0 -98
- package/src/components/ui/play-button.tsx +0 -99
- package/src/components/ui/seek-bar.tsx +0 -191
- package/src/components/ui/time-display.tsx +0 -61
- package/src/components/ui/volume-control.tsx +0 -190
- package/src/components/unified/base-media-player.tsx +0 -252
- package/src/components/unified/media-player.tsx +0 -75
- package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +0 -587
- package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +0 -573
- package/src/components/variants/minimal/MinimalControls.tsx +0 -124
- package/src/components/variants/minimal/MinimalLoading.tsx +0 -28
- package/src/components/variants/minimal/MinimalMediaPlayer.tsx +0 -318
- package/src/components/variants/minimal/MinimalOverlay.tsx +0 -58
- package/src/components/variants/minimal/MinimalPlayButton.tsx +0 -56
- package/src/components/variants/minimal/MinimalSeekBar.tsx +0 -140
- package/src/components/variants/minimal/MinimalVolumeControl.tsx +0 -75
- package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +0 -206
- package/src/components/variants/minimal/components/CenterPlayButton.tsx +0 -22
- package/src/components/variants/minimal/components/ControlBar.tsx +0 -142
- package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +0 -412
- package/src/components/variants/minimal/components/PlaybackControls.tsx +0 -46
- package/src/components/variants/minimal/components/RightControls.tsx +0 -164
- package/src/components/variants/minimal/components/SeekBar.tsx +0 -127
- package/src/components/variants/minimal/components/SettingsDropdown.tsx +0 -68
- package/src/components/variants/minimal/components/SubtitleDisplay.tsx +0 -21
- package/src/components/variants/minimal/components/TimeDisplay.tsx +0 -15
- package/src/components/variants/minimal/components/VideoElement.tsx +0 -35
- package/src/components/variants/minimal/components/VolumeControl.tsx +0 -220
- package/src/components/variants/minimal/index.ts +0 -23
- package/src/components/video-player.tsx +0 -100
- package/src/context/__tests__/media-store.test.ts +0 -509
- package/src/context/error-handling.ts +0 -398
- package/src/context/media-context.tsx +0 -254
- package/src/context/media-provider.tsx +0 -264
- package/src/context/media-store.ts +0 -387
- package/src/context/persistence.ts +0 -462
- package/src/core/events/event-system.ts +0 -448
- package/src/core/events/hooks.ts +0 -325
- package/src/core/events/index.ts +0 -22
- package/src/core/events/middleware.ts +0 -286
- package/src/core/index.ts +0 -22
- package/src/core/optimization/bundle-optimizer.tsx +0 -312
- package/src/core/performance/cicd.ts +0 -98
- package/src/core/performance/index.ts +0 -38
- package/src/core/performance/media-loading-optimizer.ts +0 -545
- package/src/core/performance/performance-budgets.ts +0 -437
- package/src/core/performance/performance-monitor.tsx +0 -488
- package/src/core/performance/performance-testing.ts +0 -461
- package/src/core/plugins/__tests__/registry.test.ts +0 -595
- package/src/core/plugins/base-plugin.ts +0 -225
- package/src/core/plugins/enhanced-plugin-system.ts +0 -435
- package/src/core/plugins/examples/analytics-plugin.ts +0 -241
- package/src/core/plugins/index.ts +0 -39
- package/src/core/plugins/registry.ts +0 -546
- package/src/core/plugins/types.ts +0 -169
- package/src/core/plugins/utils.ts +0 -317
- package/src/core/progressive-loading.tsx +0 -331
- package/src/core/providers/enhanced-hls-provider.ts +0 -307
- package/src/core/providers/lazy-provider.tsx +0 -14
- package/src/core/providers/service-provider.tsx +0 -164
- package/src/core/utils.tsx +0 -34
- package/src/features/media-session/media-session-manager.ts +0 -411
- package/src/features/picture-in-picture/pip-manager.ts +0 -428
- package/src/features/playlist/playlist-manager.ts +0 -626
- package/src/features/subtitles/subtitle-manager.ts +0 -435
- package/src/features/subtitles/subtitle-parser.ts +0 -284
- package/src/features/thumbnails/thumbnail-generator.ts +0 -528
- package/src/hooks/__tests__/currentTime-fix.test.ts +0 -149
- package/src/hooks/__tests__/use-media-player.test.ts +0 -712
- package/src/hooks/__tests__/use-media-state.test.tsx +0 -316
- package/src/hooks/accessibility/index.ts +0 -27
- package/src/hooks/accessibility/use-accessibility-preferences.ts +0 -190
- package/src/hooks/accessibility/use-focus-management.ts +0 -183
- package/src/hooks/accessibility/use-keyboard-shortcuts.ts +0 -152
- package/src/hooks/accessibility/use-screen-reader.ts +0 -212
- package/src/hooks/core/index.ts +0 -47
- package/src/hooks/legacy.ts +0 -21
- package/src/hooks/use-buffer-health.ts +0 -218
- package/src/hooks/use-enhanced-media-player.ts +0 -575
- package/src/hooks/use-focus-trap.tsx +0 -162
- package/src/hooks/use-intelligent-preloading.ts +0 -387
- package/src/hooks/use-keyboard-controls.ts +0 -115
- package/src/hooks/use-keyboard-shortcuts.ts +0 -255
- package/src/hooks/use-media-actions.ts +0 -184
- package/src/hooks/use-media-metadata.ts +0 -91
- package/src/hooks/use-media-optimistic.ts +0 -264
- package/src/hooks/use-media-player.ts +0 -343
- package/src/hooks/use-media-state.ts +0 -194
- package/src/hooks/use-memory-optimization.ts +0 -360
- package/src/hooks/use-network-status.ts +0 -124
- package/src/hooks/use-optimistic-controls.ts +0 -95
- package/src/hooks/use-optimized-media.ts +0 -283
- package/src/hooks/use-smart-preload.ts +0 -229
- package/src/hooks/use-touch-gestures.ts +0 -461
- package/src/hooks/useEnhancedSubtitles.ts +0 -258
- package/src/hooks/useKeyboardShortcuts.ts +0 -106
- package/src/hooks/useMediaControls.ts +0 -52
- package/src/hooks/useScreenshot.ts +0 -77
- package/src/hooks/useSubtitles.ts +0 -91
- package/src/hooks/useVideoPlayer.ts +0 -278
- package/src/icons/components/FullscreenIcon.tsx +0 -36
- package/src/icons/components/SettingsIcon.tsx +0 -37
- package/src/icons/components/animated/LoadingIcon.tsx +0 -27
- package/src/icons/components/animated/PlayPauseIcon.tsx +0 -42
- package/src/icons/components/media/PauseIcon.tsx +0 -38
- package/src/icons/components/media/PlayIcon.tsx +0 -37
- package/src/icons/components/volume/VolumeIcon.tsx +0 -38
- package/src/icons/components/volume/VolumeOffIcon.tsx +0 -38
- package/src/icons/index.ts +0 -56
- package/src/icons/provider.tsx +0 -58
- package/src/icons/types.ts +0 -60
- package/src/index-enhanced.ts +0 -35
- package/src/index-legacy.ts +0 -324
- package/src/index.css +0 -102
- package/src/lib/__tests__/async-utils.test.ts +0 -291
- package/src/lib/async-utils.ts +0 -194
- package/src/lib/deprecation.ts +0 -51
- package/src/lib/format-time.ts +0 -37
- package/src/lib/index.ts +0 -4
- package/src/lib/utils.ts +0 -6
- package/src/styles/globals.css +0 -462
- package/src/styles/minimal-player.css +0 -621
- package/src/styles/pixel-art.css +0 -41
- package/src/styles/videojs.css +0 -100
- package/src/types/assets.d.ts +0 -29
- package/src/types/events.ts +0 -47
- package/src/types/formats.ts +0 -79
- package/src/types/index.ts +0 -203
- 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()
|