sechan100_daily-routine-2/esbuild.config.mjs

126 lines
No EOL
3.4 KiB
JavaScript

import esbuild from "esbuild";
import process from "process";
import builtins from "builtin-modules";
import fs from "node:fs";
import path from "path";
import { dirname } from 'path';
import { fileURLToPath } from 'url';
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 development = process.argv[2] === "development";
const local = process.argv[2] === "local";
const prod = process.argv[2] === "production";
// CSS를 하나로 합치기 위한 rename 플러그인
const renamePlugin = {
name: 'rename-styles',
setup(build) {
build.onEnd(() => {
const { outfile } = build.initialOptions;
const outcss = outfile.replace(/\.js$/, '.css'); // main.js -> main.css
const fixcss = outfile.replace(/main\.js$/, 'styles.css'); // main.css -> styles.css
if(fs.existsSync(outcss)) {
console.log('Start renaming', outcss, 'to', fixcss);
fs.renameSync(outcss, fixcss); // main.css -> styles.css
console.log('End renaming', outcss, 'to', fixcss);
} else {
console.log('CSS file not found:', outcss); // 문제 발생 시 경로 확인용
}
});
},
};
const context = await esbuild.context({
banner: {
js: banner,
},
entryPoints: ["src/main.ts"], // 엔트리 포인트
bundle: true,
external: [
"obsidian",
"electron",
"@codemirror/autocomplete",
"@codemirror/collab",
"@codemirror/commands",
"@codemirror/language",
"@codemirror/lint",
"@codemirror/search",
"@codemirror/state",
"@codemirror/view",
"@lezer/common",
"@lezer/highlight",
"@lezer/lr",
...builtins,
],
define: {
'process.env.NODE_ENV': JSON.stringify(development || local || prod)
},
format: "cjs", // CommonJS 포맷
target: "es2018",
logLevel: "warning",
sourcemap: prod ? false : "inline",
treeShaking: true,
outfile: "main.js", // JavaScript 번들 파일
plugins: [
renamePlugin, // CSS 파일 이름 변경 플러그인
],
minify: prod,
loader: {
".tsx": "tsx", // TypeScript와 TSX 파일을 처리
".ts": "ts",
".css": "css", // CSS 파일을 로드
},
// CSS 파일을 추출하여 하나로 합침
write: true,
});
if(prod) {
await context.rebuild();
process.exit(0);
} else if(local) {
await context.rebuild();
console.log("\n === 클라우드로 플러그인 복사 시작 ===");
await copyPluginFilesTo_iCloud();
console.log("=== 완료 ===");
process.exit(0);
} else {
await context.watch();
}
async function copyPluginFilesTo_iCloud() {
const filesToCopy = [
'main.js',
'manifest.json',
'styles.css',
];
const destinationDir = '/Users/sechan/Library/Mobile Documents/iCloud~md~obsidian/Documents/main/.obsidian/plugins/daily-routine-2/';
// const destinationDir = '/Users/sechan/Library/Mobile Documents/iCloud~md~obsidian/Documents/cloud-test/.obsidian/plugins/daily-routine-2/';
// 현재 파일의 URL을 파일 경로로 변환
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
// 복사 작업
for(const file of filesToCopy) {
const sourcePath = path.join(__dirname, file);
const destPath = path.join(destinationDir, file);
try {
await fs.promises.copyFile(sourcePath, destPath);
console.log(`DONE: ${file}`);
} catch (error) {
console.error(`Failed to copy ${file}:`, error);
}
}
}