@videts/vide 0.7.0 → 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,17 @@
1
1
  # vide
2
2
 
3
+ [![CI](https://github.com/hogekai/vide/actions/workflows/ci.yml/badge.svg)](https://github.com/hogekai/vide/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/@videts/vide)](https://www.npmjs.com/package/@videts/vide)
5
+ [![gzip](https://img.shields.io/badge/core-1.8KB-blue)](https://bundlephobia.com/package/@videts/vide)
6
+
3
7
  Modular video player library. Use only what you need.
4
8
 
9
+ **[Documentation](https://hogekai.github.io/vide/)** · **[Getting Started](https://hogekai.github.io/vide/getting-started)** · **[Demo](https://hogekai.github.io/vide/demo)**
10
+
11
+ ```html
12
+ <video src="video.mp4"></video>
13
+ ```
14
+
5
15
  ```ts
6
16
  import { createPlayer } from "@videts/vide";
7
17
  import { vast } from "@videts/vide/vast";
@@ -12,22 +22,6 @@ player.use(hls());
12
22
  player.use(vast({ tagUrl: "https://example.com/vast.xml" }));
13
23
  ```
14
24
 
15
- | Plugin | What | gzip |
16
- |--------|------|-----:|
17
- | `@videts/vide` | Core player | 1.7 KB |
18
- | `@videts/vide/vast` | VAST 4.2 ads | 1.5 KB |
19
- | `@videts/vide/vmap` | VMAP scheduling | 2.6 KB |
20
- | `@videts/vide/hls` | HLS streaming | 0.6 KB |
21
- | `@videts/vide/dash` | DASH streaming | 0.6 KB |
22
- | `@videts/vide/drm` | DRM (Widevine + FairPlay) | 0.8 KB |
23
- | `@videts/vide/ssai` | SSAI (server-side ads) | 1.4 KB |
24
- | `@videts/vide/omid` | Open Measurement | 1.7 KB |
25
- | `@videts/vide/simid` | Interactive ads | 2.4 KB |
26
- | `@videts/vide/ui` | Headless UI | 4.7 KB |
27
- | `@videts/vide/ui/theme.css` | Default theme | 3.4 KB |
28
-
29
- > HLS and DASH plugins require `hls.js` and `dashjs` as peer dependencies.
30
-
31
25
  Zero config. No data attributes. No class scanning. No side effects.
32
26
  Web standards first — if the browser can do it, we don't reinvent it.
33
27
 
@@ -41,6 +35,10 @@ npm install @videts/vide
41
35
 
42
36
  ## Quick Start
43
37
 
38
+ ```html
39
+ <video src="video.mp4"></video>
40
+ ```
41
+
44
42
  ```ts
45
43
  import { createPlayer } from "@videts/vide";
46
44
  // import type { PlayerEventMap } from "@videts/vide";
@@ -68,208 +66,31 @@ player.on("statechange", ({ from, to }) => console.log(`${from} → ${to}`));
68
66
 
69
67
  Plugins are explicit opt-in. Import only what you need.
70
68
 
71
- ### HLS Streaming
72
-
73
- ```sh
74
- npm install hls.js
75
- ```
76
-
77
- ```ts
78
- import { createPlayer } from "@videts/vide";
79
- import { hls } from "@videts/vide/hls";
80
-
81
- const player = createPlayer(document.querySelector("video")!);
82
- player.use(hls());
83
-
84
- player.src = "https://example.com/stream.m3u8";
85
- ```
86
-
87
- ```ts
88
- // Pass config directly to hls.js constructor
89
- player.use(hls({ hlsConfig: { maxBufferLength: 60 } }));
90
- ```
91
-
92
- ### DASH Streaming
93
-
94
- ```sh
95
- npm install dashjs
96
- ```
97
-
98
- ```ts
99
- import { createPlayer } from "@videts/vide";
100
- import { dash } from "@videts/vide/dash";
101
-
102
- const player = createPlayer(document.querySelector("video")!);
103
- player.use(dash());
104
-
105
- player.src = "https://example.com/stream.mpd";
106
- ```
107
-
108
- ```ts
109
- // Pass settings directly to dashjs.updateSettings()
110
- player.use(dash({ dashConfig: { streaming: { buffer: { bufferTimeDefault: 20 } } } }));
111
- ```
112
-
113
- ### DRM
114
-
115
- Widevine (Chrome/Firefox/Edge) and FairPlay (Safari/iOS). The plugin detects the browser's key system automatically — just pass the license server URL.
116
-
117
- ```ts
118
- import { createPlayer } from "@videts/vide";
119
- import { hls } from "@videts/vide/hls";
120
- import { drm } from "@videts/vide/drm";
121
-
122
- const player = createPlayer(document.querySelector("video")!);
123
- player.use(hls());
124
- player.use(drm({
125
- widevine: {
126
- licenseUrl: "https://license.example.com/widevine",
127
- },
128
- fairplay: {
129
- licenseUrl: "https://license.example.com/fairplay",
130
- certificateUrl: "https://certificate.example.com/fairplay.cer",
131
- },
132
- }));
133
-
134
- player.src = "https://example.com/encrypted-stream.m3u8";
135
- ```
136
-
137
- Works with both HLS and DASH — plugin order doesn't matter.
138
-
139
- ```ts
140
- // Custom headers for license requests (e.g. auth tokens)
141
- player.use(drm({
142
- widevine: {
143
- licenseUrl: "https://license.example.com/widevine",
144
- headers: { Authorization: "Bearer <token>" },
145
- },
146
- }));
147
- ```
148
-
149
- ### SSAI (Server-Side Ad Insertion)
150
-
151
- Detects ad breaks from HLS/DASH in-band metadata and fires standard ad events. No vendor SDK required.
152
-
153
- ```ts
154
- import { createPlayer } from "@videts/vide";
155
- import { hls } from "@videts/vide/hls";
156
- import { ssai } from "@videts/vide/ssai";
157
-
158
- const player = createPlayer(document.querySelector("video")!);
159
- player.use(hls());
160
- player.use(ssai());
161
-
162
- player.on("ad:start", ({ adId }) => console.log("ad started", adId));
163
- player.on("ad:end", ({ adId }) => console.log("ad ended", adId));
164
-
165
- player.src = "https://example.com/ssai-stream.m3u8";
166
- ```
167
-
168
- ```ts
169
- // Custom parser for vendor-specific metadata formats
170
- player.use(ssai({
171
- parser(raw) {
172
- if (raw.source === "daterange" && raw.attributes["X-MY-AD"] === "true") {
173
- return [{
174
- id: raw.attributes.ID,
175
- startTime: new Date(raw.attributes["START-DATE"]).getTime() / 1000,
176
- duration: Number(raw.attributes.DURATION || 0),
177
- trackingUrls: [raw.attributes["X-TRACKING-URL"]].filter(Boolean),
178
- }];
179
- }
180
- return [];
181
- },
182
- }));
183
- ```
184
-
185
- ### UI
186
-
187
- Headless by default — JS creates DOM and wires behavior, styling is yours.
188
- Import `theme.css` for a ready-made look, or target the BEM classes (`vide-play`, `vide-progress__bar`, …) yourself.
189
-
190
- ```ts
191
- import { createPlayer } from "@videts/vide";
192
- import { ui } from "@videts/vide/ui";
193
- import "@videts/vide/ui/theme.css"; // optional — brings default skin
194
-
195
- const player = createPlayer(document.querySelector("video")!);
196
- player.use(ui({ container: document.getElementById("player-container")! }));
197
- ```
198
-
199
- ```ts
200
- // exclude: play, progress, time, volume, fullscreen, loader, error,
201
- // bigplay, poster, keyboard, clickplay, autohide,
202
- // ad-countdown, ad-skip, ad-overlay, ad-label
203
- player.use(ui({
204
- container: el,
205
- exclude: ["volume", "fullscreen"],
206
- poster: "https://example.com/poster.jpg",
207
- }));
208
- ```
209
-
210
- Components can also be used individually:
211
-
212
- ```ts
213
- import { createPlayButton, createProgress } from "@videts/vide/ui";
214
-
215
- const play = createPlayButton();
216
- play.mount(controls);
217
- play.connect(player);
218
- ```
219
-
220
- #### UI + VAST Ads
221
-
222
- ```ts
223
- import { ui } from "@videts/vide/ui";
224
- import { vast } from "@videts/vide/vast";
225
-
226
- // UI plugin provides ad components (countdown, skip, overlay, label)
227
- // that integrate with VAST playback via getAdPlugin()
228
- const uiPlugin = ui({ container: el });
229
- player.use(uiPlugin);
230
- player.use(vast({
231
- tagUrl: "https://example.com/vast.xml",
232
- adPlugins: uiPlugin.getAdPlugin(),
233
- }));
234
- ```
235
-
236
- ### VAST Ads
237
-
238
- ```ts
239
- import { vast } from "@videts/vide/vast";
240
- player.use(vast({ tagUrl: "https://example.com/vast.xml" }));
241
- ```
242
-
243
- ### VMAP Ad Scheduling
244
-
245
- ```ts
246
- import { vmap } from "@videts/vide/vmap";
247
- player.use(vmap({ vmapUrl: "https://example.com/vmap.xml" }));
248
- ```
249
-
250
- ### OMID Viewability
251
-
252
- ```ts
253
- import { vast } from "@videts/vide/vast";
254
- import { omid } from "@videts/vide/omid";
69
+ | Plugin | What | gzip |
70
+ |--------|------|-----:|
71
+ | `@videts/vide` | Core player | 1.8 KB |
72
+ | `@videts/vide/vast` | VAST 4.2 ads | 1.6 KB |
73
+ | `@videts/vide/vmap` | VMAP scheduling | 2.6 KB |
74
+ | `@videts/vide/hls` | HLS streaming | 0.7 KB |
75
+ | `@videts/vide/dash` | DASH streaming | 0.6 KB |
76
+ | `@videts/vide/drm` | DRM (Widevine + FairPlay) | 1.7 KB |
77
+ | `@videts/vide/ssai` | SSAI (server-side ads) | 1.5 KB |
78
+ | `@videts/vide/omid` | Open Measurement | 1.7 KB |
79
+ | `@videts/vide/simid` | Interactive ads | 2.4 KB |
80
+ | `@videts/vide/ui` | Headless UI | 4.8 KB |
81
+ | `@videts/vide/ui/theme.css` | Default theme | 3.4 KB |
255
82
 
256
- player.use(vast({
257
- tagUrl: "https://example.com/vast.xml",
258
- adPlugins: () => [omid({ partner: { name: "your-company", version: "1.0.0" } })],
259
- }));
260
- ```
83
+ > HLS and DASH plugins require `hls.js` and `dashjs` as peer dependencies.
261
84
 
262
- ### SIMID Interactive Ads
85
+ See the [plugin documentation](https://hogekai.github.io/vide/plugins/hls) for usage examples and configuration options.
263
86
 
264
- ```ts
265
- import { vast } from "@videts/vide/vast";
266
- import { simid } from "@videts/vide/simid";
87
+ ## Documentation
267
88
 
268
- player.use(vast({
269
- tagUrl: "https://example.com/vast.xml",
270
- adPlugins: () => [simid({ container: document.getElementById("ad-container")! })],
271
- }));
272
- ```
89
+ - [Getting Started](https://hogekai.github.io/vide/getting-started) — install, CDN usage, basic setup
90
+ - [Plugin Guides](https://hogekai.github.io/vide/plugins/hls) — HLS, DASH, DRM, VAST, UI, and more
91
+ - [API Reference](https://hogekai.github.io/vide/api-reference/) auto-generated from TypeScript
92
+ - [Browser Support](https://hogekai.github.io/vide/browser-support) — compatibility notes
93
+ - [Demo](https://hogekai.github.io/vide/demo) — live examples
273
94
 
274
95
  ## License
275
96
 
@@ -0,0 +1 @@
1
+ var R=1e3,o=2e3,t=2001,E=2002,_=3e3,c=3001,e=4e3,n=4001,p=4002,r=4003;export{R as a,o as b,t as c,E as d,_ as e,c as f,e as g,n as h,p as i,r as j};
@@ -1,4 +1,4 @@
1
- import { e as Plugin } from '../types-BxRa9Jvl.js';
1
+ import { e as Plugin } from '../types-Cine0xi3.js';
2
2
 
3
3
  interface DashPluginOptions {
4
4
  /** dash.js MediaPlayerSettingClass — passed to updateSettings(). */
@@ -1,2 +1,2 @@
1
- var h="application/dash+xml";function m(t){try{return new URL(t,"https://placeholder.invalid").pathname.endsWith(".mpd")}catch{return t.includes(".mpd")}}function f(t){return t.toLowerCase()===h}function p(t={}){return {name:"dash",setup(e){let o=null,d=false,l={canHandle(r,n){return n&&f(n)?true:m(r)},load(r,n){this.unload(n),g(r,n);},unload(r){o&&(o.destroy(),o=null);}};function g(r,n){import('dashjs').then(s=>{if(d)return;let u=s.default,a=u.MediaPlayer().create();o=a,e.setPluginData("dash",a);let c=e.getPluginData("drm");c?.dashConfig&&a.updateSettings(c.dashConfig),t.dashConfig&&a.updateSettings(t.dashConfig),a.on(u.MediaPlayer.events.ERROR,i=>{typeof i.error=="object"&&i.error!==null?e.emit("error",{code:i.error.code,message:i.error.message}):e.emit("error",{code:0,message:`DASH error: ${String(i.error)}`});}),a.initialize(n,r,n.autoplay);}).catch(s=>{d||e.emit("error",{code:0,message:s instanceof Error?`Failed to load dashjs: ${s.message}`:"Failed to load dashjs"});});}return e.registerSourceHandler(l),()=>{d=true,l.unload(e.el);}}}}
2
- export{p as dash};
1
+ import'../chunk-DWXOYV4E.mjs';var f="application/dash+xml";function p(r){try{return new URL(r,"https://placeholder.invalid").pathname.endsWith(".mpd")}catch{return r.includes(".mpd")}}function D(r){return r.toLowerCase()===f}function P(r={}){return {name:"dash",setup(e){let o=null,d=false,l={canHandle(t,n){return n&&D(n)?true:p(t)},load(t,n){this.unload(n),h(t,n);},unload(t){o&&(o.destroy(),o=null);}};function h(t,n){import('dashjs').then(i=>{if(d)return;let u=i.default,a=u.MediaPlayer().create();o=a,e.setPluginData("dash",a);let c=e.getPluginData("drm");c?.dashConfig&&a.updateSettings(c.dashConfig),r.dashConfig&&a.updateSettings(r.dashConfig),a.on(u.MediaPlayer.events.ERROR,s=>{typeof s.error=="object"&&s.error!==null?e.emit("error",{code:s.error.code,message:s.error.message,source:"dash"}):e.emit("error",{code:3001,message:`DASH error: ${String(s.error)}`,source:"dash"});}),a.initialize(n,t,n.autoplay);}).catch(i=>{d||e.emit("error",{code:3e3,message:i instanceof Error?`Failed to load dashjs: ${i.message}`:"Failed to load dashjs",source:"dash"});});}return e.registerSourceHandler(l),()=>{d=true,l.unload(e.el);}}}}
2
+ export{P as dash};
@@ -1,4 +1,4 @@
1
- import { e as Plugin } from '../types-BxRa9Jvl.js';
1
+ import { e as Plugin } from '../types-Cine0xi3.js';
2
2
 
3
3
  /** Widevine DRM configuration. */
4
4
  interface WidevineConfig {
@@ -45,7 +45,23 @@ declare function hlsDrmConfig(input: BridgeInput): Record<string, unknown>;
45
45
  /** Generate dash.js settings fragment from resolved DRM info. */
46
46
  declare function dashDrmConfig(input: BridgeInput): Record<string, unknown>;
47
47
 
48
+ interface EmeOptions {
49
+ keySystem: KeySystem;
50
+ licenseUrl: string;
51
+ certificateUrl?: string | undefined;
52
+ headers?: Record<string, string> | undefined;
53
+ prepareLicenseRequest?: ((payload: Uint8Array) => Uint8Array | Promise<Uint8Array>) | undefined;
54
+ processLicenseResponse?: ((response: Uint8Array) => Uint8Array | Promise<Uint8Array>) | undefined;
55
+ }
56
+ /**
57
+ * Set up standalone EME (Encrypted Media Extensions) handling on a video element.
58
+ * This enables DRM-protected MP4 playback without hls.js or dash.js.
59
+ *
60
+ * Returns a cleanup function that removes listeners and closes sessions.
61
+ */
62
+ declare function setupEme(videoElement: HTMLVideoElement, options: EmeOptions, onError: (err: Error) => void): () => void;
63
+
48
64
  /** Create a DRM plugin for vide. */
49
65
  declare function drm(options: DrmPluginOptions): Plugin;
50
66
 
51
- export { type DrmPluginOptions, type FairPlayConfig, type KeySystem, type ResolvedDrmConfig, type WidevineConfig, dashDrmConfig, detectKeySystem, drm, hlsDrmConfig };
67
+ export { type DrmPluginOptions, type FairPlayConfig, type KeySystem, type ResolvedDrmConfig, type WidevineConfig, dashDrmConfig, detectKeySystem, drm, hlsDrmConfig, setupEme };
@@ -1 +1 @@
1
- function f(e){let r={licenseUrl:e.licenseUrl,serverCertificateUrl:e.certificateUrl};if(e.headers){let n=e.headers;r.licenseXhrSetup=t=>{for(let[i,o]of Object.entries(n))t.setRequestHeader(i,o);};}return {emeEnabled:true,drmSystems:{"com.apple.fps.1_0":r}}}function m(e){let r={serverURL:e.licenseUrl,serverCertificateURL:e.certificateUrl};return e.headers&&(r.httpRequestHeaders=e.headers),{streaming:{protection:{data:{"com.apple.fps.1_0":r}}}}}function p(e){let r={licenseUrl:e.licenseUrl};if(e.headers){let n=e.headers;r.licenseXhrSetup=t=>{for(let[i,o]of Object.entries(n))t.setRequestHeader(i,o);};}return {emeEnabled:true,drmSystems:{"com.widevine.alpha":r}}}function y(e){let r={serverURL:e.licenseUrl};return e.headers&&(r.httpRequestHeaders=e.headers),{streaming:{protection:{data:{"com.widevine.alpha":r}}}}}function s(e){return e.keySystem==="com.widevine.alpha"&&e.widevine?p(e.widevine):e.keySystem==="com.apple.fps.1_0"&&e.fairplay?f(e.fairplay):{}}function a(e){return e.keySystem==="com.widevine.alpha"&&e.widevine?y(e.widevine):e.keySystem==="com.apple.fps.1_0"&&e.fairplay?m(e.fairplay):{}}var l="com.apple.fps.1_0",u=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}],g=[{initDataTypes:["sinf"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}];async function d(e){for(let r of e)try{let n=r===l?g:u;return await navigator.requestMediaKeySystemAccess(r,n),r}catch{}return null}function k(e){return {name:"drm",setup(r){let n=false,t=[];return e.widevine&&t.push("com.widevine.alpha"),e.fairplay&&t.push("com.apple.fps.1_0"),t.length===0?(console.warn("[vide/drm] No DRM configuration provided"),()=>{}):(d(t).then(i=>{if(n)return;if(!i){r.emit("error",{code:0,message:"No supported DRM key system found"});return}let o={keySystem:i,widevine:e.widevine,fairplay:e.fairplay},c={keySystem:i,hlsConfig:s(o),dashConfig:a(o)};r.setPluginData("drm",c);}).catch(i=>{n||r.emit("error",{code:0,message:i instanceof Error?`DRM detection failed: ${i.message}`:"DRM detection failed"});}),()=>{n=true;})}}}export{a as dashDrmConfig,d as detectKeySystem,k as drm,s as hlsDrmConfig};
1
+ import'../chunk-DWXOYV4E.mjs';function l(e){let r={licenseUrl:e.licenseUrl,serverCertificateUrl:e.certificateUrl};if(e.headers){let t=e.headers;r.licenseXhrSetup=n=>{for(let[i,s]of Object.entries(t))n.setRequestHeader(i,s);};}return {emeEnabled:true,drmSystems:{"com.apple.fps.1_0":r}}}function g(e){let r={serverURL:e.licenseUrl,serverCertificateURL:e.certificateUrl};return e.headers&&(r.httpRequestHeaders=e.headers),{streaming:{protection:{data:{"com.apple.fps.1_0":r}}}}}function h(e){let r={licenseUrl:e.licenseUrl};if(e.headers){let t=e.headers;r.licenseXhrSetup=n=>{for(let[i,s]of Object.entries(t))n.setRequestHeader(i,s);};}return {emeEnabled:true,drmSystems:{"com.widevine.alpha":r}}}function v(e){let r={serverURL:e.licenseUrl};return e.headers&&(r.httpRequestHeaders=e.headers),{streaming:{protection:{data:{"com.widevine.alpha":r}}}}}function u(e){return e.keySystem==="com.widevine.alpha"&&e.widevine?h(e.widevine):e.keySystem==="com.apple.fps.1_0"&&e.fairplay?l(e.fairplay):{}}function y(e){return e.keySystem==="com.widevine.alpha"&&e.widevine?v(e.widevine):e.keySystem==="com.apple.fps.1_0"&&e.fairplay?g(e.fairplay):{}}var K="com.apple.fps.1_0",P=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}],U=[{initDataTypes:["sinf"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}];async function m(e){for(let r of e)try{let t=r===K?U:P;return await navigator.requestMediaKeySystemAccess(r,t),r}catch{}return null}var R="com.apple.fps.1_0",D=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}],M=[{initDataTypes:["sinf"],videoCapabilities:[{contentType:'video/mp4;codecs="avc1.42E01E"'}]}];function p(e,r,t){let n=false,i=[],s=null,a=o=>{if(n||e.mediaKeys&&e.mediaKeys!==s||!s||!o.initData)return;let f=s.createSession("temporary");i.push(f),f.generateRequest(o.initDataType,o.initData).then(()=>{},c=>{n||t(c instanceof Error?c:new Error("generateRequest failed"));}),f.addEventListener("message",c=>{n||L(c,f,r,t,()=>n);}),f.addEventListener("keystatuseschange",()=>{if(!n)for(let[,c]of f.keyStatuses)(c==="expired"||c==="internal-error")&&t(new Error(`Key status: ${c}`));});},d=r.keySystem===R?M:D;return navigator.requestMediaKeySystemAccess(r.keySystem,d).then(o=>{if(!n)return o.createMediaKeys()}).then(o=>{if(!(n||!o)&&(s=o,r.keySystem===R&&r.certificateUrl))return k(r.certificateUrl,r.headers,t,()=>n).then(f=>{if(!(n||!f))return s?.setServerCertificate(f.buffer)})}).then(()=>{n||!s||(e.mediaKeys||e.setMediaKeys(s),e.addEventListener("encrypted",a));}).catch(o=>{n||t(o instanceof Error?o:new Error("EME setup failed"));}),()=>{n=true,e.removeEventListener("encrypted",a);for(let o of i)o.close().catch(()=>{});}}async function k(e,r,t,n){try{let i=await fetch(e,r?{headers:r}:{});if(!i.ok)throw new Error(`Certificate fetch failed: ${i.status} ${i.statusText}`);let s=await i.arrayBuffer();return n()?null:new Uint8Array(s)}catch(i){return n()||t(i instanceof Error?i:new Error("Certificate fetch failed")),null}}function L(e,r,t,n,i){let s=new Uint8Array(e.message);Promise.resolve(t.prepareLicenseRequest?t.prepareLicenseRequest(s):s).then(a=>{if(!i())return fetch(t.licenseUrl,{method:"POST",body:a.buffer,...t.headers?{headers:t.headers}:{}})}).then(a=>{if(!(i()||!a)){if(!a.ok)throw new Error(`License request failed: ${a.status} ${a.statusText}`);return a.arrayBuffer()}}).then(a=>{if(i()||!a)return;let d=new Uint8Array(a);return Promise.resolve(t.processLicenseResponse?t.processLicenseResponse(d):d)}).then(a=>{if(!(i()||!a))return r.update(a.buffer)}).catch(a=>{i()||n(a instanceof Error?a:new Error("License exchange failed"));});}function B(e){return {name:"drm",setup(r){let t=false,n,i=[];return e.widevine&&i.push("com.widevine.alpha"),e.fairplay&&i.push("com.apple.fps.1_0"),i.length===0?(console.warn("[vide/drm] No DRM configuration provided"),()=>{}):(m(i).then(s=>{if(t)return;if(!s){r.emit("error",{code:4e3,message:"No supported DRM key system found",source:"drm"});return}let a={keySystem:s,widevine:e.widevine,fairplay:e.fairplay},d={keySystem:s,hlsConfig:u(a),dashConfig:y(a)};r.setPluginData("drm",d);let o=s!=="com.widevine.alpha",f=o?e.fairplay:e.widevine;if(!f)return;let c={keySystem:s,licenseUrl:f.licenseUrl,headers:f.headers,prepareLicenseRequest:f.prepareLicenseRequest,processLicenseResponse:f.processLicenseResponse};o&&(c.certificateUrl=f.certificateUrl),n=p(r.el,c,C=>{t||r.emit("error",{code:4002,message:C.message,source:"drm"});});}).catch(s=>{t||r.emit("error",{code:4001,message:s instanceof Error?`DRM detection failed: ${s.message}`:"DRM detection failed",source:"drm"});}),()=>{t=true,n?.();})}}}export{y as dashDrmConfig,m as detectKeySystem,B as drm,u as hlsDrmConfig,p as setupEme};
@@ -1,4 +1,4 @@
1
- import { e as Plugin } from '../types-BxRa9Jvl.js';
1
+ import { e as Plugin } from '../types-Cine0xi3.js';
2
2
 
3
3
  interface HlsPluginOptions {
4
4
  /** Configuration passed directly to the hls.js constructor. */
@@ -1,2 +1,2 @@
1
- var c=["application/vnd.apple.mpegurl","application/x-mpegurl"];function m(e){if(e.startsWith("data:")){let t=e.indexOf(";");return t===-1?false:c.includes(e.slice(5,t).toLowerCase())}if(e.startsWith("blob:"))return e.includes(".m3u8");try{return new URL(e,"https://placeholder.invalid").pathname.endsWith(".m3u8")}catch{return e.includes(".m3u8")}}function h(e){return c.includes(e.toLowerCase())}function L(e={}){return {name:"hls",setup(t){let r=null,a=false,u={canHandle(s,n){return n&&h(n)?true:m(s)},load(s,n){this.unload(n),p(s,n);},unload(s){r&&(r.destroy(),r=null);}};function p(s,n){import('hls.js').then(o=>{if(a)return;let l=o.default;if(!l.isSupported()){if(n.canPlayType("application/vnd.apple.mpegurl")){n.src=s;return}t.emit("error",{code:0,message:"HLS is not supported in this browser"});return}let f=t.getPluginData("drm"),g={...e.hlsConfig??{},...f?.hlsConfig??{}},i=new l(g);r=i,t.setPluginData("hls",i),i.on(l.Events.ERROR,(H,d)=>{d.fatal&&t.emit("error",{code:1,message:`HLS fatal error: ${d.type} - ${d.details}`});}),i.attachMedia(n),i.loadSource(s);}).catch(o=>{a||t.emit("error",{code:0,message:o instanceof Error?`Failed to load hls.js: ${o.message}`:"Failed to load hls.js"});});}return t.registerSourceHandler(u),()=>{a=true,u.unload(t.el);}}}}
2
- export{L as hls};
1
+ import'../chunk-DWXOYV4E.mjs';var c=["application/vnd.apple.mpegurl","application/x-mpegurl"];function L(e){if(e.startsWith("data:")){let t=e.indexOf(";");return t===-1?false:c.includes(e.slice(5,t).toLowerCase())}if(e.startsWith("blob:"))return e.includes(".m3u8");try{return new URL(e,"https://placeholder.invalid").pathname.endsWith(".m3u8")}catch{return e.includes(".m3u8")}}function P(e){return c.includes(e.toLowerCase())}function R(e={}){return {name:"hls",setup(t){let o=null,l=false,u={canHandle(s,n){return n&&P(n)?true:L(s)},load(s,n){this.unload(n),p(s,n);},unload(s){o&&(o.destroy(),o=null);}};function p(s,n){import('hls.js').then(i=>{if(l)return;let a=i.default;if(!a.isSupported()){if(n.canPlayType("application/vnd.apple.mpegurl")){n.src=s;return}t.emit("error",{code:2e3,message:"HLS is not supported in this browser",source:"hls"});return}let f=t.getPluginData("drm"),g={...e.hlsConfig??{},...f?.hlsConfig??{}},r=new a(g);o=r,t.setPluginData("hls",r),r.on(a.Events.ERROR,(E,d)=>{d.fatal&&t.emit("error",{code:2002,message:`HLS fatal error: ${d.type} - ${d.details}`,source:"hls"});}),r.attachMedia(n),r.loadSource(s);}).catch(i=>{l||t.emit("error",{code:2001,message:i instanceof Error?`Failed to load hls.js: ${i.message}`:"Failed to load hls.js",source:"hls"});});}return t.registerSourceHandler(u),()=>{l=true,u.unload(t.el);}}}}
2
+ export{R as hls};
package/dist/index.d.ts CHANGED
@@ -1,6 +1,28 @@
1
- import { P as Player } from './types-BxRa9Jvl.js';
2
- export { A as AdQuartile, E as EventBus, a as EventHandler, b as PlayerEvent, c as PlayerEventMap, d as PlayerState, e as Plugin, S as SourceHandler } from './types-BxRa9Jvl.js';
1
+ import { P as Player } from './types-Cine0xi3.js';
2
+ export { A as AdQuartile, E as EventBus, a as EventHandler, b as PlayerEvent, c as PlayerEventMap, d as PlayerState, e as Plugin, S as SourceHandler } from './types-Cine0xi3.js';
3
3
 
4
+ /** Create a vide player instance wrapping the given video element. */
4
5
  declare function createPlayer(el: HTMLVideoElement): Player;
5
6
 
6
- export { Player, createPlayer };
7
+ /** Core: HTMLMediaElement error. */
8
+ declare const ERR_MEDIA = 1000;
9
+ /** HLS: browser does not support MSE or hls.js. */
10
+ declare const ERR_HLS_UNSUPPORTED = 2000;
11
+ /** HLS: dynamic import of hls.js failed. */
12
+ declare const ERR_HLS_IMPORT = 2001;
13
+ /** HLS: fatal hls.js playback error. */
14
+ declare const ERR_HLS_FATAL = 2002;
15
+ /** DASH: dynamic import of dashjs failed. */
16
+ declare const ERR_DASH_IMPORT = 3000;
17
+ /** DASH: dashjs playback error. */
18
+ declare const ERR_DASH_PLAYBACK = 3001;
19
+ /** DRM: no supported key system found. */
20
+ declare const ERR_DRM_UNSUPPORTED = 4000;
21
+ /** DRM: key system detection failed. */
22
+ declare const ERR_DRM_DETECTION = 4001;
23
+ /** DRM: license request failed. */
24
+ declare const ERR_DRM_LICENSE = 4002;
25
+ /** DRM: certificate request failed. */
26
+ declare const ERR_DRM_CERTIFICATE = 4003;
27
+
28
+ export { ERR_DASH_IMPORT, ERR_DASH_PLAYBACK, ERR_DRM_CERTIFICATE, ERR_DRM_DETECTION, ERR_DRM_LICENSE, ERR_DRM_UNSUPPORTED, ERR_HLS_FATAL, ERR_HLS_IMPORT, ERR_HLS_UNSUPPORTED, ERR_MEDIA, Player, createPlayer };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var C={idle:["loading","error"],loading:["ready","error"],ready:["playing","loading","ad:loading","error"],playing:["paused","buffering","loading","ad:loading","ended","error"],paused:["playing","loading","ad:loading","ended","error"],buffering:["playing","loading","error"],"ad:loading":["ad:playing","playing","error"],"ad:playing":["ad:paused","playing","error"],"ad:paused":["ad:playing","playing","error"],ended:["idle","loading","error"],error:["idle","loading"]};function D(e,r){return C[e].includes(r)}function K(e){return e.readyState>=3?e.paused?"ready":"playing":e.readyState>=1?"loading":"idle"}function U(e){let r=K(e),g=new Map,v=[],p=false,f=[],i=null,y=e.getAttribute("src")??"",m=false,E=new Map;function b(t){let n=g.get(t);return n||(n=new Set,g.set(t,n)),n}function d(t,n){let a=g.get(t);if(a)for(let l of a)try{l(n);}catch(c){console.error("[vide] Event handler error:",c);}}function o(t){if(t===r)return;if(!D(r,t)){console.warn(`[vide] Invalid transition: ${r} \u2192 ${t}`);return}let n=r;r=t,d("statechange",{from:n,to:t});}function s(){return r==="ad:loading"||r==="ad:playing"||r==="ad:paused"}function S(){s()||o("loading");}function L(){r==="loading"&&o("ready");}function P(){s()||o("playing"),d("play",void 0);}function k(){s()||o("paused"),d("pause",void 0);}function w(){r==="playing"&&o("buffering");}function H(){r==="buffering"&&o("playing");}function h(){s()||o("ended"),d("ended",void 0);}function M(){d("timeupdate",{currentTime:e.currentTime,duration:e.duration});}function T(){let t=e.error;s()||o("error"),d("error",{code:t?.code??0,message:t?.message??"Unknown error"});}e.addEventListener("loadstart",S),e.addEventListener("canplay",L),e.addEventListener("play",P),e.addEventListener("pause",k),e.addEventListener("waiting",w),e.addEventListener("playing",H),e.addEventListener("ended",h),e.addEventListener("timeupdate",M),e.addEventListener("error",T);let O=new Set(["statechange","play","pause","ended","timeupdate","error","ad:start","ad:end","ad:skip","ad:click","ad:error","ad:impression","ad:loaded","ad:quartile","ad:mute","ad:unmute","ad:volumeChange","ad:fullscreen","ad:breakStart","ad:breakEnd","destroy"]);function R(){e.removeEventListener("loadstart",S),e.removeEventListener("canplay",L),e.removeEventListener("play",P),e.removeEventListener("pause",k),e.removeEventListener("waiting",w),e.removeEventListener("playing",H),e.removeEventListener("ended",h),e.removeEventListener("timeupdate",M),e.removeEventListener("error",T);}function A(){if(i||m)return;let t=e.querySelectorAll("source");for(let n of t){let a=n.getAttribute("src"),l=n.getAttribute("type")??void 0;if(a){for(let c of f)if(c.canHandle(a,l)){i=c,y=a,o("loading"),c.load(a,e);for(let j of t)j.remove();return}}}}let u={get el(){return e},get state(){return r},on(t,n){O.has(t)?b(t).add(n):e.addEventListener(t,n);},off(t,n){O.has(t)?b(t).delete(n):e.removeEventListener(t,n);},emit:d,once(t,n){let a=l=>{u.off(t,a),n(l);};u.on(t,a);},play(){return e.play()},pause(){e.pause();},get currentTime(){return e.currentTime},set currentTime(t){e.currentTime=t;},get duration(){return e.duration},set duration(t){},get volume(){return e.volume},set volume(t){e.volume=t;},get muted(){return e.muted},set muted(t){e.muted=t;},get playbackRate(){return e.playbackRate},set playbackRate(t){e.playbackRate=t;},get paused(){return e.paused},get ended(){return e.ended},get readyState(){return e.readyState},get buffered(){return e.buffered},get seekable(){return e.seekable},get seeking(){return e.seeking},get videoWidth(){return e.videoWidth},get videoHeight(){return e.videoHeight},get networkState(){return e.networkState},get loop(){return e.loop},set loop(t){e.loop=t;},get autoplay(){return e.autoplay},set autoplay(t){e.autoplay=t;},get poster(){return e.poster},set poster(t){e.poster=t;},get preload(){return e.preload},set preload(t){e.preload=t;},get defaultPlaybackRate(){return e.defaultPlaybackRate},set defaultPlaybackRate(t){e.defaultPlaybackRate=t;},get defaultMuted(){return e.defaultMuted},set defaultMuted(t){e.defaultMuted=t;},get crossOrigin(){return e.crossOrigin},set crossOrigin(t){e.crossOrigin=t;},get controls(){return e.controls},set controls(t){e.controls=t;},get src(){return y},set src(t){if(i&&(i.unload(e),i=null),m=true,y=t,!t){e.removeAttribute("src");return}for(let n of f)if(n.canHandle(t)){i=n,o("loading"),n.load(t,e);return}e.src=t;},registerSourceHandler(t){if(p){console.warn("[vide] Cannot register source handler after destroy");return}f.push(t),!m&&!i&&A();},addEventListener(t,n,a){e.addEventListener(t,n,a);},removeEventListener(t,n,a){e.removeEventListener(t,n,a);},use(t){if(p){console.warn("[vide] Cannot use plugin after destroy");return}let n=t.setup(u);n&&v.push(n);},setPluginData(t,n){E.set(t,n);},getPluginData(t){return E.get(t)},destroy(){if(!p){p=true,i&&(i.unload(e),i=null);for(let t of v)try{t();}catch(n){console.error("[vide] Plugin cleanup error:",n);}v.length=0,d("destroy",void 0),R(),g.clear(),E.clear();}}};return u._setState=o,u}export{U as createPlayer};
1
+ export{e as ERR_DASH_IMPORT,f as ERR_DASH_PLAYBACK,j as ERR_DRM_CERTIFICATE,h as ERR_DRM_DETECTION,i as ERR_DRM_LICENSE,g as ERR_DRM_UNSUPPORTED,d as ERR_HLS_FATAL,c as ERR_HLS_IMPORT,b as ERR_HLS_UNSUPPORTED,a as ERR_MEDIA}from'./chunk-DWXOYV4E.mjs';var x={idle:["loading","playing","error"],loading:["ready","playing","error"],ready:["playing","loading","ad:loading","error"],playing:["paused","buffering","loading","ad:loading","ended","error"],paused:["playing","loading","ad:loading","ended","error"],buffering:["playing","loading","error"],"ad:loading":["ad:playing","playing","error"],"ad:playing":["ad:paused","playing","error"],"ad:paused":["ad:playing","playing","error"],ended:["idle","loading","error"],error:["idle","loading"]};function B(e,r){return x[e].includes(r)}function F(e){return e.readyState>=3?e.paused?"ready":"playing":e.readyState>=1?"loading":"idle"}function $(e){let r=F(e),g=new Map,p=[],f=false,v=[],i=null,y=e.getAttribute("src")??"",E=false,m=new Map;function S(t){let n=g.get(t);return n||(n=new Set,g.set(t,n)),n}function d(t,n){let a=g.get(t);if(a)for(let l of a)try{l(n);}catch(c){console.error("[vide] Event handler error:",c);}}function o(t){if(t===r)return;if(!B(r,t)){console.warn(`[vide] Invalid transition: ${r} \u2192 ${t}`);return}let n=r;r=t,d("statechange",{from:n,to:t});}function s(){return r==="ad:loading"||r==="ad:playing"||r==="ad:paused"}function L(){!s()&&e.paused&&o("loading");}function P(){r==="loading"&&o("ready");}function R(){s()||o("playing"),d("play",void 0);}function b(){s()||o("paused"),d("pause",void 0);}function k(){r==="playing"&&o("buffering");}function H(){(r==="buffering"||r==="ready")&&o("playing");}function _(){s()||o("ended"),d("ended",void 0);}function w(){d("timeupdate",{currentTime:e.currentTime,duration:e.duration});}function T(){let t=e.error;s()||o("error"),d("error",{code:t?.code??1e3,message:t?.message??"Unknown error",source:"core"});}e.addEventListener("loadstart",L),e.addEventListener("canplay",P),e.addEventListener("play",R),e.addEventListener("pause",b),e.addEventListener("waiting",k),e.addEventListener("playing",H),e.addEventListener("ended",_),e.addEventListener("timeupdate",w),e.addEventListener("error",T);let M=new Set(["statechange","play","pause","ended","timeupdate","error","ad:start","ad:end","ad:skip","ad:click","ad:error","ad:impression","ad:loaded","ad:quartile","ad:mute","ad:unmute","ad:volumeChange","ad:fullscreen","ad:breakStart","ad:breakEnd","destroy"]);function A(){e.removeEventListener("loadstart",L),e.removeEventListener("canplay",P),e.removeEventListener("play",R),e.removeEventListener("pause",b),e.removeEventListener("waiting",k),e.removeEventListener("playing",H),e.removeEventListener("ended",_),e.removeEventListener("timeupdate",w),e.removeEventListener("error",T);}function O(){if(i||E)return;let t=e.querySelectorAll("source");for(let n of t){let a=n.getAttribute("src"),l=n.getAttribute("type")??void 0;if(a){for(let c of v)if(c.canHandle(a,l)){i=c,y=a,o("loading"),c.load(a,e);for(let D of t)D.remove();return}}}}let u={get el(){return e},get state(){return r},on(t,n){M.has(t)?S(t).add(n):e.addEventListener(t,n);},off(t,n){M.has(t)?S(t).delete(n):e.removeEventListener(t,n);},emit:d,once(t,n){let a=l=>{u.off(t,a),n(l);};u.on(t,a);},play(){return e.play()},pause(){e.pause();},get currentTime(){return e.currentTime},set currentTime(t){e.currentTime=t;},get duration(){return e.duration},set duration(t){},get volume(){return e.volume},set volume(t){e.volume=t;},get muted(){return e.muted},set muted(t){e.muted=t;},get playbackRate(){return e.playbackRate},set playbackRate(t){e.playbackRate=t;},get paused(){return e.paused},get ended(){return e.ended},get readyState(){return e.readyState},get buffered(){return e.buffered},get seekable(){return e.seekable},get seeking(){return e.seeking},get videoWidth(){return e.videoWidth},get videoHeight(){return e.videoHeight},get networkState(){return e.networkState},get loop(){return e.loop},set loop(t){e.loop=t;},get autoplay(){return e.autoplay},set autoplay(t){e.autoplay=t;},get poster(){return e.poster},set poster(t){e.poster=t;},get preload(){return e.preload},set preload(t){e.preload=t;},get defaultPlaybackRate(){return e.defaultPlaybackRate},set defaultPlaybackRate(t){e.defaultPlaybackRate=t;},get defaultMuted(){return e.defaultMuted},set defaultMuted(t){e.defaultMuted=t;},get crossOrigin(){return e.crossOrigin},set crossOrigin(t){e.crossOrigin=t;},get controls(){return e.controls},set controls(t){e.controls=t;},get src(){return y},set src(t){if(i&&(i.unload(e),i=null),E=true,y=t,!t){e.removeAttribute("src");return}for(let n of v)if(n.canHandle(t)){i=n,o("loading"),n.load(t,e);return}e.src=t;},registerSourceHandler(t){if(f){console.warn("[vide] Cannot register source handler after destroy");return}v.push(t),!E&&!i&&O();},addEventListener(t,n,a){e.addEventListener(t,n,a);},removeEventListener(t,n,a){e.removeEventListener(t,n,a);},use(t){if(f){console.warn("[vide] Cannot use plugin after destroy");return}let n=t.setup(u);n&&p.push(n);},setPluginData(t,n){m.set(t,n);},getPluginData(t){return m.get(t)},destroy(){if(!f){f=true,i&&(i.unload(e),i=null);for(let t of p)try{t();}catch(n){console.error("[vide] Plugin cleanup error:",n);}p.length=0,d("destroy",void 0),A(),g.clear(),m.clear();}}};return u._setState=o,u}export{$ as createPlayer};
@@ -1,5 +1,5 @@
1
- import { b as AdPlugin } from '../types-BryM58LE.js';
2
- import '../types-BxRa9Jvl.js';
1
+ import { b as AdPlugin } from '../types-8aPf_wxJ.js';
2
+ import '../types-Cine0xi3.js';
3
3
 
4
4
  interface OmidPluginOptions {
5
5
  /** Partner identification for the OM SDK. */
@@ -1,2 +1,2 @@
1
- function E(e,t,r){let i=true;t.adEvents.loaded(t.vastProperties),t.adEvents.impressionOccurred(),t.mediaEvents.start(r,e.el.muted?0:e.el.volume);function o(n){i&&(n.quartile==="firstQuartile"?t.mediaEvents.firstQuartile():n.quartile==="midpoint"?t.mediaEvents.midpoint():n.quartile==="thirdQuartile"&&t.mediaEvents.thirdQuartile());}function s(n){i&&(n.to==="ad:paused"?t.mediaEvents.pause():n.to==="ad:playing"&&n.from==="ad:paused"&&t.mediaEvents.resume());}function d(){i&&(i=false,t.mediaEvents.complete(),t.finish());}function a(){i&&(i=false,t.mediaEvents.skipped(),t.finish());}function u(){i&&(i=false,t.error("Ad playback error"),t.finish());}function c(){i&&(i=false,t.finish());}function l(n){i&&t.mediaEvents.volumeChange(n.volume);}function p(n){if(!i)return;let v=n.fullscreen?"fullscreen":"normal";t.mediaEvents.playerStateChange(v);}return e.on("ad:quartile",o),e.on("statechange",s),e.on("ad:end",d),e.on("ad:skip",a),e.on("ad:error",u),e.on("destroy",c),e.on("ad:volumeChange",l),e.on("ad:fullscreen",p),()=>{i=false,e.off("ad:quartile",o),e.off("statechange",s),e.off("ad:end",d),e.off("ad:skip",a),e.off("ad:error",u),e.off("destroy",c),e.off("ad:volumeChange",l),e.off("ad:fullscreen",p);}}function w(e,t){return new Promise((r,i)=>{let o=document.createElement("script");o.src=e,o.async=true;let s=setTimeout(()=>{o.remove(),i(new Error(`OM SDK script load timeout: ${e}`));},t);o.onload=()=>{clearTimeout(s),r();},o.onerror=()=>{clearTimeout(s),o.remove(),i(new Error(`OM SDK script load failed: ${e}`));},document.head.appendChild(o);})}function b(){let t=globalThis.OmidSessionClient;if(!t)return null;let r=t.default??t;return typeof r.AdSession!="function"?null:r}async function h(e,t,r){let i=Date.now();if(await w(e,r),t){let s=Date.now()-i,d=Math.max(r-s,1e3);await w(t,d);}let o=b();if(!o)throw new Error("OM SDK namespace not found after script load");return o}function P(e,t,r){let i=new e.Partner(r.partner.name,r.partner.version),o=r.verifications.filter(m=>m.resourceUrl).map(m=>new e.VerificationScriptResource(m.resourceUrl,m.vendor,m.parameters,"full")),s=new e.Context(i,o,r.contentUrl,r.customReferenceData);s.setVideoElement(t);let d=t.parentElement;d&&s.setSlotElement(d),s.setServiceWindow(window);let a=new e.AdSession(s);if(a.setCreativeType("video"),a.setImpressionType("beginToRender"),!a.isSupported())throw new Error("OM SDK session not supported in this environment");let u=false,c=false,l=null;a.registerSessionObserver(m=>{m.type==="sessionStart"&&(u=true,l&&(l(true),l=null));}),a.start();let p=new e.AdEvents(a),n=new e.MediaEvents(a),v=r.position??"standalone",f=r.skipOffset!==void 0,O=r.skipOffset??-1,S=r.isAutoPlay??true,y=new e.VastProperties(f,O,S,v);return {get adEvents(){return p},get mediaEvents(){return n},get vastProperties(){return y},get started(){return u},waitForStart(m){return u?Promise.resolve(true):new Promise(g=>{l=g,setTimeout(()=>{u||(l=null,g(false));},m);})},finish(){c||(c=true,a.finish());},error(m){a.error("video",m);}}}var A="https://pagead2.googlesyndication.com/omsdk/releases/live/omweb-v1.js";function D(e){return {name:"omid",setup(t,r){let i=r.verifications??[];if(i.length===0)return;let o=false,s=null,d=null,a=e.timeout??5e3,u=e.serviceScriptUrl??A,c={...e,serviceScriptUrl:u,verifications:i,skipOffset:r.creatives[0]?.linear?.skipOffset},l=h(u,e.sessionClientUrl,a).catch(n=>n);async function p(){if(!o)try{let n=await l;if(o)return;if(n instanceof Error)throw n;let f=P(n,t.el,c);if(d=f,o){f.finish();return}let O=await f.waitForStart(a);if(o){f.finish();return}if(!O){console.warn("[vide:omid] Session start timed out"),f.finish();return}let S=Number.isFinite(t.el.duration)?t.el.duration:0;s=E(t,f,S);}catch(n){if(o)return;console.warn("[vide:omid] Failed to initialize:",n instanceof Error?n.message:String(n)),t.emit("ad:error",{error:n instanceof Error?n:new Error(String(n))});}}return p(),()=>{o=true,s&&(s(),s=null),d&&(d.finish(),d=null);}}}}
1
+ function E(e,t,r){let n=true;t.adEvents.loaded(t.vastProperties),t.adEvents.impressionOccurred(),t.mediaEvents.start(r,e.el.muted?0:e.el.volume);function o(i){n&&(i.quartile==="firstQuartile"?t.mediaEvents.firstQuartile():i.quartile==="midpoint"?t.mediaEvents.midpoint():i.quartile==="thirdQuartile"&&t.mediaEvents.thirdQuartile());}function s(i){n&&(i.to==="ad:paused"?t.mediaEvents.pause():i.to==="ad:playing"&&i.from==="ad:paused"&&t.mediaEvents.resume());}function d(){n&&(n=false,t.mediaEvents.complete(),t.finish());}function a(){n&&(n=false,t.mediaEvents.skipped(),t.finish());}function u(){n&&(n=false,t.error("Ad playback error"),t.finish());}function c(){n&&(n=false,t.finish());}function l(i){n&&t.mediaEvents.volumeChange(i.volume);}function p(i){if(!n)return;let v=i.fullscreen?"fullscreen":"normal";t.mediaEvents.playerStateChange(v);}return e.on("ad:quartile",o),e.on("statechange",s),e.on("ad:end",d),e.on("ad:skip",a),e.on("ad:error",u),e.on("destroy",c),e.on("ad:volumeChange",l),e.on("ad:fullscreen",p),()=>{n=false,e.off("ad:quartile",o),e.off("statechange",s),e.off("ad:end",d),e.off("ad:skip",a),e.off("ad:error",u),e.off("destroy",c),e.off("ad:volumeChange",l),e.off("ad:fullscreen",p);}}function w(e,t){return new Promise((r,n)=>{let o=document.createElement("script");o.src=e,o.async=true;let s=setTimeout(()=>{o.remove(),n(new Error(`OM SDK script load timeout: ${e}`));},t);o.onload=()=>{clearTimeout(s),r();},o.onerror=()=>{clearTimeout(s),o.remove(),n(new Error(`OM SDK script load failed: ${e}`));},document.head.appendChild(o);})}function b(){let t=globalThis.OmidSessionClient;if(!t)return null;let r=t.default??t;return typeof r.AdSession!="function"?null:r}async function h(e,t,r){let n=Date.now();if(await w(e,r),t){let s=Date.now()-n,d=Math.max(r-s,1e3);await w(t,d);}let o=b();if(!o)throw new Error("OM SDK namespace not found after script load");return o}function P(e,t,r){let n=new e.Partner(r.partner.name,r.partner.version),o=r.verifications.filter(m=>m.resourceUrl).map(m=>new e.VerificationScriptResource(m.resourceUrl,m.vendor,m.parameters,"full")),s=new e.Context(n,o,r.contentUrl,r.customReferenceData);s.setVideoElement(t);let d=t.parentElement;d&&s.setSlotElement(d),s.setServiceWindow(window);let a=new e.AdSession(s);if(a.setCreativeType("video"),a.setImpressionType("beginToRender"),!a.isSupported())throw new Error("OM SDK session not supported in this environment");let u=false,c=false,l=null;a.registerSessionObserver(m=>{m.type==="sessionStart"&&(u=true,l&&(l(true),l=null));}),a.start();let p=new e.AdEvents(a),i=new e.MediaEvents(a),v=r.position??"standalone",f=r.skipOffset!==void 0,O=r.skipOffset??-1,S=r.isAutoPlay??true,y=new e.VastProperties(f,O,S,v);return {get adEvents(){return p},get mediaEvents(){return i},get vastProperties(){return y},get started(){return u},waitForStart(m){return u?Promise.resolve(true):new Promise(g=>{l=g,setTimeout(()=>{u||(l=null,g(false));},m);})},finish(){c||(c=true,a.finish());},error(m){a.error("video",m);}}}var A="https://pagead2.googlesyndication.com/omsdk/releases/live/omweb-v1.js";function D(e){return {name:"omid",setup(t,r){let n=r.verifications??[];if(n.length===0)return;let o=false,s=null,d=null,a=e.timeout??5e3,u=e.serviceScriptUrl??A,c={...e,serviceScriptUrl:u,verifications:n,skipOffset:r.creatives[0]?.linear?.skipOffset},l=h(u,e.sessionClientUrl,a).catch(i=>i);async function p(){if(!o)try{let i=await l;if(o)return;if(i instanceof Error)throw i;let f=P(i,t.el,c);if(d=f,o){f.finish();return}let O=await f.waitForStart(a);if(o){f.finish();return}if(!O){console.warn("[vide:omid] Session start timed out"),f.finish();return}let S=Number.isFinite(t.el.duration)?t.el.duration:0;s=E(t,f,S);}catch(i){if(o)return;console.warn("[vide:omid] Failed to initialize:",i instanceof Error?i.message:String(i)),t.emit("ad:error",{error:i instanceof Error?i:new Error(String(i)),source:"omid"});}}return p(),()=>{o=true,s&&(s(),s=null),d&&(d.finish(),d=null);}}}}
2
2
  export{D as omid};
@@ -1,5 +1,5 @@
1
- import { b as AdPlugin } from '../types-BryM58LE.js';
2
- import '../types-BxRa9Jvl.js';
1
+ import { b as AdPlugin } from '../types-8aPf_wxJ.js';
2
+ import '../types-Cine0xi3.js';
3
3
 
4
4
  interface SimidPluginOptions {
5
5
  /** Container element to mount the SIMID iframe into. */
@@ -1 +1 @@
1
- function k(t,r){let i=document.createElement("iframe");i.sandbox.add("allow-scripts","allow-same-origin"),i.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;border:none;display:none;pointer-events:auto;",i.src=t;let a=new MessageChannel,o=a.port1,l=()=>{i.contentWindow?.postMessage("simid:connect","*",[a.port2]);};i.addEventListener("load",l,{once:true}),r.appendChild(i);let m=false;return {iframe:i,port:o,show(){m||(i.style.display="");},destroy(){m||(m=true,i.removeEventListener("load",l),i.remove(),o.close());}}}function h(t,r,i,a){return {sessionId:t,messageId:r,timestamp:Date.now(),type:i,args:a}}function j(t,r,i,a){let o={messageId:i};return a!==void 0&&(o.value=a),h(t,r,"resolve",o)}function T(t,r,i,a,o){let l={errorCode:a};return o!==void 0&&(l.message=o),h(t,r,"reject",{messageId:i,value:l})}function b(t){if(typeof t!="object"||t===null)return null;let r=t;return typeof r.sessionId!="string"||typeof r.messageId!="number"||typeof r.timestamp!="number"||typeof r.type!="string"?null:{sessionId:r.sessionId,messageId:r.messageId,timestamp:r.timestamp,type:r.type,args:r.args}}function x(t){return t.type==="createSession"}function C(t){return t.type==="resolve"}function y(t){return t.type==="reject"}function L(t,r,i,a){let o=false,l="",m=0,f=[],d=new Map;function w(){return m++}function S(e,n){let s=w(),u=h(l,s,e,n);return r.postMessage(u),s}function g(e,n){let s=w();r.postMessage(j(l,s,e,n));}function M(e,n,s){let u=w();r.postMessage(T(l,u,e,n,s));}function P(e,n,s){return new Promise((u,c)=>{let v=S(e,n),I=setTimeout(()=>{d.delete(v),c(new Error(`SIMID timeout waiting for response to ${e}`));},i.handshakeTimeout);d.set(v,{resolve:p=>{clearTimeout(I),d.delete(v),u(p);},reject:p=>{clearTimeout(I),d.delete(v),c(p);}});})}function q(){let e=t.el.getBoundingClientRect();return {x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}function A(){let e=q();return {videoDimensions:e,creativeDimensions:e,fullscreen:!!document.fullscreenElement,fullscreenAllowed:!!document.fullscreenEnabled,variableDurationAllowed:false,skippableState:"playerHandles",version:"1.2",muted:t.muted,volume:t.volume,navigationSupport:i.policy.navigation==="new-tab"?"playerHandles":"notSupported"}}function N(){return {adParameters:"",clickThruUrl:a.creatives[0]?.linear?.clickThrough}}function O(){return {currentTime:t.el.currentTime,duration:t.el.duration,ended:t.el.ended,muted:t.muted,paused:t.el.paused,volume:t.volume,fullscreen:!!document.fullscreenElement}}function H(){let e=t.el,n=["play","pause","playing","ended","seeking","seeked","stalled"];for(let I of n){let p=()=>{o||S(`SIMID:Media:${I}`);};e.addEventListener(I,p),f.push(()=>e.removeEventListener(I,p));}let s=()=>{o||S("SIMID:Media:timeupdate",{currentTime:e.currentTime});};e.addEventListener("timeupdate",s),f.push(()=>e.removeEventListener("timeupdate",s));let u=()=>{o||S("SIMID:Media:durationchange",{duration:e.duration});};e.addEventListener("durationchange",u),f.push(()=>e.removeEventListener("durationchange",u));let c=()=>{o||S("SIMID:Media:volumechange",{volume:e.volume,muted:e.muted});};e.addEventListener("volumechange",c),f.push(()=>e.removeEventListener("volumechange",c));let v=()=>{o||S("SIMID:Media:error",{error:e.error?.code??0,message:e.error?.message??""});};e.addEventListener("error",v),f.push(()=>e.removeEventListener("error",v));}function V(e){if(o)return;if(C(e)||y(e)){let u=e.args?.messageId;if(u!==void 0){let c=d.get(u);c&&(C(e)?c.resolve(e):c.reject(new Error(`SIMID creative rejected: ${JSON.stringify(e.args)}`)));}return}let n=e.type;if(n==="SIMID:Creative:requestPause"){i.policy.allowPause?(t.pause(),g(e.messageId)):M(e.messageId,1203,"Pause not allowed");return}if(n==="SIMID:Creative:requestPlay"){i.policy.allowPlay?(t.play(),g(e.messageId)):M(e.messageId,1203,"Play not allowed");return}if(n==="SIMID:Creative:requestResize"){i.policy.allowResize?g(e.messageId):M(e.messageId,1203,"Resize not allowed");return}if(n==="SIMID:Creative:requestNavigation"){let s=e.args;i.policy.navigation==="new-tab"&&s?.uri?(window.open(s.uri,"_blank"),g(e.messageId)):M(e.messageId,1214,"Navigation not supported");return}if(n==="SIMID:Creative:getMediaState"){g(e.messageId,O());return}if(n==="SIMID:Creative:requestSkip"){g(e.messageId),t.emit("ad:skip",{adId:a.id});return}if(n==="SIMID:Creative:requestStop"){g(e.messageId),S("SIMID:Player:adStopped",{code:4}),D(),t.emit("ad:skip",{adId:a.id});return}if(n!=="SIMID:Creative:clickThru"){if(n==="SIMID:Creative:fatalError"){t.emit("ad:error",{error:new Error(`SIMID creative fatal error: ${JSON.stringify(e.args)}`)}),D();return}if(n==="SIMID:Creative:log"){let s=e.args;console.debug("[vide:simid] creative:",s?.message);return}if(n==="SIMID:Creative:reportTracking"){g(e.messageId);return}if(n==="SIMID:Creative:requestChangeVolume"){let s=e.args;s?.volume!==void 0&&(t.volume=s.volume),s?.muted!==void 0&&(t.muted=s.muted),g(e.messageId);return}if(n==="SIMID:Creative:requestFullscreen"||n==="SIMID:Creative:requestExitFullscreen"||n==="SIMID:Creative:requestChangeAdDuration"){M(e.messageId,1203,"Not supported");return}if(n==="SIMID:Creative:expandNonlinear"||n==="SIMID:Creative:collapseNonlinear"){M(e.messageId,1203,"Not supported");return}}}function R(e){let n=b(e.data);n&&V(n);}function D(){if(!o){o=true,r.removeEventListener("message",R);for(let e of f)e();f.length=0;for(let[,e]of d)e.reject(new Error("SIMID host destroyed"));d.clear();}}async function F(){r.addEventListener("message",R),r.start();let e=await new Promise((u,c)=>{let v=setTimeout(()=>{c(new Error("SIMID handshake timeout: no createSession"));},i.handshakeTimeout),I=p=>{let E=b(p.data);!E||!x(E)||(clearTimeout(v),r.removeEventListener("message",I),u(E));};r.addEventListener("message",I);});if(o)throw new Error("SIMID host destroyed during handshake");l=e.sessionId,g(e.messageId);let n=await P("SIMID:Player:init",{environmentData:A(),creativeData:N()});if(o)throw new Error("SIMID host destroyed during handshake");if(y(n))throw new Error(`SIMID creative rejected init: ${JSON.stringify(n.args)}`);let s=await P("SIMID:Player:startCreative");if(o)throw new Error("SIMID host destroyed during handshake");if(y(s))throw new Error(`SIMID creative rejected startCreative: ${JSON.stringify(s.args)}`);H();}return {start:F,destroy:D}}var z={allowPause:true,allowPlay:true,allowResize:false,navigation:"new-tab"};function G(t){return {name:"simid",setup(r,i){let a=i.creatives.flatMap(d=>d.linear?.interactiveCreativeFiles??[]).find(d=>d.apiFramework==="SIMID");if(!a)return;let o={...z,...t.policy},l=t.handshakeTimeout??5e3,m=k(a.url,t.container),f=L(r,m.port,{policy:o,handshakeTimeout:l},i);return f.start().then(()=>m.show()).catch(d=>{r.emit("ad:error",{error:d instanceof Error?d:new Error(String(d))}),m.destroy();}),()=>{f.destroy(),m.destroy();}}}}export{G as simid};
1
+ function k(t,r){let i=document.createElement("iframe");i.sandbox.add("allow-scripts","allow-same-origin"),i.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;border:none;display:none;pointer-events:auto;",i.src=t;let a=new MessageChannel,o=a.port1,l=()=>{i.contentWindow?.postMessage("simid:connect","*",[a.port2]);};i.addEventListener("load",l,{once:true}),r.appendChild(i);let m=false;return {iframe:i,port:o,show(){m||(i.style.display="");},destroy(){m||(m=true,i.removeEventListener("load",l),i.remove(),o.close());}}}function h(t,r,i,a){return {sessionId:t,messageId:r,timestamp:Date.now(),type:i,args:a}}function j(t,r,i,a){let o={messageId:i};return a!==void 0&&(o.value=a),h(t,r,"resolve",o)}function T(t,r,i,a,o){let l={errorCode:a};return o!==void 0&&(l.message=o),h(t,r,"reject",{messageId:i,value:l})}function b(t){if(typeof t!="object"||t===null)return null;let r=t;return typeof r.sessionId!="string"||typeof r.messageId!="number"||typeof r.timestamp!="number"||typeof r.type!="string"?null:{sessionId:r.sessionId,messageId:r.messageId,timestamp:r.timestamp,type:r.type,args:r.args}}function x(t){return t.type==="createSession"}function C(t){return t.type==="resolve"}function y(t){return t.type==="reject"}function L(t,r,i,a){let o=false,l="",m=0,f=[],d=new Map;function w(){return m++}function S(e,n){let s=w(),u=h(l,s,e,n);return r.postMessage(u),s}function g(e,n){let s=w();r.postMessage(j(l,s,e,n));}function M(e,n,s){let u=w();r.postMessage(T(l,u,e,n,s));}function P(e,n,s){return new Promise((u,c)=>{let v=S(e,n),I=setTimeout(()=>{d.delete(v),c(new Error(`SIMID timeout waiting for response to ${e}`));},i.handshakeTimeout);d.set(v,{resolve:p=>{clearTimeout(I),d.delete(v),u(p);},reject:p=>{clearTimeout(I),d.delete(v),c(p);}});})}function q(){let e=t.el.getBoundingClientRect();return {x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}function A(){let e=q();return {videoDimensions:e,creativeDimensions:e,fullscreen:!!document.fullscreenElement,fullscreenAllowed:!!document.fullscreenEnabled,variableDurationAllowed:false,skippableState:"playerHandles",version:"1.2",muted:t.muted,volume:t.volume,navigationSupport:i.policy.navigation==="new-tab"?"playerHandles":"notSupported"}}function N(){return {adParameters:"",clickThruUrl:a.creatives[0]?.linear?.clickThrough}}function O(){return {currentTime:t.el.currentTime,duration:t.el.duration,ended:t.el.ended,muted:t.muted,paused:t.el.paused,volume:t.volume,fullscreen:!!document.fullscreenElement}}function H(){let e=t.el,n=["play","pause","playing","ended","seeking","seeked","stalled"];for(let I of n){let p=()=>{o||S(`SIMID:Media:${I}`);};e.addEventListener(I,p),f.push(()=>e.removeEventListener(I,p));}let s=()=>{o||S("SIMID:Media:timeupdate",{currentTime:e.currentTime});};e.addEventListener("timeupdate",s),f.push(()=>e.removeEventListener("timeupdate",s));let u=()=>{o||S("SIMID:Media:durationchange",{duration:e.duration});};e.addEventListener("durationchange",u),f.push(()=>e.removeEventListener("durationchange",u));let c=()=>{o||S("SIMID:Media:volumechange",{volume:e.volume,muted:e.muted});};e.addEventListener("volumechange",c),f.push(()=>e.removeEventListener("volumechange",c));let v=()=>{o||S("SIMID:Media:error",{error:e.error?.code??0,message:e.error?.message??""});};e.addEventListener("error",v),f.push(()=>e.removeEventListener("error",v));}function V(e){if(o)return;if(C(e)||y(e)){let u=e.args?.messageId;if(u!==void 0){let c=d.get(u);c&&(C(e)?c.resolve(e):c.reject(new Error(`SIMID creative rejected: ${JSON.stringify(e.args)}`)));}return}let n=e.type;if(n==="SIMID:Creative:requestPause"){i.policy.allowPause?(t.pause(),g(e.messageId)):M(e.messageId,1203,"Pause not allowed");return}if(n==="SIMID:Creative:requestPlay"){i.policy.allowPlay?(t.play(),g(e.messageId)):M(e.messageId,1203,"Play not allowed");return}if(n==="SIMID:Creative:requestResize"){i.policy.allowResize?g(e.messageId):M(e.messageId,1203,"Resize not allowed");return}if(n==="SIMID:Creative:requestNavigation"){let s=e.args;i.policy.navigation==="new-tab"&&s?.uri?(window.open(s.uri,"_blank"),g(e.messageId)):M(e.messageId,1214,"Navigation not supported");return}if(n==="SIMID:Creative:getMediaState"){g(e.messageId,O());return}if(n==="SIMID:Creative:requestSkip"){g(e.messageId),t.emit("ad:skip",{adId:a.id});return}if(n==="SIMID:Creative:requestStop"){g(e.messageId),S("SIMID:Player:adStopped",{code:4}),D(),t.emit("ad:skip",{adId:a.id});return}if(n!=="SIMID:Creative:clickThru"){if(n==="SIMID:Creative:fatalError"){t.emit("ad:error",{error:new Error(`SIMID creative fatal error: ${JSON.stringify(e.args)}`),source:"simid"}),D();return}if(n==="SIMID:Creative:log"){let s=e.args;console.debug("[vide:simid] creative:",s?.message);return}if(n==="SIMID:Creative:reportTracking"){g(e.messageId);return}if(n==="SIMID:Creative:requestChangeVolume"){let s=e.args;s?.volume!==void 0&&(t.volume=s.volume),s?.muted!==void 0&&(t.muted=s.muted),g(e.messageId);return}if(n==="SIMID:Creative:requestFullscreen"||n==="SIMID:Creative:requestExitFullscreen"||n==="SIMID:Creative:requestChangeAdDuration"){M(e.messageId,1203,"Not supported");return}if(n==="SIMID:Creative:expandNonlinear"||n==="SIMID:Creative:collapseNonlinear"){M(e.messageId,1203,"Not supported");return}}}function R(e){let n=b(e.data);n&&V(n);}function D(){if(!o){o=true,r.removeEventListener("message",R);for(let e of f)e();f.length=0;for(let[,e]of d)e.reject(new Error("SIMID host destroyed"));d.clear();}}async function F(){r.addEventListener("message",R),r.start();let e=await new Promise((u,c)=>{let v=setTimeout(()=>{c(new Error("SIMID handshake timeout: no createSession"));},i.handshakeTimeout),I=p=>{let E=b(p.data);!E||!x(E)||(clearTimeout(v),r.removeEventListener("message",I),u(E));};r.addEventListener("message",I);});if(o)throw new Error("SIMID host destroyed during handshake");l=e.sessionId,g(e.messageId);let n=await P("SIMID:Player:init",{environmentData:A(),creativeData:N()});if(o)throw new Error("SIMID host destroyed during handshake");if(y(n))throw new Error(`SIMID creative rejected init: ${JSON.stringify(n.args)}`);let s=await P("SIMID:Player:startCreative");if(o)throw new Error("SIMID host destroyed during handshake");if(y(s))throw new Error(`SIMID creative rejected startCreative: ${JSON.stringify(s.args)}`);H();}return {start:F,destroy:D}}var z={allowPause:true,allowPlay:true,allowResize:false,navigation:"new-tab"};function G(t){return {name:"simid",setup(r,i){let a=i.creatives.flatMap(d=>d.linear?.interactiveCreativeFiles??[]).find(d=>d.apiFramework==="SIMID");if(!a)return;let o={...z,...t.policy},l=t.handshakeTimeout??5e3,m=k(a.url,t.container),f=L(r,m.port,{policy:o,handshakeTimeout:l},i);return f.start().then(()=>m.show()).catch(d=>{r.emit("ad:error",{error:d instanceof Error?d:new Error(String(d)),source:"simid"}),m.destroy();}),()=>{f.destroy(),m.destroy();}}}}export{G as simid};
@@ -1,4 +1,4 @@
1
- import { e as Plugin } from '../types-BxRa9Jvl.js';
1
+ import { e as Plugin } from '../types-Cine0xi3.js';
2
2
 
3
3
  /** Parsed ad break metadata from stream signals. */
4
4
  interface AdBreakMetadata {
@@ -1,4 +1,4 @@
1
- import { P as Player } from './types-BxRa9Jvl.js';
1
+ import { P as Player } from './types-Cine0xi3.js';
2
2
 
3
3
  interface VastResponse {
4
4
  version: string;
@@ -5,9 +5,9 @@ interface PlayerEventMap {
5
5
  from: PlayerState;
6
6
  to: PlayerState;
7
7
  };
8
- play: void;
9
- pause: void;
10
- ended: void;
8
+ play: undefined;
9
+ pause: undefined;
10
+ ended: undefined;
11
11
  timeupdate: {
12
12
  currentTime: number;
13
13
  duration: number;
@@ -15,6 +15,7 @@ interface PlayerEventMap {
15
15
  error: {
16
16
  code: number;
17
17
  message: string;
18
+ source: string;
18
19
  };
19
20
  "ad:start": {
20
21
  adId: string;
@@ -31,6 +32,7 @@ interface PlayerEventMap {
31
32
  };
32
33
  "ad:error": {
33
34
  error: Error;
35
+ source: string;
34
36
  };
35
37
  "ad:impression": {
36
38
  adId: string;
@@ -62,7 +64,7 @@ interface PlayerEventMap {
62
64
  "ad:breakEnd": {
63
65
  breakId: string | undefined;
64
66
  };
65
- destroy: void;
67
+ destroy: undefined;
66
68
  }
67
69
  type PlayerEvent = keyof PlayerEventMap;
68
70
  type EventHandler<T> = (data: T) => void;
@@ -90,7 +92,7 @@ interface SourceHandler {
90
92
  }
91
93
  interface Plugin {
92
94
  name: string;
93
- setup(player: Player): (() => void) | void;
95
+ setup(player: Player): (() => void) | undefined;
94
96
  }
95
97
  interface Player extends EventBus {
96
98
  readonly el: HTMLVideoElement;
@@ -1,5 +1,5 @@
1
- import { P as Player, d as PlayerState, e as Plugin } from '../types-BxRa9Jvl.js';
2
- import { b as AdPlugin, e as VastAd } from '../types-BryM58LE.js';
1
+ import { P as Player, d as PlayerState, e as Plugin } from '../types-Cine0xi3.js';
2
+ import { b as AdPlugin, e as VastAd } from '../types-8aPf_wxJ.js';
3
3
 
4
4
  /** A single UI component that can be independently mounted and connected. */
5
5
  interface UIComponent {
package/dist/ui/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- function b(e){return {name:"ui-ad",setup(n,t){let r=t.creatives.find(o=>o.linear)?.linear;if(r)return e.set({adId:t.id,skipOffset:r.skipOffset,clickThrough:r.clickThrough,duration:r.duration}),()=>{e.clear();}}}}function C(e){return `vide-ui--${e.replace(":","-")}`}function f(e){return e==="ad:loading"||e==="ad:playing"||e==="ad:paused"}function S(e,n){e.classList.add(C(n.state));function t({from:r,to:o}){e.classList.remove(C(r)),e.classList.add(C(o));}return n.on("statechange",t),()=>n.off("statechange",t)}function P(e){if(!Number.isFinite(e)||e<0)return "0:00";let n=Math.floor(e),t=Math.floor(n/3600),r=Math.floor(n%3600/60),o=n%60,i=t>0?String(r).padStart(2,"0"):String(r),l=String(o).padStart(2,"0");return t>0?`${t}:${i}:${l}`:`${i}:${l}`}function a(e,n){let t=document.createElement(e);return t.className=n,t}function A(){let e={current:null,set(n){e.current=n;},clear(){e.current=null;}};return e}function M(e){let n=null,t=null;function r(){if(!n||!t||!f(t.state))return;let o=e.current?.duration??(Number.isFinite(t.el.duration)?t.el.duration:0),i=t.el.currentTime,l=Math.max(0,Math.ceil(o-i));n.textContent=`Ad \xB7 ${l}s`;}return {mount(o){n=a("div","vide-ad-countdown"),o.appendChild(n);},connect(o){t=o,t.on("timeupdate",r);},destroy(){n&&(n.remove(),n=null),t&&(t.off("timeupdate",r),t=null);}}}function T(){let e=null;return {mount(n){e=a("div","vide-ad-label"),e.textContent="Ad",n.appendChild(e);},connect(n){},destroy(){e&&(e.remove(),e=null);}}}function I(){let e=null,n=null;function t(){n&&(n.el.click(),n.el.paused?Promise.resolve(n.el.play()).catch(()=>{}):n.el.pause());}return {mount(r){e=a("div","vide-ad-overlay"),r.appendChild(e);},connect(r){n=r,e&&e.addEventListener("click",t);},destroy(){e&&(e.removeEventListener("click",t),e.remove(),e=null),n=null;}}}var U="http://www.w3.org/2000/svg";function y(e,n="0 0 24 24"){let t=document.createElementNS(U,"svg");t.setAttribute("viewBox",n),t.setAttribute("width","24"),t.setAttribute("height","24"),t.setAttribute("fill","currentColor"),t.setAttribute("aria-hidden","true");for(let r of e){let o=document.createElementNS(U,"path");o.setAttribute("d",r),t.appendChild(o);}return t}function L(){return y(["M8 5v14l11-7z"])}function k(){return y(["M6 19h4V5H6v14zm8-14v14h4V5h-4z"])}function x(){return y(["M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"])}function H(){return y(["M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z"])}function V(){return y(["M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4l-1.88 1.88L12 7.76V4z"])}function w(){return y(["M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"])}function j(){return y(["M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"])}function D(){return y(["M5 18l10-6L5 6v12zm12-12v12h2V6h-2z"])}function _(e){let n=null,t=null,r=null;function o(){!r||!e.current||n?.classList.contains("vide-skip--disabled")||r.emit("ad:skip",{adId:e.current.adId});}function i(){if(!n||!t||!r||!f(r.state))return;if(!e.current||e.current.skipOffset===void 0){n.style.display="none";return}n.style.display="";let{skipOffset:u}=e.current,m=r.el.currentTime;if(m>=u)n.classList.remove("vide-skip--disabled"),t.textContent="Skip Ad";else {n.classList.add("vide-skip--disabled");let d=Math.max(0,Math.ceil(u-m));t.textContent=`Skip in ${d}s`;}}function l({to:u}){!n||!t||f(u)||(n.style.display="none",n.classList.add("vide-skip--disabled"),t.textContent="");}return {mount(u){n=a("button","vide-skip vide-skip--disabled"),n.type="button",n.setAttribute("aria-label","Skip ad"),n.style.display="none",t=a("span","vide-skip__label"),n.appendChild(t),n.appendChild(D()),u.appendChild(n);},connect(u){r=u,n&&(n.addEventListener("click",o),r.on("timeupdate",i),r.on("statechange",l));},destroy(){n&&(n.removeEventListener("click",o),n.remove(),n=null,t=null),r&&(r.off("timeupdate",i),r.off("statechange",l),r=null);}}}var J=3e3;function F(){let e=null,n=null,t=null;function r(){if(!n)return true;let d=n.state;return d==="paused"||d==="ended"||d==="idle"||d==="ready"||f(d)}function o(){e&&e.classList.remove("vide-ui--autohide");}function i(){l(),!r()&&(t=setTimeout(()=>{e&&e.classList.add("vide-ui--autohide");},J));}function l(){t!==null&&(clearTimeout(t),t=null);}function u(){o(),i();}function m({to:d}){d==="paused"||d==="ended"||d==="idle"||d==="ready"||f(d)?(l(),o()):i();}return {mount(d){e=d.closest(".vide-ui")??d;},connect(d){n=d,e&&(e.addEventListener("mousemove",u),e.addEventListener("touchstart",u),e.addEventListener("keydown",u),n.on("statechange",m),i());},destroy(){l(),e&&(e.removeEventListener("mousemove",u),e.removeEventListener("touchstart",u),e.removeEventListener("keydown",u),e.classList.remove("vide-ui--autohide"),e=null),n&&(n.off("statechange",m),n=null);}}}function G(){let e=null,n=null;function t(){if(n){if(n.state==="ended"){let o=function({to:i}){i==="ready"&&(n?.off("statechange",o),n?.play().catch(()=>{}));};n.on("statechange",o),n.el.currentTime=0,n.el.load();return}n.play().catch(()=>{});}}return {mount(r){e=a("button","vide-bigplay"),e.type="button",e.setAttribute("aria-label","Play video"),e.appendChild(L()),r.appendChild(e);},connect(r){n=r,e&&e.addEventListener("click",t);},destroy(){e&&(e.removeEventListener("click",t),e.remove(),e=null),n=null;}}}var Q=200;function N(e){let n=null,t=null,r=null,o=null;function i(){t&&(t.state==="playing"||t.state==="ad:playing"?t.pause():t.play().catch(()=>{}));}function l(){!o||e.has("fullscreen")||(document.fullscreenElement!=null?document.exitFullscreen().catch(()=>{}):o.requestFullscreen&&o.requestFullscreen().catch(()=>{}));}function u(){if(t){if(f(t.state)){t.el.click(),i();return}if(r!==null){clearTimeout(r),r=null,l();return}r=setTimeout(()=>{r=null,i();},Q);}}return {mount(m){n=a("div","vide-clickplay"),o=m.closest(".vide-ui")?.parentElement??m,m.appendChild(n);},connect(m){t=m,n&&n.addEventListener("click",u);},destroy(){r!==null&&(clearTimeout(r),r=null),n&&(n.removeEventListener("click",u),n.remove(),n=null),t=null,o=null;}}}function z(){let e=null,n=null,t=null;function r({message:o}){n&&(n.textContent=o);}return {mount(o){e=a("div","vide-error"),n=a("span","vide-error__message"),e.appendChild(n),o.appendChild(e);},connect(o){t=o,t.on("error",r);},destroy(){e&&(e.remove(),e=null,n=null),t&&(t.off("error",r),t=null);}}}function R(){let e=null,n=null,t=null;function r(){return document.fullscreenElement!=null}function o(u){e&&(t&&t.remove(),t=u?j():w(),e.appendChild(t));}function i(){n&&(r()?document.exitFullscreen().catch(()=>{}):n.requestFullscreen().catch(()=>{}));}function l(){if(!e)return;let u=r();u?(e.classList.add("vide-fullscreen--active"),e.setAttribute("aria-label","Exit fullscreen")):(e.classList.remove("vide-fullscreen--active"),e.setAttribute("aria-label","Fullscreen")),o(u);}return {mount(u){n=u.closest(".vide-ui")?.parentElement??u,e=a("button","vide-fullscreen"),e.type="button",e.setAttribute("aria-label","Fullscreen"),o(false),u.appendChild(e);},connect(){e&&(e.addEventListener("click",i),document.addEventListener("fullscreenchange",l));},destroy(){e&&(e.removeEventListener("click",i),e.remove(),e=null,t=null),document.removeEventListener("fullscreenchange",l),n=null;}}}function B(e){let n=null,t=null,{excluded:r}=e;function o(i){if(!t)return;let l=!r.has("volume"),u=!r.has("progress"),m=!r.has("fullscreen"),d=f(t.state);switch(i.key){case " ":case "k":case "K":i.preventDefault(),t.state==="playing"||t.state==="ad:playing"?t.pause():t.play().catch(()=>{});break;case "ArrowLeft":if(!u||d)return;i.preventDefault(),t.currentTime=Math.max(0,t.el.currentTime-5);break;case "ArrowRight":if(!u||d)return;i.preventDefault(),t.currentTime=Math.min(t.el.duration||0,t.el.currentTime+5);break;case "ArrowUp":if(!l)return;i.preventDefault(),t.volume=Math.min(1,t.volume+.1),t.muted&&(t.muted=false);break;case "ArrowDown":if(!l)return;i.preventDefault(),t.volume=Math.max(0,t.volume-.1);break;case "m":case "M":if(!l)return;i.preventDefault(),t.muted=!t.muted;break;case "f":case "F":if(!m)return;if(i.preventDefault(),document.fullscreenElement!=null)document.exitFullscreen().catch(()=>{});else {let c=n?.closest(".vide-ui")?.parentElement??n;c?.requestFullscreen&&c.requestFullscreen().catch(()=>{});}break;default:if(i.key.length===1&&i.key>="0"&&i.key<="9"&&u&&!d){i.preventDefault();let c=Number.parseInt(i.key,10)/10,v=t.el.duration;Number.isFinite(v)&&v>0&&(t.currentTime=c*v);}break}}return {mount(i){n=i.closest(".vide-ui")??i,n.setAttribute("tabindex","0");},connect(i){t=i,n&&n.addEventListener("keydown",o);},destroy(){n&&(n.removeEventListener("keydown",o),n.removeAttribute("tabindex"),n=null),t=null;}}}function K(){let e=null;return {mount(n){e=a("div","vide-loader");let t=a("div","vide-loader__spinner");e.appendChild(t),n.appendChild(e);},connect(n){},destroy(){e&&(e.remove(),e=null);}}}function O(){let e=null,n=null,t=null;function r(l){e&&(t&&t.remove(),t=l?k():L(),e.appendChild(t));}function o(){n&&(n.state==="playing"?n.pause():n.play().catch(()=>{}));}function i({to:l}){e&&(l==="playing"?(e.classList.add("vide-play--playing"),e.classList.remove("vide-play--paused"),e.setAttribute("aria-label","Pause"),r(true)):(l==="paused"||l==="ready"||l==="ended")&&(e.classList.remove("vide-play--playing"),e.classList.add("vide-play--paused"),e.setAttribute("aria-label","Play"),r(false)));}return {mount(l){e=a("button","vide-play vide-play--paused"),e.type="button",e.setAttribute("aria-label","Play"),r(false),l.appendChild(e);},connect(l){n=l,e&&(e.addEventListener("click",o),n.on("statechange",i));},destroy(){e&&(e.removeEventListener("click",o),e.remove(),e=null,t=null),n&&(n.off("statechange",i),n=null);}}}function $(e){let n=null;return {mount(t){n=a("div","vide-poster");let r=a("img","vide-poster__image");r.src=e.src,r.alt="",n.appendChild(r),t.appendChild(n);},connect(t){},destroy(){n&&(n.remove(),n=null);}}}function q(){let e=null,n=null,t=null,r=null,o=null,i=false;function l(s){if(!e)return 0;let p=e.getBoundingClientRect();return p.width===0?0:Math.max(0,Math.min(1,(s.clientX-p.left)/p.width))}function u(s){e&&e.style.setProperty("--vide-progress",String(s));}function m(){if(!o||!t)return;let s=o.el;if(s.buffered.length>0&&s.duration>0){let g=s.buffered.end(s.buffered.length-1)/s.duration;t.style.setProperty("--vide-progress-buffered",String(Math.min(1,g)));}}function d(){if(i||!o)return;let{currentTime:s,duration:p}=o.el;p>0&&u(s/p),m(),e&&(e.setAttribute("aria-valuenow",String(Math.floor(s))),Number.isFinite(p)&&e.setAttribute("aria-valuemax",String(Math.floor(p))));}function c(s){!o||!e||f(o.state)||(i=true,e.classList.add("vide-progress--dragging"),e.setPointerCapture(s.pointerId),u(l(s)));}function v(s){i&&u(l(s));}function h(s){if(!i||!o)return;i=false,e&&(e.classList.remove("vide-progress--dragging"),e.releasePointerCapture(s.pointerId));let p=l(s),g=o.el.duration;Number.isFinite(g)&&g>0&&(o.currentTime=p*g);}function E({to:s}){e&&(f(s)?e.classList.add("vide-progress--disabled"):e.classList.remove("vide-progress--disabled"));}return {mount(s){e=a("div","vide-progress"),e.setAttribute("role","slider"),e.setAttribute("aria-label","Seek"),e.setAttribute("aria-valuemin","0"),e.setAttribute("aria-valuemax","0"),e.setAttribute("aria-valuenow","0"),t=a("div","vide-progress__buffered"),n=a("div","vide-progress__bar"),r=a("div","vide-progress__handle"),e.appendChild(t),e.appendChild(n),e.appendChild(r),s.appendChild(e);},connect(s){o=s,e&&(o.on("timeupdate",d),o.on("statechange",E),e.addEventListener("pointerdown",c),e.addEventListener("pointermove",v),e.addEventListener("pointerup",h));},destroy(){e&&(e.removeEventListener("pointerdown",c),e.removeEventListener("pointermove",v),e.removeEventListener("pointerup",h),e.remove(),e=null,n=null,t=null,r=null),o&&(o.off("timeupdate",d),o.off("statechange",E),o=null);}}}function X(){let e=null,n=null,t=null,r=null;function o({currentTime:i,duration:l}){n&&(n.textContent=P(i)),t&&(t.textContent=P(l));}return {mount(i){e=a("div","vide-time"),n=a("span","vide-time__current");let l=a("span","vide-time__separator");t=a("span","vide-time__duration"),n.textContent="0:00",l.textContent="/",t.textContent="0:00",e.appendChild(n),e.appendChild(l),e.appendChild(t),i.appendChild(e);},connect(i){r=i,r.on("timeupdate",o);},destroy(){e&&(e.remove(),e=null,n=null,t=null),r&&(r.off("timeupdate",o),r=null);}}}function Y(){let e=null,n=null,t=null,r=null,o=false,i=null;function l(){if(!n||!r)return;i&&i.remove(),r.muted||r.volume===0?i=V():r.volume<.5?i=H():i=x(),n.appendChild(i);}function u(){if(!r||!e||!n)return;r.muted||r.volume===0?(e.classList.add("vide-volume--muted"),n.setAttribute("aria-label","Unmute")):(e.classList.remove("vide-volume--muted"),n.setAttribute("aria-label","Mute"));let p=r.muted?0:r.volume;e.style.setProperty("--vide-volume",String(p)),t&&t.setAttribute("aria-valuenow",String(Math.round(p*100))),l();}function m(s){if(!t)return 0;let p=t.getBoundingClientRect();return p.width===0?0:Math.max(0,Math.min(1,(s.clientX-p.left)/p.width))}function d(){r&&(r.muted=!r.muted);}function c(){o||u();}function v(s){if(!r||!t)return;o=true,t.setPointerCapture(s.pointerId);let p=m(s);r.volume=p,r.muted&&p>0&&(r.muted=false),u();}function h(s){if(!o||!r)return;let p=m(s);r.volume=p,r.muted&&p>0&&(r.muted=false),u();}function E(s){!o||!t||(o=false,t.releasePointerCapture(s.pointerId));}return {mount(s){e=a("div","vide-volume"),n=a("button","vide-volume__button"),n.type="button",n.setAttribute("aria-label","Mute"),t=a("div","vide-volume__slider"),t.setAttribute("role","slider"),t.setAttribute("aria-label","Volume"),t.setAttribute("aria-valuemin","0"),t.setAttribute("aria-valuemax","100"),t.setAttribute("aria-valuenow","100");let p=a("div","vide-volume__track"),g=a("div","vide-volume__filled");t.appendChild(p),t.appendChild(g),e.appendChild(n),e.appendChild(t),s.appendChild(e);},connect(s){r=s,!(!n||!t)&&(n.addEventListener("click",d),t.addEventListener("pointerdown",v),t.addEventListener("pointermove",h),t.addEventListener("pointerup",E),r.el.addEventListener("volumechange",c),u());},destroy(){n&&n.removeEventListener("click",d),t&&(t.removeEventListener("pointerdown",v),t.removeEventListener("pointermove",h),t.removeEventListener("pointerup",E)),r&&(r.el.removeEventListener("volumechange",c),r=null),e&&(e.remove(),e=null,n=null,t=null,i=null);}}}function W(e,n,t){e.mount(n),e.connect(t);}function st(e){let n=A(),t=new Set(e.exclude);return {name:"ui",setup(r){let o=document.createElement("div");o.className="vide-ui",o.setAttribute("role","region"),o.setAttribute("aria-label","Video player"),e.container.appendChild(o);let i=[];function l(c,v,h){t.has(c)||(W(v,h,r),i.push(v));}if(l("loader",K(),o),l("error",z(),o),l("bigplay",G(),o),e.poster&&l("poster",$({src:e.poster}),o),l("clickplay",N(t),o),!t.has("ad-overlay")||!t.has("ad-label")||!t.has("ad-countdown")||!t.has("ad-skip")){let c=document.createElement("div");c.className="vide-ad",o.appendChild(c),l("ad-overlay",I(),c),l("ad-label",T(),c),l("ad-countdown",M(n),c),l("ad-skip",_(n),c);}let m=document.createElement("div");m.className="vide-controls",m.addEventListener("click",c=>c.stopPropagation()),o.appendChild(m),l("play",O(),m),l("progress",q(),m),l("time",X(),m),l("volume",Y(),m),l("fullscreen",R(),m),l("autohide",F(),o),l("keyboard",B({excluded:t}),o);let d=S(o,r);return ()=>{for(let c of i)c.destroy();d(),o.remove();}},getAdPlugin(){return ()=>[b(n)]}}}
2
- export{S as connectStateClasses,M as createAdCountdown,T as createAdLabel,I as createAdOverlay,_ as createAdSkip,A as createAdUIState,F as createAutohide,G as createBigPlay,N as createClickPlay,z as createErrorDisplay,R as createFullscreen,B as createKeyboard,K as createLoader,O as createPlayButton,$ as createPoster,q as createProgress,X as createTimeDisplay,Y as createVolume,P as formatTime,f as isAdState,C as stateToClass,st as ui,b as uiAdPlugin};
1
+ function P(e){return {name:"ui-ad",setup(t,n){let r=n.creatives.find(o=>o.linear)?.linear;if(r)return e.set({adId:n.id,skipOffset:r.skipOffset,clickThrough:r.clickThrough,duration:r.duration}),()=>{e.clear();}}}}function C(e){return `vide-ui--${e.replace(":","-")}`}function f(e){return e==="ad:loading"||e==="ad:playing"||e==="ad:paused"}function S(e,t){e.classList.add(C(t.state));function n({from:r,to:o}){e.classList.remove(C(r)),e.classList.add(C(o));}return t.on("statechange",n),()=>t.off("statechange",n)}function b(e){if(!Number.isFinite(e)||e<0)return "0:00";let t=Math.floor(e),n=Math.floor(t/3600),r=Math.floor(t%3600/60),o=t%60,i=n>0?String(r).padStart(2,"0"):String(r),l=String(o).padStart(2,"0");return n>0?`${n}:${i}:${l}`:`${i}:${l}`}function u(e,t){let n=document.createElement(e);return n.className=t,n}function A(){let e={current:null,set(t){e.current=t;},clear(){e.current=null;}};return e}function M(e){let t=null,n=null;function r(){if(!t||!n||!f(n.state))return;let o=e.current?.duration??(Number.isFinite(n.el.duration)?n.el.duration:0),i=n.el.currentTime,l=Math.max(0,Math.ceil(o-i));t.textContent=`Ad \xB7 ${l}s`;}return {mount(o){t=u("div","vide-ad-countdown"),o.appendChild(t);},connect(o){n=o,n.on("timeupdate",r);},destroy(){t&&(t.remove(),t=null),n&&(n.off("timeupdate",r),n=null);}}}function T(){let e=null;return {mount(t){e=u("div","vide-ad-label"),e.textContent="Ad",t.appendChild(e);},connect(t){},destroy(){e&&(e.remove(),e=null);}}}function k(){let e=null,t=null;function n(){t&&(t.el.click(),t.el.paused?Promise.resolve(t.el.play()).catch(()=>{}):t.el.pause());}return {mount(r){e=u("div","vide-ad-overlay"),r.appendChild(e);},connect(r){t=r,e&&e.addEventListener("click",n);},destroy(){e&&(e.removeEventListener("click",n),e.remove(),e=null),t=null;}}}var x="http://www.w3.org/2000/svg";function y(e,t="0 0 24 24"){let n=document.createElementNS(x,"svg");n.setAttribute("viewBox",t),n.setAttribute("width","24"),n.setAttribute("height","24"),n.setAttribute("fill","currentColor"),n.setAttribute("aria-hidden","true");for(let r of e){let o=document.createElementNS(x,"path");o.setAttribute("d",r),n.appendChild(o);}return n}function L(){return y(["M8 5v14l11-7z"])}function I(){return y(["M6 19h4V5H6v14zm8-14v14h4V5h-4z"])}function U(){return y(["M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"])}function H(){return y(["M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z"])}function V(){return y(["M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4l-1.88 1.88L12 7.76V4z"])}function w(){return y(["M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"])}function j(){return y(["M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"])}function F(){return y(["M5 18l10-6L5 6v12zm12-12v12h2V6h-2z"])}function D(e){let t=null,n=null,r=null;function o(){!r||!e.current||t?.classList.contains("vide-skip--disabled")||r.emit("ad:skip",{adId:e.current.adId});}function i(){if(!t||!n||!r||!f(r.state))return;if(!e.current||e.current.skipOffset===void 0){t.style.display="none";return}t.style.display="";let{skipOffset:a}=e.current,m=r.el.currentTime;if(m>=a)t.classList.remove("vide-skip--disabled"),n.textContent="Skip Ad";else {t.classList.add("vide-skip--disabled");let d=Math.max(0,Math.ceil(a-m));n.textContent=`Skip in ${d}s`;}}function l({to:a}){!t||!n||f(a)||(t.style.display="none",t.classList.add("vide-skip--disabled"),n.textContent="");}return {mount(a){t=u("button","vide-skip vide-skip--disabled"),t.type="button",t.setAttribute("aria-label","Skip ad"),t.style.display="none",n=u("span","vide-skip__label"),t.appendChild(n),t.appendChild(F()),a.appendChild(t);},connect(a){r=a,t&&(t.addEventListener("click",o),r.on("timeupdate",i),r.on("statechange",l));},destroy(){t&&(t.removeEventListener("click",o),t.remove(),t=null,n=null),r&&(r.off("timeupdate",i),r.off("statechange",l),r=null);}}}var J=3e3;function _(){let e=null,t=null,n=null;function r(){if(!t)return true;let d=t.state;return d==="paused"||d==="ended"||d==="idle"||d==="ready"||f(d)}function o(){e&&e.classList.remove("vide-ui--autohide");}function i(){l(),!r()&&(n=setTimeout(()=>{e&&e.classList.add("vide-ui--autohide");},J));}function l(){n!==null&&(clearTimeout(n),n=null);}function a(){o(),i();}function m({to:d}){d==="paused"||d==="ended"||d==="idle"||d==="ready"||f(d)?(l(),o()):i();}return {mount(d){e=d.closest(".vide-ui")??d;},connect(d){t=d,e&&(e.addEventListener("mousemove",a),e.addEventListener("touchstart",a),e.addEventListener("keydown",a),t.on("statechange",m),i());},destroy(){l(),e&&(e.removeEventListener("mousemove",a),e.removeEventListener("touchstart",a),e.removeEventListener("keydown",a),e.classList.remove("vide-ui--autohide"),e=null),t&&(t.off("statechange",m),t=null);}}}function G(){let e=null,t=null;function n(){if(t){if(t.state==="ended"){let o=function({to:i}){i==="ready"&&(t?.off("statechange",o),t?.play().catch(()=>{}));};t.on("statechange",o),t.el.currentTime=0,t.el.load();return}t.play().catch(()=>{});}}return {mount(r){e=u("button","vide-bigplay"),e.type="button",e.setAttribute("aria-label","Play video"),e.appendChild(L()),r.appendChild(e);},connect(r){t=r,e&&e.addEventListener("click",n);},destroy(){e&&(e.removeEventListener("click",n),e.remove(),e=null),t=null;}}}var Q=200;function N(e){let t=null,n=null,r=null,o=null;function i(){n&&(n.state==="playing"||n.state==="ad:playing"?n.pause():n.play().catch(()=>{}));}function l(){!o||e.has("fullscreen")||(document.fullscreenElement!=null?document.exitFullscreen().catch(()=>{}):o.requestFullscreen&&o.requestFullscreen().catch(()=>{}));}function a(){if(n){if(f(n.state)){n.el.click(),i();return}if(r!==null){clearTimeout(r),r=null,l();return}r=setTimeout(()=>{r=null,i();},Q);}}return {mount(m){t=u("div","vide-clickplay"),o=m.closest(".vide-ui")?.parentElement??m,m.appendChild(t);},connect(m){n=m,t&&t.addEventListener("click",a);},destroy(){r!==null&&(clearTimeout(r),r=null),t&&(t.removeEventListener("click",a),t.remove(),t=null),n=null,o=null;}}}function z(){let e=null,t=null,n=null;function r({message:o}){t&&(t.textContent=o);}return {mount(o){e=u("div","vide-error"),t=u("span","vide-error__message"),e.appendChild(t),o.appendChild(e);},connect(o){n=o,n.on("error",r);},destroy(){e&&(e.remove(),e=null,t=null),n&&(n.off("error",r),n=null);}}}function R(){let e=null,t=null,n=null;function r(){return document.fullscreenElement!=null||document.webkitFullscreenElement!=null}function o(a){e&&(n&&n.remove(),n=a?j():w(),e.appendChild(n));}function i(){t&&(r()?typeof document.exitFullscreen=="function"?document.exitFullscreen().catch(()=>{}):typeof document.webkitExitFullscreen=="function"&&document.webkitExitFullscreen():typeof t.requestFullscreen=="function"?t.requestFullscreen().catch(()=>{}):typeof t.webkitRequestFullscreen=="function"?t.webkitRequestFullscreen():t.querySelector("video")?.webkitEnterFullscreen?.());}function l(){if(!e)return;let a=r();a?(e.classList.add("vide-fullscreen--active"),e.setAttribute("aria-label","Exit fullscreen")):(e.classList.remove("vide-fullscreen--active"),e.setAttribute("aria-label","Fullscreen")),o(a);}return {mount(a){t=a.closest(".vide-ui")?.parentElement??a,e=u("button","vide-fullscreen"),e.type="button",e.setAttribute("aria-label","Fullscreen"),o(false),a.appendChild(e);},connect(){e&&(e.addEventListener("click",i),document.addEventListener("fullscreenchange",l),document.addEventListener("webkitfullscreenchange",l));},destroy(){e&&(e.removeEventListener("click",i),e.remove(),e=null,n=null),document.removeEventListener("fullscreenchange",l),document.removeEventListener("webkitfullscreenchange",l),t=null;}}}function B(e){let t=null,n=null,{excluded:r}=e;function o(i){if(!n)return;let l=!r.has("volume"),a=!r.has("progress"),m=!r.has("fullscreen"),d=f(n.state);switch(i.key){case " ":case "k":case "K":i.preventDefault(),n.state==="playing"||n.state==="ad:playing"?n.pause():n.play().catch(()=>{});break;case "ArrowLeft":if(!a||d)return;i.preventDefault(),n.currentTime=Math.max(0,n.el.currentTime-5);break;case "ArrowRight":if(!a||d)return;i.preventDefault(),n.currentTime=Math.min(n.el.duration||0,n.el.currentTime+5);break;case "ArrowUp":if(!l)return;i.preventDefault(),n.volume=Math.min(1,n.volume+.1),n.muted&&(n.muted=false);break;case "ArrowDown":if(!l)return;i.preventDefault(),n.volume=Math.max(0,n.volume-.1);break;case "m":case "M":if(!l)return;i.preventDefault(),n.muted=!n.muted;break;case "f":case "F":if(!m)return;if(i.preventDefault(),document.fullscreenElement!=null)document.exitFullscreen().catch(()=>{});else {let p=t?.closest(".vide-ui")?.parentElement??t;p?.requestFullscreen&&p.requestFullscreen().catch(()=>{});}break;default:if(i.key.length===1&&i.key>="0"&&i.key<="9"&&a&&!d){i.preventDefault();let p=Number.parseInt(i.key,10)/10,v=n.el.duration;Number.isFinite(v)&&v>0&&(n.currentTime=p*v);}break}}return {mount(i){t=i.closest(".vide-ui")??i,t.setAttribute("tabindex","0");},connect(i){n=i,t&&t.addEventListener("keydown",o);},destroy(){t&&(t.removeEventListener("keydown",o),t.removeAttribute("tabindex"),t=null),n=null;}}}function K(){let e=null;return {mount(t){e=u("div","vide-loader");let n=u("div","vide-loader__spinner");e.appendChild(n),t.appendChild(e);},connect(t){},destroy(){e&&(e.remove(),e=null);}}}function O(){let e=null,t=null,n=null;function r(l){e&&(n&&n.remove(),n=l?I():L(),e.appendChild(n));}function o(){t&&(t.state==="playing"?t.pause():t.play().catch(()=>{}));}function i({to:l}){e&&(l==="playing"?(e.classList.add("vide-play--playing"),e.classList.remove("vide-play--paused"),e.setAttribute("aria-label","Pause"),r(true)):(l==="paused"||l==="ready"||l==="ended")&&(e.classList.remove("vide-play--playing"),e.classList.add("vide-play--paused"),e.setAttribute("aria-label","Play"),r(false)));}return {mount(l){e=u("button","vide-play vide-play--paused"),e.type="button",e.setAttribute("aria-label","Play"),r(false),l.appendChild(e);},connect(l){t=l,e&&(e.addEventListener("click",o),t.on("statechange",i));},destroy(){e&&(e.removeEventListener("click",o),e.remove(),e=null,n=null),t&&(t.off("statechange",i),t=null);}}}function q(e){let t=null;return {mount(n){t=u("div","vide-poster");let r=u("img","vide-poster__image");r.src=e.src,r.alt="",t.appendChild(r),n.appendChild(t);},connect(n){},destroy(){t&&(t.remove(),t=null);}}}function $(){let e=null,t=null,n=null,r=null,o=null,i=false;function l(s){if(!e)return 0;let c=e.getBoundingClientRect();return c.width===0?0:Math.max(0,Math.min(1,(s.clientX-c.left)/c.width))}function a(s){e&&e.style.setProperty("--vide-progress",String(s));}function m(){if(!o||!n)return;let s=o.el;if(s.buffered.length>0&&s.duration>0){let E=s.buffered.end(s.buffered.length-1)/s.duration;n.style.setProperty("--vide-progress-buffered",String(Math.min(1,E)));}}function d(){if(i||!o)return;let{currentTime:s,duration:c}=o.el;c>0&&a(s/c),m(),e&&(e.setAttribute("aria-valuenow",String(Math.floor(s))),Number.isFinite(c)&&e.setAttribute("aria-valuemax",String(Math.floor(c))));}function p(s){!o||!e||f(o.state)||(i=true,e.classList.add("vide-progress--dragging"),e.setPointerCapture(s.pointerId),a(l(s)));}function v(s){i&&a(l(s));}function h(s){if(!i||!o)return;i=false,e&&(e.classList.remove("vide-progress--dragging"),e.releasePointerCapture(s.pointerId));let c=l(s),E=o.el.duration;Number.isFinite(E)&&E>0&&(o.currentTime=c*E);}function g({to:s}){e&&(f(s)?e.classList.add("vide-progress--disabled"):e.classList.remove("vide-progress--disabled"));}return {mount(s){e=u("div","vide-progress"),e.setAttribute("role","slider"),e.setAttribute("aria-label","Seek"),e.setAttribute("aria-valuemin","0"),e.setAttribute("aria-valuemax","0"),e.setAttribute("aria-valuenow","0"),n=u("div","vide-progress__buffered"),t=u("div","vide-progress__bar"),r=u("div","vide-progress__handle"),e.appendChild(n),e.appendChild(t),e.appendChild(r),s.appendChild(e);},connect(s){o=s,e&&(o.on("timeupdate",d),o.on("statechange",g),e.addEventListener("pointerdown",p),e.addEventListener("pointermove",v),e.addEventListener("pointerup",h));},destroy(){e&&(e.removeEventListener("pointerdown",p),e.removeEventListener("pointermove",v),e.removeEventListener("pointerup",h),e.remove(),e=null,t=null,n=null,r=null),o&&(o.off("timeupdate",d),o.off("statechange",g),o=null);}}}function X(){let e=null,t=null,n=null,r=null;function o({currentTime:i,duration:l}){t&&(t.textContent=b(i)),n&&(n.textContent=b(l));}return {mount(i){e=u("div","vide-time"),t=u("span","vide-time__current");let l=u("span","vide-time__separator");n=u("span","vide-time__duration"),t.textContent="0:00",l.textContent="/",n.textContent="0:00",e.appendChild(t),e.appendChild(l),e.appendChild(n),i.appendChild(e);},connect(i){r=i,r.on("timeupdate",o);},destroy(){e&&(e.remove(),e=null,t=null,n=null),r&&(r.off("timeupdate",o),r=null);}}}function Y(){let e=null,t=null,n=null,r=null,o=false,i=null;function l(){if(!t||!r)return;i&&i.remove(),r.muted||r.volume===0?i=V():r.volume<.5?i=H():i=U(),t.appendChild(i);}function a(){if(!r||!e||!t)return;r.muted||r.volume===0?(e.classList.add("vide-volume--muted"),t.setAttribute("aria-label","Unmute")):(e.classList.remove("vide-volume--muted"),t.setAttribute("aria-label","Mute"));let c=r.muted?0:r.volume;e.style.setProperty("--vide-volume",String(c)),n&&n.setAttribute("aria-valuenow",String(Math.round(c*100))),l();}function m(s){if(!n)return 0;let c=n.getBoundingClientRect();return c.width===0?0:Math.max(0,Math.min(1,(s.clientX-c.left)/c.width))}function d(){r&&(r.muted=!r.muted);}function p(){o||a();}function v(s){if(!r||!n)return;o=true,n.setPointerCapture(s.pointerId);let c=m(s);r.volume=c,r.muted&&c>0&&(r.muted=false),a();}function h(s){if(!o||!r)return;let c=m(s);r.volume=c,r.muted&&c>0&&(r.muted=false),a();}function g(s){!o||!n||(o=false,n.releasePointerCapture(s.pointerId));}return {mount(s){e=u("div","vide-volume"),t=u("button","vide-volume__button"),t.type="button",t.setAttribute("aria-label","Mute"),n=u("div","vide-volume__slider"),n.setAttribute("role","slider"),n.setAttribute("aria-label","Volume"),n.setAttribute("aria-valuemin","0"),n.setAttribute("aria-valuemax","100"),n.setAttribute("aria-valuenow","100");let c=u("div","vide-volume__track"),E=u("div","vide-volume__filled");n.appendChild(c),n.appendChild(E),e.appendChild(t),e.appendChild(n),s.appendChild(e);},connect(s){r=s,!(!t||!n)&&(t.addEventListener("click",d),n.addEventListener("pointerdown",v),n.addEventListener("pointermove",h),n.addEventListener("pointerup",g),r.el.addEventListener("volumechange",p),a());},destroy(){t&&t.removeEventListener("click",d),n&&(n.removeEventListener("pointerdown",v),n.removeEventListener("pointermove",h),n.removeEventListener("pointerup",g)),r&&(r.el.removeEventListener("volumechange",p),r=null),e&&(e.remove(),e=null,t=null,n=null,i=null);}}}function W(e,t,n){e.mount(t),e.connect(n);}function st(e){let t=A(),n=new Set(e.exclude);return {name:"ui",setup(r){let o=document.createElement("div");o.className="vide-ui",o.setAttribute("role","region"),o.setAttribute("aria-label","Video player"),e.container.appendChild(o);let i=[];function l(p,v,h){n.has(p)||(W(v,h,r),i.push(v));}if(l("loader",K(),o),l("error",z(),o),l("bigplay",G(),o),e.poster&&l("poster",q({src:e.poster}),o),l("clickplay",N(n),o),!n.has("ad-overlay")||!n.has("ad-label")||!n.has("ad-countdown")||!n.has("ad-skip")){let p=document.createElement("div");p.className="vide-ad",o.appendChild(p),l("ad-overlay",k(),p),l("ad-label",T(),p),l("ad-countdown",M(t),p),l("ad-skip",D(t),p);}let m=document.createElement("div");m.className="vide-controls",m.addEventListener("click",p=>p.stopPropagation()),o.appendChild(m),l("play",O(),m),l("progress",$(),m),l("time",X(),m),l("volume",Y(),m),l("fullscreen",R(),m),l("autohide",_(),o),l("keyboard",B({excluded:n}),o);let d=S(o,r);return ()=>{for(let p of i)p.destroy();d(),o.remove();}},getAdPlugin(){return ()=>[P(t)]}}}
2
+ export{S as connectStateClasses,M as createAdCountdown,T as createAdLabel,k as createAdOverlay,D as createAdSkip,A as createAdUIState,_ as createAutohide,G as createBigPlay,N as createClickPlay,z as createErrorDisplay,R as createFullscreen,B as createKeyboard,K as createLoader,O as createPlayButton,q as createPoster,$ as createProgress,X as createTimeDisplay,Y as createVolume,b as formatTime,f as isAdState,C as stateToClass,st as ui,P as uiAdPlugin};
package/dist/ui/theme.css CHANGED
@@ -433,7 +433,7 @@
433
433
  cursor: pointer;
434
434
  align-items: center;
435
435
  justify-content: center;
436
- z-index: 1;
436
+ z-index: 2;
437
437
  transition: background var(--vide-duration-fast), transform
438
438
  var(--vide-duration) var(--vide-ease);
439
439
  }
@@ -1,6 +1,6 @@
1
- import { e as Plugin } from '../types-BxRa9Jvl.js';
2
- import { V as VastResponse, R as ResolveOptions, a as VastPluginOptions } from '../types-BryM58LE.js';
3
- export { A as AdCategory, b as AdPlugin, c as AdVerification, d as VastProgressEvent } from '../types-BryM58LE.js';
1
+ import { e as Plugin } from '../types-Cine0xi3.js';
2
+ import { V as VastResponse, R as ResolveOptions, a as VastPluginOptions } from '../types-8aPf_wxJ.js';
3
+ export { A as AdCategory, b as AdPlugin, c as AdVerification, d as VastProgressEvent } from '../types-8aPf_wxJ.js';
4
4
 
5
5
  /**
6
6
  * Parse a VAST XML string into a VastResponse object.
@@ -1 +1 @@
1
- import {b,a as a$1}from'../chunk-726XNUGZ.mjs';export{b as fetchVast,a as parseVast,c as resolveVast}from'../chunk-726XNUGZ.mjs';import {a,c}from'../chunk-G4Q7R3SH.mjs';export{b as getQuartile,a as track}from'../chunk-G4Q7R3SH.mjs';function ue(d){return {name:"vast",setup(e){let c$1=false,u=null,s=e._setState;async function q(){if(!c$1){s("ad:loading");try{let N=function(n){if(t)for(let i of t.trackingEvents.progress)!I.has(i.offset)&&n>=i.offset&&(I.add(i.offset),a([i.url]));},v=function(){for(let n of L)n();L.length=0;},g=function(){e.emit("ad:end",{adId:a$2}),s("playing"),U();},U=function(){function n({to:i}){i==="ready"&&(e.off("statechange",n),R>0&&(e.el.currentTime=R),e.play().catch(()=>{e.el.muted=!0,e.play().catch(()=>{});}));}e.on("statechange",n),e.src=D;},V=function(){!t||o||(a(t.clickTracking),e.emit("ad:click",{clickThrough:t.clickThrough,clickTracking:t.clickTracking}));},b$1=function(){!t||o||(a(t.trackingEvents.skip),o=!0,m(),v(),g());},S=function(){!t||o||e.state==="ad:playing"&&(a(t.trackingEvents.pause),s("ad:paused"));},w=function(){!t||o||e.state==="ad:paused"&&(a(t.trackingEvents.resume),s("ad:playing"));},A=function(){_(e.el.currentTime),N(e.el.currentTime);},F=function(){if(!t||o)return;let n=e.el.muted||e.el.volume===0;n&&!P?(a(t.trackingEvents.mute),e.emit("ad:mute",{adId:a$2})):!n&&P&&(a(t.trackingEvents.unmute),e.emit("ad:unmute",{adId:a$2})),P=n,e.emit("ad:volumeChange",{adId:a$2,volume:e.el.muted?0:e.el.volume});},x=function(){if(!t||o)return;let n=!!document.fullscreenElement;n&&!T?(a(t.trackingEvents.playerExpand),e.emit("ad:fullscreen",{adId:a$2,fullscreen:!0})):!n&&T&&(a(t.trackingEvents.playerCollapse),e.emit("ad:fullscreen",{adId:a$2,fullscreen:!1})),T=n;},C=function(){o||(o=!0,m(),v(),e.emit("ad:error",{error:new Error("Ad media playback failed")}),g());},O=function(){o||(o=!0,t&&_(t.duration),m(),v(),g());},E=function(){e.el.removeEventListener("canplay",E),t&&(a(t.trackingEvents.loaded),a(t.trackingEvents.creativeView),e.emit("ad:loaded",{adId:a$2}),s("ad:playing"),e.el.play().catch(()=>{e.el.muted=!0,e.el.play().catch(()=>{});}));},m=function(){e.el.removeEventListener("timeupdate",A),e.el.removeEventListener("ended",O),e.el.removeEventListener("error",C),e.el.removeEventListener("canplay",E),e.el.removeEventListener("pause",S),e.el.removeEventListener("play",w),e.el.removeEventListener("click",V),e.el.removeEventListener("volumechange",F),document.removeEventListener("fullscreenchange",x),e.off("ad:skip",b$1);};var M=N,K=v,W=g,X=U,Y=V,Z=b$1,$=S,y=w,ee=A,te=F,ne=x,ie=C,re=O,se=E,oe=m;let f=d.timeout!==void 0?{timeout:d.timeout}:void 0,B=await b(d.tagUrl,f);if(c$1)return;let h=a$1(B);if(h.ads.length===0){s("playing");return}let t=null,l=null;for(let n of h.ads){for(let i of n.creatives)if(i.linear&&i.linear.mediaFiles.length>0){t=i.linear,l=n;break}if(t)break}if(!t||!l){s("playing");return}let a$2=l.id;e.emit("ad:start",{adId:a$2});let L=[];if(d.adPlugins)for(let n of d.adPlugins(l)){let i=n.setup(e,l);i&&L.push(i);}for(let n of h.ads)a(n.impressions);e.emit("ad:impression",{adId:a$2});let Q=J(t.mediaFiles);if(!Q){e.emit("ad:error",{error:new Error("No suitable media file found")}),s("playing");return}let R=e.el.currentTime,D=e.src,_=c(t.duration,n=>{if(!t)return;let i=t.trackingEvents[n];i&&a(i),e.emit("ad:quartile",{adId:a$2,quartile:n});}),I=new Set,P=e.el.muted||e.el.volume===0,T=!!document.fullscreenElement,o=!1;e.el.addEventListener("canplay",E),e.el.addEventListener("timeupdate",A),e.el.addEventListener("ended",O),e.el.addEventListener("error",C),e.el.addEventListener("pause",S),e.el.addEventListener("play",w),e.el.addEventListener("click",V),e.el.addEventListener("volumechange",F),document.addEventListener("fullscreenchange",x),e.on("ad:skip",b$1),u=m,e.src="",e.el.src=Q.url,e.el.load();}catch(f){if(c$1)return;e.emit("ad:error",{error:f instanceof Error?f:new Error(String(f))}),s("playing");}}}function k({to:M}){M==="ready"&&!c$1&&(e.off("statechange",k),q());}return e.state==="ready"||e.state==="playing"||e.state==="paused"?q():e.on("statechange",k),()=>{c$1=true,e.off("statechange",k),u&&u();}}}}function J(d){if(d.length===0)return null;let e=d.filter(u=>u.mimeType==="video/mp4");return (e.length>0?e:d).sort((u,s)=>(s.bitrate??0)-(u.bitrate??0))[0]}export{ue as vast};
1
+ import {b,a as a$1}from'../chunk-726XNUGZ.mjs';export{b as fetchVast,a as parseVast,c as resolveVast}from'../chunk-726XNUGZ.mjs';import {a,c}from'../chunk-G4Q7R3SH.mjs';export{b as getQuartile,a as track}from'../chunk-G4Q7R3SH.mjs';function de(u){return {name:"vast",setup(e){let c$1=false,d=null,s=e._setState;async function q(){if(!c$1){s("ad:loading");try{let N=function(n){if(t)for(let i of t.trackingEvents.progress)!I.has(i.offset)&&n>=i.offset&&(I.add(i.offset),a([i.url]));},v=function(){for(let n of L)n();L.length=0;},g=function(){e.emit("ad:end",{adId:a$2}),s("playing"),U();},U=function(){function n({to:i}){i==="ready"&&(e.off("statechange",n),R>0&&(e.el.currentTime=R),e.play().catch(()=>{e.el.muted=!0,e.play().catch(()=>{});}));}e.on("statechange",n),e.src=D;},V=function(){!t||o||(a(t.clickTracking),e.emit("ad:click",{clickThrough:t.clickThrough,clickTracking:t.clickTracking}));},b$1=function(){!t||o||(a(t.trackingEvents.skip),o=!0,m(),v(),g());},S=function(){!t||o||e.state==="ad:playing"&&(a(t.trackingEvents.pause),s("ad:paused"));},w=function(){!t||o||e.state==="ad:paused"&&(a(t.trackingEvents.resume),s("ad:playing"));},A=function(){_(e.el.currentTime),N(e.el.currentTime);},F=function(){if(!t||o)return;let n=e.el.muted||e.el.volume===0;n&&!P?(a(t.trackingEvents.mute),e.emit("ad:mute",{adId:a$2})):!n&&P&&(a(t.trackingEvents.unmute),e.emit("ad:unmute",{adId:a$2})),P=n,e.emit("ad:volumeChange",{adId:a$2,volume:e.el.muted?0:e.el.volume});},x=function(){if(!t||o)return;let n=!!document.fullscreenElement;n&&!T?(a(t.trackingEvents.playerExpand),e.emit("ad:fullscreen",{adId:a$2,fullscreen:!0})):!n&&T&&(a(t.trackingEvents.playerCollapse),e.emit("ad:fullscreen",{adId:a$2,fullscreen:!1})),T=n;},C=function(){o||(o=!0,m(),v(),e.emit("ad:error",{error:new Error("Ad media playback failed"),source:"vast"}),g());},O=function(){o||(o=!0,t&&_(t.duration),m(),v(),g());},E=function(){e.el.removeEventListener("canplay",E),t&&(a(t.trackingEvents.loaded),a(t.trackingEvents.creativeView),e.emit("ad:loaded",{adId:a$2}),s("ad:playing"),e.el.play().catch(()=>{e.el.muted=!0,e.el.play().catch(()=>{});}));},m=function(){e.el.removeEventListener("timeupdate",A),e.el.removeEventListener("ended",O),e.el.removeEventListener("error",C),e.el.removeEventListener("canplay",E),e.el.removeEventListener("pause",S),e.el.removeEventListener("play",w),e.el.removeEventListener("click",V),e.el.removeEventListener("volumechange",F),document.removeEventListener("fullscreenchange",x),e.off("ad:skip",b$1);};var M=N,K=v,W=g,X=U,Y=V,Z=b$1,$=S,y=w,ee=A,te=F,ne=x,ie=C,re=O,se=E,oe=m;let f=u.timeout!==void 0?{timeout:u.timeout}:void 0,B=await b(u.tagUrl,f);if(c$1)return;let h=a$1(B);if(h.ads.length===0){s("playing");return}let t=null,l=null;for(let n of h.ads){for(let i of n.creatives)if(i.linear&&i.linear.mediaFiles.length>0){t=i.linear,l=n;break}if(t)break}if(!t||!l){s("playing");return}let a$2=l.id;e.emit("ad:start",{adId:a$2});let L=[];if(u.adPlugins)for(let n of u.adPlugins(l)){let i=n.setup(e,l);i&&L.push(i);}for(let n of h.ads)a(n.impressions);e.emit("ad:impression",{adId:a$2});let Q=J(t.mediaFiles);if(!Q){e.emit("ad:error",{error:new Error("No suitable media file found"),source:"vast"}),s("playing");return}let R=e.el.currentTime,D=e.src,_=c(t.duration,n=>{if(!t)return;let i=t.trackingEvents[n];i&&a(i),e.emit("ad:quartile",{adId:a$2,quartile:n});}),I=new Set,P=e.el.muted||e.el.volume===0,T=!!document.fullscreenElement,o=!1;e.el.addEventListener("canplay",E),e.el.addEventListener("timeupdate",A),e.el.addEventListener("ended",O),e.el.addEventListener("error",C),e.el.addEventListener("pause",S),e.el.addEventListener("play",w),e.el.addEventListener("click",V),e.el.addEventListener("volumechange",F),document.addEventListener("fullscreenchange",x),e.on("ad:skip",b$1),d=m,e.src="",e.el.src=Q.url,e.el.load();}catch(f){if(c$1)return;e.emit("ad:error",{error:f instanceof Error?f:new Error(String(f)),source:"vast"}),s("playing");}}}function k({to:M}){M==="ready"&&!c$1&&(e.off("statechange",k),q());}return e.state==="ready"||e.state==="playing"||e.state==="paused"?q():e.on("statechange",k),()=>{c$1=true,e.off("statechange",k),d&&d();}}}}function J(u){if(u.length===0)return null;let e=u.filter(d=>d.mimeType==="video/mp4");return (e.length>0?e:u).sort((d,s)=>(s.bitrate??0)-(d.bitrate??0))[0]}export{de as vast};
@@ -1,5 +1,5 @@
1
- import { P as Player, e as Plugin } from '../types-BxRa9Jvl.js';
2
- import { e as VastAd, b as AdPlugin } from '../types-BryM58LE.js';
1
+ import { P as Player, e as Plugin } from '../types-Cine0xi3.js';
2
+ import { e as VastAd, b as AdPlugin } from '../types-8aPf_wxJ.js';
3
3
 
4
4
  interface VmapResponse {
5
5
  version: string;
@@ -1 +1 @@
1
- import {a as a$1,c}from'../chunk-726XNUGZ.mjs';import {a,c as c$1}from'../chunk-G4Q7R3SH.mjs';function O(t){let i=new DOMParser().parseFromString(t,"text/xml");if(i.querySelector("parsererror"))return {version:"",adBreaks:[]};let o=i.documentElement;if((o.localName||o.tagName)!=="VMAP")return {version:"",adBreaks:[]};let c=o.getAttribute("version")??"",g=[];for(let d=0;d<o.children.length;d++){let n=o.children[d];if((n.localName||n.tagName)==="AdBreak"){let k=_(n);k&&g.push(k);}}return {version:c,adBreaks:g}}function _(t){let e=t.getAttribute("timeOffset");if(!e)return null;let i=H(e),r=t.getAttribute("breakType"),o=r==="nonlinear"?"nonlinear":r==="display"?"display":"linear",f=t.getAttribute("breakId")??void 0,c=null,g={breakStart:[],breakEnd:[],error:[]};for(let d=0;d<t.children.length;d++){let n=t.children[d],v=n.localName||n.tagName;v==="AdSource"?c=X(n):v==="TrackingEvents"&&z(n,g);}return {timeOffset:i,breakType:o,breakId:f,adSource:c,trackingEvents:g}}function z(t,e){for(let i=0;i<t.children.length;i++){let r=t.children[i];if((r.localName||r.tagName)!=="Tracking")continue;let f=r.getAttribute("event"),c=(r.textContent??"").trim();!f||!c||(f==="breakStart"?e.breakStart.push(c):f==="breakEnd"?e.breakEnd.push(c):f==="error"&&e.error.push(c));}}function X(t){let e=t.getAttribute("id")??void 0,i=t.getAttribute("allowMultipleAds"),r=i!=null?i==="true":void 0,o=t.getAttribute("followRedirects"),f=o!=null?o==="true":void 0,c,g;for(let d=0;d<t.children.length;d++){let n=t.children[d],v=n.localName||n.tagName;if(v==="VASTAdData"){let k=n.querySelector("VAST");k&&(c=new XMLSerializer().serializeToString(k));}else v==="AdTagURI"&&(g=(n.textContent??"").trim());}return {id:e,allowMultipleAds:r,followRedirects:f,vastUrl:g,vastData:c}}function H(t){if(t==="start")return {type:"start"};if(t==="end")return {type:"end"};if(t.endsWith("%")){let e=Number.parseFloat(t);return Number.isNaN(e)?{type:"time",seconds:0}:{type:"percentage",pct:e}}return {type:"time",seconds:K(t)}}function K(t){if(!t)return 0;let e=t.split(":");if(e.length!==3)return 0;let i=Number.parseInt(e[0],10),r=Number.parseInt(e[1],10),o=Number.parseFloat(e[2]);return Number.isNaN(i)||Number.isNaN(r)||Number.isNaN(o)?0:i*3600+r*60+o}function V(t,e,i){let r=new Set,o=0,f=false,c=false,g=e.filter(a=>a.timeOffset.type==="start"),d=e.filter(a=>a.timeOffset.type==="end"),n=e.filter(a=>a.timeOffset.type==="time"||a.timeOffset.type==="percentage").sort((a,b)=>U(a)-U(b));function v(){if(c)return;let a=t.currentTime,b=a>o+1.5;for(let E of n){if(r.has(E))continue;let T=Q(E,t.duration);if(T!==null){if(b&&a>T+.5){r.add(E);continue}a>=T-.5&&(r.add(E),i(E));}}o=a;}function k(){if(!c)for(let a of d)r.has(a)||(r.add(a),i(a));}function p(){if(!f){f=true;for(let a of g)r.has(a)||(r.add(a),i(a));t.on("timeupdate",v),t.on("ended",k);}}function s(){c=true;}function A(){c=false,o=t.currentTime;}function u(){t.off("timeupdate",v),t.off("ended",k);}return {start:p,pause:s,resume:A,destroy:u}}function Q(t,e){return t.timeOffset.type==="time"?t.timeOffset.seconds:t.timeOffset.type==="percentage"?t.timeOffset.pct/100*e:null}function U(t){return t.timeOffset.type==="time"?t.timeOffset.seconds:t.timeOffset.type==="percentage"?t.timeOffset.pct:0}function te(t){return {name:"vmap",setup(e){let i=false,r=null,o=null,f=e._setState;async function c$2(n){if(!(i||!n.adSource)){r&&r.pause(),a(n.trackingEvents.breakStart),e.emit("ad:breakStart",{breakId:n.breakId});try{let b=function(){for(let m of a$2)m();a$2.length=0;},x=function(m){if(s)for(let l of s.trackingEvents.progress)!y.has(l.offset)&&m>=l.offset&&(y.add(l.offset),a([l.url]));};var v=b,k=x;let p;if(n.adSource.vastData)p=a$1(n.adSource.vastData);else if(n.adSource.vastUrl)p=await c(n.adSource.vastUrl,t.vastOptions);else return;if(i||p.ads.length===0)return;let s=null,A=null;for(let m of p.ads){for(let l of m.creatives)if(l.linear&&l.linear.mediaFiles.length>0){s=l.linear,A=m;break}if(s)break}if(!s||!A)return;let u=A.id;f("ad:loading"),e.emit("ad:start",{adId:u});let a$2=[];if(t.adPlugins)for(let m of t.adPlugins(A)){let l=m.setup(e,A);l&&a$2.push(l);}for(let m of p.ads)a(m.impressions);e.emit("ad:impression",{adId:u});let E=W(s.mediaFiles);if(!E){e.emit("ad:error",{error:new Error("No suitable media file found")}),b(),f("playing");return}let T=e.el.currentTime,D=e.el.paused,q=e.el.src,B=c$1(s.duration,m=>{if(!s)return;let l=s.trackingEvents[m];l&&a(l),e.emit("ad:quartile",{adId:u,quartile:m});}),y=new Set,N=e.el.muted||e.el.volume===0,w=!!document.fullscreenElement;await new Promise(m=>{function l(){B(e.el.currentTime),x(e.el.currentTime);}function L(){if(!s)return;let S=e.el.muted||e.el.volume===0;S&&!N?(a(s.trackingEvents.mute),e.emit("ad:mute",{adId:u})):!S&&N&&(a(s.trackingEvents.unmute),e.emit("ad:unmute",{adId:u})),N=S,e.emit("ad:volumeChange",{adId:u,volume:e.el.muted?0:e.el.volume});}function F(){if(!s)return;let S=!!document.fullscreenElement;S&&!w?(a(s.trackingEvents.playerExpand),e.emit("ad:fullscreen",{adId:u,fullscreen:!0})):!S&&w&&(a(s.trackingEvents.playerCollapse),e.emit("ad:fullscreen",{adId:u,fullscreen:!1})),w=S;}function R(){s&&B(s.duration),C(),b(),e.emit("ad:end",{adId:u}),e.el.src=q,e.el.load(),e.el.currentTime=T,D||e.el.play().catch(()=>{e.el.muted=!0,e.el.play().catch(()=>{});}),m();}function C(){e.el.removeEventListener("timeupdate",l),e.el.removeEventListener("ended",R),e.el.removeEventListener("canplay",P),e.el.removeEventListener("volumechange",L),document.removeEventListener("fullscreenchange",F),o=null;}function P(){e.el.removeEventListener("canplay",P),s&&(a(s.trackingEvents.loaded),a(s.trackingEvents.creativeView),e.emit("ad:loaded",{adId:u}),f("ad:playing"),e.el.play().catch(()=>{e.el.muted=!0,e.el.play().catch(()=>{});}));}e.el.addEventListener("canplay",P),e.el.addEventListener("timeupdate",l),e.el.addEventListener("ended",R),e.el.addEventListener("volumechange",L),document.addEventListener("fullscreenchange",F),o=C,e.el.src=E.url,e.el.load();});}catch(p){i||(a(n.trackingEvents.error),e.emit("ad:error",{error:p instanceof Error?p:new Error(String(p))}));}finally{a(n.trackingEvents.breakEnd),e.emit("ad:breakEnd",{breakId:n.breakId}),r&&r.resume();}}}async function g(){if(!i)try{let n=t.timeout??1e4,v=new AbortController,k=setTimeout(()=>v.abort(),n),p;try{let u=await fetch(t.url,{signal:v.signal});if(!u.ok)throw new Error(`VMAP fetch failed: ${u.status}`);p=await u.text();}finally{clearTimeout(k);}if(i)return;let s=O(p);if(s.adBreaks.length===0)return;let A=V(e,s.adBreaks,u=>c$2(u));r=A,A.start();}catch(n){if(i)return;e.emit("ad:error",{error:n instanceof Error?n:new Error(String(n))});}}function d({to:n}){n==="ready"&&!i&&(e.off("statechange",d),g());}return e.state==="ready"||e.state==="playing"||e.state==="paused"?g():e.on("statechange",d),()=>{i=true,e.off("statechange",d),r&&r.destroy(),o&&o();}}}}function W(t){if(t.length===0)return null;let e=t.filter(r=>r.mimeType==="video/mp4");return (e.length>0?e:t).sort((r,o)=>(o.bitrate??0)-(r.bitrate??0))[0]}export{V as createScheduler,O as parseVmap,te as vmap};
1
+ import {a as a$1,c}from'../chunk-726XNUGZ.mjs';import {a,c as c$1}from'../chunk-G4Q7R3SH.mjs';function O(t){let i=new DOMParser().parseFromString(t,"text/xml");if(i.querySelector("parsererror"))return {version:"",adBreaks:[]};let o=i.documentElement;if((o.localName||o.tagName)!=="VMAP")return {version:"",adBreaks:[]};let c=o.getAttribute("version")??"",v=[];for(let d=0;d<o.children.length;d++){let n=o.children[d];if((n.localName||n.tagName)==="AdBreak"){let k=_(n);k&&v.push(k);}}return {version:c,adBreaks:v}}function _(t){let e=t.getAttribute("timeOffset");if(!e)return null;let i=H(e),r=t.getAttribute("breakType"),o=r==="nonlinear"?"nonlinear":r==="display"?"display":"linear",f=t.getAttribute("breakId")??void 0,c=null,v={breakStart:[],breakEnd:[],error:[]};for(let d=0;d<t.children.length;d++){let n=t.children[d],g=n.localName||n.tagName;g==="AdSource"?c=X(n):g==="TrackingEvents"&&z(n,v);}return {timeOffset:i,breakType:o,breakId:f,adSource:c,trackingEvents:v}}function z(t,e){for(let i=0;i<t.children.length;i++){let r=t.children[i];if((r.localName||r.tagName)!=="Tracking")continue;let f=r.getAttribute("event"),c=(r.textContent??"").trim();!f||!c||(f==="breakStart"?e.breakStart.push(c):f==="breakEnd"?e.breakEnd.push(c):f==="error"&&e.error.push(c));}}function X(t){let e=t.getAttribute("id")??void 0,i=t.getAttribute("allowMultipleAds"),r=i!=null?i==="true":void 0,o=t.getAttribute("followRedirects"),f=o!=null?o==="true":void 0,c,v;for(let d=0;d<t.children.length;d++){let n=t.children[d],g=n.localName||n.tagName;if(g==="VASTAdData"){let k=n.querySelector("VAST");k&&(c=new XMLSerializer().serializeToString(k));}else g==="AdTagURI"&&(v=(n.textContent??"").trim());}return {id:e,allowMultipleAds:r,followRedirects:f,vastUrl:v,vastData:c}}function H(t){if(t==="start")return {type:"start"};if(t==="end")return {type:"end"};if(t.endsWith("%")){let e=Number.parseFloat(t);return Number.isNaN(e)?{type:"time",seconds:0}:{type:"percentage",pct:e}}return {type:"time",seconds:K(t)}}function K(t){if(!t)return 0;let e=t.split(":");if(e.length!==3)return 0;let i=Number.parseInt(e[0],10),r=Number.parseInt(e[1],10),o=Number.parseFloat(e[2]);return Number.isNaN(i)||Number.isNaN(r)||Number.isNaN(o)?0:i*3600+r*60+o}function V(t,e,i){let r=new Set,o=0,f=false,c=false,v=e.filter(a=>a.timeOffset.type==="start"),d=e.filter(a=>a.timeOffset.type==="end"),n=e.filter(a=>a.timeOffset.type==="time"||a.timeOffset.type==="percentage").sort((a,b)=>U(a)-U(b));function g(){if(c)return;let a=t.currentTime,b=a>o+1.5;for(let E of n){if(r.has(E))continue;let T=Q(E,t.duration);if(T!==null){if(b&&a>T+.5){r.add(E);continue}a>=T-.5&&(r.add(E),i(E));}}o=a;}function k(){if(!c)for(let a of d)r.has(a)||(r.add(a),i(a));}function p(){if(!f){f=true;for(let a of v)r.has(a)||(r.add(a),i(a));t.on("timeupdate",g),t.on("ended",k);}}function s(){c=true;}function A(){c=false,o=t.currentTime;}function u(){t.off("timeupdate",g),t.off("ended",k);}return {start:p,pause:s,resume:A,destroy:u}}function Q(t,e){return t.timeOffset.type==="time"?t.timeOffset.seconds:t.timeOffset.type==="percentage"?t.timeOffset.pct/100*e:null}function U(t){return t.timeOffset.type==="time"?t.timeOffset.seconds:t.timeOffset.type==="percentage"?t.timeOffset.pct:0}function te(t){return {name:"vmap",setup(e){let i=false,r=null,o=null,f=e._setState;async function c$2(n){if(!(i||!n.adSource)){r&&r.pause(),a(n.trackingEvents.breakStart),e.emit("ad:breakStart",{breakId:n.breakId});try{let b=function(){for(let m of a$2)m();a$2.length=0;},x=function(m){if(s)for(let l of s.trackingEvents.progress)!y.has(l.offset)&&m>=l.offset&&(y.add(l.offset),a([l.url]));};var g=b,k=x;let p;if(n.adSource.vastData)p=a$1(n.adSource.vastData);else if(n.adSource.vastUrl)p=await c(n.adSource.vastUrl,t.vastOptions);else return;if(i||p.ads.length===0)return;let s=null,A=null;for(let m of p.ads){for(let l of m.creatives)if(l.linear&&l.linear.mediaFiles.length>0){s=l.linear,A=m;break}if(s)break}if(!s||!A)return;let u=A.id;f("ad:loading"),e.emit("ad:start",{adId:u});let a$2=[];if(t.adPlugins)for(let m of t.adPlugins(A)){let l=m.setup(e,A);l&&a$2.push(l);}for(let m of p.ads)a(m.impressions);e.emit("ad:impression",{adId:u});let E=W(s.mediaFiles);if(!E){e.emit("ad:error",{error:new Error("No suitable media file found"),source:"vmap"}),b(),f("playing");return}let T=e.el.currentTime,D=e.el.paused,q=e.el.src,B=c$1(s.duration,m=>{if(!s)return;let l=s.trackingEvents[m];l&&a(l),e.emit("ad:quartile",{adId:u,quartile:m});}),y=new Set,N=e.el.muted||e.el.volume===0,w=!!document.fullscreenElement;await new Promise(m=>{function l(){B(e.el.currentTime),x(e.el.currentTime);}function L(){if(!s)return;let S=e.el.muted||e.el.volume===0;S&&!N?(a(s.trackingEvents.mute),e.emit("ad:mute",{adId:u})):!S&&N&&(a(s.trackingEvents.unmute),e.emit("ad:unmute",{adId:u})),N=S,e.emit("ad:volumeChange",{adId:u,volume:e.el.muted?0:e.el.volume});}function F(){if(!s)return;let S=!!document.fullscreenElement;S&&!w?(a(s.trackingEvents.playerExpand),e.emit("ad:fullscreen",{adId:u,fullscreen:!0})):!S&&w&&(a(s.trackingEvents.playerCollapse),e.emit("ad:fullscreen",{adId:u,fullscreen:!1})),w=S;}function R(){s&&B(s.duration),C(),b(),e.emit("ad:end",{adId:u}),e.el.src=q,e.el.load(),e.el.currentTime=T,D||e.el.play().catch(()=>{e.el.muted=!0,e.el.play().catch(()=>{});}),m();}function C(){e.el.removeEventListener("timeupdate",l),e.el.removeEventListener("ended",R),e.el.removeEventListener("canplay",P),e.el.removeEventListener("volumechange",L),document.removeEventListener("fullscreenchange",F),o=null;}function P(){e.el.removeEventListener("canplay",P),s&&(a(s.trackingEvents.loaded),a(s.trackingEvents.creativeView),e.emit("ad:loaded",{adId:u}),f("ad:playing"),e.el.play().catch(()=>{e.el.muted=!0,e.el.play().catch(()=>{});}));}e.el.addEventListener("canplay",P),e.el.addEventListener("timeupdate",l),e.el.addEventListener("ended",R),e.el.addEventListener("volumechange",L),document.addEventListener("fullscreenchange",F),o=C,e.el.src=E.url,e.el.load();});}catch(p){i||(a(n.trackingEvents.error),e.emit("ad:error",{error:p instanceof Error?p:new Error(String(p)),source:"vmap"}));}finally{a(n.trackingEvents.breakEnd),e.emit("ad:breakEnd",{breakId:n.breakId}),r&&r.resume();}}}async function v(){if(!i)try{let n=t.timeout??1e4,g=new AbortController,k=setTimeout(()=>g.abort(),n),p;try{let u=await fetch(t.url,{signal:g.signal});if(!u.ok)throw new Error(`VMAP fetch failed: ${u.status}`);p=await u.text();}finally{clearTimeout(k);}if(i)return;let s=O(p);if(s.adBreaks.length===0)return;let A=V(e,s.adBreaks,u=>c$2(u));r=A,A.start();}catch(n){if(i)return;e.emit("ad:error",{error:n instanceof Error?n:new Error(String(n)),source:"vmap"});}}function d({to:n}){n==="ready"&&!i&&(e.off("statechange",d),v());}return e.state==="ready"||e.state==="playing"||e.state==="paused"?v():e.on("statechange",d),()=>{i=true,e.off("statechange",d),r&&r.destroy(),o&&o();}}}}function W(t){if(t.length===0)return null;let e=t.filter(r=>r.mimeType==="video/mp4");return (e.length>0?e:t).sort((r,o)=>(o.bitrate??0)-(r.bitrate??0))[0]}export{V as createScheduler,O as parseVmap,te as vmap};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@videts/vide",
3
- "version": "0.7.0",
4
- "description": "Modular video player — use only what you need. VAST/VMAP, HLS, DASH as plugins.",
3
+ "version": "0.7.4",
4
+ "description": "Zero-config, web-standard-first modular video player. VAST, VMAP, HLS, DASH, DRM, SSAI, OMID, SIMID — all as plugins. Core under 2KB gzip.",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
@@ -50,13 +50,31 @@
50
50
  "dist"
51
51
  ],
52
52
  "sideEffects": false,
53
+ "scripts": {
54
+ "build": "tsup",
55
+ "test": "vitest run",
56
+ "test:watch": "vitest",
57
+ "test:e2e": "playwright test",
58
+ "test:e2e:install": "playwright install --with-deps",
59
+ "lint": "biome check src tests",
60
+ "lint:fix": "biome check --write src tests",
61
+ "typecheck": "tsc --noEmit",
62
+ "docs:api": "typedoc",
63
+ "docs:dev": "vitepress dev docs",
64
+ "docs:build": "vitepress build docs",
65
+ "docs:preview": "vitepress preview docs"
66
+ },
53
67
  "devDependencies": {
54
68
  "@biomejs/biome": "^1.9.0",
69
+ "@playwright/test": "^1.58.2",
55
70
  "dashjs": "^4.7.0",
56
71
  "hls.js": "^1.6.15",
57
72
  "jsdom": "^25.0.0",
58
73
  "tsup": "^8.0.0",
74
+ "typedoc": "^0.28.17",
75
+ "typedoc-plugin-markdown": "^4.10.0",
59
76
  "typescript": "^5.6.0",
77
+ "vitepress": "^1.6.4",
60
78
  "vitest": "^2.0.0"
61
79
  },
62
80
  "peerDependencies": {
@@ -71,19 +89,22 @@
71
89
  "optional": true
72
90
  }
73
91
  },
92
+ "repository": {
93
+ "type": "git",
94
+ "url": "https://github.com/hogekai/vide"
95
+ },
74
96
  "publishConfig": {
75
97
  "access": "public"
76
98
  },
99
+ "packageManager": "pnpm@10.30.1",
77
100
  "license": "MIT",
78
101
  "engines": {
79
102
  "node": ">=18"
80
103
  },
81
- "scripts": {
82
- "build": "tsup",
83
- "test": "vitest run",
84
- "test:watch": "vitest",
85
- "lint": "biome check src tests",
86
- "lint:fix": "biome check --write src tests",
87
- "typecheck": "tsc --noEmit"
104
+ "pnpm": {
105
+ "onlyBuiltDependencies": [
106
+ "@biomejs/biome",
107
+ "esbuild"
108
+ ]
88
109
  }
89
- }
110
+ }