import { compileProject } from '@videojs/compiler'; import { describe, expect, it } from 'vitest'; import config from '../../../skins.compiler.config'; const compact = (value: string): string => value.replace(/\s+/g, ''); describe('skins compiler config', () => { it('lowers the default video source skin to a React Tailwind slice', async () => { const result = await compileProject(config); const output = result.files.find( (file) => file.type === 'chunk' && file.fileName.endsWith('default-video.generated.tailwind.tsx') ); expect(result.diagnostics).toEqual([]); expect(output).toBeDefined(); const code = output!.source; expect(code).not.toContain('@videojs/core/components'); expect(code).not.toContain('@videojs/icons/components'); expect(code).not.toContain('./tailwind/video.tailwind'); expect(code).toContain('from "@videojs/skins/default/tailwind/video.tailwind"'); expect(code).toContain('from "@videojs/utils/style"'); expect(code).toContain('from "@/player/context"'); expect(code).toContain('from "@/ui/airplay-button"'); expect(code).toContain('from "@/ui/buffering-indicator"'); expect(code).toContain('from "@/ui/error-dialog"'); expect(code).toContain('from "@/ui/overlay"'); expect(code).toContain('from "@/ui/pip-button"'); expect(code).toContain('from "@/ui/play-button"'); expect(code).toContain('from "@/ui/poster"'); expect(code).toContain('from "@/ui/seek-indicator"'); expect(code).toContain('from "@/ui/slider"'); expect(code).toContain('from "@/ui/status-indicator"'); expect(code).toContain('from "@/ui/volume-indicator"'); expect(code).not.toContain('from "@/ui/text"'); expect(code).toContain('from "@/utils/use-render"'); expect(code).toContain('from "@videojs/utils/predicate"'); expect(code).toContain('from "@/icons"'); expect(code).not.toContain('from "../skin-renderers"'); expect(code).toContain('from "../types"'); expect(code).toContain('import type { ReactNode } from "react"'); const compactCode = compact(code); expect(compactCode).toContain(compact('export interface DefaultVideoSkinProps extends BaseVideoSkinProps')); expect(compactCode).toContain(compact('const iconButton = [button.base, button.subtle, button.icon];')); expect(compactCode).toContain( compact("const TOP_STATUS_ACTIONS = ['toggleSubtitles', 'toggleFullscreen', 'togglePictureInPicture'] as const;") ); expect(compactCode).toContain(compact("const CENTER_STATUS_ACTIONS = ['togglePaused'] as const;")); expect(compactCode).toContain(compact('children?: ReactNode | undefined;')); expect(compactCode).toContain( compact('DefaultVideoSkin({ className, children, poster, ...rest }: DefaultVideoSkinProps)') ); expect(compactCode).toContain(compact('')); expect(compactCode).toContain( compact( '{poster && }' ) ); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('')); expect(compactCode).not.toContain('BufferingIndicatorRoot'); expect(compactCode).not.toContain('bufferingIndicator.container'); expect(compactCode).toContain(compact('')); expect(compactCode).toContain( compact('Something went wrong.') ); expect(compactCode).toContain(compact('')); expect(compactCode).toContain( compact('OK') ); expect(compactCode).not.toContain('ErrorDialog.Panel'); expect(compactCode).not.toContain('ErrorDialog.Content'); expect(compactCode).not.toContain('ErrorDialog.Actions'); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('')); expect(compactCode).not.toContain(compact('
')); expect(compactCode).not.toContain('inputFeedback.root'); expect(compactCode).toContain( compact( '' ) ); expect(compactCode).toContain(compact('')); expect(compactCode).toContain( compact('') ); expect(compactCode).toContain( compact( '' ) ); expect(compactCode).toContain( compact( '' ) ); expect(compactCode).toContain( compact( '' ) ); expect(compactCode).toContain(compact('')); expect(compactCode).toContain( compact('') ); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('{SEEK_TIME}')); expect(compactCode).toContain( compact('') ); expect(compactCode).toContain(compact('{SEEK_TIME}')); expect(compactCode).not.toContain('iconContainer'); expect(compactCode).not.toContain('}')); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('')); expect(compactCode).toContain( compact('') ); expect(compactCode).toContain( compact('') ); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('')); expect(compactCode).toContain(compact('')); expect(compactCode).not.toContain('SliderTrack'); expect(compactCode).not.toContain('className={['); }); });