02a90e839c
- manifest.json with MV3 config, host permissions for beat-battle.net - content/detector.ts: route + overlay observer, emits bbp:phase events - content/layout.ts: defensive mobile-first layout reflow - content/chat-drawer.ts: bottom-sheet drawer, dispatches synthetic events through site's own React-managed textarea + button (preserves auth, rate-limit, mute, profanity guards) - content/util/selectors.ts: text- and role-based fallback chain - content/util/ws-proxy.ts: lightweight WebSocket instrumentation, no payload capture - content/inject.css: mobile overrides using site's existing --bb-* vars - background.js: MV3 service worker stub - package.json + tsconfig.json + esbuild.config.mjs: build pipeline - icons/: 16/32/48/128 placeholder PNGs (chili-red disc) - docs/PLAN.md: full V1 architecture, risks, scope - README.md: scope, dev workflow (load unpacked), tech
30 lines
789 B
JavaScript
30 lines
789 B
JavaScript
// esbuild config — bundles TS entry to a single content script
|
|
import * as esbuild from 'esbuild';
|
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
|
|
const isWatch = process.argv.includes('--watch');
|
|
const outdir = 'dist/content';
|
|
|
|
if (!existsSync(outdir)) mkdirSync(outdir, { recursive: true });
|
|
|
|
const ctx = await esbuild.context({
|
|
entryPoints: ['extension/content/index.ts'],
|
|
bundle: true,
|
|
format: 'iife',
|
|
target: 'chrome109',
|
|
outfile: `${outdir}/index.js`,
|
|
sourcemap: 'linked',
|
|
logLevel: 'info',
|
|
banner: { js: '/* Beat Pocket content script */' },
|
|
});
|
|
|
|
if (isWatch) {
|
|
await ctx.watch();
|
|
console.log('esbuild watching…');
|
|
} else {
|
|
const r = await ctx.rebuild();
|
|
await ctx.dispose();
|
|
if (r.errors.length) process.exit(1);
|
|
console.log('build complete');
|
|
}
|