Files
goon_plugin/vite.config.ts
T
robot d86c1d1778 feat: add HLS deep-probe scanning with refactored pipeline and cleanup
- Deep-probe HLS manifests via known player globals, inline scripts, config objects
- Scan main frame only (no nested iframes); pick largest visible video per tab
- Store mediaType/hlsManifest metadata through the pipeline
- CSP-safe interceptor injection via script.src (not inline textContent)
- Remove probeFn/scrapeFn from Vite build entries (non-existent files)
- Refactor: extract m3u8DeepProbeFn, scrapeFn, scanVideos, storeVideos,
  makeVideoEntry, filterValidTabs, probeHlsManifests, dedupManifests, scrapeTab
  to module-level functions (no inline closures recreated on every click)
- Clean up viewer.js: extract createVideoElement(), createPanel(),
  consolidate HLS_CONFIG, remove console.log noise
- Add DEBUG flag to gate console output in popup
- Unify url/src fields — prefer 'src' everywhere
- Remove dead code in renderList and setTimeout(100) hack
2026-08-12 00:20:00 +00:00

70 lines
2.0 KiB
TypeScript

/**
* Vite config for the Chrome extension.
* Builds the extension into dist/ for loading as an unpacked extension.
*
* Usage:
* npm run dev — watch mode, rebuild on change
* npm run build — production build
*/
import { defineConfig } from 'vite';
import { resolve } from 'path';
import { copyFileSync, mkdirSync, writeFileSync } from 'fs';
import sharp from 'sharp';
export default defineConfig({
root: 'src',
plugins: [
{
name: 'generate-icons',
async generateBundle() {
const outDir = resolve(__dirname, 'dist');
mkdirSync(resolve(outDir, 'icons'), { recursive: true });
const sizes = [16, 48, 128];
const svgPath = resolve(__dirname, 'src/icons/icon.svg');
const outDirs = [
resolve(outDir, 'icons'),
resolve(__dirname, 'icons'),
];
for (const size of sizes) {
const buffer = await sharp(svgPath)
.resize(size, size)
.png()
.toBuffer();
for (const dir of outDirs) {
mkdirSync(dir, { recursive: true });
writeFileSync(resolve(dir, `icon${size}.png`), buffer);
}
}
},
},
{
name: 'copy-manifest',
generateBundle() {
const manifestPath = resolve(__dirname, 'manifest.json');
const outPath = resolve(__dirname, 'dist/manifest.json');
copyFileSync(manifestPath, outPath);
},
},
],
build: {
outDir: '../dist',
emptyOutDir: true,
rollupOptions: {
input: {
background: resolve(__dirname, 'src/background/background.js'),
content: resolve(__dirname, 'src/content/content.js'),
viewer: resolve(__dirname, 'src/viewer/viewer.html'),
viewerIndex: resolve(__dirname, 'src/viewer/index.html'),
interceptors: resolve(__dirname, 'src/inject/interceptors.js'),
},
output: {
entryFileNames: '[name].js',
chunkFileNames: 'chunks/[name].js',
assetFileNames: '[name][extname]',
},
},
},
});