diff --git a/.gitignore b/.gitignore index c01e3a81..ced680e0 100644 --- a/.gitignore +++ b/.gitignore @@ -130,6 +130,9 @@ dist # ignore polyfills copy packages/*/src/polyfills +# Vendored mux-embed types — regenerated on install via root prepare hook +packages/playback-core/src/vendor/mux-embed.ts + .turbo examples/astro/.vercel/ diff --git a/.prettierignore b/.prettierignore index 88d2c97c..611058f1 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,3 +6,4 @@ examples *.sublime-* *.vscode* *.md +packages/playback-core/src/vendor diff --git a/package-lock.json b/package-lock.json index 93b6f41a..8ad50688 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7006,7 +7006,6 @@ "version": "3.697.1", "resolved": "https://registry.npmjs.org/@types/google_interactive_media_ads_types/-/google_interactive_media_ads_types-3.697.1.tgz", "integrity": "sha512-gRjJoPKQRjjTuySHqZe8Pnu6a5B0bKbTUD2ioDLPSWlEuBaAc2p1mzUzy42SCeWkyYffo2Mnv+blUGuvVvx3dQ==", - "dev": true, "license": "MIT" }, "node_modules/@types/hast": { @@ -26942,7 +26941,7 @@ "@mux/mux-video": "0.31.0", "@mux/playback-core": "0.35.0", "media-chrome": "~4.19.0", - "player.style": "^0.3.4" + "player.style": "^0.3.0" }, "devDependencies": { "@mux/esbuilder": "*", @@ -27712,13 +27711,13 @@ "dependencies": { "@mux/mux-data-google-ima": "^0.3.4", "@mux/playback-core": "0.35.0", - "castable-video": "^1.1.13", + "@types/google_interactive_media_ads_types": "^3.697.0", + "castable-video": "~1.1.13", "custom-media-element": "~1.4.6", "media-tracks": "~0.3.5" }, "devDependencies": { "@open-wc/testing": "^4.0.0", - "@types/google_interactive_media_ads_types": "^3.697.0", "@typescript-eslint/eslint-plugin": "^8.27.0", "@typescript-eslint/parser": "^8.27.0", "@web/dev-server-esbuild": "^1.0.4", diff --git a/package.json b/package.json index e5d2a7a8..ecd5eac5 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "build:packages": "turbo run build --filter '!./examples/*'", "build": "turbo run build", "i18n": "turbo run i18n", - "prepare": "husky" + "prepare": "husky && npm run vendor:types -w @mux/playback-core" }, "packageManager": "npm@11.2.0" } diff --git a/packages/mux-video/package.json b/packages/mux-video/package.json index 8943e3dd..8db811a9 100644 --- a/packages/mux-video/package.json +++ b/packages/mux-video/package.json @@ -126,13 +126,13 @@ "dependencies": { "@mux/mux-data-google-ima": "^0.3.4", "@mux/playback-core": "0.35.0", + "@types/google_interactive_media_ads_types": "^3.697.0", "castable-video": "~1.1.13", "custom-media-element": "~1.4.6", "media-tracks": "~0.3.5" }, "devDependencies": { "@open-wc/testing": "^4.0.0", - "@types/google_interactive_media_ads_types": "^3.697.0", "@typescript-eslint/eslint-plugin": "^8.27.0", "@typescript-eslint/parser": "^8.27.0", "@web/dev-server-esbuild": "^1.0.4", diff --git a/packages/mux-video/src/ads/index.ts b/packages/mux-video/src/ads/index.ts index 62d947fa..7a35b92d 100644 --- a/packages/mux-video/src/ads/index.ts +++ b/packages/mux-video/src/ads/index.ts @@ -1,6 +1,5 @@ /* eslint @typescript-eslint/triple-slash-reference: "off" */ /// -/// /** @TODO publish types for package to use here (CJP) */ // @ts-ignore diff --git a/packages/playback-core/.eslintignore b/packages/playback-core/.eslintignore new file mode 100644 index 00000000..cee46cca --- /dev/null +++ b/packages/playback-core/.eslintignore @@ -0,0 +1 @@ +src/vendor diff --git a/packages/playback-core/package.json b/packages/playback-core/package.json index 0d1a60f8..3aa60d11 100644 --- a/packages/playback-core/package.json +++ b/packages/playback-core/package.json @@ -51,7 +51,8 @@ "build:esm-module": "esbuilder src/index.ts --sourcemap --format=esm --outfile=./dist/playback-core.mjs", "build:cjs": "esbuilder src/index.ts --sourcemap --format=cjs --out-extension:.js=.cjs.js --external:mux-embed --external:hls.js", "build:iife": "esbuilder src/index.ts --sourcemap --format=iife --outfile=./dist/playback-core.js", - "prebuild:types": "shx mkdir -p ./dist/types", + "vendor:types": "node ./scripts/vendor-mux-embed-types.mjs", + "prebuild:types": "npm run vendor:types && shx mkdir -p ./dist/types", "build:types": "tsc", "postbuild:types": "downlevel-dts ./dist/types ./dist/types-ts3.4 --to=3.4", "build": "npm-run-all --parallel 'build:esm -- --minify' 'build:iife -- --minify' 'build:cjs -- --minify' 'build:esm-module -- --minify'" diff --git a/packages/playback-core/scripts/vendor-mux-embed-types.mjs b/packages/playback-core/scripts/vendor-mux-embed-types.mjs new file mode 100644 index 00000000..d36d93c4 --- /dev/null +++ b/packages/playback-core/scripts/vendor-mux-embed-types.mjs @@ -0,0 +1,38 @@ +import { createRequire } from 'node:module'; +import { existsSync } from 'node:fs'; +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const require = createRequire(import.meta.url); +const __dirname = dirname(fileURLToPath(import.meta.url)); + +// Resolve the mux-embed package root by walking up from its main entry +// (require.resolve respects exports, so we can't use a subpath directly) +const muxEmbedMain = require.resolve('mux-embed'); +let pkgRoot = dirname(muxEmbedMain); +while (!existsSync(join(pkgRoot, 'package.json'))) { + const parent = dirname(pkgRoot); + if (parent === pkgRoot) { + throw new Error(`Could not find mux-embed package.json starting from ${muxEmbedMain}`); + } + pkgRoot = parent; +} + +const pkg = JSON.parse(await readFile(join(pkgRoot, 'package.json'), 'utf8')); +if (pkg.name !== 'mux-embed') { + throw new Error(`Found package.json at ${pkgRoot}, but it is "${pkg.name}", not mux-embed`); +} + +const SOURCE = join(pkgRoot, 'dist/types/mux-embed.d.ts'); +const DEST = resolve(__dirname, '../src/vendor/mux-embed.ts'); +const HEADER = `// AUTO-GENERATED — do not edit. +// Source: mux-embed@${pkg.version} / dist/types/mux-embed.d.ts +// Run \`npm run vendor:types\` to refresh. + +`; + +const content = await readFile(SOURCE, 'utf8'); +await mkdir(dirname(DEST), { recursive: true }); +await writeFile(DEST, HEADER + content); +console.log(`Vendored mux-embed@${pkg.version} types -> ${DEST}`); diff --git a/packages/playback-core/src/types.ts b/packages/playback-core/src/types.ts index 885dd554..a8cc6713 100644 --- a/packages/playback-core/src/types.ts +++ b/packages/playback-core/src/types.ts @@ -1,5 +1,5 @@ /* eslint @typescript-eslint/triple-slash-reference: "off" */ -/// +/// import type { Options, Mux } from 'mux-embed'; import type { MediaError } from './errors'; import type { HlsConfig } from 'hls.js';