Skip to content

refactor(packages)!: playback adapters packages - #2567

Merged
mihar-22 merged 1 commit into
mainfrom
t3code/split-adapter-cdn-packages
Sep 3, 2026
Merged

refactor(packages)!: playback adapters packages#2567
mihar-22 merged 1 commit into
mainfrom
t3code/split-adapter-cdn-packages

Conversation

@mihar-22

@mihar-22 mihar-22 commented Aug 31, 2026

Copy link
Copy Markdown
Member

What this does

Splits every playback engine and extension out of @videojs/media into a package named for the media it plays. @videojs/media keeps only shared code.

Packages

Adapters Extensions Stays built in
@videojs/hlsjs-video @videojs/mux-data @videojs/spf (HlsVideo, HlsAudio, background)
@videojs/mux-video, @videojs/mux-audio @videojs/google-cast @videojs/native-hls-video
@videojs/dash-video, @videojs/shaka-video
@videojs/vimeo-video, @videojs/wistia-video, @videojs/youtube-video
@videojs/cloudflare-video, @videojs/twitch-video, @videojs/tiktok-video, @videojs/spotify-audio

Rules

  • Adapter and extension packages export the class, its props, and defaults. Nothing else.
  • Each pins its engine (hls.js, dashjs, shaka-player, @vimeo/player, @wistia/wistia-player, mux-embed) as an exact dependency.
  • @videojs/html and @videojs/react keep every façade entry point and list the packages as optional peers at exact versions. Users install the framework package plus the media they play.
  • @videojs/spf and @videojs/native-hls-video are regular dependencies of the framework packages, so HLS and native HLS need no extra install.
  • @videojs/media has two entry points: @videojs/media and @videojs/media/dom. The dom/* subpaths are gone.
  • Mux identity helpers live in a private @videojs/mux workspace package, bundled into @videojs/mux-video, @videojs/mux-data, and @videojs/spf (code and declarations). Whether to publish it is a later call.

For users

pnpm add @videojs/react @videojs/mux-video
import { MuxVideo } from '@videojs/react/media/mux-video'; // unchanged

Also in this PR

  • Site install generator, CLI docs output, package READMEs, and reference-page Import sections name the package to install.
  • The Mux SPF adapters live with their packages: @videojs/mux-video/spf (SPF-backed MuxVideoMedia plus the shared MuxMediaMixin) and @videojs/mux-audio/spf (MuxAudioMedia). Both depend on @videojs/spf; spf no longer depends on @videojs/mux or, through it, hls.js. The unused @videojs/spf/mux-background-video alias entry is gone (html and react alias <mux-background-video> themselves).
  • @videojs/mux-audio exports MuxAudioMedia, a class extending @videojs/mux-video's Media, so audio players install by the media they play. Audio extending video is upside down; a TODO(mux) marks the shared base to extract.

Stack

#2598 (cdn) → #2600 (Extension naming) → #2601 (MediaExtension) → #2602 (Adapter naming) → #2603 (createMediaElement) → #2604 (createMediaComponent)

Validation

pnpm build:packages, pnpm typecheck, pnpm lint, pnpm check:workspace, pnpm test, site and CLI tests.

🤖 Generated with Claude Code


Note

High Risk
Removes public @videojs/media/dom/* entry points and changes the install/peer-dependency model for every playback integration—apps must add adapter packages or builds will fail at import time.

Overview
Breaking change: playback engines and extensions that lived under @videojs/media/dom/* are now standalone npm packages (@videojs/hlsjs-video, @videojs/mux-video, @videojs/dash-video, embed adapters, @videojs/mux-data, @videojs/google-cast, etc.). @videojs/media is narrowed to engine-neutral contracts, hosts, and @videojs/media/dom only—those dom/* subpath exports are removed along with bundled third-party runtimes.

@videojs/html and @videojs/react still expose the same façade import paths but depend on the matching adapter as an optional peer; install docs, CLI generateReactInstallCode, and tests now tell users to add e.g. @videojs/hlsjs-video or @videojs/mux-audio beside the framework package. @videojs/native-hls-video stays a direct framework dependency so native HLS does not require a separate install.

Mux is reorganized: private @videojs/mux holds shared URL/source helpers (bundled into public Mux packages), SPF-backed Mux Medias move to @videojs/mux-video/spf and @videojs/mux-audio/spf (removed from @videojs/spf exports), and @videojs/mux-audio introduces MuxAudioMedia extending the video adapter. Release-please, CI matrices, pkg-pr-new, commitlint, sandbox, and registry e2e setup are updated to build and test the new packages; e2e overlays explicitly pull in @videojs/hlsjs-video where registry tests need it.

Reviewed by Cursor Bugbot for commit 92b5dc0. Bugbot is set up for automated code reviews on this repo. Configure here.

@netlify

netlify Bot commented Aug 31, 2026

Copy link
Copy Markdown

Deploy Preview for vjs10-site ready!

Name Link
🔨 Latest commit 92b5dc0
🔍 Latest deploy log https://app.netlify.com/projects/vjs10-site/deploys/6a99db75937d2b00083a3d49
😎 Deploy Preview https://deploy-preview-2567--vjs10-site.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@vercel

vercel Bot commented Aug 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
v10-sandbox Ready Ready Preview Sep 3, 2026 8:43pm UTC

Request Review

@pkg-pr-new

pkg-pr-new Bot commented Aug 31, 2026

Copy link
Copy Markdown
@videojs/cloudflare-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/cloudflare-video@2567

@videojs/core

pnpm add https://pkg.pr.new/videojs/v10/@videojs/core@2567

@videojs/dash-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/dash-video@2567

@videojs/element

pnpm add https://pkg.pr.new/videojs/v10/@videojs/element@2567

@videojs/google-cast

pnpm add https://pkg.pr.new/videojs/v10/@videojs/google-cast@2567

@videojs/hlsjs-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/hlsjs-video@2567

@videojs/html

pnpm add https://pkg.pr.new/videojs/v10/@videojs/html@2567

@videojs/media

pnpm add https://pkg.pr.new/videojs/v10/@videojs/media@2567

@videojs/mux-audio

pnpm add https://pkg.pr.new/videojs/v10/@videojs/mux-audio@2567

@videojs/mux-data

pnpm add https://pkg.pr.new/videojs/v10/@videojs/mux-data@2567

@videojs/mux-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/mux-video@2567

@videojs/native-hls-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/native-hls-video@2567

@videojs/react

pnpm add https://pkg.pr.new/videojs/v10/@videojs/react@2567

@videojs/shaka-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/shaka-video@2567

@videojs/spf

pnpm add https://pkg.pr.new/videojs/v10/@videojs/spf@2567

@videojs/spotify-audio

pnpm add https://pkg.pr.new/videojs/v10/@videojs/spotify-audio@2567

@videojs/store

pnpm add https://pkg.pr.new/videojs/v10/@videojs/store@2567

@videojs/tiktok-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/tiktok-video@2567

@videojs/twitch-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/twitch-video@2567

@videojs/utils

pnpm add https://pkg.pr.new/videojs/v10/@videojs/utils@2567

@videojs/vimeo-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/vimeo-video@2567

@videojs/wistia-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/wistia-video@2567

@videojs/youtube-video

pnpm add https://pkg.pr.new/videojs/v10/@videojs/youtube-video@2567

commit: 11ff2a2

@github-actions

github-actions Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

📦 Bundle Size Report

🎨 @videojs/html

Path Base initial PR initial Initial diff Lazy diff
/extensions/google-cast 6.52 kB 2.89 kB -3.63 kB (-55.7%)
/extensions/mux-data 26.94 kB 3.02 kB -23.92 kB (-88.8%)
/media/mux-video 142.40 kB 3.02 kB -139.39 kB (-97.9%)
/media/mux-audio 142.23 kB 2.69 kB -139.55 kB (-98.1%)
/media/cloudflare-video 6.28 kB 2.89 kB -3.38 kB (-53.9%)
/media/dash-video 211.61 kB 2.62 kB -209.00 kB (-98.8%)
/media/hlsjs-video 141.22 kB 2.62 kB -138.60 kB (-98.1%)
/media/shaka-video 199.18 kB 2.62 kB -196.56 kB (-98.7%)
/media/spotify-audio 6.27 kB 3.01 kB -3.26 kB (-51.9%)
/media/tiktok-video 6.33 kB 3.12 kB -3.21 kB (-50.7%)
/media/twitch-video 6.22 kB 2.93 kB -3.29 kB (-52.9%)
/media/vimeo-video 13.05 kB 2.90 kB -10.15 kB (-77.8%)
/media/wistia-video 60.23 kB 604 B -59.64 kB (-99.0%)
/media/youtube-video 6.81 kB 2.90 kB -3.91 kB (-57.4%)
/video (default + hls) 201.75 kB 64.47 kB -137.27 kB (-68.0%) 0 B
/video (minimal + hls) 202.25 kB 64.81 kB -137.43 kB (-68.0%) 0 B
Small changes (11, ≤ 300 B)
Path Base initial PR initial Initial diff Lazy diff
/live-video/player 9.06 kB 9.06 kB -1 B (-0.0%) 0 B
/ui/pip-button 11.22 kB 11.22 kB +6 B (+0.1%) 0 B
/ui/time 10.80 kB 10.79 kB -7 B (-0.1%) 0 B
/ui/time-slider 13.02 kB 12.99 kB -25 B (-0.2%) 0 B
/ui/time-slider-chapter-title 8.79 kB 8.79 kB +2 B (+0.0%) 0 B
/ui/time-slider-chapters 9.64 kB 9.63 kB -11 B (-0.1%) 0 B
/ui/title 8.17 kB 8.17 kB -2 B (-0.0%) 0 B
/media/hls-audio 22.09 kB 22.05 kB -36 B (-0.2%)
/media/hls-video 28.04 kB 27.98 kB -59 B (-0.2%)
/media/native-hls-video 7.57 kB 7.59 kB +13 B (+0.2%)
/audio (default) 47.02 kB 47.02 kB -5 B (-0.0%) 0 B
Presets (7)
Entry Initial Lazy
/video (default) 62.68 kB 56.87 kB
/video (default + hls) 64.47 kB 56.87 kB
/video (minimal) 63.04 kB 56.87 kB
/video (minimal + hls) 64.81 kB 56.87 kB
/audio (default) 47.02 kB 56.87 kB
/audio (minimal) 47.23 kB 56.87 kB
/background 11.57 kB 56.87 kB
Media (18)
Entry Initial
/media/mux-video 3.02 kB
/media/mux-audio 2.69 kB
/media/background-video 1.16 kB
/media/cloudflare-video 2.89 kB
/media/dash-video 2.62 kB
/media/hls-audio 22.05 kB
/media/hls-background-video 16.80 kB
/media/hls-video 27.98 kB
/media/hlsjs-video 2.62 kB
/media/mux-background-video 16.83 kB
/media/native-hls-video 7.59 kB
/media/shaka-video 2.62 kB
/media/spotify-audio 3.01 kB
/media/tiktok-video 3.12 kB
/media/twitch-video 2.93 kB
/media/vimeo-video 2.90 kB
/media/wistia-video 604 B
/media/youtube-video 2.90 kB
Extensions (2)
Entry Initial
/extensions/google-cast 2.89 kB
/extensions/mux-data 3.02 kB
Players (5)
Entry Initial Lazy
/video/player 9.70 kB 56.87 kB
/audio/player 6.14 kB 56.87 kB
/background/player 4.46 kB 56.87 kB
/live-video/player 9.06 kB 56.87 kB
/live-audio/player 6.15 kB 56.87 kB
Skins (29)
Entry Type Initial Lazy
/video/minimal-skin.css css 7.65 kB
/video/skin.css css 7.46 kB
/video/minimal-skin js 61.46 kB 56.87 kB
/video/minimal-skin2 js 8.09 kB
/video/skin js 61.34 kB 56.87 kB
/video/skin2 js 7.95 kB
/audio/minimal-skin.css css 5.53 kB
/audio/skin.css css 5.34 kB
/audio/minimal-skin js 45.76 kB 56.87 kB
/audio/minimal-skin2 js 5.83 kB
/audio/skin js 45.52 kB 56.87 kB
/audio/skin2 js 5.65 kB
/background/skin.css css 139 B
/background/skin js 9.81 kB 56.87 kB
/background/skin2 js 187 B
/live-video/minimal-skin.css css 6.21 kB
/live-video/skin.css css 6.18 kB
/live-video/minimal-skin js 49.42 kB 56.87 kB
/live-video/minimal-skin2 js 6.55 kB
/live-video/skin js 49.42 kB 56.87 kB
/live-video/skin2 js 6.58 kB
/live-audio/minimal-skin.css css 4.39 kB
/live-audio/skin.css css 4.37 kB
/live-audio/minimal-skin js 35.39 kB 56.87 kB
/live-audio/minimal-skin2 js 4.64 kB
/live-audio/skin js 35.40 kB 56.87 kB
/live-audio/skin2 js 4.63 kB
/global.css css 190 B
/shared.css css 118 B
UI Components (62)
Entry Initial Lazy
/ui/airplay-button 11.26 kB 56.87 kB
/ui/alert-dialog 8.79 kB 56.87 kB
/ui/audio-track-radio-group 11.38 kB 56.87 kB
/ui/buffering-indicator 8.61 kB 56.87 kB
/ui/captions-button 11.51 kB 56.87 kB
/ui/captions-radio-group 11.46 kB 56.87 kB
/ui/cast-button 11.25 kB 56.87 kB
/ui/container 9.47 kB 56.87 kB
/ui/controls 8.77 kB 56.87 kB
/ui/controls-backdrop 1.69 kB 56.87 kB
/ui/controls-content 1.67 kB 56.87 kB
/ui/dialog 8.73 kB 56.87 kB
/ui/dialog-backdrop 1.70 kB 56.87 kB
/ui/dialog-close 2.06 kB 56.87 kB
/ui/dialog-description 1.69 kB 56.87 kB
/ui/dialog-popup 1.90 kB 56.87 kB
/ui/dialog-title 1.70 kB 56.87 kB
/ui/error-dialog 12.38 kB 56.87 kB
/ui/fullscreen-button 11.27 kB 56.87 kB
/ui/gesture 9.56 kB 56.87 kB
/ui/hotkey 9.97 kB 56.87 kB
/ui/live-button 9.74 kB 56.87 kB
/ui/menu 18.45 kB 56.87 kB
/ui/menu-checkbox-item 1.97 kB 56.87 kB
/ui/menu-content 7.52 kB 56.87 kB
/ui/menu-group 2.09 kB 56.87 kB
/ui/menu-group-label 1.64 kB
/ui/menu-item 2.29 kB 56.87 kB
/ui/menu-item-indicator 1.37 kB 56.87 kB
/ui/menu-radio-group 3.01 kB 56.87 kB
/ui/menu-radio-item 2.13 kB 56.87 kB
/ui/menu-separator 1.30 kB 56.87 kB
/ui/mute-button 11.28 kB 56.87 kB
/ui/pip-button 11.22 kB 56.87 kB
/ui/play-button 11.23 kB 56.87 kB
/ui/playback-rate-button 11.32 kB 56.87 kB
/ui/playback-rate-radio-group 11.37 kB 56.87 kB
/ui/popover 8.57 kB 56.87 kB
/ui/poster 8.67 kB 56.87 kB
/ui/quality-radio-group 11.97 kB 56.87 kB
/ui/seek-button 11.27 kB 56.87 kB
/ui/seek-indicator 12.69 kB 56.87 kB
/ui/seek-indicator-value 1.10 kB
/ui/slider 11.65 kB 56.87 kB
/ui/slider-preview 2.01 kB 56.87 kB
/ui/status-announcer 10.59 kB 56.87 kB
/ui/status-indicator 13.02 kB 56.87 kB
/ui/status-indicator-value 1.10 kB
/ui/thumbnail 9.84 kB 56.87 kB
/ui/time 10.79 kB 56.87 kB
/ui/time-slider 12.99 kB 56.87 kB
/ui/time-slider-chapter-title 8.79 kB 56.87 kB
/ui/time-slider-chapters 9.63 kB 56.87 kB
/ui/title 8.17 kB 56.87 kB
/ui/tooltip 9.95 kB 56.87 kB
/ui/tooltip-label 1.21 kB
/ui/tooltip-shortcut 1.18 kB
/ui/volume-indicator 13.01 kB 56.87 kB
/ui/volume-indicator-fill 1.11 kB
/ui/volume-indicator-value 1.10 kB
/ui/volume-popover 14.74 kB 56.87 kB
/ui/volume-slider 12.31 kB 56.87 kB

⚛️ @videojs/react

Path Base initial PR initial Initial diff Lazy diff
/extensions/google-cast 5.34 kB 1.60 kB -3.74 kB (-70.0%)
/extensions/mux-data 25.70 kB 1.63 kB -24.07 kB (-93.6%)
/media/mux-video/hls-js 140.61 kB 986 B -139.64 kB (-99.3%)
/media/mux-video/spf 27.39 kB 23.03 kB -4.37 kB (-15.9%)
/media/mux-audio/hls-js 140.55 kB 733 B -139.83 kB (-99.5%)
/media/mux-audio/spf 21.32 kB 19.49 kB -1.82 kB (-8.6%)
/media/cloudflare-video 4.34 kB 914 B -3.45 kB (-79.5%)
/media/dash-video 210.29 kB 710 B -209.60 kB (-99.7%)
/media/hlsjs-video 139.44 kB 711 B -138.75 kB (-99.5%)
/media/mux-audio 140.56 kB 726 B -139.85 kB (-99.5%)
/media/mux-video 140.54 kB 980 B -139.58 kB (-99.3%)
/media/shaka-video 197.52 kB 711 B -196.83 kB (-99.6%)
/media/spotify-audio 4.22 kB 902 B -3.34 kB (-79.1%)
/media/tiktok-video 4.18 kB 908 B -3.30 kB (-78.8%)
/media/twitch-video 4.30 kB 929 B -3.39 kB (-78.9%)
/media/vimeo-video 11.19 kB 887 B -10.32 kB (-92.3%)
/media/wistia-video 60.05 kB 619 B -59.44 kB (-99.0%)
/media/youtube-video 4.86 kB 891 B -3.99 kB (-82.1%)
/video (default + hls) 188.44 kB 50.85 kB -137.59 kB (-73.0%) 0 B
/video (minimal + hls) 188.48 kB 50.94 kB -137.54 kB (-73.0%) 0 B
Small changes (8, ≤ 300 B)
Path Base initial PR initial Initial diff Lazy diff
/media/hls-audio 20.33 kB 20.32 kB -14 B (-0.1%)
/media/hls-video 26.34 kB 26.33 kB -12 B (-0.0%)
/media/native-hls-video 5.76 kB 5.76 kB +2 B (+0.0%)
/live-video/player 6.96 kB 6.95 kB -6 B (-0.1%) 0 B
/ui/audio-track 7.93 kB 7.94 kB +12 B (+0.1%) 0 B
/ui/buffering-indicator 7.80 kB 7.80 kB +1 B (+0.0%) 0 B
/ui/seek-indicator 11.97 kB 11.98 kB +11 B (+0.1%) 0 B
/ui/status-indicator 12.29 kB 12.29 kB -3 B (-0.0%) 0 B
Presets (7)
Entry Initial Lazy
/video (default) 50.60 kB 56.87 kB
/video (default + hls) 50.85 kB 56.87 kB
/video (minimal) 50.74 kB 56.87 kB
/video (minimal + hls) 50.94 kB 56.87 kB
/audio (default) 39.53 kB 56.87 kB
/audio (minimal) 39.57 kB 56.87 kB
/background 581 B 56.87 kB
Media (22)
Entry Initial
/media/mux-video/hls-js 986 B
/media/mux-video/spf 23.03 kB
/media/mux-audio/hls-js 733 B
/media/mux-audio/spf 19.49 kB
/media/background-video 402 B
/media/cloudflare-video 914 B
/media/dash-video 710 B
/media/hls-audio 20.32 kB
/media/hls-background-video 16.46 kB
/media/hls-video 26.33 kB
/media/hlsjs-video 711 B
/media/mux-audio 726 B
/media/mux-background-video 16.45 kB
/media/mux-video 980 B
/media/native-hls-video 5.76 kB
/media/shaka-video 711 B
/media/spotify-audio 902 B
/media/tiktok-video 908 B
/media/twitch-video 929 B
/media/vimeo-video 887 B
/media/wistia-video 619 B
/media/youtube-video 891 B
Extensions (2)
Entry Initial
/extensions/google-cast 1.60 kB
/extensions/mux-data 1.63 kB
Players (5)
Entry Initial Lazy
/video/player 7.56 kB 56.87 kB
/audio/player 4.00 kB 56.87 kB
/background/player 2.27 kB 56.87 kB
/live-video/player 6.95 kB 56.87 kB
/live-audio/player 3.99 kB 56.87 kB
Skins (18)
Entry Type Initial Lazy
/video/minimal-skin.css css 7.52 kB
/video/skin.css css 7.34 kB
/video/minimal-skin js 50.59 kB 56.87 kB
/video/skin js 50.49 kB 56.87 kB
/audio/minimal-skin.css css 5.37 kB
/audio/skin.css css 5.18 kB
/audio/minimal-skin js 39.47 kB 56.87 kB
/audio/skin js 39.41 kB 56.87 kB
/background/skin.css css 90 B
/background/skin js 277 B
/live-video/minimal-skin.css css 6.07 kB
/live-video/skin.css css 6.05 kB
/live-video/minimal-skin js 42.56 kB 56.87 kB
/live-video/skin js 42.52 kB 56.87 kB
/live-audio/minimal-skin.css css 4.24 kB
/live-audio/skin.css css 4.21 kB
/live-audio/minimal-skin js 30.37 kB 56.87 kB
/live-audio/skin js 30.35 kB 56.87 kB
UI Components (39)
Entry Initial Lazy
/ui/airplay-button 10.45 kB 56.87 kB
/ui/alert-dialog 4.73 kB 56.87 kB
/ui/audio-track 7.94 kB 56.87 kB
/ui/audio-track-radio-group 9.48 kB 56.87 kB
/ui/buffering-indicator 7.80 kB 56.87 kB
/ui/captions-button 10.44 kB 56.87 kB
/ui/captions-radio-group 9.59 kB 56.87 kB
/ui/cast-button 10.44 kB 56.87 kB
/ui/controls 7.71 kB 56.87 kB
/ui/dialog 4.75 kB 56.87 kB
/ui/error-dialog 11.80 kB 56.87 kB
/ui/fullscreen-button 10.40 kB 56.87 kB
/ui/gesture 7.99 kB 56.87 kB
/ui/hotkey 8.38 kB 56.87 kB
/ui/live-button 8.80 kB 56.87 kB
/ui/menu 19.45 kB 56.87 kB
/ui/mute-button 10.44 kB 56.87 kB
/ui/pip-button 10.39 kB 56.87 kB
/ui/play-button 10.37 kB 56.87 kB
/ui/playback-rate 7.99 kB 56.87 kB
/ui/playback-rate-button 10.37 kB 56.87 kB
/ui/playback-rate-radio-group 9.53 kB 56.87 kB
/ui/popover 8.16 kB 56.87 kB
/ui/poster 7.57 kB 56.87 kB
/ui/quality 8.42 kB 56.87 kB
/ui/quality-radio-group 9.95 kB 56.87 kB
/ui/seek-button 10.41 kB 56.87 kB
/ui/seek-indicator 11.98 kB 56.87 kB
/ui/slider 12.76 kB 56.87 kB
/ui/status-announcer 10.10 kB 56.87 kB
/ui/status-indicator 12.29 kB 56.87 kB
/ui/thumbnail 8.73 kB 56.87 kB
/ui/time 9.77 kB 56.87 kB
/ui/time-slider 14.17 kB 56.87 kB
/ui/title 7.28 kB 56.87 kB
/ui/tooltip 8.93 kB 56.87 kB
/ui/volume-indicator 12.33 kB 56.87 kB
/ui/volume-popover 14.20 kB 56.87 kB
/ui/volume-slider 12.14 kB 56.87 kB
🧩 @videojs/core — no changes
Entries (76)
Entry Initial Lazy
. 13.15 kB
/dom 22.53 kB 56.87 kB
/vjsc 1.82 kB
/i18n 3.23 kB 56.87 kB
/i18n/locales/all 34.97 kB
/i18n/locales/ar 1.22 kB
/i18n/locales/az 1.09 kB
/i18n/locales/bg 1.29 kB
/i18n/locales/bn 1.23 kB
/i18n/locales/bs 1.00 kB
/i18n/locales/ca 1.07 kB
/i18n/locales/cs 1.07 kB
/i18n/locales/cy 1.02 kB
/i18n/locales/da 1006 B
/i18n/locales/de 1.09 kB
/i18n/locales/el 1.49 kB
/i18n/locales/en 785 B
/i18n/locales/es 1018 B
/i18n/locales/et 1.05 kB
/i18n/locales/eu 1.03 kB
/i18n/locales/fa 1.22 kB
/i18n/locales/fi 1.04 kB
/i18n/locales/fr 1.07 kB
/i18n/locales/gd 1.10 kB
/i18n/locales/gl 1022 B
/i18n/locales/he 1.14 kB
/i18n/locales/hi 1.30 kB
/i18n/locales/hr 1.02 kB
/i18n/locales/hu 1.10 kB
/i18n/locales/id 919 B
/i18n/locales/it 1.01 kB
/i18n/locales/ja 1.18 kB
/i18n/locales/ko 1.14 kB
/i18n/locales/lt 1.02 kB
/i18n/locales/lv 1.09 kB
/i18n/locales/mr 1.30 kB
/i18n/locales/nb 987 B
/i18n/locales/ne 1.29 kB
/i18n/locales/nl 1.00 kB
/i18n/locales/nn 987 B
/i18n/locales/oc 1.08 kB
/i18n/locales/pl 1.14 kB
/i18n/locales/pt 1.03 kB
/i18n/locales/pt-BR 1.03 kB
/i18n/locales/pt-PT 1.01 kB
/i18n/locales/ro 1.07 kB
/i18n/locales/ru 1.40 kB
/i18n/locales/sk 1.10 kB
/i18n/locales/sl 1.04 kB
/i18n/locales/sr 1.07 kB
/i18n/locales/sv 1.01 kB
/i18n/locales/te 1.32 kB
/i18n/locales/th 1.29 kB
/i18n/locales/tr 1.08 kB
/i18n/locales/uk 1.41 kB
/i18n/locales/vi 1.11 kB
/i18n/locales/zh 1.02 kB
/i18n/locales/zh-CN 1.02 kB
/i18n/locales/zh-TW 1.02 kB
/i18n/text/airplay 101 B
/i18n/text/buttons 137 B
/i18n/text/captions 93 B
/i18n/text/cast 114 B
/i18n/text/common 90 B
/i18n/text/container 75 B
/i18n/text/errors 285 B
/i18n/text/fullscreen 98 B
/i18n/text/live 126 B
/i18n/text/menu 249 B
/i18n/text/pip 101 B
/i18n/text/playback 80 B
/i18n/text/seek 105 B
/i18n/text/slider 65 B
/i18n/text/status 222 B
/i18n/text/time 280 B
/i18n/text/volume 133 B
🏷️ @videojs/element — no changes
Entries (2)
Entry Initial
. 1.05 kB
/context 943 B
📦 @videojs/store — no changes
Entries (3)
Entry Initial
. 1.72 kB
/html 703 B
/react 365 B
🔧 @videojs/utils — no changes
Entries (13)
Entry Initial
/array 271 B
/dom 5.02 kB
/events 320 B
/function 386 B
/i18n 249 B
/jwt 176 B
/object 535 B
/predicate 297 B
/percent 281 B
/string 239 B
/style 212 B
/time 976 B
/number 199 B

📦 @videojs/cloudflare-video

Path Base initial PR initial Initial diff Lazy diff
. 3.70 kB new

📦 @videojs/dash-video

Path Base initial PR initial Initial diff Lazy diff
. 3.29 kB new

📦 @videojs/google-cast

Path Base initial PR initial Initial diff Lazy diff
. 4.06 kB new

📦 @videojs/hlsjs-video

Path Base initial PR initial Initial diff Lazy diff
. 134.71 kB new

📦 @videojs/media

Path Base initial PR initial Initial diff Lazy diff
/dom 121 B 4.11 kB +3.99 kB (+3376.9%)
/dom/dash 3.28 kB removed
/dom/wistia 1.89 kB removed
/dom/audio-host 1.10 kB removed
/dom/cloudflare 3.69 kB removed
/dom/custom-media-element 2.13 kB removed
/dom/dash 209.83 kB removed
/dom/google-cast 4.06 kB removed
/dom/hls-js 139.16 kB removed
/dom/media-host 1.20 kB removed
/dom/media-played-ranges 576 B removed
/dom/mux 162.88 kB removed
/dom/native-hls 5.25 kB removed
/dom/shaka 197.02 kB removed
/dom/spotify 3.58 kB removed
/dom/tiktok 3.57 kB removed
/dom/twitch 3.62 kB removed
/dom/video-host 1.39 kB removed
/dom/vimeo 10.62 kB removed
/dom/wistia 60.09 kB removed
/dom/youtube 4.25 kB removed
Small changes (1, ≤ 300 B)
Path Base initial PR initial Initial diff Lazy diff
. 1.07 kB 1.12 kB +48 B (+4.4%)
Entries (3)
Entry Initial
. 1.12 kB
/dom 4.11 kB
/media-tracks 2.05 kB

📦 @videojs/mux

Path Base initial PR initial Initial diff Lazy diff
. 804 B new

📦 @videojs/mux-audio

Path Base initial PR initial Initial diff Lazy diff
. 135.55 kB new
/spf 20.84 kB new
Entries (2)
Entry Initial
. 135.55 kB
/spf 20.84 kB

📦 @videojs/mux-data

Path Base initial PR initial Initial diff Lazy diff
. 24.26 kB new

📦 @videojs/mux-video

Path Base initial PR initial Initial diff Lazy diff
. 135.59 kB new
/spf 26.70 kB new
Entries (2)
Entry Initial
. 135.59 kB
/spf 26.70 kB

📦 @videojs/native-hls-video

Path Base initial PR initial Initial diff Lazy diff
. 5.25 kB new

📦 @videojs/shaka-video

Path Base initial PR initial Initial diff Lazy diff
. 196.80 kB new

📦 @videojs/spf

Path Base initial PR initial Initial diff Lazy diff
/mux-audio 20.76 kB removed
/mux-background-video 15.89 kB removed
/mux-video 26.67 kB removed
Small changes (2, ≤ 300 B)
Path Base initial PR initial Initial diff Lazy diff
/hls-audio 19.82 kB 19.83 kB +13 B (+0.1%)
/hls-video 25.85 kB 25.89 kB +39 B (+0.1%)
Entries (7)
Entry Initial
. 4.55 kB
/dom 6.60 kB
/hls 22.06 kB
/media-tracks 504 B
/hls-background-video 15.89 kB
/hls-audio 19.83 kB
/hls-video 25.89 kB

📦 @videojs/spotify-audio

Path Base initial PR initial Initial diff Lazy diff
. 3.59 kB new

📦 @videojs/tiktok-video

Path Base initial PR initial Initial diff Lazy diff
. 3.56 kB new

📦 @videojs/twitch-video

Path Base initial PR initial Initial diff Lazy diff
. 3.62 kB new

📦 @videojs/vimeo-video

Path Base initial PR initial Initial diff Lazy diff
. 10.59 kB new

📦 @videojs/wistia-video

Path Base initial PR initial Initial diff Lazy diff
. 1.91 kB new
/helpers 1.81 kB new
Entries (2)
Entry Initial
. 1.91 kB
/helpers 1.81 kB

📦 @videojs/youtube-video

Path Base initial PR initial Initial diff Lazy diff
. 4.25 kB new

ℹ️ How to interpret

Each entry is independently bundled, minified, and brotli-compressed. Initial size includes its static import graph; lazy dynamic chunks are reported separately.

Entries are not additive because their dependency graphs overlap. Preset rows represent realistic combined bundles.

Changes of 300 B or less across initial, lazy, and total size are collapsed, not discarded.

Run pnpm size locally to check current initial sizes.

@mihar-22
mihar-22 force-pushed the t3code/split-adapter-cdn-packages branch from e7d3522 to 3e046e6 Compare September 2, 2026 23:13
@mihar-22 mihar-22 changed the title refactor(packages): split playback adapters and cdn refactor(packages)!: split playback adapters and extensions into per-media packages Sep 2, 2026
@mihar-22
mihar-22 force-pushed the t3code/split-adapter-cdn-packages branch from 3e046e6 to b7eebd9 Compare September 2, 2026 23:30
@mihar-22
mihar-22 force-pushed the t3code/split-adapter-cdn-packages branch from b7eebd9 to df52013 Compare September 3, 2026 03:19
@mihar-22
mihar-22 force-pushed the t3code/split-adapter-cdn-packages branch from df52013 to 871f614 Compare September 3, 2026 03:59
@mihar-22 mihar-22 changed the title refactor(packages)!: split playback adapters and extensions into per-media packages refactor(packages)!: split playback adapters/extensions into packages Sep 3, 2026
@mihar-22
mihar-22 force-pushed the t3code/split-adapter-cdn-packages branch from 871f614 to d193a52 Compare September 3, 2026 04:55
Comment thread packages/mux/package.json
@@ -0,0 +1,48 @@
{
"name": "@videojs/mux",

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should call out this popped up as it contained core types and stuff across mux integrations. I've kept it private for now and just let the consuming packages bundle it. We can decide later what we call it and whether it needs to be public or not (unlikely yet).

@mihar-22
mihar-22 marked this pull request as ready for review September 3, 2026 05:28
Comment thread site/src/utils/installation/codegen.ts
@mihar-22
mihar-22 force-pushed the t3code/split-adapter-cdn-packages branch from d193a52 to 309ae6b Compare September 3, 2026 05:52
@mihar-22 mihar-22 changed the title refactor(packages)!: split playback adapters/extensions into packages refactor(packages)!: playback adapters packages Sep 3, 2026
@mihar-22
mihar-22 force-pushed the t3code/split-adapter-cdn-packages branch from 309ae6b to 11ff2a2 Compare September 3, 2026 06:57

@cjpillsbury cjpillsbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have one blocking question/concern that we might have missed in our discussion. Otherwise this looks great (with one nitpick blocker as well).

Comment thread packages/google-cast/README.md Outdated
@@ -0,0 +1,5 @@
declare global {
const __DEV__: boolean;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question(non-blocking): should this be in a more shared location? (can happen later/as a followup if so)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right now we have these global types per package, but it would be nice if we could share a base! Leave it as a follow-up!

Comment thread packages/html/README.md Outdated
import '@videojs/html/media/hlsjs-video';
```

Each media has its own package: `@videojs/hlsjs-video`, `@videojs/mux-video`, `@videojs/mux-audio`, `@videojs/dash-video`,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

praise: 👌

Comment thread packages/html/README.md Outdated
Comment thread packages/media/src/dom/mux/index.ts
Comment thread packages/spf/README.md Outdated
Comment thread packages/spf/vite.config.ts Outdated

@cjpillsbury cjpillsbury left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢 🇮🇹

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

E2E triage: real regression. The registry-installed Next React consumer cannot resolve the newly optional @videojs/hlsjs-video adapter during its build. Tracking issue: #2624.

…media packages

`@videojs/media` becomes engine-neutral. Each playback engine now ships as a
package named for the media it plays, and each extension as its own package:

- adapters: `@videojs/hlsjs-video`, `@videojs/mux-video`, `@videojs/mux-audio`,
  `@videojs/dash-video`, `@videojs/shaka-video`, `@videojs/vimeo-video`,
  `@videojs/wistia-video`
- extensions: `@videojs/mux-data`, `@videojs/google-cast`

Adapter packages export the Media class, its props, and defaults, and pin
their engine (hls.js, dashjs, shaka-player, ...) as an exact dependency.
`@videojs/html` and `@videojs/react` keep the façade entry points and declare
the adapter and extension packages as optional peers at exact versions.
`@videojs/spf` and the native HLS media stay built in, so `HlsVideo`,
`HlsAudio`, background, and `NativeHlsVideo` need no extra install.

Installation code on the site, CLI docs output, and the reference pages'
import sections now name the package to install beside the framework.

BREAKING CHANGE: `@videojs/media/dom/{hls-js,dash,shaka,vimeo,wistia,mux,google-cast}`
and `MuxData` under `@videojs/media/dom/mux` moved to the packages above.
Consumers must install the adapter or extension package they use.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 92b5dc0. Configure here.

import { HlsAudioMedia } from '../hls-audio/media';
import { MuxMediaMixin } from '../mux-video/adapter';
import { MuxMediaMixin } from '@videojs/mux-video/spf';
import { HlsAudioMedia } from '@videojs/spf/hls-audio';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Audio SPF entry pulls video engine

Medium Severity

@videojs/mux-audio/spf now loads MuxMediaMixin and muxMediaDefaultProps from the @videojs/mux-video/spf barrel. That module evaluates MuxVideoMedia, which composes HlsVideoMedia at import time, so the audio-only entry pulls in the full SPF video engine.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 92b5dc0. Configure here.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is how it was before, we have some unwinding to do later.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants