@electron-forge/plugin-vite 7.2.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/Config.d.ts CHANGED
@@ -7,13 +7,13 @@ export interface VitePluginBuildConfig {
7
7
  /**
8
8
  * Vite config file path.
9
9
  */
10
- config?: string;
10
+ config: string;
11
11
  }
12
12
  export interface VitePluginRendererConfig {
13
13
  /**
14
- * Human friendly name of your entry point
14
+ * Human friendly name of your entry point.
15
15
  */
16
- name: string;
16
+ name?: string;
17
17
  /**
18
18
  * Vite config file path.
19
19
  */
@@ -25,7 +25,7 @@ export interface VitePluginConfig {
25
25
  */
26
26
  build: VitePluginBuildConfig[];
27
27
  /**
28
- * Renderer process.
28
+ * Renderer process Vite configs.
29
29
  */
30
30
  renderer: VitePluginRendererConfig[];
31
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAE3C,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B;;OAEG;IACH,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACtC"}
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAE3C,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAK/B;;OAEG;IACH,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B;;OAEG;IACH,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACtC"}
@@ -1,25 +1,17 @@
1
- import { ConfigEnv, loadConfigFromFile, UserConfig } from 'vite';
2
- import { VitePluginConfig } from './Config';
3
- /**
4
- * Vite allows zero-config runs, if the user does not provide `vite.config.js`,
5
- * then the value of `LoadResult` will become `null`.
6
- */
7
- export declare type LoadResult = Awaited<ReturnType<typeof loadConfigFromFile>>;
1
+ import type { VitePluginBuildConfig, VitePluginConfig, VitePluginRendererConfig } from './Config';
2
+ import type { ConfigEnv, UserConfig } from 'vite';
8
3
  export default class ViteConfigGenerator {
9
4
  private readonly pluginConfig;
10
5
  private readonly projectDir;
11
6
  private readonly isProd;
12
- private readonly baseDir;
13
- private rendererConfigCache;
14
7
  constructor(pluginConfig: VitePluginConfig, projectDir: string, isProd: boolean);
15
- resolveConfig(config: string, configEnv?: Partial<ConfigEnv>): Promise<{
8
+ resolveConfig(buildConfig: VitePluginBuildConfig | VitePluginRendererConfig, configEnv?: Partial<ConfigEnv>): Promise<{
16
9
  path: string;
17
10
  config: UserConfig;
18
11
  dependencies: string[];
19
12
  } | null>;
20
13
  get mode(): string;
21
- getDefines(): Promise<Record<string, string>>;
22
- getBuildConfig(watch?: boolean): Promise<UserConfig[]>;
14
+ getBuildConfig(): Promise<UserConfig[]>;
23
15
  getRendererConfig(): Promise<UserConfig[]>;
24
16
  }
25
17
  //# sourceMappingURL=ViteConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViteConfig.d.ts","sourceRoot":"","sources":["../src/ViteConfig.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAe,UAAU,EAAE,MAAM,MAAM,CAAC;AAE9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAK5C;;;GAGG;AACH,oBAAY,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAK1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAAoB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO,CAAC,mBAAmB,CAAyB;gBAEvB,YAAY,EAAE,gBAAgB,EAAmB,UAAU,EAAE,MAAM,EAAmB,MAAM,EAAE,OAAO;IAKlI,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,OAAO,CAAC,SAAS,CAAM;;;;;IAShE,IAAI,IAAI,IAAI,MAAM,CAKjB;IAEK,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAgB7C,cAAc,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA0CpD,iBAAiB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAsBjD"}
1
+ {"version":3,"file":"ViteConfig.d.ts","sourceRoot":"","sources":["../src/ViteConfig.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAElG,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAIlD,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAAoB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAA5F,YAAY,EAAE,gBAAgB,EAAmB,UAAU,EAAE,MAAM,EAAmB,MAAM,EAAE,OAAO;IAIlI,aAAa,CAAC,WAAW,EAAE,qBAAqB,GAAG,wBAAwB,EAAE,SAAS,GAAE,OAAO,CAAC,SAAS,CAAM;;;;;IAiB/G,IAAI,IAAI,IAAI,MAAM,CAKjB;IAEK,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAavC,iBAAiB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAWjD"}
@@ -3,26 +3,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_path_1 = __importDefault(require("node:path"));
7
6
  const debug_1 = __importDefault(require("debug"));
7
+ // eslint-disable-next-line node/no-unpublished-import
8
8
  const vite_1 = require("vite");
9
- const plugins_1 = require("./util/plugins");
10
- const d = (0, debug_1.default)('electron-forge:plugin:vite:viteconfig');
9
+ const d = (0, debug_1.default)('@electron-forge/plugin-vite:ViteConfig');
11
10
  class ViteConfigGenerator {
12
11
  constructor(pluginConfig, projectDir, isProd) {
13
12
  this.pluginConfig = pluginConfig;
14
13
  this.projectDir = projectDir;
15
14
  this.isProd = isProd;
16
- this.baseDir = node_path_1.default.join(projectDir, '.vite');
17
15
  d('Config mode:', this.mode);
18
16
  }
19
- resolveConfig(config, configEnv = {}) {
20
- // `command` is to be passed as an arguments when the user export a function in `vite.config.js`.
17
+ resolveConfig(buildConfig, configEnv = {}) {
21
18
  // @see - https://vitejs.dev/config/#conditional-config
22
19
  configEnv.command ??= this.isProd ? 'build' : 'serve';
23
- // `mode` affects `.env.[mode]` file loading.
20
+ // `mode` affects `.env.[mode]` file load.
24
21
  configEnv.mode ??= this.mode;
25
- return (0, vite_1.loadConfigFromFile)(configEnv, config);
22
+ // Hack! Pass the forge runtime config to the vite config file in the template.
23
+ Object.assign(configEnv, {
24
+ root: this.projectDir,
25
+ forgeConfig: this.pluginConfig,
26
+ forgeConfigSelf: buildConfig,
27
+ });
28
+ // `configEnv` is to be passed as an arguments when the user export a function in `vite.config.js`.
29
+ return (0, vite_1.loadConfigFromFile)(configEnv, buildConfig.config);
26
30
  }
27
31
  get mode() {
28
32
  // Vite's `mode` can be passed in via command.
@@ -30,80 +34,25 @@ class ViteConfigGenerator {
30
34
  // The `mode` set by the end user in `vite.config.js` has a higher priority.
31
35
  return this.isProd ? 'production' : 'development';
32
36
  }
33
- async getDefines() {
34
- const defines = {};
35
- const rendererConfigs = await this.getRendererConfig();
36
- for (const [index, userConfig] of rendererConfigs.entries()) {
37
- const name = this.pluginConfig.renderer[index].name;
38
- if (!name) {
39
- continue;
40
- }
41
- const NAME = name.toUpperCase().replace(/ /g, '_');
42
- // `server.port` is set in `launchRendererDevServers` in `VitePlugin.ts`.
43
- defines[`${NAME}_VITE_DEV_SERVER_URL`] = this.isProd ? undefined : JSON.stringify(`http://localhost:${userConfig?.server?.port}`);
44
- defines[`${NAME}_VITE_NAME`] = JSON.stringify(name);
45
- }
46
- return defines;
47
- }
48
- async getBuildConfig(watch = false) {
37
+ async getBuildConfig() {
49
38
  if (!Array.isArray(this.pluginConfig.build)) {
50
39
  throw new Error('"config.build" must be an Array');
51
40
  }
52
- const define = await this.getDefines();
53
- const plugins = [(0, plugins_1.externalBuiltins)()];
54
41
  const configs = this.pluginConfig.build
55
- .filter(({ entry, config }) => entry || config)
56
- .map(async ({ entry, config }) => {
57
- const defaultConfig = {
58
- // Ensure that each build config loads the .env file correctly.
59
- mode: this.mode,
60
- build: {
61
- lib: entry
62
- ? {
63
- entry,
64
- // Electron can only support cjs.
65
- formats: ['cjs'],
66
- fileName: () => '[name].js',
67
- }
68
- : undefined,
69
- // Prevent multiple builds from interfering with each other.
70
- emptyOutDir: false,
71
- // 🚧 Multiple builds may conflict.
72
- outDir: node_path_1.default.join(this.baseDir, 'build'),
73
- watch: watch ? {} : undefined,
74
- },
75
- clearScreen: false,
76
- define,
77
- plugins,
78
- };
79
- if (config) {
80
- const loadResult = await this.resolveConfig(config);
81
- return (0, vite_1.mergeConfig)(defaultConfig, loadResult?.config ?? {});
82
- }
83
- return defaultConfig;
84
- });
42
+ // Prevent load the default `vite.config.js` file.
43
+ .filter(({ config }) => config)
44
+ .map(async (buildConfig) => (await this.resolveConfig(buildConfig))?.config ?? {});
85
45
  return await Promise.all(configs);
86
46
  }
87
47
  async getRendererConfig() {
88
48
  if (!Array.isArray(this.pluginConfig.renderer)) {
89
49
  throw new Error('"config.renderer" must be an Array');
90
50
  }
91
- const configs = (this.rendererConfigCache ??= this.pluginConfig.renderer.map(async ({ name, config }) => {
92
- const defaultConfig = {
93
- // Ensure that each build config loads the .env file correctly.
94
- mode: this.mode,
95
- // Make sure that Electron can be loaded into the local file using `loadFile` after packaging.
96
- base: './',
97
- build: {
98
- outDir: node_path_1.default.join(this.baseDir, 'renderer', name),
99
- },
100
- clearScreen: false,
101
- };
102
- const loadResult = (await this.resolveConfig(config)) ?? { path: '', config: {}, dependencies: [] };
103
- return (0, vite_1.mergeConfig)(defaultConfig, loadResult.config);
104
- }));
51
+ const configs = this.pluginConfig.renderer
52
+ .filter(({ config }) => config)
53
+ .map(async (buildConfig) => (await this.resolveConfig(buildConfig))?.config ?? {});
105
54
  return await Promise.all(configs);
106
55
  }
107
56
  }
108
57
  exports.default = ViteConfigGenerator;
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZUNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMERBQTZCO0FBRTdCLGtEQUEwQjtBQUMxQiwrQkFBOEU7QUFHOUUsNENBQWtEO0FBRWxELE1BQU0sQ0FBQyxHQUFHLElBQUEsZUFBSyxFQUFDLHVDQUF1QyxDQUFDLENBQUM7QUFRekQsTUFBcUIsbUJBQW1CO0lBS3RDLFlBQTZCLFlBQThCLEVBQW1CLFVBQWtCLEVBQW1CLE1BQWU7UUFBckcsaUJBQVksR0FBWixZQUFZLENBQWtCO1FBQW1CLGVBQVUsR0FBVixVQUFVLENBQVE7UUFBbUIsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNoSSxJQUFJLENBQUMsT0FBTyxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQWMsRUFBRSxZQUFnQyxFQUFFO1FBQzlELGlHQUFpRztRQUNqRyx1REFBdUQ7UUFDdkQsU0FBUyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN0RCw2Q0FBNkM7UUFDN0MsU0FBUyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzdCLE9BQU8sSUFBQSx5QkFBa0IsRUFBQyxTQUFzQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTiw4Q0FBOEM7UUFDOUMsaUhBQWlIO1FBQ2pILDRFQUE0RTtRQUM1RSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQ3BELENBQUM7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
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZUNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLHNEQUFzRDtBQUN0RCwrQkFBMEM7QUFNMUMsTUFBTSxDQUFDLEdBQUcsSUFBQSxlQUFLLEVBQUMsd0NBQXdDLENBQUMsQ0FBQztBQUUxRCxNQUFxQixtQkFBbUI7SUFDdEMsWUFBNkIsWUFBOEIsRUFBbUIsVUFBa0IsRUFBbUIsTUFBZTtRQUFyRyxpQkFBWSxHQUFaLFlBQVksQ0FBa0I7UUFBbUIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUFtQixXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQ2hJLENBQUMsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxhQUFhLENBQUMsV0FBNkQsRUFBRSxZQUFnQyxFQUFFO1FBQzdHLHVEQUF1RDtRQUN2RCxTQUFTLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3RELDBDQUEwQztRQUMxQyxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFN0IsK0VBQStFO1FBQy9FLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtZQUNyQixXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDOUIsZUFBZSxFQUFFLFdBQVc7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsbUdBQW1HO1FBQ25HLE9BQU8sSUFBQSx5QkFBa0IsRUFBQyxTQUFzQixFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sOENBQThDO1FBQzlDLGlIQUFpSDtRQUNqSCw0RUFBNEU7UUFDNUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDcEQ7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUs7WUFDckMsa0RBQWtEO2FBQ2pELE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQzthQUM5QixHQUFHLENBQXNCLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFHLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO2FBQ3ZDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQzthQUM5QixHQUFHLENBQXNCLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFHLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQXJERCxzQ0FxREMifQ==
@@ -1,6 +1,6 @@
1
1
  import { PluginBase } from '@electron-forge/plugin-base';
2
- import { ForgeMultiHookMap, StartResult } from '@electron-forge/shared-types';
3
- import { VitePluginConfig } from './Config';
2
+ import type { VitePluginConfig } from './Config';
3
+ import type { ForgeMultiHookMap, ResolvedForgeConfig, StartResult } from '@electron-forge/shared-types';
4
4
  export default class VitePlugin extends PluginBase<VitePluginConfig> {
5
5
  private static alreadyStarted;
6
6
  name: string;
@@ -11,11 +11,13 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
11
11
  private watchers;
12
12
  private servers;
13
13
  init: (dir: string) => void;
14
- private setDirectories;
14
+ setDirectories(dir: string): void;
15
15
  private get configGenerator();
16
16
  getHooks: () => ForgeMultiHookMap;
17
+ resolveForgeConfig: (forgeConfig: ResolvedForgeConfig) => Promise<ResolvedForgeConfig>;
18
+ packageAfterCopy: (_forgeConfig: ResolvedForgeConfig, buildPath: string) => Promise<void>;
17
19
  startLogic: () => Promise<StartResult>;
18
- build: (watch?: boolean) => Promise<void>;
20
+ build: () => Promise<void>;
19
21
  buildRenderer: () => Promise<void>;
20
22
  launchRendererDevServers: () => Promise<void>;
21
23
  exitHandler: (options: {
@@ -1 +1 @@
1
- {"version":3,"file":"VitePlugin.d.ts","sourceRoot":"","sources":["../src/VitePlugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAM9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAK5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,UAAU,CAAC,gBAAgB,CAAC;IAClE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAS;IAE/B,IAAI,SAAU;IAErB,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,UAAU,CAAU;IAG5B,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,oBAAoB,CAAuB;IAEnD,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO,CAAC,OAAO,CAA4B;IAE3C,IAAI,QAAS,MAAM,KAAG,IAAI,CAMxB;IAEF,OAAO,CAAC,cAAc;IAKtB,OAAO,KAAK,eAAe,GAE1B;IAED,QAAQ,QAAO,iBAAiB,CAkB9B;IAEF,UAAU,QAAa,QAAQ,WAAW,CAAC,CA+BzC;IAGF,KAAK,uBAA0B,QAAQ,IAAI,CAAC,CAoC1C;IAGF,aAAa,QAAa,QAAQ,IAAI,CAAC,CAOrC;IAEF,wBAAwB,QAAa,QAAQ,IAAI,CAAC,CAuBhD;IAEF,WAAW,YAAa;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,8BAAgB,IAAI,CAmB/E;CACH;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"VitePlugin.d.ts","sourceRoot":"","sources":["../src/VitePlugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAW9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAOxG,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,UAAU,CAAC,gBAAgB,CAAC;IAClE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAS;IAE/B,IAAI,SAAU;IAErB,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,UAAU,CAAU;IAG5B,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,oBAAoB,CAAuB;IAEnD,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO,CAAC,OAAO,CAA4B;IAE3C,IAAI,QAAS,MAAM,KAAG,IAAI,CAMxB;IAEK,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKxC,OAAO,KAAK,eAAe,GAE1B;IAED,QAAQ,QAAO,iBAAiB,CAoB9B;IAEF,kBAAkB,gBAAuB,mBAAmB,KAAG,QAAQ,mBAAmB,CAAC,CAsBzF;IAEF,gBAAgB,iBAAwB,mBAAmB,aAAa,MAAM,KAAG,QAAQ,IAAI,CAAC,CAsB5F;IAEF,UAAU,QAAa,QAAQ,WAAW,CAAC,CA+BzC;IAGF,KAAK,QAAa,QAAQ,IAAI,CAAC,CA4B7B;IAGF,aAAa,QAAa,QAAQ,IAAI,CAAC,CAOrC;IAEF,wBAAwB,QAAa,QAAQ,IAAI,CAAC,CAuBhD;IAEF,WAAW,YAAa;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,8BAAgB,IAAI,CAmB/E;CACH;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -4,11 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.VitePlugin = void 0;
7
- const promises_1 = __importDefault(require("node:fs/promises"));
8
7
  const node_path_1 = __importDefault(require("node:path"));
9
8
  const plugin_base_1 = require("@electron-forge/plugin-base");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
10
  const debug_1 = __importDefault(require("debug"));
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ // eslint-disable-next-line node/no-unpublished-import
11
13
  const vite_1 = __importDefault(require("vite"));
14
+ const package_1 = require("./util/package");
15
+ const plugins_1 = require("./util/plugins");
12
16
  const ViteConfig_1 = __importDefault(require("./ViteConfig"));
13
17
  const d = (0, debug_1.default)('electron-forge:plugin:vite');
14
18
  class VitePlugin extends plugin_base_1.PluginBase {
@@ -29,7 +33,7 @@ class VitePlugin extends plugin_base_1.PluginBase {
29
33
  prePackage: [
30
34
  (0, plugin_base_1.namedHookWithTaskFn)(async () => {
31
35
  this.isProd = true;
32
- await promises_1.default.rm(this.baseDir, { recursive: true, force: true });
36
+ await fs_extra_1.default.remove(this.baseDir);
33
37
  await Promise.all([this.build(), this.buildRenderer()]);
34
38
  }, 'Building vite bundles'),
35
39
  ],
@@ -41,13 +45,53 @@ class VitePlugin extends plugin_base_1.PluginBase {
41
45
  this.exitHandler({ cleanup: true, exit: true });
42
46
  });
43
47
  },
48
+ resolveForgeConfig: this.resolveForgeConfig,
49
+ packageAfterCopy: this.packageAfterCopy,
44
50
  };
45
51
  };
52
+ this.resolveForgeConfig = async (forgeConfig) => {
53
+ forgeConfig.packagerConfig ??= {};
54
+ if (forgeConfig.packagerConfig.ignore) {
55
+ if (typeof forgeConfig.packagerConfig.ignore !== 'function') {
56
+ console.error(chalk_1.default.yellow(`You have set packagerConfig.ignore, the Electron Forge Vite plugin normally sets this automatically.
57
+
58
+ Your packaged app may be larger than expected if you dont ignore everything other than the '.vite' folder`));
59
+ }
60
+ return forgeConfig;
61
+ }
62
+ forgeConfig.packagerConfig.ignore = (file) => {
63
+ if (!file)
64
+ return false;
65
+ // Always starts with `/`
66
+ // @see - https://github.com/electron/packager/blob/v18.1.3/src/copy-filter.ts#L89-L93
67
+ return !file.startsWith('/.vite');
68
+ };
69
+ return forgeConfig;
70
+ };
71
+ this.packageAfterCopy = async (_forgeConfig, buildPath) => {
72
+ const pj = await fs_extra_1.default.readJson(node_path_1.default.resolve(this.projectDir, 'package.json'));
73
+ const flatDependencies = await (0, package_1.getFlatDependencies)(this.projectDir);
74
+ if (!pj.main?.includes('.vite/')) {
75
+ throw new Error(`Electron Forge is configured to use the Vite plugin. The plugin expects the
76
+ "main" entry point in "package.json" to be ".vite/*" (where the plugin outputs
77
+ the generated files). Instead, it is ${JSON.stringify(pj.main)}`);
78
+ }
79
+ if (pj.config) {
80
+ delete pj.config.forge;
81
+ }
82
+ await fs_extra_1.default.writeJson(node_path_1.default.resolve(buildPath, 'package.json'), pj, {
83
+ spaces: 2,
84
+ });
85
+ // Copy the dependencies in package.json
86
+ for (const dep of flatDependencies) {
87
+ await fs_extra_1.default.copy(dep.src, node_path_1.default.resolve(buildPath, dep.dest));
88
+ }
89
+ };
46
90
  this.startLogic = async () => {
47
91
  if (VitePlugin.alreadyStarted)
48
92
  return false;
49
93
  VitePlugin.alreadyStarted = true;
50
- await promises_1.default.rm(this.baseDir, { recursive: true, force: true });
94
+ await fs_extra_1.default.remove(this.baseDir);
51
95
  return {
52
96
  tasks: [
53
97
  {
@@ -64,7 +108,7 @@ class VitePlugin extends plugin_base_1.PluginBase {
64
108
  {
65
109
  title: 'Compiling main process code',
66
110
  task: async () => {
67
- await this.build(true);
111
+ await this.build();
68
112
  },
69
113
  options: {
70
114
  showTimer: true,
@@ -75,27 +119,20 @@ class VitePlugin extends plugin_base_1.PluginBase {
75
119
  };
76
120
  };
77
121
  // Main process, Preload scripts and Worker process, etc.
78
- this.build = async (watch = false) => {
79
- await Promise.all((await this.configGenerator.getBuildConfig(watch)).map((userConfig) => {
80
- return new Promise((resolve, reject) => {
122
+ this.build = async () => {
123
+ const configs = await this.configGenerator.getBuildConfig();
124
+ const buildTasks = [];
125
+ const isWatcher = (x) => typeof x?.close === 'function';
126
+ for (const userConfig of configs) {
127
+ const buildTask = new Promise((resolve, reject) => {
81
128
  vite_1.default
82
129
  .build({
83
130
  // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
84
131
  configFile: false,
85
132
  ...userConfig,
86
- plugins: [
87
- {
88
- name: '@electron-forge/plugin-vite:start',
89
- closeBundle() {
90
- resolve();
91
- // TODO: implement hot-restart here
92
- },
93
- },
94
- ...(userConfig.plugins ?? []),
95
- ],
133
+ plugins: [(0, plugins_1.onBuildDone)(resolve), ...(userConfig.plugins ?? [])],
96
134
  })
97
135
  .then((result) => {
98
- const isWatcher = (x) => typeof x?.close === 'function';
99
136
  if (isWatcher(result)) {
100
137
  this.watchers.push(result);
101
138
  }
@@ -103,7 +140,9 @@ class VitePlugin extends plugin_base_1.PluginBase {
103
140
  })
104
141
  .catch(reject);
105
142
  });
106
- }));
143
+ buildTasks.push(buildTask);
144
+ }
145
+ await Promise.all(buildTasks);
107
146
  };
108
147
  // Renderer process
109
148
  this.buildRenderer = async () => {
@@ -167,4 +206,4 @@ class VitePlugin extends plugin_base_1.PluginBase {
167
206
  exports.default = VitePlugin;
168
207
  exports.VitePlugin = VitePlugin;
169
208
  VitePlugin.alreadyStarted = false;
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFrQztBQUVsQywwREFBNkI7QUFFN0IsNkRBQThFO0FBRTlFLGtEQUEwQjtBQUcxQixnREFBdUM7QUFHdkMsOERBQStDO0FBRS9DLE1BQU0sQ0FBQyxHQUFHLElBQUEsZUFBSyxFQUFDLDRCQUE0QixDQUFDLENBQUM7QUFFOUMsTUFBcUIsVUFBVyxTQUFRLHdCQUE0QjtJQUFwRTs7UUFHUyxTQUFJLEdBQUcsTUFBTSxDQUFDO1FBRWIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQVVmLGFBQVEsR0FBb0IsRUFBRSxDQUFDO1FBRS9CLFlBQU8sR0FBeUIsRUFBRSxDQUFDO1FBRTNDLFNBQUksR0FBRyxDQUFDLEdBQVcsRUFBUSxFQUFFO1lBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekIsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDNUIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBMEIsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDO1FBV0YsYUFBUSxHQUFHLEdBQXNCLEVBQUU7WUFDakMsT0FBTztnQkFDTCxVQUFVLEVBQUU7b0JBQ1YsSUFBQSxpQ0FBbUIsRUFBZSxLQUFLLElBQUksRUFBRTt3QkFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7d0JBQ25CLE1BQU0sa0JBQUUs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
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUE2QjtBQUU3Qiw2REFBOEU7QUFDOUUsa0RBQTBCO0FBQzFCLGtEQUEwQjtBQUMxQix3REFBMEI7QUFDMUIsc0RBQXNEO0FBQ3RELGdEQUF1QztBQUV2Qyw0Q0FBcUQ7QUFDckQsNENBQTZDO0FBQzdDLDhEQUErQztBQVEvQyxNQUFNLENBQUMsR0FBRyxJQUFBLGVBQUssRUFBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBRTlDLE1BQXFCLFVBQVcsU0FBUSx3QkFBNEI7SUFBcEU7O1FBR1MsU0FBSSxHQUFHLE1BQU0sQ0FBQztRQUViLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFVZixhQUFRLEdBQW9CLEVBQUUsQ0FBQztRQUUvQixZQUFPLEdBQXlCLEVBQUUsQ0FBQztRQUUzQyxTQUFJLEdBQUcsQ0FBQyxHQUFXLEVBQVEsRUFBRTtZQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXpCLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuRSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQTBCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQztRQVdGLGFBQVEsR0FBRyxHQUFzQixFQUFFO1lBQ2pDLE9BQU87Z0JBQ0wsVUFBVSxFQUFFO29CQUNWLElBQUEsaUNBQW1CLEVBQWUsS0FBSyxJQUFJLEVBQUU7d0JB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
@@ -0,0 +1,14 @@
1
+ export interface Dependency {
2
+ name: string;
3
+ path: SourceAndDestination;
4
+ dependencies: Dependency[];
5
+ }
6
+ export interface SourceAndDestination {
7
+ src: string;
8
+ dest: string;
9
+ }
10
+ export declare function isDirectory(p: string): Promise<boolean>;
11
+ export declare function lookupNodeModulesPaths(root: string, paths?: string[]): Promise<string[]>;
12
+ export declare function resolveDependencies(root: string): Promise<Dependency[]>;
13
+ export declare function getFlatDependencies(root?: string): Promise<SourceAndDestination[]>;
14
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../src/util/package.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,oBAAoB,CAAC;IAC3B,YAAY,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,wBAAsB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7D;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYlG;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,yBAmDrD;AAED,wBAAsB,mBAAmB,CAAC,IAAI,SAAgB,mCAW7D"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getFlatDependencies = exports.resolveDependencies = exports.lookupNodeModulesPaths = exports.isDirectory = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ function isRootPath(dir) {
10
+ // *unix or Windows root path
11
+ return dir === '/' || /^[a-zA-Z]:\\$/i.test(dir);
12
+ }
13
+ async function isDirectory(p) {
14
+ try {
15
+ const stat = await fs_extra_1.default.promises.stat(p);
16
+ return stat.isDirectory();
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ exports.isDirectory = isDirectory;
23
+ async function lookupNodeModulesPaths(root, paths = []) {
24
+ if (!root)
25
+ return paths;
26
+ if (!node_path_1.default.isAbsolute(root))
27
+ return paths;
28
+ const p = node_path_1.default.join(root, 'node_modules');
29
+ if (await isDirectory(p)) {
30
+ paths = paths.concat(p);
31
+ }
32
+ root = node_path_1.default.join(root, '..');
33
+ return isRootPath(root) ? paths : await lookupNodeModulesPaths(root, paths);
34
+ }
35
+ exports.lookupNodeModulesPaths = lookupNodeModulesPaths;
36
+ async function resolveDependencies(root) {
37
+ const rootDependencies = Object.keys((await fs_extra_1.default.readJson(node_path_1.default.join(root, 'package.json'))).dependencies || {});
38
+ const resolve = async (prePath, dependencies, collected = new Map()) => await Promise.all(dependencies.map(async (name) => {
39
+ let curPath = prePath, depPath = null, packageJson = null;
40
+ while (!packageJson && !isRootPath(curPath)) {
41
+ const allNodeModules = await lookupNodeModulesPaths(curPath);
42
+ for (const nodeModules of allNodeModules) {
43
+ depPath = node_path_1.default.join(nodeModules, name);
44
+ if (await fs_extra_1.default.pathExists(depPath))
45
+ break;
46
+ }
47
+ if (depPath) {
48
+ try {
49
+ packageJson = await fs_extra_1.default.readJson(node_path_1.default.join(depPath, 'package.json'));
50
+ }
51
+ catch (err) {
52
+ // lookup node_modules
53
+ curPath = node_path_1.default.join(curPath, '..');
54
+ if (curPath.length < root.length) {
55
+ console.error(`not found 'node_modules' in root path: ${root}`);
56
+ throw err;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ if (!depPath || !packageJson) {
62
+ throw new Error(`find dependencies error in: ${curPath}`);
63
+ }
64
+ const result = {
65
+ name,
66
+ path: {
67
+ src: depPath,
68
+ dest: node_path_1.default.relative(root, depPath),
69
+ },
70
+ dependencies: [],
71
+ };
72
+ const shouldResolveDeps = !collected.has(depPath);
73
+ collected.set(depPath, result);
74
+ if (shouldResolveDeps) {
75
+ result.dependencies = await resolve(depPath, Object.keys(packageJson.dependencies || {}), collected);
76
+ }
77
+ return result;
78
+ }));
79
+ return resolve(root, rootDependencies);
80
+ }
81
+ exports.resolveDependencies = resolveDependencies;
82
+ async function getFlatDependencies(root = process.cwd()) {
83
+ const depsTree = await resolveDependencies(root);
84
+ const depsFlat = new Map();
85
+ const flatten = (dep) => {
86
+ depsFlat.set(dep.path.src, dep.path); // dedup
87
+ dep.dependencies.forEach(flatten);
88
+ };
89
+ depsTree.forEach(flatten);
90
+ return [...depsFlat.values()];
91
+ }
92
+ exports.getFlatDependencies = getFlatDependencies;
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3BhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBQTZCO0FBRTdCLHdEQUEwQjtBQWExQixTQUFTLFVBQVUsQ0FBQyxHQUFXO0lBQzdCLDZCQUE2QjtJQUM3QixPQUFPLEdBQUcsS0FBSyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFTSxLQUFLLFVBQVUsV0FBVyxDQUFDLENBQVM7SUFDekMsSUFBSTtRQUNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sa0JBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0tBQzNCO0lBQUMsTUFBTTtRQUNOLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7QUFDSCxDQUFDO0FBUEQsa0NBT0M7QUFFTSxLQUFLLFVBQVUsc0JBQXNCLENBQUMsSUFBWSxFQUFFLFFBQWtCLEVBQUU7SUFDN0UsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN4QixJQUFJLENBQUMsbUJBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFekMsTUFBTSxDQUFDLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRTFDLElBQUksTUFBTSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDeEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDekI7SUFDRCxJQUFJLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRTdCLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFaRCx3REFZQztBQUVNLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxJQUFZO0lBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sa0JBQUUsQ0FBQyxRQUFRLENBQUMsbUJBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUcsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLE9BQWUsRUFBRSxZQUFzQixFQUFFLFlBQXFDLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUNoSCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDOUIsSUFBSSxPQUFPLEdBQUcsT0FBTyxFQUNuQixPQUFPLEdBQUcsSUFBSSxFQUNkLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDckIsT0FBTyxDQUFDLFdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMzQyxNQUFNLGNBQWMsR0FBRyxNQUFNLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTdELEtBQUssTUFBTSxXQUFXLElBQUksY0FBYyxFQUFFO2dCQUN4QyxPQUFPLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLE1BQU0sa0JBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO29CQUFFLE1BQU07YUFDekM7WUFFRCxJQUFJLE9BQU8sRUFBRTtnQkFDWCxJQUFJO29CQUNGLFdBQVcsR0FBRyxNQUFNLGtCQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO2lCQUNyRTtnQkFBQyxPQUFPLEdBQUcsRUFBRTtvQkFDWixzQkFBc0I7b0JBQ3RCLE9BQU8sR0FBRyxtQkFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ25DLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUNoRSxNQUFNLEdBQUcsQ0FBQztxQkFDWDtpQkFDRjthQUNGO1NBQ0Y7UUFFRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDM0Q7UUFFRCxNQUFNLE1BQU0sR0FBZTtZQUN6QixJQUFJO1lBQ0osSUFBSSxFQUFFO2dCQUNKLEdBQUcsRUFBRSxPQUFPO2dCQUNaLElBQUksRUFBRSxtQkFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO2FBQ25DO1lBQ0QsWUFBWSxFQUFFLEVBQUU7U0FDakIsQ0FBQztRQUNGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLElBQUksaUJBQWlCLEVBQUU7WUFDckIsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQ3RHO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFuREQsa0RBbURDO0FBRU0sS0FBSyxVQUFVLG1CQUFtQixDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFO0lBQzVELE1BQU0sUUFBUSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFFekQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFlLEVBQUUsRUFBRTtRQUNsQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVE7UUFDOUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDO0lBQ0YsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUxQixPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBWEQsa0RBV0MifQ==
@@ -1,6 +1,3 @@
1
1
  import type { Plugin } from 'vite';
2
- /**
3
- * `electron` and Node.js built-in modules should always be externalize.
4
- */
5
- export declare function externalBuiltins(): Plugin;
2
+ export declare function onBuildDone(callback: () => void): Plugin<any>;
6
3
  //# sourceMappingURL=plugins.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/util/plugins.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC;;GAEG;AACH,wBAAgB,gBAAgB,WA2B/B"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/util/plugins.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,eAO/C"}
@@ -1,37 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.externalBuiltins = void 0;
4
- const node_module_1 = require("node:module");
5
- /**
6
- * `electron` and Node.js built-in modules should always be externalize.
7
- */
8
- function externalBuiltins() {
3
+ exports.onBuildDone = void 0;
4
+ function onBuildDone(callback) {
9
5
  return {
10
- name: '@electron-forge/plugin-vite:external-builtins',
11
- config(config) {
12
- const nativeModules = node_module_1.builtinModules.filter((e) => !e.startsWith('_'));
13
- const builtins = ['electron', ...nativeModules, ...nativeModules.map((m) => `node:${m}`)];
14
- config.build ??= {};
15
- config.build.rollupOptions ??= {};
16
- let external = config.build.rollupOptions.external;
17
- if (Array.isArray(external) || typeof external === 'string' || external instanceof RegExp) {
18
- external = builtins.concat(external);
19
- }
20
- else if (typeof external === 'function') {
21
- const original = external;
22
- external = function (source, importer, isResolved) {
23
- if (builtins.includes(source)) {
24
- return true;
25
- }
26
- return original(source, importer, isResolved);
27
- };
28
- }
29
- else {
30
- external = builtins;
31
- }
32
- config.build.rollupOptions.external = external;
6
+ name: '@electron-forge/plugin-vite:build-done',
7
+ closeBundle() {
8
+ callback();
33
9
  },
34
10
  };
35
11
  }
36
- exports.externalBuiltins = externalBuiltins;
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTZDO0FBSTdDOztHQUVHO0FBQ0gsU0FBZ0IsZ0JBQWdCO0lBQzlCLE9BQWU7UUFDYixJQUFJLEVBQUUsK0NBQStDO1FBQ3JELE1BQU0sQ0FBQyxNQUFNO1lBQ1gsTUFBTSxhQUFhLEdBQUcsNEJBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sUUFBUSxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFMUYsTUFBTSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEtBQUssRUFBRSxDQUFDO1lBRWxDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUNuRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsWUFBWSxNQUFNLEVBQUU7Z0JBQ3pGLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQW9CLENBQUMsQ0FBQzthQUNsRDtpQkFBTSxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRTtnQkFDekMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDO2dCQUMxQixRQUFRLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVU7b0JBQy9DLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDN0IsT0FBTyxJQUFJLENBQUM7cUJBQ2I7b0JBQ0QsT0FBTyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDaEQsQ0FBQyxDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsUUFBUSxHQUFHLFFBQVEsQ0FBQzthQUNyQjtZQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDakQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBM0JELDRDQTJCQyJ9
12
+ exports.onBuildDone = onBuildDone;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsU0FBZ0IsV0FBVyxDQUFDLFFBQW9CO0lBQzlDLE9BQU87UUFDTCxJQUFJLEVBQUUsd0NBQXdDO1FBQzlDLFdBQVc7WUFDVCxRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7S0FDUSxDQUFDO0FBQ2QsQ0FBQztBQVBELGtDQU9DIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electron-forge/plugin-vite",
3
- "version": "7.2.0",
3
+ "version": "7.3.0",
4
4
  "description": "Vite plugin for Electron Forge, lets you use Vite directly in your tooling",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,29 +12,30 @@
12
12
  "main": "dist/VitePlugin.js",
13
13
  "typings": "dist/VitePlugin.d.ts",
14
14
  "scripts": {
15
- "test": "xvfb-maybe mocha --config ../../../.mocharc.js test/**/*_spec.ts"
15
+ "test": "xvfb-maybe mocha --config ../../../.mocharc.js test/**/*_spec.ts test/*_spec.ts"
16
+ },
17
+ "dependencies": {
18
+ "@electron-forge/core-utils": "7.3.0",
19
+ "@electron-forge/plugin-base": "7.3.0",
20
+ "@electron-forge/shared-types": "7.3.0",
21
+ "@electron-forge/web-multi-logger": "7.3.0",
22
+ "chalk": "^4.0.0",
23
+ "debug": "^4.3.1",
24
+ "fs-extra": "^10.0.0"
16
25
  },
17
26
  "devDependencies": {
27
+ "@electron/packager": "^18.1.2",
18
28
  "@malept/cross-spawn-promise": "^2.0.0",
19
29
  "@types/node": "^18.0.3",
20
30
  "chai": "^4.3.3",
21
- "fs-extra": "^10.0.0",
22
31
  "mocha": "^9.0.1",
32
+ "vite": "^5.0.12",
23
33
  "which": "^2.0.2",
24
34
  "xvfb-maybe": "^0.2.1"
25
35
  },
26
36
  "engines": {
27
37
  "node": ">= 16.4.0"
28
38
  },
29
- "dependencies": {
30
- "@electron-forge/core-utils": "7.2.0",
31
- "@electron-forge/plugin-base": "7.2.0",
32
- "@electron-forge/shared-types": "7.2.0",
33
- "@electron-forge/web-multi-logger": "7.2.0",
34
- "chalk": "^4.0.0",
35
- "debug": "^4.3.1",
36
- "vite": "^4.1.1"
37
- },
38
39
  "publishConfig": {
39
40
  "access": "public"
40
41
  },
@@ -42,5 +43,5 @@
42
43
  "dist",
43
44
  "src"
44
45
  ],
45
- "gitHead": "30af3b2a7f2e209ec7a3fed877ca7bbb96555e2a"
46
+ "gitHead": "81160c598e2249f3adfe4dd5f966fbc55d03b82b"
46
47
  }
package/src/Config.ts CHANGED
@@ -1,3 +1,4 @@
1
+ // eslint-disable-next-line node/no-unpublished-import
1
2
  import type { LibraryOptions } from 'vite';
2
3
 
3
4
  export interface VitePluginBuildConfig {
@@ -8,14 +9,14 @@ export interface VitePluginBuildConfig {
8
9
  /**
9
10
  * Vite config file path.
10
11
  */
11
- config?: string;
12
+ config: string;
12
13
  }
13
14
 
14
15
  export interface VitePluginRendererConfig {
15
16
  /**
16
- * Human friendly name of your entry point
17
+ * Human friendly name of your entry point.
17
18
  */
18
- name: string;
19
+ name?: string;
19
20
  /**
20
21
  * Vite config file path.
21
22
  */
@@ -23,12 +24,16 @@ export interface VitePluginRendererConfig {
23
24
  }
24
25
 
25
26
  export interface VitePluginConfig {
27
+ // Reserved option, may support modification in the future.
28
+ // @defaultValue '.vite'
29
+ // baseDir?: string;
30
+
26
31
  /**
27
32
  * Build anything such as Main process, Preload scripts and Worker process, etc.
28
33
  */
29
34
  build: VitePluginBuildConfig[];
30
35
  /**
31
- * Renderer process.
36
+ * Renderer process Vite configs.
32
37
  */
33
38
  renderer: VitePluginRendererConfig[];
34
39
  }
package/src/ViteConfig.ts CHANGED
@@ -1,36 +1,33 @@
1
- import path from 'node:path';
2
-
3
1
  import debug from 'debug';
4
- import { ConfigEnv, loadConfigFromFile, mergeConfig, UserConfig } from 'vite';
5
-
6
- import { VitePluginConfig } from './Config';
7
- import { externalBuiltins } from './util/plugins';
2
+ // eslint-disable-next-line node/no-unpublished-import
3
+ import { loadConfigFromFile } from 'vite';
8
4
 
9
- const d = debug('electron-forge:plugin:vite:viteconfig');
5
+ import type { VitePluginBuildConfig, VitePluginConfig, VitePluginRendererConfig } from './Config';
6
+ // eslint-disable-next-line node/no-unpublished-import
7
+ import type { ConfigEnv, UserConfig } from 'vite';
10
8
 
11
- /**
12
- * Vite allows zero-config runs, if the user does not provide `vite.config.js`,
13
- * then the value of `LoadResult` will become `null`.
14
- */
15
- export type LoadResult = Awaited<ReturnType<typeof loadConfigFromFile>>;
9
+ const d = debug('@electron-forge/plugin-vite:ViteConfig');
16
10
 
17
11
  export default class ViteConfigGenerator {
18
- private readonly baseDir: string;
19
-
20
- private rendererConfigCache!: Promise<UserConfig>[];
21
-
22
12
  constructor(private readonly pluginConfig: VitePluginConfig, private readonly projectDir: string, private readonly isProd: boolean) {
23
- this.baseDir = path.join(projectDir, '.vite');
24
13
  d('Config mode:', this.mode);
25
14
  }
26
15
 
27
- resolveConfig(config: string, configEnv: Partial<ConfigEnv> = {}) {
28
- // `command` is to be passed as an arguments when the user export a function in `vite.config.js`.
16
+ resolveConfig(buildConfig: VitePluginBuildConfig | VitePluginRendererConfig, configEnv: Partial<ConfigEnv> = {}) {
29
17
  // @see - https://vitejs.dev/config/#conditional-config
30
18
  configEnv.command ??= this.isProd ? 'build' : 'serve';
31
- // `mode` affects `.env.[mode]` file loading.
19
+ // `mode` affects `.env.[mode]` file load.
32
20
  configEnv.mode ??= this.mode;
33
- return loadConfigFromFile(configEnv as ConfigEnv, config);
21
+
22
+ // Hack! Pass the forge runtime config to the vite config file in the template.
23
+ Object.assign(configEnv, {
24
+ root: this.projectDir,
25
+ forgeConfig: this.pluginConfig,
26
+ forgeConfigSelf: buildConfig,
27
+ });
28
+
29
+ // `configEnv` is to be passed as an arguments when the user export a function in `vite.config.js`.
30
+ return loadConfigFromFile(configEnv as ConfigEnv, buildConfig.config);
34
31
  }
35
32
 
36
33
  get mode(): string {
@@ -40,60 +37,15 @@ export default class ViteConfigGenerator {
40
37
  return this.isProd ? 'production' : 'development';
41
38
  }
42
39
 
43
- async getDefines(): Promise<Record<string, string>> {
44
- const defines: Record<string, any> = {};
45
- const rendererConfigs = await this.getRendererConfig();
46
- for (const [index, userConfig] of rendererConfigs.entries()) {
47
- const name = this.pluginConfig.renderer[index].name;
48
- if (!name) {
49
- continue;
50
- }
51
- const NAME = name.toUpperCase().replace(/ /g, '_');
52
- // `server.port` is set in `launchRendererDevServers` in `VitePlugin.ts`.
53
- defines[`${NAME}_VITE_DEV_SERVER_URL`] = this.isProd ? undefined : JSON.stringify(`http://localhost:${userConfig?.server?.port}`);
54
- defines[`${NAME}_VITE_NAME`] = JSON.stringify(name);
55
- }
56
- return defines;
57
- }
58
-
59
- async getBuildConfig(watch = false): Promise<UserConfig[]> {
40
+ async getBuildConfig(): Promise<UserConfig[]> {
60
41
  if (!Array.isArray(this.pluginConfig.build)) {
61
42
  throw new Error('"config.build" must be an Array');
62
43
  }
63
44
 
64
- const define = await this.getDefines();
65
- const plugins = [externalBuiltins()];
66
45
  const configs = this.pluginConfig.build
67
- .filter(({ entry, config }) => entry || config)
68
- .map<Promise<UserConfig>>(async ({ entry, config }) => {
69
- const defaultConfig: UserConfig = {
70
- // Ensure that each build config loads the .env file correctly.
71
- mode: this.mode,
72
- build: {
73
- lib: entry
74
- ? {
75
- entry,
76
- // Electron can only support cjs.
77
- formats: ['cjs'],
78
- fileName: () => '[name].js',
79
- }
80
- : undefined,
81
- // Prevent multiple builds from interfering with each other.
82
- emptyOutDir: false,
83
- // 🚧 Multiple builds may conflict.
84
- outDir: path.join(this.baseDir, 'build'),
85
- watch: watch ? {} : undefined,
86
- },
87
- clearScreen: false,
88
- define,
89
- plugins,
90
- };
91
- if (config) {
92
- const loadResult = await this.resolveConfig(config);
93
- return mergeConfig(defaultConfig, loadResult?.config ?? {});
94
- }
95
- return defaultConfig;
96
- });
46
+ // Prevent load the default `vite.config.js` file.
47
+ .filter(({ config }) => config)
48
+ .map<Promise<UserConfig>>(async (buildConfig) => (await this.resolveConfig(buildConfig))?.config ?? {});
97
49
 
98
50
  return await Promise.all(configs);
99
51
  }
@@ -103,20 +55,9 @@ export default class ViteConfigGenerator {
103
55
  throw new Error('"config.renderer" must be an Array');
104
56
  }
105
57
 
106
- const configs = (this.rendererConfigCache ??= this.pluginConfig.renderer.map(async ({ name, config }) => {
107
- const defaultConfig: UserConfig = {
108
- // Ensure that each build config loads the .env file correctly.
109
- mode: this.mode,
110
- // Make sure that Electron can be loaded into the local file using `loadFile` after packaging.
111
- base: './',
112
- build: {
113
- outDir: path.join(this.baseDir, 'renderer', name),
114
- },
115
- clearScreen: false,
116
- };
117
- const loadResult = (await this.resolveConfig(config)) ?? { path: '', config: {}, dependencies: [] };
118
- return mergeConfig(defaultConfig, loadResult.config);
119
- }));
58
+ const configs = this.pluginConfig.renderer
59
+ .filter(({ config }) => config)
60
+ .map<Promise<UserConfig>>(async (buildConfig) => (await this.resolveConfig(buildConfig))?.config ?? {});
120
61
 
121
62
  return await Promise.all(configs);
122
63
  }
package/src/VitePlugin.ts CHANGED
@@ -1,17 +1,22 @@
1
- import fs from 'node:fs/promises';
2
- import { AddressInfo } from 'node:net';
3
1
  import path from 'node:path';
4
2
 
5
3
  import { namedHookWithTaskFn, PluginBase } from '@electron-forge/plugin-base';
6
- import { ForgeMultiHookMap, StartResult } from '@electron-forge/shared-types';
4
+ import chalk from 'chalk';
7
5
  import debug from 'debug';
8
- // eslint-disable-next-line node/no-extraneous-import
9
- import { RollupWatcher } from 'rollup';
6
+ import fs from 'fs-extra';
7
+ // eslint-disable-next-line node/no-unpublished-import
10
8
  import { default as vite } from 'vite';
11
9
 
12
- import { VitePluginConfig } from './Config';
10
+ import { getFlatDependencies } from './util/package';
11
+ import { onBuildDone } from './util/plugins';
13
12
  import ViteConfigGenerator from './ViteConfig';
14
13
 
14
+ import type { VitePluginConfig } from './Config';
15
+ import type { ForgeMultiHookMap, ResolvedForgeConfig, StartResult } from '@electron-forge/shared-types';
16
+ import type { AddressInfo } from 'node:net';
17
+ // eslint-disable-next-line node/no-extraneous-import
18
+ import type { RollupWatcher } from 'rollup';
19
+
15
20
  const d = debug('electron-forge:plugin:vite');
16
21
 
17
22
  export default class VitePlugin extends PluginBase<VitePluginConfig> {
@@ -41,7 +46,7 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
41
46
  process.on('SIGINT' as NodeJS.Signals, (_signal) => this.exitHandler({ exit: true }));
42
47
  };
43
48
 
44
- private setDirectories(dir: string): void {
49
+ public setDirectories(dir: string): void {
45
50
  this.projectDir = dir;
46
51
  this.baseDir = path.join(dir, '.vite');
47
52
  }
@@ -55,7 +60,7 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
55
60
  prePackage: [
56
61
  namedHookWithTaskFn<'prePackage'>(async () => {
57
62
  this.isProd = true;
58
- await fs.rm(this.baseDir, { recursive: true, force: true });
63
+ await fs.remove(this.baseDir);
59
64
 
60
65
  await Promise.all([this.build(), this.buildRenderer()]);
61
66
  }, 'Building vite bundles'),
@@ -67,14 +72,64 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
67
72
  this.exitHandler({ cleanup: true, exit: true });
68
73
  });
69
74
  },
75
+ resolveForgeConfig: this.resolveForgeConfig,
76
+ packageAfterCopy: this.packageAfterCopy,
70
77
  };
71
78
  };
72
79
 
80
+ resolveForgeConfig = async (forgeConfig: ResolvedForgeConfig): Promise<ResolvedForgeConfig> => {
81
+ forgeConfig.packagerConfig ??= {};
82
+
83
+ if (forgeConfig.packagerConfig.ignore) {
84
+ if (typeof forgeConfig.packagerConfig.ignore !== 'function') {
85
+ console.error(
86
+ chalk.yellow(`You have set packagerConfig.ignore, the Electron Forge Vite plugin normally sets this automatically.
87
+
88
+ Your packaged app may be larger than expected if you dont ignore everything other than the '.vite' folder`)
89
+ );
90
+ }
91
+ return forgeConfig;
92
+ }
93
+
94
+ forgeConfig.packagerConfig.ignore = (file: string) => {
95
+ if (!file) return false;
96
+
97
+ // Always starts with `/`
98
+ // @see - https://github.com/electron/packager/blob/v18.1.3/src/copy-filter.ts#L89-L93
99
+ return !file.startsWith('/.vite');
100
+ };
101
+ return forgeConfig;
102
+ };
103
+
104
+ packageAfterCopy = async (_forgeConfig: ResolvedForgeConfig, buildPath: string): Promise<void> => {
105
+ const pj = await fs.readJson(path.resolve(this.projectDir, 'package.json'));
106
+ const flatDependencies = await getFlatDependencies(this.projectDir);
107
+
108
+ if (!pj.main?.includes('.vite/')) {
109
+ throw new Error(`Electron Forge is configured to use the Vite plugin. The plugin expects the
110
+ "main" entry point in "package.json" to be ".vite/*" (where the plugin outputs
111
+ the generated files). Instead, it is ${JSON.stringify(pj.main)}`);
112
+ }
113
+
114
+ if (pj.config) {
115
+ delete pj.config.forge;
116
+ }
117
+
118
+ await fs.writeJson(path.resolve(buildPath, 'package.json'), pj, {
119
+ spaces: 2,
120
+ });
121
+
122
+ // Copy the dependencies in package.json
123
+ for (const dep of flatDependencies) {
124
+ await fs.copy(dep.src, path.resolve(buildPath, dep.dest));
125
+ }
126
+ };
127
+
73
128
  startLogic = async (): Promise<StartResult> => {
74
129
  if (VitePlugin.alreadyStarted) return false;
75
130
  VitePlugin.alreadyStarted = true;
76
131
 
77
- await fs.rm(this.baseDir, { recursive: true, force: true });
132
+ await fs.remove(this.baseDir);
78
133
 
79
134
  return {
80
135
  tasks: [
@@ -92,7 +147,7 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
92
147
  {
93
148
  title: 'Compiling main process code',
94
149
  task: async () => {
95
- await this.build(true);
150
+ await this.build();
96
151
  },
97
152
  options: {
98
153
  showTimer: true,
@@ -104,42 +159,34 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
104
159
  };
105
160
 
106
161
  // Main process, Preload scripts and Worker process, etc.
107
- build = async (watch = false): Promise<void> => {
108
- await Promise.all(
109
- (
110
- await this.configGenerator.getBuildConfig(watch)
111
- ).map((userConfig) => {
112
- return new Promise<void>((resolve, reject) => {
113
- vite
114
- .build({
115
- // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
116
- configFile: false,
117
- ...userConfig,
118
- plugins: [
119
- {
120
- name: '@electron-forge/plugin-vite:start',
121
- closeBundle() {
122
- resolve();
123
-
124
- // TODO: implement hot-restart here
125
- },
126
- },
127
- ...(userConfig.plugins ?? []),
128
- ],
129
- })
130
- .then((result) => {
131
- const isWatcher = (x: any): x is RollupWatcher => typeof x?.close === 'function';
132
-
133
- if (isWatcher(result)) {
134
- this.watchers.push(result);
135
- }
136
-
137
- return result;
138
- })
139
- .catch(reject);
140
- });
141
- })
142
- );
162
+ build = async (): Promise<void> => {
163
+ const configs = await this.configGenerator.getBuildConfig();
164
+ const buildTasks: Promise<void>[] = [];
165
+ const isWatcher = (x: any): x is RollupWatcher => typeof x?.close === 'function';
166
+
167
+ for (const userConfig of configs) {
168
+ const buildTask = new Promise<void>((resolve, reject) => {
169
+ vite
170
+ .build({
171
+ // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
172
+ configFile: false,
173
+ ...userConfig,
174
+ plugins: [onBuildDone(resolve), ...(userConfig.plugins ?? [])],
175
+ })
176
+ .then((result) => {
177
+ if (isWatcher(result)) {
178
+ this.watchers.push(result);
179
+ }
180
+
181
+ return result;
182
+ })
183
+ .catch(reject);
184
+ });
185
+
186
+ buildTasks.push(buildTask);
187
+ }
188
+
189
+ await Promise.all(buildTasks);
143
190
  };
144
191
 
145
192
  // Renderer process
@@ -0,0 +1,108 @@
1
+ import path from 'node:path';
2
+
3
+ import fs from 'fs-extra';
4
+
5
+ export interface Dependency {
6
+ name: string;
7
+ path: SourceAndDestination;
8
+ dependencies: Dependency[];
9
+ }
10
+
11
+ export interface SourceAndDestination {
12
+ src: string;
13
+ dest: string;
14
+ }
15
+
16
+ function isRootPath(dir: string) {
17
+ // *unix or Windows root path
18
+ return dir === '/' || /^[a-zA-Z]:\\$/i.test(dir);
19
+ }
20
+
21
+ export async function isDirectory(p: string): Promise<boolean> {
22
+ try {
23
+ const stat = await fs.promises.stat(p);
24
+ return stat.isDirectory();
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
29
+
30
+ export async function lookupNodeModulesPaths(root: string, paths: string[] = []): Promise<string[]> {
31
+ if (!root) return paths;
32
+ if (!path.isAbsolute(root)) return paths;
33
+
34
+ const p = path.join(root, 'node_modules');
35
+
36
+ if (await isDirectory(p)) {
37
+ paths = paths.concat(p);
38
+ }
39
+ root = path.join(root, '..');
40
+
41
+ return isRootPath(root) ? paths : await lookupNodeModulesPaths(root, paths);
42
+ }
43
+
44
+ export async function resolveDependencies(root: string) {
45
+ const rootDependencies = Object.keys((await fs.readJson(path.join(root, 'package.json'))).dependencies || {});
46
+ const resolve = async (prePath: string, dependencies: string[], collected: Map<string, Dependency> = new Map()) =>
47
+ await Promise.all(
48
+ dependencies.map(async (name) => {
49
+ let curPath = prePath,
50
+ depPath = null,
51
+ packageJson = null;
52
+ while (!packageJson && !isRootPath(curPath)) {
53
+ const allNodeModules = await lookupNodeModulesPaths(curPath);
54
+
55
+ for (const nodeModules of allNodeModules) {
56
+ depPath = path.join(nodeModules, name);
57
+ if (await fs.pathExists(depPath)) break;
58
+ }
59
+
60
+ if (depPath) {
61
+ try {
62
+ packageJson = await fs.readJson(path.join(depPath, 'package.json'));
63
+ } catch (err) {
64
+ // lookup node_modules
65
+ curPath = path.join(curPath, '..');
66
+ if (curPath.length < root.length) {
67
+ console.error(`not found 'node_modules' in root path: ${root}`);
68
+ throw err;
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ if (!depPath || !packageJson) {
75
+ throw new Error(`find dependencies error in: ${curPath}`);
76
+ }
77
+
78
+ const result: Dependency = {
79
+ name,
80
+ path: {
81
+ src: depPath,
82
+ dest: path.relative(root, depPath),
83
+ },
84
+ dependencies: [],
85
+ };
86
+ const shouldResolveDeps = !collected.has(depPath);
87
+ collected.set(depPath, result);
88
+ if (shouldResolveDeps) {
89
+ result.dependencies = await resolve(depPath, Object.keys(packageJson.dependencies || {}), collected);
90
+ }
91
+ return result;
92
+ })
93
+ );
94
+ return resolve(root, rootDependencies);
95
+ }
96
+
97
+ export async function getFlatDependencies(root = process.cwd()) {
98
+ const depsTree = await resolveDependencies(root);
99
+ const depsFlat = new Map<string, SourceAndDestination>();
100
+
101
+ const flatten = (dep: Dependency) => {
102
+ depsFlat.set(dep.path.src, dep.path); // dedup
103
+ dep.dependencies.forEach(flatten);
104
+ };
105
+ depsTree.forEach(flatten);
106
+
107
+ return [...depsFlat.values()];
108
+ }
@@ -1,35 +1,11 @@
1
- import { builtinModules } from 'node:module';
2
-
1
+ // eslint-disable-next-line node/no-unpublished-import
3
2
  import type { Plugin } from 'vite';
4
3
 
5
- /**
6
- * `electron` and Node.js built-in modules should always be externalize.
7
- */
8
- export function externalBuiltins() {
9
- return <Plugin>{
10
- name: '@electron-forge/plugin-vite:external-builtins',
11
- config(config) {
12
- const nativeModules = builtinModules.filter((e) => !e.startsWith('_'));
13
- const builtins = ['electron', ...nativeModules, ...nativeModules.map((m) => `node:${m}`)];
14
-
15
- config.build ??= {};
16
- config.build.rollupOptions ??= {};
17
-
18
- let external = config.build.rollupOptions.external;
19
- if (Array.isArray(external) || typeof external === 'string' || external instanceof RegExp) {
20
- external = builtins.concat(external as string[]);
21
- } else if (typeof external === 'function') {
22
- const original = external;
23
- external = function (source, importer, isResolved) {
24
- if (builtins.includes(source)) {
25
- return true;
26
- }
27
- return original(source, importer, isResolved);
28
- };
29
- } else {
30
- external = builtins;
31
- }
32
- config.build.rollupOptions.external = external;
4
+ export function onBuildDone(callback: () => void) {
5
+ return {
6
+ name: '@electron-forge/plugin-vite:build-done',
7
+ closeBundle() {
8
+ callback();
33
9
  },
34
- };
10
+ } as Plugin;
35
11
  }