build-browser-detector.js

 1#!/usr/bin/env node
 2
 3/**
 4 * Generates src/detect-antipatterns-browser.js
 5 * by stripping Node-specific sections from the universal source and wrapping in an IIFE.
 6 *
 7 * Run: node scripts/build-browser-detector.js
 8 */
 9
10import fs from 'fs';
11import path from 'path';
12import { fileURLToPath } from 'url';
13
14const __dirname = path.dirname(fileURLToPath(import.meta.url));
15const ROOT = path.resolve(__dirname, '..');
16
17const SOURCE = path.join(ROOT, 'src/detect-antipatterns.mjs');
18const OUTPUT = path.join(ROOT, 'src/detect-antipatterns-browser.js');
19
20let code = fs.readFileSync(SOURCE, 'utf-8');
21
22// Strip shebang
23code = code.replace(/^#!.*\n/, '');
24// Strip sections between @browser-strip-start / @browser-strip-end markers
25code = code.replace(/^\/\/ @browser-strip-start\n[\s\S]*?^\/\/ @browser-strip-end\n?/gm, '');
26// Set IS_BROWSER = true (dead-code eliminates Node paths)
27code = code.replace(/^const IS_BROWSER = .*$/m, 'const IS_BROWSER = true;');
28
29const output = `/**
30 * Anti-Pattern Browser Detector for Impeccable
31 * Copyright (c) 2026 Paul Bakaus
32 * SPDX-License-Identifier: Apache-2.0
33 *
34 * GENERATED -- do not edit. Source: detect-antipatterns.mjs
35 * Rebuild: node scripts/build-browser-detector.js
36 *
37 * Usage: <script src="detect-antipatterns-browser.js"></script>
38 * Re-scan: window.impeccableScan()
39 */
40(function () {
41if (typeof window === 'undefined') return;
42${code}
43})();
44`;
45
46fs.writeFileSync(OUTPUT, output);
47console.log(`Generated ${path.relative(ROOT, OUTPUT)} (${(output.length / 1024).toFixed(1)} KB)`);