taskgenius_taskgenius-plugin/esbuild.config.mjs
Quorafind 7116bb15ae refactor(styles): migrate from CSS to SCSS
- Convert all .css files to .scss format
- Add sass and esbuild-sass-plugin dependencies
- Configure esbuild with sassPlugin for SCSS compilation
- Update all component imports from .css to .scss
- Add _variables.scss for shared SCSS variables
- Add native-layout.scss for new layout styles
2025-12-11 14:33:41 +08:00

169 lines
4.2 KiB
JavaScript

import esbuild from "esbuild";
import process from "process";
import builtins from "builtin-modules";
import fs from "fs";
import path from "path";
import inlineWorkerPlugin from "esbuild-plugin-inline-worker";
import { sassPlugin } from "esbuild-sass-plugin";
// Respect release-it dry-run: skip writing build artifacts entirely
const __D_RY__ =
process.env.RELEASE_IT_DRY_RUN === "1" || process.env.RELEASE_IT === "1";
if (__D_RY__) {
console.log("[dry-run] skip esbuild production build");
process.exit(0);
}
const banner = `/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
`;
const prod = process.argv[2] === "production";
const outDir = prod ? "dist" : ".";
// Ensure dist directory exists in production mode
if (prod && !fs.existsSync("dist")) {
fs.mkdirSync("dist", { recursive: true });
}
// Update plugins to handle output directory
const renamePluginWithDir = {
name: "rename-styles",
setup(build) {
build.onEnd(() => {
const { outfile } = build.initialOptions;
const outcss = outfile.replace(/\.js$/, ".css");
const fixcss = outfile.replace(/main\.js$/, "styles.css");
if (fs.existsSync(outcss)) {
console.log("Renaming", outcss, "to", fixcss);
fs.renameSync(outcss, fixcss);
}
});
},
};
// Update CSS settings plugin to handle output directory
const cssSettingsPluginWithDir = {
name: "css-settings-plugin",
setup(build) {
build.onEnd(async (result) => {
// Path to the output CSS file
const cssOutfile = path.join(outDir, "styles.css");
// The settings comment to prepend (read from SCSS file now)
const indexFile = fs.existsSync("src/styles/index.scss")
? "src/styles/index.scss"
: "src/styles/index.css";
const settingsComment =
fs.readFileSync(indexFile, "utf8").split("*/")[0] + "*/\n\n";
if (fs.existsSync(cssOutfile)) {
// Read the current content
const cssContent = fs.readFileSync(cssOutfile, "utf8");
// Check if the settings comment is already there
if (!cssContent.includes("/* @settings")) {
// Prepend the settings comment
fs.writeFileSync(cssOutfile, settingsComment + cssContent);
}
}
});
},
};
// Copy manifest to output directory in production
const copyManifestPlugin = {
name: "copy-manifest",
setup(build) {
build.onEnd(() => {
if (prod) {
fs.copyFileSync(
"manifest.json",
path.join(outDir, "manifest.json"),
);
console.log("Copied manifest.json to", outDir);
}
});
},
};
const buildOptions = {
banner: {
js: banner,
},
minify: prod ? true : false,
entryPoints: ["src/index.ts"],
plugins: [
inlineWorkerPlugin({ workerName: "Task Genius Indexer" }),
sassPlugin({
// Enable modern SASS API
type: "css",
// Load paths for @use and @import
loadPaths: [path.resolve(process.cwd(), "src/styles")],
}),
renamePluginWithDir,
cssSettingsPluginWithDir,
copyManifestPlugin,
],
bundle: true,
alias: {
"@": path.resolve(process.cwd(), "src"),
},
external: [
"obsidian",
"electron",
"codemirror",
"@codemirror/autocomplete",
"@codemirror/closebrackets",
"@codemirror/collab",
"@codemirror/commands",
"@codemirror/comment",
"@codemirror/fold",
"@codemirror/gutter",
"@codemirror/highlight",
"@codemirror/history",
"@codemirror/language",
"@codemirror/lint",
"@codemirror/matchbrackets",
"@codemirror/panel",
"@codemirror/rangeset",
"@codemirror/rectangular-selection",
"@codemirror/search",
"@codemirror/state",
"@codemirror/stream-parser",
"@codemirror/text",
"@codemirror/tooltip",
"@codemirror/view",
"@lezer/common",
"@lezer/lr",
"@lezer/highlight",
"obsidian-typings",
...builtins,
],
format: "cjs",
target: "es2018",
logLevel: "info",
sourcemap: prod ? false : "inline",
treeShaking: true,
outfile: path.join(outDir, "main.js"),
pure: prod
? ["console.log", "console.time", "console.timeEnd", "console.info"]
: [],
};
if (prod) {
// Production build
esbuild.build(buildOptions).catch(() => process.exit(1));
} else {
// Development build with watch
esbuild
.context(buildOptions)
.then((ctx) => {
ctx.watch();
console.log("Watching for changes...");
})
.catch(() => process.exit(1));
}