Files
WorkNote/.obsidian/plugins/obsidian-enhancing-export-main/vite.config.ts
2025-04-10 14:02:57 +08:00

143 lines
3.8 KiB
TypeScript

import { exec } from 'child_process';
import { defineConfig, loadEnv, Plugin, UserConfig } from 'vite';
import { viteStaticCopy } from 'vite-plugin-static-copy';
import solidPlugin from 'vite-plugin-solid';
import builtins from 'builtin-modules';
import path from 'path';
import * as fsp from 'fs/promises';
const banner = `
/*!
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository https://github.com/mokeyish/obsidian-enhancing-export .
*/
`;
export default defineConfig(async ({ mode }) => {
const { normalize } = path;
const { rm } = fsp;
const prod = mode === 'production';
let { OUT_DIR } = loadEnv(mode, process.cwd(), ['OUT_']);
OUT_DIR = normalize(OUT_DIR);
if (OUT_DIR != 'dist' && OUT_DIR != path.join(process.cwd(), 'dist')) {
await rm('dist', { recursive: true });
exec(process.platform === 'win32' ? `mklink /J dist ${OUT_DIR}` : `ln -s ${OUT_DIR} dist`);
}
return {
plugins: [
solidPlugin(),
viteStaticCopy({
targets: [{
src: 'manifest.json',
dest: '.'
}]
}),
loader({
'.lua': 'binary',
'.tex': 'binary',
'.sty': 'binary'
}), // src/resources.ts
prod ? undefined : inject(['src/hmr.ts']),
],
build: {
lib: {
entry: 'src/main.ts',
name: 'main',
fileName: () => 'main.js',
formats: ['cjs'],
},
minify: prod,
sourcemap: prod ? false : 'inline',
cssCodeSplit: false,
emptyOutDir: false,
// outDir: '',
rollupOptions: {
output: {
exports: 'named',
assetFileNames: (v) => v.name === 'style.css' ? 'styles.css' : v.name,
banner,
},
external: [
'obsidian',
'electron',
'@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/highlight',
'@lezer/lr',
...builtins
],
},
}
} as UserConfig;
});
const loader = (config: { [extention: string]: 'binary' }): Plugin => {
const { extname } = path;
return {
name: 'binary-boader',
enforce: 'pre',
async load(id) {
const format = config[extname(id)];
if (format) {
if (format === 'binary') {
const buffer = await fsp.readFile(id);
return {
code: `export default Uint8Array.from(atob('${buffer.toString('base64')}'), c => c.charCodeAt(0));`
};
}
}
},
};
};
const inject = (files: string[]): Plugin => {
if (files && files.length > 0) {
return {
name: 'inject-code',
async load(this, id) {
const info = this.getModuleInfo(id);
if (info.isEntry) {
const code = await fsp.readFile(id, 'utf-8');
const { relative, dirname, basename, extname, join } = path;
const dir = dirname(id);
const inject_code = files
.map(v => relative(dir, v))
.map(p => join('./', basename(p, extname(p))))
.map(p => `import './${p}'`).join(';');
return `
${inject_code};
${code}
`;
}
},
};
}
};