#!/usr/bin/env bun import type { BuildConfig, BunPlugin, PluginBuilder } from "bun"; import { parseArgs } from "node:util"; import type { FileImporter } from "sass"; const { values, positionals } = parseArgs({ args: Bun.argv, options: { production: { type: "boolean", short: "p", default: true, }, filter: { type: "string", short: "f", default: "all", }, }, strict: true, allowPositionals: true, }); const outdir = positionals.at(2); if (!outdir) { throw new Error("No outdir provided!"); } const nodeModuleImporter: FileImporter<"async"> = { findFileUrl(url) { if (url.startsWith("@")) { return new URL(import.meta.resolve(url)); } return null; }, }; const sassPlugin: BunPlugin = { name: "Sass Loader", async setup(build: PluginBuilder) { const sass = await import("sass"); build.onLoad({ filter: /\.scss$/ }, async ({ path }) => { // read and compile it with the sass compiler const result = await sass.compileAsync(path, { importers: [nodeModuleImporter], }); return { loader: "css", contents: result.css, }; }); }, }; const assets: BuildConfig[] = []; const filter = values.filter ?? "all"; if (["all", "sass"].includes(filter)) { assets.push({ entrypoints: ["./src/style.scss"], outdir: `${outdir}/css`, naming: "[name].css", plugins: [sassPlugin], minify: values.production, // On by default in Bun v1.2+ html: true, experimentalCss: true, }); } // if (["all", "js", "ts"].includes(filter)) { // assets.push({ // entrypoints: ["./js/index.ts"], // outdir: `${outdir}/js`, // target: "browser", // splitting: values.production, // minify: values.production, // }); // } await Promise.all( assets.map(async (item) => { const result = await Bun.build(item); if (!result.success) { throw new AggregateError(result.logs, "Build failed"); } return result; }), ); console.log(`${Bun.color("#a6da95", "ansi")}Assets succesfully build!\x1b[0m`);