CI / test (pull_request) Failing after 24s
Two fixes addressing kfj001 review #37 on commit b19035a:
1. Vendor hls.js bundle locally — chrome.runtime.getURL('hls.min.js')
instead of CDN, bypassing site CSP (script-src 'self') blocks.
Added hls.min.js to vite.config.ts entry points, manifest web_accessible_resources.
2. Handle null entries in executeScript results — destroyed frames
return null when allFrames:true, causing 'Cannot read properties of
null (reading 'result')' in probeHlsManifests() and scrapeTab().
Added null guards before accessing .result.
83/83 tests pass. Build: 10 modules, 413KB hls bundle.
75 lines
2.1 KiB
TypeScript
75 lines
2.1 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: {
|
|
target: 'chrome110',
|
|
outDir: '../dist',
|
|
emptyOutDir: true,
|
|
modulePreload: {
|
|
polyfill: false,
|
|
},
|
|
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'),
|
|
hls: resolve(__dirname, 'src/inject/hls.min.js'),
|
|
},
|
|
output: {
|
|
entryFileNames: '[name].js',
|
|
chunkFileNames: 'chunks/[name].js',
|
|
assetFileNames: '[name][extname]',
|
|
},
|
|
},
|
|
},
|
|
});
|