/
ViteTemplate.ts
68 lines (61 loc) · 2.82 KB
/
ViteTemplate.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import path from 'path';
import { ForgeListrTaskDefinition, InitTemplateOptions } from '@electron-forge/shared-types';
import { BaseTemplate } from '@electron-forge/template-base';
import fs from 'fs-extra';
class ViteTemplate extends BaseTemplate {
public templateDir = path.resolve(__dirname, '..', 'tmpl');
public async initializeTemplate(directory: string, options: InitTemplateOptions): Promise<ForgeListrTaskDefinition[]> {
const superTasks = await super.initializeTemplate(directory, options);
return [
...superTasks,
{
title: 'Setting up Forge configuration',
task: async () => {
await this.copyTemplateFile(directory, 'forge.config.js');
await this.copyTemplateFile(directory, 'forge.env.d.txt');
await fs.rename(path.join(directory, 'forge.env.d.txt'), path.join(directory, 'forge.env.d.ts'));
},
},
{
title: 'Setting up Vite configuration',
task: async () => {
await this.copyTemplateFile(directory, 'vite.base.config.mjs');
await this.copyTemplateFile(directory, 'vite.main.config.mjs');
await this.copyTemplateFile(directory, 'vite.preload.config.mjs');
await this.copyTemplateFile(directory, 'vite.renderer.config.mjs');
await this.copyTemplateFile(path.join(directory, 'src'), 'renderer.js');
await this.copyTemplateFile(path.join(directory, 'src'), 'preload.js');
await this.updateFileByLine(
path.resolve(directory, 'src', 'index.js'),
(line) => {
if (line.includes('mainWindow.loadFile'))
return ` if (MAIN_WINDOW_VITE_DEV_SERVER_URL) {
mainWindow.loadURL(MAIN_WINDOW_VITE_DEV_SERVER_URL);
} else {
mainWindow.loadFile(path.join(__dirname, \`../renderer/\${MAIN_WINDOW_VITE_NAME}/index.html\`));
}`;
return line;
},
path.resolve(directory, 'src', 'main.js')
);
// TODO: Compatible with any path entry.
// Vite uses index.html under the root path as the entry point.
fs.moveSync(path.join(directory, 'src', 'index.html'), path.join(directory, 'index.html'));
await this.updateFileByLine(path.join(directory, 'index.html'), (line) => {
if (line.includes('link rel="stylesheet"')) return '';
if (line.includes('</body>')) return ' <script type="module" src="/src/renderer.js"></script>\n </body>';
return line;
});
// update package.json entry point
const pjPath = path.resolve(directory, 'package.json');
const currentPJ = await fs.readJson(pjPath);
currentPJ.main = '.vite/build/main.js';
await fs.writeJson(pjPath, currentPJ, {
spaces: 2,
});
},
},
];
}
}
export default new ViteTemplate();