143 lines
3.8 KiB
TypeScript
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}
|
|
`;
|
|
}
|
|
},
|
|
};
|
|
}
|
|
}; |