import { build } from "esbuild"; import { copyFileSync, mkdirSync, readdirSync, rmSync, statSync } from "fs"; import { join } from "path"; try { const basePath = join(import.meta.dir, "../../src/bun.js/WebKit/Source/WebInspectorUI/UserInterface"); const htmlPath = join(basePath, "Main.html"); const backendCommands = join( import.meta.dir, "../../src/bun.js/WebKit/WebKitBuild/Release/JavaScriptCore/DerivedSources/inspector/InspectorBackendCommands.js", ); const scriptsToBundle = []; const stylesToBundle = []; const jsReplacementId = crypto.randomUUID() + ".js"; const cssReplacementId = crypto.randomUUID() + ".css"; const html = new HTMLRewriter() .on("script", { element(element) { const src = element.getAttribute("src"); if ( src && !src?.includes("External") && !src?.includes("WebKitAdditions") && !src.includes("DOMUtilities.js") ) { if (scriptsToBundle.length === 0) { element.replace("", { html: true }); } else { element.remove(); } scriptsToBundle.push(src); } }, }) .on("script:not([src])", { element(element) { element.remove(); }, }) .on("head", { element(element) { element.prepend( ` `, { html: true }, ); element.append( ` `, { html: true }, ); }, }) // .on("link[rel=stylesheet]", { // element(element) { // const href = element.getAttribute("href"); // if (href && !href?.includes("External") && !href?.includes("WebKitAdditions")) { // element.remove(); // stylesToBundle.push(href); // } // }, // }) .transform(new Response(Bun.file(htmlPath))); let htmlText = await html.text(); rmSync(join(import.meta.dir, "out"), { recursive: true, force: true }); mkdirSync(join(import.meta.dir, "out", "Protocol"), { recursive: true }); const javascript = scriptsToBundle.map(a => `import '${join(basePath, a)}';`).join("\n") + "\n"; // const css = stylesToBundle.map(a => `@import "${join(basePath, a)}";`).join("\n") + "\n"; await Bun.write(join(import.meta.dir, "out/manifest.js"), javascript); mkdirSync("out/WebKitAdditions/WebInspectorUI/", { recursive: true }); await Bun.write(join(import.meta.dir, "out/WebKitAdditions/WebInspectorUI/WebInspectorUIAdditions.js"), ""); await Bun.write(join(import.meta.dir, "out/WebKitAdditions/WebInspectorUI/WebInspectorUIAdditions.css"), ""); // await Bun.write(join(import.meta.dir, "manifest.css"), css); const jsBundle = await Bun.build({ entrypoints: [join(import.meta.dir, "out/manifest.js")], outdir: "out", minify: true, }); const jsFilename = "manifest-" + jsBundle.outputs[0].hash + ".js"; // const cssBundle = await build({ // bundle: true, // minify: true, // write: false, // entryPoints: [join(import.meta.dir, "manifest.css")], // outdir: "out", // loader: { // ".css": "css", // ".svg": "dataurl", // }, // external: ["*.png"], // plugins: [ // { // name: "css", // setup(build) { // build.onResolve({ filter: new RegExp("/Images/Warning.svg") }, args => ({ // path: join(basePath, "Images/Warning.svg"), // })); // }, // }, // ], // }); // const cssFilename = "manifest-" + cssBundle.outputFiles[0].hash.replaceAll("/", "_") + ".css"; htmlText = htmlText.replace(jsReplacementId, jsFilename); // htmlText = htmlText.replace(cssReplacementId, cssFilename); await Bun.write(join(import.meta.dir, "out", jsFilename), jsBundle.outputs[0]); // await Bun.write(join(import.meta.dir, "out", cssFilename), cssBundle.outputFiles[0].text); await Bun.write(join(import.meta.dir, "out", "index.html"), htmlText); await Bun.write(join(import.meta.dir, "out", "index.html"), htmlText); await Bun.write(join(import.meta.dir, "out", "Protocol", "InspectorBackendCommands.js"), Bun.file(backendCommands)); function recursiveCopy(src, dest) { readdirSync(src).forEach(file => { const srcPath = join(src, file); const destPath = join(dest, file); if (statSync(srcPath).isDirectory()) { mkdirSync(destPath, { recursive: true }); recursiveCopy(srcPath, destPath); } else { rmSync(destPath, { force: true }); copyFileSync(srcPath, destPath); } }); } recursiveCopy(basePath, join(import.meta.dir, "out")); } catch (e) { console.error("Failed to build. Please make sure you've ran `make jsc` locally."); throw e; }