diff --git a/.agents/skills/implement-spf-use-case/references/workflow.md b/.agents/skills/implement-spf-use-case/references/workflow.md index 90a86860..7863ee4a 100644 --- a/.agents/skills/implement-spf-use-case/references/workflow.md +++ b/.agents/skills/implement-spf-use-case/references/workflow.md @@ -366,16 +366,16 @@ After Step 1's report: effectively unconsumable through the existing player surface. Ask the user (multi-select `AskUserQuestion`) which downstream layers to bundle into this pass: - - **Core media wrapper** — `packages/core/src/dom/media//` + - **Media wrapper** — `packages/media/src/dom//` (~5 LOC; applies the SPF mixin to `HTMLVideoElementHost`). The minimum bridge between the SPF adapter and the player packages. - Worked example: `simple-hls/index.ts` → + Worked example: `simple-hls/media.ts` → `class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}`. - **HTML custom element** — `packages/html/src/media/-video/` - (~5 LOC; wraps the core media in `CustomMediaElement` + + (~5 LOC; wraps the media host in `CustomMediaElement` + `MediaAttachMixin`) + `packages/html/src/define/media/-video.ts` + `packages/html/src/cdn/media/-video.ts` for the CDN entry. - Worked example: `simple-hls-video/index.ts` → + Worked example: `simple-hls-video/media.ts` → `class SimpleHlsVideo extends MediaAttachMixin(CustomMediaElement('video', SimpleHlsMedia)) {}`. - **React component** — `packages/react/src/media/-video/` (~37 LOC; React adapter exposing props matching the HTML @@ -438,15 +438,15 @@ typical for use-case implementations: **Implementation-scope-extension layers (opt-in per Step 2):** -- **Core media wrapper** — `packages/core/src/dom/media//index.ts` +- **Media wrapper** — `packages/media/src/dom//media.ts` applying the SPF mixin to `HTMLVideoElementHost` (or audio host for - audio-only variants). Inline implementation; ~5 LOC. + audio-only variants), exported through the adjacent `index.ts`; ~5 LOC. - **HTML custom element + define entry + CDN entry** — - `packages/html/src/media/-video/index.ts`, + `packages/html/src/media/-video/media.ts`, `packages/html/src/define/media/-video.ts`, `packages/html/src/cdn/media/-video.ts`. Inline implementation; ~5 LOC + boilerplate. -- **React component** — `packages/react/src/media/-video/index.tsx` +- **React component** — `packages/react/src/media/-video/media.tsx` exposing the props surface; ~37 LOC. Inline implementation. - **Sandbox demo(s)** — `apps/sandbox/templates/{html,react}--video/` (each ~50–80 LOC). **Write to `templates/`, not `src/`** (which is @@ -592,7 +592,7 @@ docs (cascade): always present. - *Adapter* table (Export / File / Purpose) — always present. - *Composed behaviors* paragraph — always present. - - *Core media wrapper* table — if the core wrapper layer + - *Media wrapper* table — if the media wrapper layer landed (`packages/core/...`). - *HTML custom element* table — if the HTML element layer landed (`packages/html/...`). diff --git a/.github/DISCUSSION_TEMPLATE/ideas.yml b/.github/DISCUSSION_TEMPLATE/ideas.yml index a27b3935..1eb5df38 100644 --- a/.github/DISCUSSION_TEMPLATE/ideas.yml +++ b/.github/DISCUSSION_TEMPLATE/ideas.yml @@ -29,6 +29,7 @@ body: - Core (@videojs/core) - Icons (@videojs/icons) - HTML (@videojs/html) + - Media (@videojs/media) - React (@videojs/react) - Utils (@videojs/utils) - Other (describe) diff --git a/.github/ISSUE_TEMPLATE/1.bug_report.yml b/.github/ISSUE_TEMPLATE/1.bug_report.yml index 4b03803a..eea50222 100644 --- a/.github/ISSUE_TEMPLATE/1.bug_report.yml +++ b/.github/ISSUE_TEMPLATE/1.bug_report.yml @@ -31,6 +31,7 @@ body: - Core (@videojs/core) - Icons (@videojs/icons) - HTML (@videojs/html) + - Media (@videojs/media) - React (@videojs/react) - SPF (@videojs/spf) - Utils (@videojs/utils) diff --git a/.github/ISSUE_TEMPLATE/2.feature_request.yml b/.github/ISSUE_TEMPLATE/2.feature_request.yml index 8efd0a28..5f3434c5 100644 --- a/.github/ISSUE_TEMPLATE/2.feature_request.yml +++ b/.github/ISSUE_TEMPLATE/2.feature_request.yml @@ -38,6 +38,7 @@ body: - Core (@videojs/core) - Icons (@videojs/icons) - HTML (@videojs/html) + - Media (@videojs/media) - React (@videojs/react) - SPF (@videojs/spf) - Utils (@videojs/utils) diff --git a/.github/ISSUE_TEMPLATE/3.docs_feedback.yml b/.github/ISSUE_TEMPLATE/3.docs_feedback.yml index 66800d0e..5267f5cd 100644 --- a/.github/ISSUE_TEMPLATE/3.docs_feedback.yml +++ b/.github/ISSUE_TEMPLATE/3.docs_feedback.yml @@ -26,6 +26,7 @@ body: - Core (@videojs/core) - Icons (@videojs/icons) - HTML (@videojs/html) + - Media (@videojs/media) - React (@videojs/react) - SPF (@videojs/spf) - general framework documentation diff --git a/.github/release-please/.release-please-manifest.json b/.github/release-please/.release-please-manifest.json index 78da1c63..e535d3b7 100644 --- a/.github/release-please/.release-please-manifest.json +++ b/.github/release-please/.release-please-manifest.json @@ -3,6 +3,7 @@ "packages/core": "10.0.0-beta.25", "packages/element": "10.0.0-beta.25", "packages/html": "10.0.0-beta.25", + "packages/media": "10.0.0-beta.25", "packages/icons": "10.0.0-beta.25", "packages/react": "10.0.0-beta.25", "packages/skins": "10.0.0-beta.25", diff --git a/.github/release-please/release-please-config.json b/.github/release-please/release-please-config.json index 609d0947..d6bed6be 100644 --- a/.github/release-please/release-please-config.json +++ b/.github/release-please/release-please-config.json @@ -18,6 +18,7 @@ "@videojs/element", "@videojs/html", "@videojs/icons", + "@videojs/media", "@videojs/react", "@videojs/skins", "@videojs/spf", @@ -51,6 +52,12 @@ "prerelease-type": "beta", "versioning": "prerelease" }, + "packages/media": { + "component": "@videojs/media", + "prerelease": true, + "prerelease-type": "beta", + "versioning": "prerelease" + }, "packages/icons": { "component": "@videojs/icons", "prerelease": true, diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7c771e28..632adb3f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -87,6 +87,7 @@ jobs: package: - '@videojs/cli' - '@videojs/core' + - '@videojs/media' - '@videojs/store' - '@videojs/utils' - '@videojs/element' diff --git a/AGENTS.md b/AGENTS.md index 097cc62d..440e8dac 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,6 +20,7 @@ When prose conflicts with executable sources, follow the executable source and u - `packages/element`: custom-element base. - `packages/store`: framework-neutral state plus `/html` and `/react` bindings. - `packages/spf`: stream-processing primitives, DOM bindings, and playback engine. +- `packages/media`: media contracts and state; browser hosts and playback engines live under `/dom`. - `packages/core`: runtime-neutral player logic; DOM bindings live under `/dom`. - `packages/html`, `packages/react`: platform players. - `packages/icons`, `packages/skins`: private shared assets and styling. diff --git a/apps/sandbox/app/shared/mux.ts b/apps/sandbox/app/shared/mux.ts index 14169bc3..97292379 100644 --- a/apps/sandbox/app/shared/mux.ts +++ b/apps/sandbox/app/shared/mux.ts @@ -1,4 +1,4 @@ -import { parseMuxVideoURL } from '@videojs/core/dom/media/mux'; +import { parseMuxVideoURL } from '@videojs/media/dom/mux'; import { SOURCES, type SourceId } from './sources'; export function getMuxAssetId(source: SourceId): string | undefined { diff --git a/apps/sandbox/package.json b/apps/sandbox/package.json index 57bb808f..76e201df 100644 --- a/apps/sandbox/package.json +++ b/apps/sandbox/package.json @@ -14,6 +14,7 @@ "@videojs/core": "workspace:*", "@videojs/html": "workspace:*", "@videojs/icons": "workspace:*", + "@videojs/media": "workspace:*", "@videojs/react": "workspace:*", "@videojs/skins": "workspace:*", "@videojs/spf": "workspace:*", diff --git a/commitlint.config.js b/commitlint.config.js index 3123ebe0..4d48f33b 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -25,6 +25,7 @@ export default { 'html', 'i18n', 'icons', + 'media', 'packages', 'plan', 'react-native', diff --git a/internal/design/media/architecture.md b/internal/design/media/architecture.md index d2da46f8..3759eeb2 100644 --- a/internal/design/media/architecture.md +++ b/internal/design/media/architecture.md @@ -14,21 +14,21 @@ Treating every media target as a complete `HTMLMediaElement` coupled player stat ## Decisions - Define small capabilities for playback, source, seeking, volume, tracks, presentation modes, and related events instead of one mandatory browser-shaped contract. -- Keep core contracts structural and DOM-free. Minimal event, target, range, and track shapes allow browser objects to satisfy them without making browser types the abstraction boundary. +- Keep media contracts structural and DOM-free. Minimal event, target, range, and track shapes allow browser objects to satisfy them without making browser types the abstraction boundary. - Require a feature to narrow to the capability it needs. The base player target cannot imply support for optional media behavior. -- Put native-element forwarding in DOM host classes, where platform behavior belongs, rather than in the core contract. +- Put native-element forwarding in DOM host classes, where platform behavior belongs, rather than in the shared contract. - Expose engine ownership through `MediaEngineHost`; keep engine-specific state off the common media surface. - Make engine destruction asynchronous so source or configuration replacement can wait for network and MediaSource cleanup. -- Keep HTML custom elements as adapters over core media hosts rather than a second media hierarchy. +- Keep HTML custom elements as adapters over media hosts rather than a second media hierarchy. ## Consequences -Custom media can implement only the capabilities it supports, store features reveal their real dependencies, and non-DOM adapters can share the same core contracts. The cost is explicit capability checks and more interfaces, which is preferable to an implicit, oversized platform contract. +Custom media can implement only the capabilities it supports, store features reveal their real dependencies, and non-DOM adapters can share the same media contracts. The cost is explicit capability checks and more interfaces, which is preferable to an implicit, oversized platform contract. ## Current sources of truth -- Contracts and type guards: `packages/core/src/core/media/` -- Browser hosts and engine-backed media: `packages/core/src/dom/media/` +- Contracts and type guards: `packages/media/src/core/` +- Browser hosts and engine-backed media: `packages/media/src/dom/` - HTML element adapters: `packages/html/src/media/` - Player feature consumers and tests: `packages/core/src/dom/store/features/` - Public exports and generated API reference diff --git a/internal/design/spf/features/engine-adapter-integration.md b/internal/design/spf/features/engine-adapter-integration.md index 6f19611a..c4f9ba55 100644 --- a/internal/design/spf/features/engine-adapter-integration.md +++ b/internal/design/spf/features/engine-adapter-integration.md @@ -33,7 +33,7 @@ the mixin. | Phase | What | Notes | |---|---|---| | Writable signal refs via `onSignalsReady` | `shareSignals` captures `Signal` / `ReadonlySignal` refs into a consumer-supplied callback at setup time. Generic over composition shape (`makeShareSignals()`) | Per-slot read/write intent is expressed at the use site (callers type captured refs as `Signal` or `ReadonlySignal`). Composed last in the engine so initial state writes are visible to the consumer | -| Mixin adapter pattern | `SimpleHlsMediaMixin` is the canonical consumer: function-of-base-class structure (mix into any base), captures refs once in `onSignalsReady`, exposes a WHATWG HTMLMediaElement-shaped API mapping each setter/method to engine writes | Downstream use: `class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}` in `packages/core/src/dom/media/simple-hls/` | +| Mixin adapter pattern | `SimpleHlsMediaMixin` is the canonical consumer: function-of-base-class structure (mix into any base), captures refs once in `onSignalsReady`, exposes a WHATWG HTMLMediaElement-shaped API mapping each setter/method to engine writes | Downstream use: `class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}` in `packages/media/src/dom/simple-hls/` | | Media element binding | `attach(el)` writes `context.mediaElement`; `detach()` clears it. **Engine persists across attach/detach cycles** — only `src` reassignment or explicit `destroy()` tears it down | Re-attach to a different element is supported. The engine is the durable state holder; `mediaElement` is a context slot | | Source assignment via in-place recycling | Adapter's `set src` overwrites `state.presentation` on its single recycled engine (`{ url }`, or `undefined` for empty src). Media element + engine-wide preload persist; no engine recreation, no signal re-capture | Drives the engine's in-place source-replacement cascade — see [source-replacement.md](./source-replacement.md). (The adapter previously destroyed + recreated the engine per assignment.) | | Preload reflection | `set preload(value)` writes W3C values to `state.preload`; clearing (`preload = ''`) doesn't patch the current engine but is re-applied on the next src change. Pre-attach src + preload combinations are supported | Extended preload values flow through state but don't reach the DOM (per [`preload-modes`](./preload-modes.md)'s sticky-extended-values semantics) | @@ -105,7 +105,7 @@ return createComposition( | `set preload(value)` | `state.preload.set(value)` (W3C values only; pre-empties stay engine-local) | | `play()` | `state.loadActivated.set(true)` → native `play()` with `loadstart` retry on "no supported sources" | -**Downstream consumer:** `packages/core/src/dom/media/simple-hls/index.ts`: +**Downstream consumer:** `packages/media/src/dom/simple-hls/media.ts`: ```ts export class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {} @@ -148,7 +148,7 @@ each `set src`). - `packages/spf/src/core/composition/tests/share-signals.test.ts` — the behavior itself - **Downstream usage:** - - `packages/core/src/dom/media/simple-hls/index.ts` — + - `packages/media/src/dom/simple-hls/media.ts` — `SimpleHlsMedia` consumer - **Walkthrough:** - `packages/spf/docs/hls-engine.md` Stage 10 — high-level coverage @@ -220,5 +220,5 @@ each `set src`). - [conventions/signals.md](../conventions/signals.md) — per-slot `Signal` / `ReadonlySignal` intent (relevant for how consumers type captured refs at the use site) -- `packages/core/src/dom/media/simple-hls/index.ts` — canonical +- `packages/media/src/dom/simple-hls/media.ts` — canonical downstream consumer diff --git a/internal/design/spf/use-cases/audio-only-mode-override.md b/internal/design/spf/use-cases/audio-only-mode-override.md index f80f3caa..fe84e695 100644 --- a/internal/design/spf/use-cases/audio-only-mode-override.md +++ b/internal/design/spf/use-cases/audio-only-mode-override.md @@ -299,19 +299,19 @@ parallel to the existing `simple-hls-video` pair. Public re-export: `@videojs/spf/hls` — all of the above ship via `packages/spf/src/playback/engines/hls/index.ts`. -**Core — media wrapper** (`packages/core/src/dom/media/simple-hls-audio-only/`): +**Core — media wrapper** (`packages/media/src/dom/simple-hls-audio-only/`): | Export | File | Purpose | |---|---|---| | `SimpleHlsAudioOnlyMedia` | `index.ts` | Applies `SimpleHlsAudioOnlyMediaMixin` to `HTMLAudioElementHost` (audio host, not video — symmetric with `mux-audio`) | -Public re-export: `@videojs/core/dom/media/simple-hls-audio-only`. +Public re-export: `@videojs/media/dom/simple-hls-audio-only`. **HTML — custom element** (`packages/html/src/media/simple-hls-audio-only/`): | Export | File | Purpose | |---|---|---| -| `SimpleHlsAudioOnly` | `media/simple-hls-audio-only/index.ts` | Applies `MediaAttachMixin` + `CustomMediaElement('audio', SimpleHlsAudioOnlyMedia)` | +| `SimpleHlsAudioOnly` | `media/simple-hls-audio-only/media.ts` | Applies `MediaAttachMixin` + `CustomMediaElement('audio', SimpleHlsAudioOnlyMedia)` | | `SimpleHlsAudioOnlyElement` (tag `simple-hls-audio-only`) | `define/media/simple-hls-audio-only.ts` | Custom-element definition; registers `` via `safeDefine` | CDN entry: `packages/html/src/cdn/media/simple-hls-audio-only.ts` → @@ -415,8 +415,8 @@ configuration drives end-of-stream correctly with no per-type changes. - [`packages/spf/src/playback/engines/hls/adapter-audio-only.ts`](../../../../packages/spf/src/playback/engines/hls/adapter-audio-only.ts) — Phase 1 adapter - [`packages/spf/src/playback/engines/hls/tests/engine-audio-only.test.ts`](../../../../packages/spf/src/playback/engines/hls/tests/engine-audio-only.test.ts) — Phase 1 engine integration tests - [`packages/spf/src/playback/engines/hls/tests/adapter-audio-only.test.ts`](../../../../packages/spf/src/playback/engines/hls/tests/adapter-audio-only.test.ts) — Phase 1 adapter tests -- [`packages/core/src/dom/media/simple-hls-audio-only/index.ts`](../../../../packages/core/src/dom/media/simple-hls-audio-only/index.ts) — Phase 1 core media wrapper -- [`packages/html/src/media/simple-hls-audio-only/index.ts`](../../../../packages/html/src/media/simple-hls-audio-only/index.ts) — Phase 1 HTML custom element -- [`packages/react/src/media/simple-hls-audio-only/index.tsx`](../../../../packages/react/src/media/simple-hls-audio-only/index.tsx) — Phase 1 React component +- [`packages/media/src/dom/simple-hls-audio-only/media.ts`](../../../../packages/media/src/dom/simple-hls-audio-only/media.ts) — Phase 1 media wrapper +- [`packages/html/src/media/simple-hls-audio-only/media.ts`](../../../../packages/html/src/media/simple-hls-audio-only/media.ts) — Phase 1 HTML custom element +- [`packages/react/src/media/simple-hls-audio-only/media.tsx`](../../../../packages/react/src/media/simple-hls-audio-only/media.tsx) — Phase 1 React component - [`apps/sandbox/templates/html-simple-hls-audio-only/`](../../../../apps/sandbox/templates/html-simple-hls-audio-only/) — Phase 1 HTML sandbox demo template - [`apps/sandbox/templates/react-simple-hls-audio-only/`](../../../../apps/sandbox/templates/react-simple-hls-audio-only/) — Phase 1 React sandbox demo template diff --git a/packages/core/package.json b/packages/core/package.json index 04d8bb68..dfc30bd7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -11,7 +11,6 @@ }, "keywords": [ "core", - "media", "player", "videojs" ], @@ -30,16 +29,6 @@ "development": "./dist/dev/dom.js", "default": "./dist/default/dom.js" }, - "./dom/media/*": { - "types": "./dist/dev/dom/media/*/index.d.ts", - "development": "./dist/dev/dom/media/*/index.js", - "default": "./dist/default/dom/media/*/index.js" - }, - "./media/predicate": { - "types": "./dist/dev/media/predicate.d.ts", - "development": "./dist/dev/media/predicate.js", - "default": "./dist/default/media/predicate.js" - }, "./i18n": { "types": "./dist/dev/i18n.d.ts", "development": "./dist/dev/i18n.js", @@ -74,17 +63,11 @@ "clean": "rimraf --glob dist types '*.tsbuildinfo'" }, "dependencies": { - "@videojs/spf": "workspace:*", + "@videojs/media": "workspace:*", "@videojs/store": "workspace:*", - "@videojs/utils": "workspace:*", - "@vimeo/player": "^2.30.3", - "dashjs": "^5.2.0", - "hls.js": "^1.6.7", - "mux-embed": "^5.17.10" + "@videojs/utils": "workspace:*" }, "devDependencies": { - "@types/chrome": "^0.1.40", - "@types/chromecast-caf-sender": "^1.0.11", "jsdom": "^26.1.0", "tsdown": "^0.22.14", "vitest": "^4.1.10" diff --git a/packages/core/src/core/index.ts b/packages/core/src/core/index.ts index b03102c7..da6612fb 100644 --- a/packages/core/src/core/index.ts +++ b/packages/core/src/core/index.ts @@ -1,7 +1,3 @@ -export { EMPTY_REMOTE, EMPTY_TEXT_TRACKS, EMPTY_TIME_RANGES } from './media/constants'; -export * from './media/predicate'; -export * from './media/state'; -export * from './media/types'; export * from './ui/airplay-button/airplay-button-core'; export * from './ui/airplay-button/airplay-button-data-attrs'; export * from './ui/alert-dialog/alert-dialog-core'; diff --git a/packages/core/src/core/ui/airplay-button/airplay-button-core.ts b/packages/core/src/core/ui/airplay-button/airplay-button-core.ts index 8dccaf68..84af4678 100644 --- a/packages/core/src/core/ui/airplay-button/airplay-button-core.ts +++ b/packages/core/src/core/ui/airplay-button/airplay-button-core.ts @@ -1,3 +1,4 @@ +import type { MediaFeatureAvailability, MediaRemotePlaybackState, RemotePlaybackConnectionState } from '@videojs/media'; import { createState } from '@videojs/store'; import { supportsWebKitAirPlay } from '@videojs/utils/dom'; import { defaults } from '@videojs/utils/object'; @@ -5,8 +6,6 @@ import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { startText, stopText } from '../../i18n/text/airplay'; import { connectingText } from '../../i18n/text/cast'; -import type { MediaRemotePlaybackState, RemotePlaybackConnectionState } from '../../media/state'; -import type { MediaFeatureAvailability } from '../../media/types'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/airplay-button/tests/airplay-button-core.test.ts b/packages/core/src/core/ui/airplay-button/tests/airplay-button-core.test.ts index 99ff755d..317a700a 100644 --- a/packages/core/src/core/ui/airplay-button/tests/airplay-button-core.test.ts +++ b/packages/core/src/core/ui/airplay-button/tests/airplay-button-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaRemotePlaybackState } from '@videojs/media'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; - -import type { MediaRemotePlaybackState } from '../../../media/state'; import type { AirPlayButtonState } from '../airplay-button-core'; import { AirPlayButtonCore } from '../airplay-button-core'; diff --git a/packages/core/src/core/ui/audio-track-radio-group/audio-track-radio-group-core.ts b/packages/core/src/core/ui/audio-track-radio-group/audio-track-radio-group-core.ts index d0a6234f..23f40d94 100644 --- a/packages/core/src/core/ui/audio-track-radio-group/audio-track-radio-group-core.ts +++ b/packages/core/src/core/ui/audio-track-radio-group/audio-track-radio-group-core.ts @@ -1,9 +1,9 @@ +import type { MediaAudioTrack, MediaAudioTrackState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { audioText } from '../../i18n/text/menu'; -import type { MediaAudioTrack, MediaAudioTrackState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/audio-track-radio-group/tests/audio-track-radio-group-core.test.ts b/packages/core/src/core/ui/audio-track-radio-group/tests/audio-track-radio-group-core.test.ts index d342224a..8ceb7abd 100644 --- a/packages/core/src/core/ui/audio-track-radio-group/tests/audio-track-radio-group-core.test.ts +++ b/packages/core/src/core/ui/audio-track-radio-group/tests/audio-track-radio-group-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaAudioTrackState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaAudioTrackState } from '../../../media/state'; import type { AudioTrackRadioGroupState } from '../audio-track-radio-group-core'; import { AudioTrackRadioGroupCore } from '../audio-track-radio-group-core'; diff --git a/packages/core/src/core/ui/buffering-indicator/buffering-indicator-core.ts b/packages/core/src/core/ui/buffering-indicator/buffering-indicator-core.ts index 2fd404f5..305e98ba 100644 --- a/packages/core/src/core/ui/buffering-indicator/buffering-indicator-core.ts +++ b/packages/core/src/core/ui/buffering-indicator/buffering-indicator-core.ts @@ -1,9 +1,8 @@ +import type { MediaPlaybackState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; -import type { MediaPlaybackState } from '../../media/state'; - export interface BufferingIndicatorProps { /** Delay in milliseconds before the indicator becomes visible. */ delay?: number | undefined; diff --git a/packages/core/src/core/ui/buffering-indicator/tests/buffering-indicator-core.test.ts b/packages/core/src/core/ui/buffering-indicator/tests/buffering-indicator-core.test.ts index 5bdf65ca..c5630048 100644 --- a/packages/core/src/core/ui/buffering-indicator/tests/buffering-indicator-core.test.ts +++ b/packages/core/src/core/ui/buffering-indicator/tests/buffering-indicator-core.test.ts @@ -1,7 +1,6 @@ +import type { MediaPlaybackState } from '@videojs/media'; import { flush } from '@videojs/store'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; - -import type { MediaPlaybackState } from '../../../media/state'; import { BufferingIndicatorCore } from '../buffering-indicator-core'; function createMediaState(overrides: Partial = {}): MediaPlaybackState { diff --git a/packages/core/src/core/ui/captions-button/captions-button-core.ts b/packages/core/src/core/ui/captions-button/captions-button-core.ts index ffaa3bcd..5bf5895a 100644 --- a/packages/core/src/core/ui/captions-button/captions-button-core.ts +++ b/packages/core/src/core/ui/captions-button/captions-button-core.ts @@ -1,10 +1,10 @@ +import type { MediaTextTrackState } from '@videojs/media'; import { createState } from '@videojs/store'; import { isCaptionOrSubtitleTrack } from '@videojs/utils/dom'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { disableText, enableText } from '../../i18n/text/captions'; -import type { MediaTextTrackState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/captions-button/tests/captions-button-core.test.ts b/packages/core/src/core/ui/captions-button/tests/captions-button-core.test.ts index 2b00b558..8d79fa88 100644 --- a/packages/core/src/core/ui/captions-button/tests/captions-button-core.test.ts +++ b/packages/core/src/core/ui/captions-button/tests/captions-button-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaTextTrackState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaTextTrackState } from '../../../media/state'; import type { CaptionsButtonState } from '../captions-button-core'; import { CaptionsButtonCore } from '../captions-button-core'; diff --git a/packages/core/src/core/ui/captions-radio-group/captions-radio-group-core.ts b/packages/core/src/core/ui/captions-radio-group/captions-radio-group-core.ts index 2ad256ca..b04b59b5 100644 --- a/packages/core/src/core/ui/captions-radio-group/captions-radio-group-core.ts +++ b/packages/core/src/core/ui/captions-radio-group/captions-radio-group-core.ts @@ -1,3 +1,4 @@ +import type { MediaTextTrack, MediaTextTrackState } from '@videojs/media'; import { createState } from '@videojs/store'; import { isCaptionOrSubtitleTrack } from '@videojs/utils/dom'; import { defaults } from '@videojs/utils/object'; @@ -5,7 +6,6 @@ import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { disableText, enableText } from '../../i18n/text/captions'; import { captionsText, subtitlesText } from '../../i18n/text/menu'; -import type { MediaTextTrack, MediaTextTrackState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/captions-radio-group/tests/captions-radio-group-core.test.ts b/packages/core/src/core/ui/captions-radio-group/tests/captions-radio-group-core.test.ts index 76358136..18411f4a 100644 --- a/packages/core/src/core/ui/captions-radio-group/tests/captions-radio-group-core.test.ts +++ b/packages/core/src/core/ui/captions-radio-group/tests/captions-radio-group-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaTextTrackState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaTextTrackState } from '../../../media/state'; import { CAPTIONS_OFF_VALUE, CaptionsRadioGroupCore, type CaptionsRadioGroupState } from '../captions-radio-group-core'; function createMediaState(overrides: Partial = {}): MediaTextTrackState { diff --git a/packages/core/src/core/ui/cast-button/cast-button-core.ts b/packages/core/src/core/ui/cast-button/cast-button-core.ts index d52ab63f..ea6d1aa3 100644 --- a/packages/core/src/core/ui/cast-button/cast-button-core.ts +++ b/packages/core/src/core/ui/cast-button/cast-button-core.ts @@ -1,10 +1,9 @@ +import type { MediaFeatureAvailability, MediaRemotePlaybackState, RemotePlaybackConnectionState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { connectingText, startText, stopText } from '../../i18n/text/cast'; -import type { MediaRemotePlaybackState, RemotePlaybackConnectionState } from '../../media/state'; -import type { MediaFeatureAvailability } from '../../media/types'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/cast-button/tests/cast-button-core.test.ts b/packages/core/src/core/ui/cast-button/tests/cast-button-core.test.ts index 24c5b0f1..cbdec4d5 100644 --- a/packages/core/src/core/ui/cast-button/tests/cast-button-core.test.ts +++ b/packages/core/src/core/ui/cast-button/tests/cast-button-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaRemotePlaybackState } from '@videojs/media'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; - -import type { MediaRemotePlaybackState } from '../../../media/state'; import type { CastButtonState } from '../cast-button-core'; import { CastButtonCore } from '../cast-button-core'; diff --git a/packages/core/src/core/ui/controls/controls-core.ts b/packages/core/src/core/ui/controls/controls-core.ts index 3ab5402b..4f52d50b 100644 --- a/packages/core/src/core/ui/controls/controls-core.ts +++ b/packages/core/src/core/ui/controls/controls-core.ts @@ -1,4 +1,4 @@ -import type { MediaControlsState } from '../../media/state'; +import type { MediaControlsState } from '@videojs/media'; export interface ControlsState { visible: boolean; diff --git a/packages/core/src/core/ui/controls/tests/controls-core.test.ts b/packages/core/src/core/ui/controls/tests/controls-core.test.ts index 7d162723..b3564138 100644 --- a/packages/core/src/core/ui/controls/tests/controls-core.test.ts +++ b/packages/core/src/core/ui/controls/tests/controls-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaControlsState } from '@videojs/media'; import { describe, expect, it } from 'vitest'; - -import type { MediaControlsState } from '../../../media/state'; import { ControlsCore } from '../controls-core'; describe('ControlsCore', () => { diff --git a/packages/core/src/core/ui/error-dialog/error-dialog-i18n.ts b/packages/core/src/core/ui/error-dialog/error-dialog-i18n.ts index d4d93888..9383eb83 100644 --- a/packages/core/src/core/ui/error-dialog/error-dialog-i18n.ts +++ b/packages/core/src/core/ui/error-dialog/error-dialog-i18n.ts @@ -1,3 +1,4 @@ +import { MediaError } from '@videojs/media'; import type { TranslationParams } from '../../i18n/params'; import type { Text } from '../../i18n/text'; import { emptyText, okText } from '../../i18n/text/common'; @@ -10,7 +11,6 @@ import { titleText, unexpectedText, } from '../../i18n/text/errors'; -import { MediaError } from '../../media/media-error'; export type MediaErrorTranslationKey = Extract< keyof TranslationParams, diff --git a/packages/core/src/core/ui/error-dialog/tests/error-dialog-i18n.test.ts b/packages/core/src/core/ui/error-dialog/tests/error-dialog-i18n.test.ts index 7434a1b3..ab3c2bd1 100644 --- a/packages/core/src/core/ui/error-dialog/tests/error-dialog-i18n.test.ts +++ b/packages/core/src/core/ui/error-dialog/tests/error-dialog-i18n.test.ts @@ -1,5 +1,5 @@ +import { MediaError } from '@videojs/media'; import { describe, expect, it } from 'vitest'; -import { MediaError } from '../../../media/media-error'; import { getErrorDialogDismissText, getErrorDialogTitleText, diff --git a/packages/core/src/core/ui/fullscreen-button/fullscreen-button-core.ts b/packages/core/src/core/ui/fullscreen-button/fullscreen-button-core.ts index 98061832..ce5e2ef6 100644 --- a/packages/core/src/core/ui/fullscreen-button/fullscreen-button-core.ts +++ b/packages/core/src/core/ui/fullscreen-button/fullscreen-button-core.ts @@ -1,9 +1,9 @@ +import type { MediaFullscreenState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { enterText, exitText } from '../../i18n/text/fullscreen'; -import type { MediaFullscreenState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/fullscreen-button/tests/fullscreen-button-core.test.ts b/packages/core/src/core/ui/fullscreen-button/tests/fullscreen-button-core.test.ts index 0fb4a0d4..a7c21fdd 100644 --- a/packages/core/src/core/ui/fullscreen-button/tests/fullscreen-button-core.test.ts +++ b/packages/core/src/core/ui/fullscreen-button/tests/fullscreen-button-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaFullscreenState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaFullscreenState } from '../../../media/state'; import type { FullscreenButtonState } from '../fullscreen-button-core'; import { FullscreenButtonCore } from '../fullscreen-button-core'; diff --git a/packages/core/src/core/ui/live-button/live-button-core.ts b/packages/core/src/core/ui/live-button/live-button-core.ts index 3f85533b..7f89c4b6 100644 --- a/packages/core/src/core/ui/live-button/live-button-core.ts +++ b/packages/core/src/core/ui/live-button/live-button-core.ts @@ -1,9 +1,9 @@ +import type { MediaBufferState, MediaLiveState, MediaTimeState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { badgeText, playingText, seekToEdgeText } from '../../i18n/text/live'; -import type { MediaBufferState, MediaLiveState, MediaTimeState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/mute-button/mute-button-core.ts b/packages/core/src/core/ui/mute-button/mute-button-core.ts index 9d4fbb41..a469c51f 100644 --- a/packages/core/src/core/ui/mute-button/mute-button-core.ts +++ b/packages/core/src/core/ui/mute-button/mute-button-core.ts @@ -1,9 +1,9 @@ +import type { MediaVolumeState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { muteText, unmuteText } from '../../i18n/text/buttons'; -import type { MediaVolumeState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/mute-button/tests/mute-button-core.test.ts b/packages/core/src/core/ui/mute-button/tests/mute-button-core.test.ts index 004d6905..59477b65 100644 --- a/packages/core/src/core/ui/mute-button/tests/mute-button-core.test.ts +++ b/packages/core/src/core/ui/mute-button/tests/mute-button-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaVolumeState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaVolumeState } from '../../../media/state'; import type { MuteButtonState } from '../mute-button-core'; import { MuteButtonCore } from '../mute-button-core'; diff --git a/packages/core/src/core/ui/pip-button/pip-button-core.ts b/packages/core/src/core/ui/pip-button/pip-button-core.ts index 77fcdb5d..b75b8fb2 100644 --- a/packages/core/src/core/ui/pip-button/pip-button-core.ts +++ b/packages/core/src/core/ui/pip-button/pip-button-core.ts @@ -1,9 +1,9 @@ +import type { MediaPictureInPictureState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { enterText, exitText } from '../../i18n/text/pip'; -import type { MediaPictureInPictureState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/pip-button/tests/pip-button-core.test.ts b/packages/core/src/core/ui/pip-button/tests/pip-button-core.test.ts index ba201b25..9d7b31cb 100644 --- a/packages/core/src/core/ui/pip-button/tests/pip-button-core.test.ts +++ b/packages/core/src/core/ui/pip-button/tests/pip-button-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaPictureInPictureState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaPictureInPictureState } from '../../../media/state'; import type { PiPButtonState } from '../pip-button-core'; import { PiPButtonCore } from '../pip-button-core'; diff --git a/packages/core/src/core/ui/play-button/play-button-core.ts b/packages/core/src/core/ui/play-button/play-button-core.ts index d1db40de..cc7568a7 100644 --- a/packages/core/src/core/ui/play-button/play-button-core.ts +++ b/packages/core/src/core/ui/play-button/play-button-core.ts @@ -1,9 +1,9 @@ +import type { MediaPlaybackState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { pauseText, playText, replayText } from '../../i18n/text/buttons'; -import type { MediaPlaybackState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/play-button/tests/play-button-core.test.ts b/packages/core/src/core/ui/play-button/tests/play-button-core.test.ts index 2fbaf314..234f2e32 100644 --- a/packages/core/src/core/ui/play-button/tests/play-button-core.test.ts +++ b/packages/core/src/core/ui/play-button/tests/play-button-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaPlaybackState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaPlaybackState } from '../../../media/state'; import type { PlayButtonState } from '../play-button-core'; import { PlayButtonCore } from '../play-button-core'; diff --git a/packages/core/src/core/ui/playback-rate-button/playback-rate-button-core.ts b/packages/core/src/core/ui/playback-rate-button/playback-rate-button-core.ts index d7fefa7b..48a90f76 100644 --- a/packages/core/src/core/ui/playback-rate-button/playback-rate-button-core.ts +++ b/packages/core/src/core/ui/playback-rate-button/playback-rate-button-core.ts @@ -1,9 +1,9 @@ +import type { MediaPlaybackRateState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { rateText } from '../../i18n/text/playback'; -import type { MediaPlaybackRateState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/playback-rate-button/tests/playback-rate-button-core.test.ts b/packages/core/src/core/ui/playback-rate-button/tests/playback-rate-button-core.test.ts index b401908c..75e17c62 100644 --- a/packages/core/src/core/ui/playback-rate-button/tests/playback-rate-button-core.test.ts +++ b/packages/core/src/core/ui/playback-rate-button/tests/playback-rate-button-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaPlaybackRateState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaPlaybackRateState } from '../../../media/state'; import type { PlaybackRateButtonState } from '../playback-rate-button-core'; import { PlaybackRateButtonCore } from '../playback-rate-button-core'; diff --git a/packages/core/src/core/ui/playback-rate-radio-group/playback-rate-radio-group-core.ts b/packages/core/src/core/ui/playback-rate-radio-group/playback-rate-radio-group-core.ts index 6caeb97c..c2d66189 100644 --- a/packages/core/src/core/ui/playback-rate-radio-group/playback-rate-radio-group-core.ts +++ b/packages/core/src/core/ui/playback-rate-radio-group/playback-rate-radio-group-core.ts @@ -1,10 +1,10 @@ +import type { MediaPlaybackRateState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import { isUndefined } from '@videojs/utils/predicate'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { rateText } from '../../i18n/text/playback'; -import type { MediaPlaybackRateState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/playback-rate-radio-group/tests/playback-rate-radio-group-core.test.ts b/packages/core/src/core/ui/playback-rate-radio-group/tests/playback-rate-radio-group-core.test.ts index 84a8f50d..8a59d471 100644 --- a/packages/core/src/core/ui/playback-rate-radio-group/tests/playback-rate-radio-group-core.test.ts +++ b/packages/core/src/core/ui/playback-rate-radio-group/tests/playback-rate-radio-group-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaPlaybackRateState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaPlaybackRateState } from '../../../media/state'; import type { PlaybackRateRadioGroupState } from '../playback-rate-radio-group-core'; import { PlaybackRateRadioGroupCore } from '../playback-rate-radio-group-core'; diff --git a/packages/core/src/core/ui/poster/poster-core.ts b/packages/core/src/core/ui/poster/poster-core.ts index 7d931ef5..bb4bb52a 100644 --- a/packages/core/src/core/ui/poster/poster-core.ts +++ b/packages/core/src/core/ui/poster/poster-core.ts @@ -1,4 +1,4 @@ -import type { MediaPlaybackState } from '../../media/state'; +import type { MediaPlaybackState } from '@videojs/media'; export interface PosterState { visible: boolean; diff --git a/packages/core/src/core/ui/poster/tests/poster-core.test.ts b/packages/core/src/core/ui/poster/tests/poster-core.test.ts index 5f3231f3..49f3646e 100644 --- a/packages/core/src/core/ui/poster/tests/poster-core.test.ts +++ b/packages/core/src/core/ui/poster/tests/poster-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaPlaybackState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaPlaybackState } from '../../../media/state'; import { PosterCore } from '../poster-core'; function createMediaState(overrides: Partial = {}): MediaPlaybackState { diff --git a/packages/core/src/core/ui/quality-radio-group/quality-radio-group-core.ts b/packages/core/src/core/ui/quality-radio-group/quality-radio-group-core.ts index c4aade80..f11b2380 100644 --- a/packages/core/src/core/ui/quality-radio-group/quality-radio-group-core.ts +++ b/packages/core/src/core/ui/quality-radio-group/quality-radio-group-core.ts @@ -1,9 +1,9 @@ +import type { MediaQualityState, MediaVideoRendition } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text, type TextParams } from '../../i18n'; import { autoText, autoWithLabelText, qualityText } from '../../i18n/text/menu'; -import type { MediaQualityState, MediaVideoRendition } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/quality-radio-group/tests/quality-radio-group-core.test.ts b/packages/core/src/core/ui/quality-radio-group/tests/quality-radio-group-core.test.ts index 70129b40..e6f5c833 100644 --- a/packages/core/src/core/ui/quality-radio-group/tests/quality-radio-group-core.test.ts +++ b/packages/core/src/core/ui/quality-radio-group/tests/quality-radio-group-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaQualityState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaQualityState } from '../../../media/state'; import type { QualityRadioGroupState } from '../quality-radio-group-core'; import { QUALITY_AUTO_VALUE, QualityRadioGroupCore } from '../quality-radio-group-core'; diff --git a/packages/core/src/core/ui/seek-button/seek-button-core.ts b/packages/core/src/core/ui/seek-button/seek-button-core.ts index de0b3f98..160f783a 100644 --- a/packages/core/src/core/ui/seek-button/seek-button-core.ts +++ b/packages/core/src/core/ui/seek-button/seek-button-core.ts @@ -1,9 +1,9 @@ +import type { MediaTimeState } from '@videojs/media'; import { createState } from '@videojs/store'; import { defaults } from '@videojs/utils/object'; import type { NonNullableObject } from '@videojs/utils/types'; import { resolveText, type Text } from '../../i18n'; import { backwardText, forwardText } from '../../i18n/text/seek'; -import type { MediaTimeState } from '../../media/state'; import type { ButtonState } from '../types'; import { resolveLabel } from '../utils/resolve-label'; diff --git a/packages/core/src/core/ui/seek-button/tests/seek-button-core.test.ts b/packages/core/src/core/ui/seek-button/tests/seek-button-core.test.ts index 39c5e910..006f8363 100644 --- a/packages/core/src/core/ui/seek-button/tests/seek-button-core.test.ts +++ b/packages/core/src/core/ui/seek-button/tests/seek-button-core.test.ts @@ -1,6 +1,5 @@ +import type { MediaTimeState } from '@videojs/media'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaTimeState } from '../../../media/state'; import type { SeekButtonState } from '../seek-button-core'; import { SeekButtonCore } from '../seek-button-core'; diff --git a/packages/core/src/core/ui/thumbnail/thumbnail-media-fragment.ts b/packages/core/src/core/ui/thumbnail/thumbnail-media-fragment.ts index 27fbfea2..18b38553 100644 --- a/packages/core/src/core/ui/thumbnail/thumbnail-media-fragment.ts +++ b/packages/core/src/core/ui/thumbnail/thumbnail-media-fragment.ts @@ -1,6 +1,5 @@ +import type { MediaTextCue } from '@videojs/media'; import { isNumber } from '@videojs/utils/predicate'; - -import type { MediaTextCue } from '../../media/state'; import type { ThumbnailCoords, ThumbnailImage } from './types'; /** Parse `url#xywh=x,y,w,h` into a URL and optional sprite coordinates. */ diff --git a/packages/core/src/core/ui/time-slider/tests/time-slider-core.test.ts b/packages/core/src/core/ui/time-slider/tests/time-slider-core.test.ts index e5e61300..f8a38538 100644 --- a/packages/core/src/core/ui/time-slider/tests/time-slider-core.test.ts +++ b/packages/core/src/core/ui/time-slider/tests/time-slider-core.test.ts @@ -1,7 +1,6 @@ +import type { MediaBufferState, MediaPlaybackState, MediaTimeState } from '@videojs/media'; import { formatTimeAsPhrase } from '@videojs/utils/time'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaBufferState, MediaPlaybackState, MediaTimeState } from '../../../media/state'; import type { SliderInput } from '../../slider/slider-core'; import { TimeSliderCore } from '../time-slider-core'; diff --git a/packages/core/src/core/ui/time-slider/time-slider-core.ts b/packages/core/src/core/ui/time-slider/time-slider-core.ts index 822c5aa0..95906d3c 100644 --- a/packages/core/src/core/ui/time-slider/time-slider-core.ts +++ b/packages/core/src/core/ui/time-slider/time-slider-core.ts @@ -1,10 +1,10 @@ +import type { MediaBufferState, MediaPlaybackState, MediaTimeState } from '@videojs/media'; import { defaults } from '@videojs/utils/object'; import { formatTimeAsPhrase } from '@videojs/utils/time'; import type { NonNullableObject } from '@videojs/utils/types'; import type { Text } from '../../i18n'; import { seekText } from '../../i18n/text/slider'; import { positionText } from '../../i18n/text/time'; -import type { MediaBufferState, MediaPlaybackState, MediaTimeState } from '../../media/state'; import { SliderCore, type SliderProps, type SliderState } from '../slider/slider-core'; export interface TimeSliderProps extends SliderProps { diff --git a/packages/core/src/core/ui/time/tests/time-core.test.ts b/packages/core/src/core/ui/time/tests/time-core.test.ts index 0c3fe9a1..bad4027f 100644 --- a/packages/core/src/core/ui/time/tests/time-core.test.ts +++ b/packages/core/src/core/ui/time/tests/time-core.test.ts @@ -1,8 +1,8 @@ +import type { MediaTimeState } from '@videojs/media'; import { formatTimeAsPhrase } from '@videojs/utils/time'; import { describe, expect, it } from 'vitest'; import { createTranslator, flattenTranslations, translateText, translations } from '../../../i18n'; -import type { MediaTimeState } from '../../../media/state'; import { TimeCore } from '../time-core'; const t = createTranslator(flattenTranslations(translations), 'en'); diff --git a/packages/core/src/core/ui/time/time-core.ts b/packages/core/src/core/ui/time/time-core.ts index ffc88514..e981f7c6 100644 --- a/packages/core/src/core/ui/time/time-core.ts +++ b/packages/core/src/core/ui/time/time-core.ts @@ -1,3 +1,4 @@ +import type { MediaTimeState } from '@videojs/media'; import { defaults } from '@videojs/utils/object'; import { formatTime, formatTimeAsPhrase, secondsToIsoDuration } from '@videojs/utils/time'; import type { NonNullableObject } from '@videojs/utils/types'; @@ -10,7 +11,6 @@ import { showElapsedText, showRemainingText, } from '../../i18n/text/time'; -import type { MediaTimeState } from '../../media/state'; import { resolveLabel } from '../utils/resolve-label'; /** Time display type. */ diff --git a/packages/core/src/core/ui/volume-slider/tests/volume-slider-core.test.ts b/packages/core/src/core/ui/volume-slider/tests/volume-slider-core.test.ts index 489297a1..4583c522 100644 --- a/packages/core/src/core/ui/volume-slider/tests/volume-slider-core.test.ts +++ b/packages/core/src/core/ui/volume-slider/tests/volume-slider-core.test.ts @@ -1,7 +1,6 @@ +import type { MediaVolumeState } from '@videojs/media'; import { formatPercent } from '@videojs/utils/percent'; import { describe, expect, it, vi } from 'vitest'; - -import type { MediaVolumeState } from '../../../media/state'; import type { SliderInput } from '../../slider/slider-core'; import { VolumeSliderCore } from '../volume-slider-core'; diff --git a/packages/core/src/core/ui/volume-slider/volume-slider-core.ts b/packages/core/src/core/ui/volume-slider/volume-slider-core.ts index 998ea22d..b614d28e 100644 --- a/packages/core/src/core/ui/volume-slider/volume-slider-core.ts +++ b/packages/core/src/core/ui/volume-slider/volume-slider-core.ts @@ -1,10 +1,9 @@ +import type { MediaFeatureAvailability, MediaVolumeState } from '@videojs/media'; import { defaults } from '@videojs/utils/object'; import { formatPercent } from '@videojs/utils/percent'; import type { NonNullableObject } from '@videojs/utils/types'; import type { Text } from '../../i18n'; import { labelText, mutedValueText } from '../../i18n/text/volume'; -import type { MediaVolumeState } from '../../media/state'; -import type { MediaFeatureAvailability } from '../../media/types'; import { SliderCore, type SliderProps, type SliderState } from '../slider/slider-core'; export interface VolumeSliderProps extends SliderProps { diff --git a/packages/core/src/dom/feature.ts b/packages/core/src/dom/feature.ts index eb4c61ce..abfbc110 100644 --- a/packages/core/src/dom/feature.ts +++ b/packages/core/src/dom/feature.ts @@ -1,7 +1,6 @@ import { type AttachContext, defineSlice, type SliceConfig, type StateContext } from '@videojs/store'; import { isUndefined } from '@videojs/utils/predicate'; - -import type { PlayerFeature, PlayerTarget } from './media/types'; +import type { PlayerFeature, PlayerTarget } from './player'; export interface ConfigurablePlayerFeature extends PlayerFeature { (config?: Config): PlayerFeature; diff --git a/packages/core/src/dom/gesture/actions.ts b/packages/core/src/dom/gesture/actions.ts index 937d2410..4e000af9 100644 --- a/packages/core/src/dom/gesture/actions.ts +++ b/packages/core/src/dom/gesture/actions.ts @@ -1,6 +1,6 @@ import { isFunction } from '@videojs/utils/predicate'; -import type { AnyPlayerStore } from '../media/types'; import { MEDIA_INPUT_ACTION_OVERRIDES } from '../media-actions'; +import type { AnyPlayerStore } from '../player'; export type GestureActionName = | 'togglePaused' diff --git a/packages/core/src/dom/hotkey/actions.ts b/packages/core/src/dom/hotkey/actions.ts index 2d5a3be7..8c737f02 100644 --- a/packages/core/src/dom/hotkey/actions.ts +++ b/packages/core/src/dom/hotkey/actions.ts @@ -1,6 +1,6 @@ import { isUndefined } from '@videojs/utils/predicate'; -import type { AnyPlayerStore } from '../media/types'; import { MEDIA_INPUT_ACTION_OVERRIDES } from '../media-actions'; +import type { AnyPlayerStore } from '../player'; import { selectFullscreen, selectPiP, diff --git a/packages/core/src/dom/index.ts b/packages/core/src/dom/index.ts index 1b4e4de3..f79daabd 100644 --- a/packages/core/src/dom/index.ts +++ b/packages/core/src/dom/index.ts @@ -8,7 +8,7 @@ export * from './hotkey/aria'; export * from './hotkey/coordinator'; export * from './hotkey/hotkey'; export * from './hotkey/hotkey-events'; -export * from './media/types'; +export * from './player'; export * from './store/features'; export * from './store/selectors'; export * from './ui/alert-dialog'; diff --git a/packages/core/src/dom/media-actions.ts b/packages/core/src/dom/media-actions.ts index 6ebf0e5d..a0b00c1d 100644 --- a/packages/core/src/dom/media-actions.ts +++ b/packages/core/src/dom/media-actions.ts @@ -1,6 +1,5 @@ import { isUndefined } from '@videojs/utils/predicate'; - -import type { AnyPlayerStore } from './media/types'; +import type { AnyPlayerStore } from './player'; import { selectPlaybackRate, selectTime, selectVolume } from './store/selectors'; export type MediaInputActionName = 'seekStep' | 'volumeStep' | 'speedUp' | 'speedDown'; diff --git a/packages/core/src/dom/media/mux/types.ts b/packages/core/src/dom/media/mux/types.ts deleted file mode 100644 index c161017f..00000000 --- a/packages/core/src/dom/media/mux/types.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -export type { Mux as MuxDataSdk, Options as MuxDataOptions } from 'mux-embed'; diff --git a/packages/core/src/dom/media/utils/index.ts b/packages/core/src/dom/media/utils/index.ts deleted file mode 100644 index 9bb4a2ca..00000000 --- a/packages/core/src/dom/media/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { addComponent, getComponents, getOwner, getProp, setProp } from './components'; diff --git a/packages/core/src/dom/media/types.ts b/packages/core/src/dom/player.ts similarity index 95% rename from packages/core/src/dom/media/types.ts rename to packages/core/src/dom/player.ts index b4d32675..2738895f 100644 --- a/packages/core/src/dom/media/types.ts +++ b/packages/core/src/dom/player.ts @@ -1,5 +1,5 @@ -import type { AnySlice, Slice, Store, UnionSliceState } from '@videojs/store'; import type { + Media, MediaAudioTrackState, MediaBufferState, MediaControlsState, @@ -15,10 +15,8 @@ import type { MediaTextTrackState, MediaTimeState, MediaVolumeState, -} from '../../core/media/state'; -import type { Media } from '../../core/media/types'; - -export type { Media }; +} from '@videojs/media'; +import type { AnySlice, Slice, Store, UnionSliceState } from '@videojs/store'; export interface MediaContainer extends HTMLElement {} @@ -27,8 +25,6 @@ export interface PlayerTarget { container: MediaContainer | null; } -export type { MediaFeatureAvailability } from '../../core/media/types'; - export type PlayerFeature = Slice; export type AnyPlayerFeature = AnySlice; diff --git a/packages/core/src/dom/presentation/fullscreen.ts b/packages/core/src/dom/presentation/fullscreen.ts index 5d177fbb..8051b524 100644 --- a/packages/core/src/dom/presentation/fullscreen.ts +++ b/packages/core/src/dom/presentation/fullscreen.ts @@ -1,6 +1,6 @@ +import type { MediaFullscreenCapability } from '@videojs/media'; import type { WebKitDocument, WebKitFullscreenElement, WebKitVideoElement } from '@videojs/utils/dom'; import { isFunction } from '@videojs/utils/predicate'; -import type { MediaFullscreenCapability } from '../../core/media/types'; export function isFullscreenEnabled() { const doc = document as WebKitDocument; diff --git a/packages/core/src/dom/presentation/pip.ts b/packages/core/src/dom/presentation/pip.ts index 1418decf..c18dbf1e 100644 --- a/packages/core/src/dom/presentation/pip.ts +++ b/packages/core/src/dom/presentation/pip.ts @@ -1,6 +1,6 @@ +import type { MediaPictureInPictureCapability } from '@videojs/media'; import type { WebKitVideoElement } from '@videojs/utils/dom'; import { isFunction } from '@videojs/utils/predicate'; -import type { MediaPictureInPictureCapability } from '../../core/media/types'; export function isPictureInPictureEnabled() { if (document.pictureInPictureEnabled) { diff --git a/packages/core/src/dom/presentation/remote-playback.ts b/packages/core/src/dom/presentation/remote-playback.ts index 56d226e4..54bb6e7c 100644 --- a/packages/core/src/dom/presentation/remote-playback.ts +++ b/packages/core/src/dom/presentation/remote-playback.ts @@ -1,7 +1,6 @@ +import type { MediaRemotePlaybackCapability } from '@videojs/media'; import { isObject } from '@videojs/utils/predicate'; -import type { MediaRemotePlaybackCapability } from '../../core/media/types'; - function resolveRemote(media: EventTarget): MediaRemotePlaybackCapability['remote'] | undefined { const target = media as EventTarget & { remote?: unknown }; if (isObject(target.remote) && 'state' in target.remote && 'prompt' in target.remote) { diff --git a/packages/core/src/dom/store/features/audio-track.ts b/packages/core/src/dom/store/features/audio-track.ts index e14fa489..60f9c4e0 100644 --- a/packages/core/src/dom/store/features/audio-track.ts +++ b/packages/core/src/dom/store/features/audio-track.ts @@ -1,7 +1,6 @@ +import type { AudioTrackLike, AudioTrackListLike, MediaAudioTrack, MediaAudioTrackState } from '@videojs/media'; +import { isMediaAudioTrackCapable } from '@videojs/media'; import { listen } from '@videojs/utils/dom'; -import { isMediaAudioTrackCapable } from '../../../core/media/predicate'; -import type { MediaAudioTrack, MediaAudioTrackState } from '../../../core/media/state'; -import type { AudioTrackLike, AudioTrackListLike } from '../../../core/media/types'; import { definePlayerFeature } from '../../feature'; function getTrackValue(track: AudioTrackLike, index: number): string { diff --git a/packages/core/src/dom/store/features/buffer.ts b/packages/core/src/dom/store/features/buffer.ts index 7d132297..e3874679 100644 --- a/packages/core/src/dom/store/features/buffer.ts +++ b/packages/core/src/dom/store/features/buffer.ts @@ -1,6 +1,6 @@ +import type { MediaBufferState } from '@videojs/media'; +import { isMediaBufferCapable } from '@videojs/media'; import { listen, serializeTimeRanges } from '@videojs/utils/dom'; -import { isMediaBufferCapable } from '../../../core/media/predicate'; -import type { MediaBufferState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; export const bufferFeature = definePlayerFeature({ diff --git a/packages/core/src/dom/store/features/controls.ts b/packages/core/src/dom/store/features/controls.ts index 79cd25be..30ea682c 100644 --- a/packages/core/src/dom/store/features/controls.ts +++ b/packages/core/src/dom/store/features/controls.ts @@ -1,7 +1,7 @@ +import type { MediaControlsState } from '@videojs/media'; +import { isMediaPauseCapable, isMediaRemotePlaybackCapable } from '@videojs/media'; import { listen } from '@videojs/utils/dom'; import { isNull } from '@videojs/utils/predicate'; -import { isMediaPauseCapable, isMediaRemotePlaybackCapable } from '../../../core/media/predicate'; -import type { MediaControlsState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; import { findGestureCoordinator } from '../../gesture/coordinator'; import { isRemotePlaybackConnected, isRemotePlaybackConnecting } from '../../presentation/remote-playback'; diff --git a/packages/core/src/dom/store/features/error.ts b/packages/core/src/dom/store/features/error.ts index d608f8bf..cfbe5df9 100644 --- a/packages/core/src/dom/store/features/error.ts +++ b/packages/core/src/dom/store/features/error.ts @@ -1,6 +1,6 @@ +import type { MediaErrorState } from '@videojs/media'; +import { isMediaErrorCapable } from '@videojs/media'; import { listen } from '@videojs/utils/dom'; -import { isMediaErrorCapable } from '../../../core/media/predicate'; -import type { MediaErrorState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; export const errorFeature = definePlayerFeature({ diff --git a/packages/core/src/dom/store/features/fullscreen.ts b/packages/core/src/dom/store/features/fullscreen.ts index cd254f10..89744014 100644 --- a/packages/core/src/dom/store/features/fullscreen.ts +++ b/packages/core/src/dom/store/features/fullscreen.ts @@ -1,6 +1,5 @@ +import type { MediaFullscreenState } from '@videojs/media'; import { listen, type WebKitVideoElement } from '@videojs/utils/dom'; - -import type { MediaFullscreenState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; import { exitFullscreen, isFullscreen, isFullscreenEnabled, requestFullscreen } from '../../presentation/fullscreen'; import { exitPictureInPicture, isPictureInPicture } from '../../presentation/pip'; diff --git a/packages/core/src/dom/store/features/live.ts b/packages/core/src/dom/store/features/live.ts index eb83374b..e9e9a1ff 100644 --- a/packages/core/src/dom/store/features/live.ts +++ b/packages/core/src/dom/store/features/live.ts @@ -1,6 +1,6 @@ +import type { MediaLiveState } from '@videojs/media'; +import { isMediaLiveCapable } from '@videojs/media'; import { listen } from '@videojs/utils/dom'; -import { isMediaLiveCapable } from '../../../core/media/predicate'; -import type { MediaLiveState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; /** diff --git a/packages/core/src/dom/store/features/pip.ts b/packages/core/src/dom/store/features/pip.ts index 8385447a..68bc5a92 100644 --- a/packages/core/src/dom/store/features/pip.ts +++ b/packages/core/src/dom/store/features/pip.ts @@ -1,6 +1,5 @@ +import type { MediaPictureInPictureState } from '@videojs/media'; import { listen, type WebKitVideoElement } from '@videojs/utils/dom'; - -import type { MediaPictureInPictureState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; import { exitFullscreen, isFullscreen } from '../../presentation/fullscreen'; import { diff --git a/packages/core/src/dom/store/features/playback-rate.ts b/packages/core/src/dom/store/features/playback-rate.ts index 53b1a434..3724c19b 100644 --- a/packages/core/src/dom/store/features/playback-rate.ts +++ b/packages/core/src/dom/store/features/playback-rate.ts @@ -1,6 +1,6 @@ +import type { MediaPlaybackRateState } from '@videojs/media'; +import { isMediaPlaybackRateCapable } from '@videojs/media'; import { listen } from '@videojs/utils/dom'; -import { isMediaPlaybackRateCapable } from '../../../core/media/predicate'; -import type { MediaPlaybackRateState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; const DEFAULT_RATES: readonly number[] = [0.2, 0.5, 0.7, 1, 1.2, 1.5, 1.7, 2]; diff --git a/packages/core/src/dom/store/features/playback.ts b/packages/core/src/dom/store/features/playback.ts index 4b6b6023..d7dfcfa6 100644 --- a/packages/core/src/dom/store/features/playback.ts +++ b/packages/core/src/dom/store/features/playback.ts @@ -1,6 +1,6 @@ +import type { MediaPlaybackState } from '@videojs/media'; +import { isMediaPauseCapable, isMediaSeekCapable, isMediaSourceCapable } from '@videojs/media'; import { listen } from '@videojs/utils/dom'; -import { isMediaPauseCapable, isMediaSeekCapable, isMediaSourceCapable } from '../../../core/media/predicate'; -import type { MediaPlaybackState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; export const playbackFeature = definePlayerFeature({ diff --git a/packages/core/src/dom/store/features/presets.ts b/packages/core/src/dom/store/features/presets.ts index ef2d0826..3919e6bb 100644 --- a/packages/core/src/dom/store/features/presets.ts +++ b/packages/core/src/dom/store/features/presets.ts @@ -4,7 +4,7 @@ import type { LiveAudioFeatures, LiveVideoFeatures, VideoFeatures, -} from '../../media/types'; +} from '../../player'; import { audioTrackFeature } from './audio-track'; import { bufferFeature } from './buffer'; import { controlsFeature } from './controls'; diff --git a/packages/core/src/dom/store/features/quality.ts b/packages/core/src/dom/store/features/quality.ts index e043dee5..7a27c100 100644 --- a/packages/core/src/dom/store/features/quality.ts +++ b/packages/core/src/dom/store/features/quality.ts @@ -1,7 +1,11 @@ +import type { + MediaQualityState, + MediaVideoRendition, + VideoRenditionLike, + VideoRenditionListLike, +} from '@videojs/media'; +import { isMediaVideoDimensionsCapable, isMediaVideoRenditionCapable } from '@videojs/media'; import { listen } from '@videojs/utils/dom'; -import { isMediaVideoDimensionsCapable, isMediaVideoRenditionCapable } from '../../../core/media/predicate'; -import type { MediaQualityState, MediaVideoRendition } from '../../../core/media/state'; -import type { VideoRenditionLike, VideoRenditionListLike } from '../../../core/media/types'; import { definePlayerFeature } from '../../feature'; const QUALITY_AUTO_VALUE = 'auto'; diff --git a/packages/core/src/dom/store/features/remote-playback.ts b/packages/core/src/dom/store/features/remote-playback.ts index 9afe8d4a..f1c16665 100644 --- a/packages/core/src/dom/store/features/remote-playback.ts +++ b/packages/core/src/dom/store/features/remote-playback.ts @@ -1,6 +1,6 @@ +import type { MediaRemotePlaybackState, RemotePlaybackConnectionState } from '@videojs/media'; +import { isMediaRemotePlaybackCapable } from '@videojs/media'; import { isWebKitAirPlayCapable, listen, type WebkitAvailabilityEvent } from '@videojs/utils/dom'; -import { isMediaRemotePlaybackCapable } from '../../../core/media/predicate'; -import type { MediaRemotePlaybackState, RemotePlaybackConnectionState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; import { exitFullscreen, isFullscreen } from '../../presentation/fullscreen'; import { isRemotePlaybackConnected, requestRemotePlayback } from '../../presentation/remote-playback'; diff --git a/packages/core/src/dom/store/features/source.ts b/packages/core/src/dom/store/features/source.ts index c93d1f9d..7852a963 100644 --- a/packages/core/src/dom/store/features/source.ts +++ b/packages/core/src/dom/store/features/source.ts @@ -1,6 +1,6 @@ +import type { MediaSourceState } from '@videojs/media'; +import { isMediaSourceCapable } from '@videojs/media'; import { listen } from '@videojs/utils/dom'; -import { isMediaSourceCapable } from '../../../core/media/predicate'; -import type { MediaSourceState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; export const sourceFeature = definePlayerFeature({ diff --git a/packages/core/src/dom/store/features/stream-type.ts b/packages/core/src/dom/store/features/stream-type.ts index 012ca3ee..39f23122 100644 --- a/packages/core/src/dom/store/features/stream-type.ts +++ b/packages/core/src/dom/store/features/stream-type.ts @@ -1,7 +1,12 @@ +import type { MediaStreamTypeState } from '@videojs/media'; +import { + isMediaBufferCapable, + isMediaSeekCapable, + isMediaStreamTypeCapable, + type MediaStreamType, + MediaStreamTypes, +} from '@videojs/media'; import { listen } from '@videojs/utils/dom'; -import { isMediaBufferCapable, isMediaSeekCapable, isMediaStreamTypeCapable } from '../../../core/media/predicate'; -import type { MediaStreamTypeState } from '../../../core/media/state'; -import { type MediaStreamType, MediaStreamTypes } from '../../../core/media/types'; import { definePlayerFeature } from '../../feature'; export const streamTypeFeature = definePlayerFeature({ diff --git a/packages/core/src/dom/store/features/tests/audio-track.test.ts b/packages/core/src/dom/store/features/tests/audio-track.test.ts index 814d99b8..07af7fd2 100644 --- a/packages/core/src/dom/store/features/tests/audio-track.test.ts +++ b/packages/core/src/dom/store/features/tests/audio-track.test.ts @@ -1,8 +1,7 @@ +import type { AudioTrackLike } from '@videojs/media'; import { createStore } from '@videojs/store'; import { describe, expect, it } from 'vitest'; - -import type { AudioTrackLike } from '../../../../core/media/types'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { audioTrackFeature } from '../audio-track'; class TestAudioTrackList extends EventTarget { diff --git a/packages/core/src/dom/store/features/tests/buffer.test.ts b/packages/core/src/dom/store/features/tests/buffer.test.ts index bcef6d48..61a11c6d 100644 --- a/packages/core/src/dom/store/features/tests/buffer.test.ts +++ b/packages/core/src/dom/store/features/tests/buffer.test.ts @@ -1,6 +1,6 @@ import { createStore } from '@videojs/store'; import { describe, expect, it } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo, createTimeRanges } from '../../../tests/test-helpers'; import { bufferFeature } from '../buffer'; diff --git a/packages/core/src/dom/store/features/tests/controls.test.ts b/packages/core/src/dom/store/features/tests/controls.test.ts index 04bc3625..3aa6e70c 100644 --- a/packages/core/src/dom/store/features/tests/controls.test.ts +++ b/packages/core/src/dom/store/features/tests/controls.test.ts @@ -1,6 +1,6 @@ import { createStore, flush } from '@videojs/store'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo } from '../../../tests/test-helpers'; import { controlsFeature } from '../controls'; diff --git a/packages/core/src/dom/store/features/tests/fullscreen.test.ts b/packages/core/src/dom/store/features/tests/fullscreen.test.ts index b7ec48e7..02942689 100644 --- a/packages/core/src/dom/store/features/tests/fullscreen.test.ts +++ b/packages/core/src/dom/store/features/tests/fullscreen.test.ts @@ -1,8 +1,8 @@ +import { HTMLVideoElementHost } from '@videojs/media/dom/video-host'; import { createStore } from '@videojs/store'; import type { WebKitVideoElement } from '@videojs/utils/dom'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; -import { HTMLVideoElementHost } from '../../../media/video-host'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo } from '../../../tests/test-helpers'; import { selectFullscreen } from '../../selectors'; import { fullscreenFeature } from '../fullscreen'; diff --git a/packages/core/src/dom/store/features/tests/live.test.ts b/packages/core/src/dom/store/features/tests/live.test.ts index e4d997de..a2c25744 100644 --- a/packages/core/src/dom/store/features/tests/live.test.ts +++ b/packages/core/src/dom/store/features/tests/live.test.ts @@ -1,6 +1,6 @@ import { createStore } from '@videojs/store'; import { describe, expect, it } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo } from '../../../tests/test-helpers'; import { liveFeature } from '../live'; diff --git a/packages/core/src/dom/store/features/tests/orientation-lock.test.ts b/packages/core/src/dom/store/features/tests/orientation-lock.test.ts index befe08f3..0cca46a9 100644 --- a/packages/core/src/dom/store/features/tests/orientation-lock.test.ts +++ b/packages/core/src/dom/store/features/tests/orientation-lock.test.ts @@ -1,7 +1,7 @@ import { createStore } from '@videojs/store'; import type { Mock } from 'vitest'; import { afterEach, describe, expect, it, vi } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo } from '../../../tests/test-helpers'; import { orientationLockFeature } from '../orientation-lock'; diff --git a/packages/core/src/dom/store/features/tests/pip.test.ts b/packages/core/src/dom/store/features/tests/pip.test.ts index 2d9f9543..4237fae7 100644 --- a/packages/core/src/dom/store/features/tests/pip.test.ts +++ b/packages/core/src/dom/store/features/tests/pip.test.ts @@ -1,8 +1,8 @@ +import { HTMLVideoElementHost } from '@videojs/media/dom/video-host'; import { createStore } from '@videojs/store'; import type { WebKitVideoElement } from '@videojs/utils/dom'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; -import { HTMLVideoElementHost } from '../../../media/video-host'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo } from '../../../tests/test-helpers'; import { pipFeature } from '../pip'; diff --git a/packages/core/src/dom/store/features/tests/playback.test.ts b/packages/core/src/dom/store/features/tests/playback.test.ts index 171783bd..d51c31de 100644 --- a/packages/core/src/dom/store/features/tests/playback.test.ts +++ b/packages/core/src/dom/store/features/tests/playback.test.ts @@ -1,6 +1,6 @@ import { createStore } from '@videojs/store'; import { describe, expect, it, vi } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo } from '../../../tests/test-helpers'; import { playbackFeature } from '../playback'; diff --git a/packages/core/src/dom/store/features/tests/quality.test.ts b/packages/core/src/dom/store/features/tests/quality.test.ts index c965721d..85781c0f 100644 --- a/packages/core/src/dom/store/features/tests/quality.test.ts +++ b/packages/core/src/dom/store/features/tests/quality.test.ts @@ -1,8 +1,7 @@ +import type { VideoRenditionLike } from '@videojs/media'; import { createStore } from '@videojs/store'; import { describe, expect, it } from 'vitest'; - -import type { VideoRenditionLike } from '../../../../core/media/types'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { qualityFeature } from '../quality'; class TestRenditionList extends EventTarget { diff --git a/packages/core/src/dom/store/features/tests/remote-playback.test.ts b/packages/core/src/dom/store/features/tests/remote-playback.test.ts index 2dd5acb9..47cdb087 100644 --- a/packages/core/src/dom/store/features/tests/remote-playback.test.ts +++ b/packages/core/src/dom/store/features/tests/remote-playback.test.ts @@ -1,6 +1,7 @@ +import type { Media } from '@videojs/media/dom'; import type { AttachContext } from '@videojs/store'; import { describe, expect, it, vi } from 'vitest'; -import type { Media, PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { remotePlaybackFeature } from '../remote-playback'; type RemotePlaybackState = ReturnType; diff --git a/packages/core/src/dom/store/features/tests/source.test.ts b/packages/core/src/dom/store/features/tests/source.test.ts index c2ca97bb..96df79e4 100644 --- a/packages/core/src/dom/store/features/tests/source.test.ts +++ b/packages/core/src/dom/store/features/tests/source.test.ts @@ -1,6 +1,6 @@ import { combine, createStore } from '@videojs/store'; import { describe, expect, it, vi } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo } from '../../../tests/test-helpers'; import { sourceFeature } from '../source'; import { timeFeature } from '../time'; diff --git a/packages/core/src/dom/store/features/tests/stream-type.test.ts b/packages/core/src/dom/store/features/tests/stream-type.test.ts index 45a2e1d2..6edce8f9 100644 --- a/packages/core/src/dom/store/features/tests/stream-type.test.ts +++ b/packages/core/src/dom/store/features/tests/stream-type.test.ts @@ -1,7 +1,7 @@ +import { type MediaStreamType, MediaStreamTypes } from '@videojs/media'; import { createStore } from '@videojs/store'; import { describe, expect, it } from 'vitest'; -import { type MediaStreamType, MediaStreamTypes } from '../../../../core/media/types'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo } from '../../../tests/test-helpers'; import { streamTypeFeature } from '../stream-type'; diff --git a/packages/core/src/dom/store/features/tests/text-track.test.ts b/packages/core/src/dom/store/features/tests/text-track.test.ts index 001c081f..1c925e23 100644 --- a/packages/core/src/dom/store/features/tests/text-track.test.ts +++ b/packages/core/src/dom/store/features/tests/text-track.test.ts @@ -1,7 +1,6 @@ import { createStore } from '@videojs/store'; import { describe, expect, it } from 'vitest'; - -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { textTrackFeature } from '../text-track'; /** diff --git a/packages/core/src/dom/store/features/tests/time.test.ts b/packages/core/src/dom/store/features/tests/time.test.ts index b1c1960a..551d59cb 100644 --- a/packages/core/src/dom/store/features/tests/time.test.ts +++ b/packages/core/src/dom/store/features/tests/time.test.ts @@ -1,6 +1,6 @@ import { createStore } from '@videojs/store'; import { describe, expect, it } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo, createTimeRanges } from '../../../tests/test-helpers'; import { timeFeature } from '../time'; diff --git a/packages/core/src/dom/store/features/tests/volume.test.ts b/packages/core/src/dom/store/features/tests/volume.test.ts index 498e2c85..5374ccc4 100644 --- a/packages/core/src/dom/store/features/tests/volume.test.ts +++ b/packages/core/src/dom/store/features/tests/volume.test.ts @@ -1,6 +1,6 @@ import { createStore } from '@videojs/store'; import { describe, expect, it } from 'vitest'; -import type { PlayerTarget } from '../../../media/types'; +import type { PlayerTarget } from '../../../player'; import { createMockVideo } from '../../../tests/test-helpers'; import { volumeFeature } from '../volume'; diff --git a/packages/core/src/dom/store/features/text-track.ts b/packages/core/src/dom/store/features/text-track.ts index 0d601b04..2a82aad1 100644 --- a/packages/core/src/dom/store/features/text-track.ts +++ b/packages/core/src/dom/store/features/text-track.ts @@ -1,7 +1,6 @@ +import type { MediaTextCue, MediaTextTrack, MediaTextTrackState, TextTrackLike } from '@videojs/media'; +import { isMediaTextTrackCapable, isQuerySelectorAllCapable } from '@videojs/media'; import { findTrackElement, getTextTrackList, isCaptionOrSubtitleTrack, listen } from '@videojs/utils/dom'; -import { isMediaTextTrackCapable, isQuerySelectorAllCapable } from '../../../core/media/predicate'; -import type { MediaTextCue, MediaTextTrack, MediaTextTrackState } from '../../../core/media/state'; -import type { TextTrackLike } from '../../../core/media/types'; import { definePlayerFeature } from '../../feature'; function getTrackId(track: TextTrackLike, index: number): string { diff --git a/packages/core/src/dom/store/features/time.ts b/packages/core/src/dom/store/features/time.ts index 012df5cd..12e01f2e 100644 --- a/packages/core/src/dom/store/features/time.ts +++ b/packages/core/src/dom/store/features/time.ts @@ -1,12 +1,7 @@ +import type { MediaTimeState } from '@videojs/media'; +import { hasMetadata, isMediaBufferCapable, isMediaSeekCapable, isMediaSourceCapable } from '@videojs/media'; import { listen, onEvent } from '@videojs/utils/dom'; import { noop } from '@videojs/utils/function'; -import { - hasMetadata, - isMediaBufferCapable, - isMediaSeekCapable, - isMediaSourceCapable, -} from '../../../core/media/predicate'; -import type { MediaTimeState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; import { signalKeys } from '../signal-keys'; diff --git a/packages/core/src/dom/store/features/volume.ts b/packages/core/src/dom/store/features/volume.ts index c845bc19..9a2a957f 100644 --- a/packages/core/src/dom/store/features/volume.ts +++ b/packages/core/src/dom/store/features/volume.ts @@ -1,7 +1,6 @@ +import type { MediaFeatureAvailability, MediaVolumeState } from '@videojs/media'; +import { isMediaVolumeCapable } from '@videojs/media'; import { listen } from '@videojs/utils/dom'; -import { isMediaVolumeCapable } from '../../../core/media/predicate'; -import type { MediaVolumeState } from '../../../core/media/state'; -import type { MediaFeatureAvailability } from '../../../core/media/types'; import { definePlayerFeature } from '../../feature'; /** Volume to restore when unmuting at zero. */ diff --git a/packages/core/src/dom/tests/feature.test.ts b/packages/core/src/dom/tests/feature.test.ts index 00388e14..99b68f33 100644 --- a/packages/core/src/dom/tests/feature.test.ts +++ b/packages/core/src/dom/tests/feature.test.ts @@ -1,7 +1,7 @@ import { createSelector, type StateContext } from '@videojs/store'; import { describe, expect, it } from 'vitest'; import { definePlayerFeature } from '../feature'; -import type { PlayerTarget } from '../media/types'; +import type { PlayerTarget } from '../player'; const stateContext = { target: () => { diff --git a/packages/core/src/dom/tsconfig.json b/packages/core/src/dom/tsconfig.json index 2214d7bd..e3330927 100644 --- a/packages/core/src/dom/tsconfig.json +++ b/packages/core/src/dom/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "composite": true, "lib": ["ES2022", "DOM", "DOM.Iterable"], - "types": ["chromecast-caf-sender"], "declarationDir": "../../types/dom", "useDefineForClassFields": false }, diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 549ac62a..2f795b24 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -5,6 +5,6 @@ "lib": ["ES2022", "WebWorker"], "declarationDir": "types" }, - "references": [{ "path": "../utils" }, { "path": "../store" }], + "references": [{ "path": "../utils" }, { "path": "../store" }, { "path": "../media" }], "include": ["src/core/**/*.ts"] } diff --git a/packages/core/tsdown.config.ts b/packages/core/tsdown.config.ts index 256e01a7..fed58b0b 100644 --- a/packages/core/tsdown.config.ts +++ b/packages/core/tsdown.config.ts @@ -1,7 +1,6 @@ import type { UserConfig } from 'tsdown'; import { defineConfig } from 'tsdown'; import { type PackageBuildMode, packageBuildConfig, packageBuildModes } from '../../build/tsdown.ts'; -import packageJson from './package.json' with { type: 'json' }; import en from './src/core/i18n/locales/en.ts'; import { LOCALES, localeAliases } from './src/core/i18n/locales.ts'; @@ -19,27 +18,12 @@ const createConfig = (mode: PackageBuildMode): UserConfig => ({ ...packageBuildConfig(mode, 'neutral'), entry: { index: './src/core/index.ts', - 'media/predicate': './src/core/media/predicate.ts', i18n: './src/core/i18n/index.ts', ...localeEntries, dom: './src/dom/index.ts', - 'dom/media/media-host/index': './src/dom/media/media-host.ts', - 'dom/media/custom-media-element/index': './src/dom/media/custom-media-element/index.ts', - 'dom/media/media-played-ranges/index': './src/dom/media/media-played-ranges/index.ts', - // Media - 'dom/media/dash/index': './src/dom/media/dash/index.ts', - 'dom/media/hls-js/index': './src/dom/media/hls-js/index.ts', - 'dom/media/native-hls/index': './src/dom/media/native-hls/index.ts', - 'dom/media/simple-hls-audio-only/index': './src/dom/media/simple-hls-audio-only/index.ts', - 'dom/media/simple-hls/index': './src/dom/media/simple-hls/index.ts', - 'dom/media/vimeo/index': './src/dom/media/vimeo/index.ts', - // Components - 'dom/media/mux/index': './src/dom/media/mux/index.ts', - 'dom/media/google-cast/index': './src/dom/media/google-cast/index.ts', }, define: { __DEV__: mode === 'dev' ? 'true' : 'false', - __PLAYER_VERSION__: JSON.stringify(packageJson.version), }, }); diff --git a/packages/html/package.json b/packages/html/package.json index 654024de..1ba3d73d 100644 --- a/packages/html/package.json +++ b/packages/html/package.json @@ -165,6 +165,7 @@ "dependencies": { "@videojs/core": "workspace:*", "@videojs/element": "workspace:*", + "@videojs/media": "workspace:*", "@videojs/spf": "workspace:*", "@videojs/store": "workspace:*", "@videojs/utils": "workspace:*" diff --git a/packages/html/src/index.ts b/packages/html/src/index.ts index abe9aba1..cd1c5b43 100644 --- a/packages/html/src/index.ts +++ b/packages/html/src/index.ts @@ -1,7 +1,5 @@ // Core export * from '@videojs/core/dom'; -// Media predicates -export * from '@videojs/core/media/predicate'; export type { Destroyable, PropertyDeclaration, @@ -12,6 +10,28 @@ export type { } from '@videojs/element'; // Element — reactive primitives for users extending MediaElement export { DestroyMixin, ReactiveElement } from '@videojs/element'; +// Media predicates +export { + hasMetadata, + isMediaAudioTrackCapable, + isMediaBufferCapable, + isMediaErrorCapable, + isMediaLiveCapable, + isMediaPauseCapable, + isMediaPlaybackRateCapable, + isMediaRemotePlaybackCapable, + isMediaSeekCapable, + isMediaSourceCapable, + isMediaStreamTypeCapable, + isMediaTextTrackCapable, + isMediaVideoDimensionsCapable, + isMediaVideoRenditionCapable, + isMediaVolumeCapable, + isQuerySelectorAllCapable, + type NodeListLike, +} from '@videojs/media'; +// Media +export * from '@videojs/media/dom'; // Store export type { Comparator, Selector } from '@videojs/store'; export { createSelector, shallowEqual } from '@videojs/store'; diff --git a/packages/html/src/media/background-video/index.ts b/packages/html/src/media/background-video/index.ts index bf311ed5..33d4737d 100644 --- a/packages/html/src/media/background-video/index.ts +++ b/packages/html/src/media/background-video/index.ts @@ -1,91 +1 @@ -import type { Media } from '@videojs/core/dom'; -import { namedNodeMapToObject, serializeAttributes } from '@videojs/utils/dom'; -import { pick } from '@videojs/utils/object'; -import { MediaAttachMixin } from '../../store/media-attach-mixin'; - -const VideoAttributes = [ - 'autoplay', - 'controls', - 'controlslist', - 'crossorigin', - 'disablepictureinpicture', - 'disableremoteplayback', - 'loop', - 'muted', - 'playsinline', - 'preload', -] as const; - -function getTemplateHTML(attrs: Record) { - return /*html*/ ` - - - - `; -} - -// Don't extend CustomMediaMixin to save some bytes, background videos don't need the full Media API. -export class BackgroundVideo extends MediaAttachMixin(HTMLElement) { - static shadowRootOptions = { mode: 'open' as ShadowRootMode }; - static getTemplateHTML = getTemplateHTML; - static get observedAttributes() { - return ['src']; - } - - constructor() { - super(); - - if (!this.shadowRoot) { - this.attachShadow((this.constructor as typeof BackgroundVideo).shadowRootOptions); - - const attrs = { - ...namedNodeMapToObject(this.attributes), - ...(!this.hasAttribute('nomuted') && { muted: '' }), - ...(!this.hasAttribute('noloop') && { loop: '' }), - ...(!this.hasAttribute('noautoplay') && { autoplay: '' }), - playsinline: '', - disableremoteplayback: '', - disablepictureinpicture: '', - }; - - this.shadowRoot!.innerHTML = getTemplateHTML(attrs); - } - - // Neither Chrome or Firefox support setting the muted attribute - // after using document.createElement. - // Get around this by setting the muted property manually. - this.target!.muted = !this.hasAttribute('nomuted'); - } - - // Register the inner + `; +} + +// Don't extend CustomMediaMixin to save some bytes, background videos don't need the full Media API. +export class BackgroundVideo extends MediaAttachMixin(HTMLElement) { + static shadowRootOptions = { mode: 'open' as ShadowRootMode }; + static getTemplateHTML = getTemplateHTML; + static get observedAttributes() { + return ['src']; + } + + constructor() { + super(); + + if (!this.shadowRoot) { + this.attachShadow((this.constructor as typeof BackgroundVideo).shadowRootOptions); + + const attrs = { + ...namedNodeMapToObject(this.attributes), + ...(!this.hasAttribute('nomuted') && { muted: '' }), + ...(!this.hasAttribute('noloop') && { loop: '' }), + ...(!this.hasAttribute('noautoplay') && { autoplay: '' }), + playsinline: '', + disableremoteplayback: '', + disablepictureinpicture: '', + }; + + this.shadowRoot!.innerHTML = getTemplateHTML(attrs); + } + + // Neither Chrome or Firefox support setting the muted attribute + // after using document.createElement. + // Get around this by setting the muted property manually. + this.target!.muted = !this.hasAttribute('nomuted'); + } + + // Register the inner