mirror of
https://codeberg.org/Tilo-K/diff-highlighter.git
synced 2026-07-03 16:23:02 +00:00
Initial commit: Diff Highlighter Chrome extension (MV3, TypeScript)
Highlights .diff/.patch files inline — additions green, deletions red, hunk/file headers styled, with toggleable highlight.js syntax highlighting. - MV3, content script gated on text/plain + URL ending in .diff/.patch - Two-phase render: instant diff colors, then chunked idle-time syntax - Popup switches + Alt+D shortcut, persisted in chrome.storage.sync, live re-render - Light/dark via prefers-color-scheme; only the `storage` permission - TypeScript + esbuild build; Forgejo Actions CI (typecheck + build) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
57
scripts/build.mjs
Normal file
57
scripts/build.mjs
Normal file
@@ -0,0 +1,57 @@
|
||||
// Builds the extension into dist/: bundles the TypeScript entry points with
|
||||
// esbuild and copies the static assets (manifest, popup HTML, CSS, icons).
|
||||
// Run `node scripts/build.mjs` for a one-shot build, or with `--watch` for dev.
|
||||
import * as esbuild from 'esbuild';
|
||||
import { cp, mkdir, rm } from 'node:fs/promises';
|
||||
import { existsSync } from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
||||
const dist = path.join(root, 'dist');
|
||||
const watch = process.argv.includes('--watch');
|
||||
|
||||
/** Copy a file or directory from a repo-relative path into dist/ (flattened). */
|
||||
async function copy(from, to) {
|
||||
const src = path.join(root, from);
|
||||
if (!existsSync(src)) return;
|
||||
await cp(src, path.join(dist, to), { recursive: true });
|
||||
}
|
||||
|
||||
async function copyStatic() {
|
||||
await copy('src/manifest.json', 'manifest.json');
|
||||
await copy('src/popup/popup.html', 'popup.html');
|
||||
await copy('src/styles/diff.css', 'diff.css');
|
||||
await copy('src/styles/hljs-theme.css', 'hljs-theme.css');
|
||||
await copy('src/styles/popup.css', 'popup.css');
|
||||
await copy('icons', 'icons');
|
||||
}
|
||||
|
||||
const options = {
|
||||
entryPoints: {
|
||||
content: path.join(root, 'src/content.ts'),
|
||||
background: path.join(root, 'src/background.ts'),
|
||||
popup: path.join(root, 'src/popup/popup.ts'),
|
||||
},
|
||||
outdir: dist,
|
||||
entryNames: '[name]',
|
||||
bundle: true,
|
||||
format: 'iife',
|
||||
target: ['chrome120'],
|
||||
minify: !watch,
|
||||
sourcemap: watch ? 'inline' : false,
|
||||
logLevel: 'info',
|
||||
};
|
||||
|
||||
await rm(dist, { recursive: true, force: true });
|
||||
await mkdir(dist, { recursive: true });
|
||||
await copyStatic();
|
||||
|
||||
if (watch) {
|
||||
const ctx = await esbuild.context(options);
|
||||
await ctx.watch();
|
||||
console.log('watching for changes…');
|
||||
} else {
|
||||
await esbuild.build(options);
|
||||
console.log('built ->', path.relative(root, dist));
|
||||
}
|
||||
Reference in New Issue
Block a user