@electron-forge/plugin-vite 8.0.0-alpha.7 → 8.0.0-alpha.8

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.
@@ -15,9 +15,8 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
15
15
  */
16
16
  private baseDir;
17
17
  private configGeneratorCache;
18
- private watchers;
18
+ private watchChildren;
19
19
  private servers;
20
- private timeFormatter;
21
20
  init: (dir: string) => void;
22
21
  setDirectories(dir: string): void;
23
22
  private get configGenerator();
@@ -1 +1 @@
1
- {"version":3,"file":"VitePlugin.d.ts","sourceRoot":"","sources":["../src/VitePlugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAI9E,OAAO,EAAE,KAAK,EAAgB,MAAM,QAAQ,CAAC;AAK7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,8BAA8B,CAAC;AAmEtC,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;IAEvB;;OAEG;IACH,OAAO,CAAC,UAAU,CAAU;IAE5B;;OAEG;IACH,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,oBAAoB,CAAuB;IAEnD,OAAO,CAAC,QAAQ,CAAmC;IAEnD,OAAO,CAAC,OAAO,CAA4B;IAG3C,OAAO,CAAC,aAAa,CAIlB;IAEH,IAAI,GAAI,KAAK,MAAM,KAAG,IAAI,CAUxB;IAEK,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKxC,OAAO,KAAK,eAAe,GAM1B;IAED,QAAQ,QAAO,iBAAiB,CAgF9B;IAEF,kBAAkB,GAChB,aAAa,mBAAmB,KAC/B,OAAO,CAAC,mBAAmB,CAAC,CAwB7B;IAEF,gBAAgB,GACd,cAAc,mBAAmB,EACjC,WAAW,MAAM,KAChB,OAAO,CAAC,IAAI,CAAC,CAgBd;IAEF;;;;OAIG;IACH,OAAO,KAAK,kBAAkB,GAQ7B;IAGD,KAAK,GAAU,OAAO,cAAc,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAsJhE;IAGF,aAAa,GAAU,OAAO,cAAc,CAAC,IAAI,CAAC,gDAyChD;IAEF,wBAAwB,GAAU,OAAO,cAAc,CAAC,IAAI,CAAC,gDAoC3D;IAEF,WAAW,GACT,SAAS;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,EAC9C,MAAM,KAAK,KACV,IAAI,CAiBL;CACH;AA2BD,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"VitePlugin.d.ts","sourceRoot":"","sources":["../src/VitePlugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAI9E,OAAO,EAAE,KAAK,EAAgB,MAAM,QAAQ,CAAC;AAM7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,8BAA8B,CAAC;AAsItC,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;IAEvB;;OAEG;IACH,OAAO,CAAC,UAAU,CAAU;IAE5B;;OAEG;IACH,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,oBAAoB,CAAuB;IAEnD,OAAO,CAAC,aAAa,CAAsB;IAE3C,OAAO,CAAC,OAAO,CAA4B;IAE3C,IAAI,GAAI,KAAK,MAAM,KAAG,IAAI,CAUxB;IAEK,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKxC,OAAO,KAAK,eAAe,GAM1B;IAED,QAAQ,QAAO,iBAAiB,CAgF9B;IAEF,kBAAkB,GAChB,aAAa,mBAAmB,KAC/B,OAAO,CAAC,mBAAmB,CAAC,CAwB7B;IAEF,gBAAgB,GACd,cAAc,mBAAmB,EACjC,WAAW,MAAM,KAChB,OAAO,CAAC,IAAI,CAAC,CAgBd;IAEF;;;;OAIG;IACH,OAAO,KAAK,kBAAkB,GAQ7B;IAGD,KAAK,GAAU,OAAO,cAAc,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAkDhE;IAGF,aAAa,GAAU,OAAO,cAAc,CAAC,IAAI,CAAC,gDAyChD;IAEF,wBAAwB,GAAU,OAAO,cAAc,CAAC,IAAI,CAAC,gDAoC3D;IAEF,WAAW,GACT,SAAS;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,EAC9C,MAAM,KAAK,KACV,IAAI,CAiBL;CACH;AA2BD,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -6,6 +6,7 @@ import debug from 'debug';
6
6
  import fs from 'fs-extra';
7
7
  import { PRESET_TIMER } from 'listr2';
8
8
  import * as vite from 'vite';
9
+ import { viteDevServerUrls } from './config/vite.base.config.js';
9
10
  import ViteConfigGenerator from './ViteConfig.js';
10
11
  const d = debug('electron-forge:plugin:vite');
11
12
  const subprocessWorkerPath = path.resolve(import.meta.dirname, 'subprocess-worker.js');
@@ -47,6 +48,59 @@ function spawnViteBuild(pluginConfig, kind, index, projectDir) {
47
48
  });
48
49
  });
49
50
  }
51
+ function spawnViteBuildWatch(pluginConfig, index, projectDir, devServerUrls, onReloadRenderers) {
52
+ const child = spawn(process.execPath, [subprocessWorkerPath], {
53
+ cwd: projectDir,
54
+ env: {
55
+ ...process.env,
56
+ FORGE_VITE_PROJECT_DIR: projectDir,
57
+ FORGE_VITE_KIND: 'build',
58
+ FORGE_VITE_INDEX: String(index),
59
+ FORGE_VITE_CONFIG: JSON.stringify(pluginConfig),
60
+ FORGE_VITE_WATCH: '1',
61
+ FORGE_VITE_DEV_SERVER_URLS: JSON.stringify(devServerUrls),
62
+ },
63
+ stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
64
+ });
65
+ let settled = false;
66
+ let stderr = '';
67
+ child.stderr.setEncoding('utf8');
68
+ child.stderr.on('data', (chunk) => {
69
+ if (!settled)
70
+ stderr += chunk;
71
+ process.stderr.write(chunk);
72
+ });
73
+ child.stdout.setEncoding('utf8');
74
+ child.stdout.on('data', (chunk) => process.stdout.write(chunk));
75
+ const firstBuild = new Promise((resolve, reject) => {
76
+ const settle = (fn) => {
77
+ if (settled)
78
+ return;
79
+ settled = true;
80
+ stderr = '';
81
+ fn();
82
+ };
83
+ child.on('message', (msg) => {
84
+ if (msg.type === 'first-build-done') {
85
+ settle(resolve);
86
+ }
87
+ else if (msg.type === 'first-build-error') {
88
+ settle(() => reject(new Error(msg.message)));
89
+ }
90
+ else if (msg.type === 'reload-renderers') {
91
+ onReloadRenderers();
92
+ }
93
+ });
94
+ child.on('error', (err) => settle(() => reject(err)));
95
+ child.on('close', (code, signal) => {
96
+ const reason = signal
97
+ ? `killed by signal ${signal}`
98
+ : `exited with code ${code}`;
99
+ settle(() => reject(new Error(`Vite watch subprocess ${reason} before first build completed${stderr ? `:\n${stderr}` : ''}`)));
100
+ });
101
+ });
102
+ return { child, firstBuild };
103
+ }
50
104
  function entryToDisplay(entry) {
51
105
  if (typeof entry === 'string')
52
106
  return entry;
@@ -67,14 +121,8 @@ export default class VitePlugin extends PluginBase {
67
121
  */
68
122
  baseDir;
69
123
  configGeneratorCache;
70
- watchers = [];
124
+ watchChildren = [];
71
125
  servers = [];
72
- // Matches the format of the default Vite logger
73
- timeFormatter = new Intl.DateTimeFormat(undefined, {
74
- hour: 'numeric',
75
- minute: 'numeric',
76
- second: 'numeric',
77
- });
78
126
  init = (dir) => {
79
127
  this.setDirectories(dir);
80
128
  d('hooking process events');
@@ -212,10 +260,10 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}.`);
212
260
  }
213
261
  // Main process, Preload scripts and Worker process, etc.
214
262
  build = async (task) => {
263
+ const targets = this.config.build
264
+ .map((spec, index) => ({ spec, index }))
265
+ .filter(({ spec }) => spec.config);
215
266
  if (this.isProd) {
216
- const targets = this.config.build
217
- .map((spec, index) => ({ spec, index }))
218
- .filter(({ spec }) => spec.config);
219
267
  return task?.newListr(targets.map(({ spec, index }) => ({
220
268
  title: `Building ${chalk.green(entryToDisplay(spec.entry))}`,
221
269
  task: async (_ctx, subtask) => {
@@ -227,107 +275,20 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}.`);
227
275
  exitOnError: true,
228
276
  });
229
277
  }
230
- const configs = await this.configGenerator.getBuildConfigs();
231
- /**
232
- * Checks if the result of the Vite build is a Rollup watcher.
233
- * This should happen iff we're running `electron-forge start`.
234
- */
235
- const isRollupWatcher = (x) => x &&
236
- typeof x === 'object' &&
237
- 'on' in x &&
238
- typeof x.on === 'function' &&
239
- 'close' in x &&
240
- typeof x.close === 'function';
241
- /**
242
- * Rollup's `input` can be a string, an array of strings, or an object.
243
- * This function converts the input to a string for the Forge CLI to consume.
244
- *
245
- * @see https://rollupjs.org/configuration-options/#input
246
- */
247
- const parseInputOptionToString = (input) => {
248
- if (typeof input === 'string') {
249
- return input;
250
- }
251
- else if (Array.isArray(input)) {
252
- return input.join(' ');
253
- }
254
- else {
255
- return Object.keys(input).join(' ');
256
- }
257
- };
258
- return task?.newListr(configs.map((userConfig) => {
259
- let target = '';
260
- const input = userConfig.build?.rollupOptions?.input;
261
- if (input) {
262
- target = parseInputOptionToString(input);
263
- }
264
- else if (typeof userConfig.build?.lib !== 'boolean' &&
265
- userConfig.build?.lib?.entry) {
266
- target = parseInputOptionToString(userConfig.build.lib.entry);
267
- }
268
- return {
269
- title: `Building ${chalk.green(target)} target`,
270
- task: async (_ctx, subtask) => {
271
- // We wrap this function in a Promise to ensure that the task is marked as completed
272
- // only after all bundles are done generated. This is done in the `closeBundle` Rollup hook
273
- // rather than when the `vite.build` promise resolves.
274
- await new Promise((resolve, reject) => {
275
- vite
276
- .build({
277
- // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
278
- configFile: false,
279
- // We suppress Vite output and instead log lines using RollupWatcher events
280
- logLevel: 'silent',
281
- ...userConfig,
282
- plugins: [
283
- // This plugin controls the output of the first-time Vite build that happens.
284
- // `buildEnd` and `closeBundle` are Rollup output generation hooks.
285
- // See https://rollupjs.org/plugin-development/#output-generation-hooks
286
- {
287
- name: '@electron-forge/plugin-vite:build-done',
288
- buildEnd(err) {
289
- if (err instanceof Error) {
290
- d('buildEnd rollup hook called with error so build failed');
291
- reject(err);
292
- }
293
- },
294
- closeBundle() {
295
- d('no error in buildEnd and reached closeBundle so build succeeded');
296
- resolve();
297
- },
298
- },
299
- ...(userConfig.plugins ?? []),
300
- ],
301
- clearScreen: false,
302
- })
303
- .then((result) => {
304
- // When running `start` and enabling watch mode in Vite, the Rollup watcher
305
- // emits events for subsequent builds.
306
- if (isRollupWatcher(result)) {
307
- result.on('event', (event) => {
308
- if (event.code === 'ERROR' &&
309
- userConfig.logLevel !== 'silent') {
310
- console.error(`\n${chalk.dim(this.timeFormatter.format(new Date()))} ${event.error.message}`);
311
- }
312
- else if (event.code === 'BUNDLE_END' &&
313
- (!userConfig.logLevel || userConfig.logLevel === 'info')) {
314
- console.log(`${chalk.dim(this.timeFormatter.format(new Date()))} ${chalk.cyan.bold('[@electron-forge/plugin-vite]')} ${chalk.green('target built')} ${chalk.dim(target)}`);
315
- }
316
- });
317
- this.watchers.push(result);
318
- }
319
- else {
320
- subtask.title = `Built target ${chalk.dim(target)}`;
321
- }
322
- return result;
323
- })
324
- .catch(reject);
325
- });
326
- },
327
- };
328
- }), {
278
+ return task?.newListr(targets.map(({ spec, index }) => ({
279
+ title: `Building ${chalk.green(entryToDisplay(spec.entry))} target`,
280
+ task: async () => {
281
+ const { child, firstBuild } = spawnViteBuildWatch(this.serializableConfig, index, this.projectDir, viteDevServerUrls, () => {
282
+ for (const server of this.servers) {
283
+ server.ws.send({ type: 'full-reload' });
284
+ }
285
+ });
286
+ this.watchChildren.push(child);
287
+ await firstBuild;
288
+ },
289
+ })), {
329
290
  concurrent: this.config.concurrent ?? true,
330
- exitOnError: this.isProd,
291
+ exitOnError: false,
331
292
  });
332
293
  };
333
294
  // Renderer process
@@ -392,11 +353,11 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}.`);
392
353
  exitHandler = (options, err) => {
393
354
  d('handling process exit with:', options);
394
355
  if (options.cleanup) {
395
- for (const watcher of this.watchers) {
396
- d('cleaning vite watcher');
397
- watcher.close();
356
+ for (const child of this.watchChildren) {
357
+ d('killing vite watch subprocess');
358
+ child.kill();
398
359
  }
399
- this.watchers = [];
360
+ this.watchChildren = [];
400
361
  for (const server of this.servers) {
401
362
  d('cleaning http server');
402
363
  server.close();
@@ -432,4 +393,4 @@ function getServerURLs(urls) {
432
393
  return output;
433
394
  }
434
395
  export { VitePlugin };
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFFN0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlFLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFCLE9BQU8sRUFBUyxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDN0MsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxtQkFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQVdsRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUU5QyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUNuQixzQkFBc0IsQ0FDdkIsQ0FBQztBQUVGLFNBQVMsY0FBYyxDQUNyQixZQUEwRCxFQUMxRCxJQUEwQixFQUMxQixLQUFhLEVBQ2IsVUFBa0I7SUFFbEIsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUMzQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDNUQsR0FBRyxFQUFFLFVBQVU7WUFDZixHQUFHLEVBQUU7Z0JBQ0gsR0FBRyxPQUFPLENBQUMsR0FBRztnQkFDZCxzQkFBc0IsRUFBRSxVQUFVO2dCQUNsQyxlQUFlLEVBQUUsSUFBSTtnQkFDckIsZ0JBQWdCLEVBQUUs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
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFFN0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlFLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFCLE9BQU8sRUFBUyxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDN0MsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxtQkFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQVlsRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUU5QyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUNuQixzQkFBc0IsQ0FDdkIsQ0FBQztBQUVGLFNBQVMsY0FBYyxDQUNyQixZQUEwRCxFQUMxRCxJQUEwQixFQUMxQixLQUFhLEVBQ2IsVUFBa0I7SUFFbEIsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUMzQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDNUQsR0FBRyxFQUFFLFVBQVU7WUFDZixHQUFHLEVBQUU7Z0JBQ0gsR0FBRyxPQUFPLENBQUMsR0FBRztnQkFDZCxzQkFBc0IsRUFBRSxV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
@@ -1,5 +1,6 @@
1
1
  import type { ConfigEnv, Plugin, UserConfig } from 'vite';
2
2
  export declare const external: string[];
3
+ export declare const viteDevServerUrls: Record<string, string>;
3
4
  export declare function getBuildConfig(env: ConfigEnv<'build'>): UserConfig;
4
5
  export declare function getDefineKeys(names: string[]): {
5
6
  [name: string]: VitePluginRuntimeKeys;
@@ -1 +1 @@
1
- {"version":3,"file":"vite.base.config.d.ts","sourceRoot":"","sources":["../../src/config/vite.base.config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAiB,MAAM,MAAM,CAAC;AAEzE,eAAO,MAAM,QAAQ,UAIpB,CAAC;AAMF,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,UAAU,CAgBlE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE;;EAe5C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,uBAsBrD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBzD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAiBtE"}
1
+ {"version":3,"file":"vite.base.config.d.ts","sourceRoot":"","sources":["../../src/config/vite.base.config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAiB,MAAM,MAAM,CAAC;AAEzE,eAAO,MAAM,QAAQ,UAIpB,CAAC;AAIF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,CAAC;AAE5D,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,UAAU,CAgBlE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE;;EAe5C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,uBAsBrD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBzD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAiBtE"}
@@ -6,7 +6,7 @@ export const external = [
6
6
  ];
7
7
  // Used for hot reload after preload scripts.
8
8
  const viteDevServers = {};
9
- const viteDevServerUrls = {};
9
+ export const viteDevServerUrls = {};
10
10
  export function getBuildConfig(env) {
11
11
  const { root, mode, command } = env;
12
12
  return {
@@ -17,7 +17,7 @@ export function getBuildConfig(env) {
17
17
  emptyOutDir: false,
18
18
  // 🚧 Multiple builds may conflict.
19
19
  outDir: '.vite/build',
20
- watch: command === 'serve' ? {} : null,
20
+ watch: command === 'serve' ? { exclude: '**/.git/**' } : null,
21
21
  minify: command === 'build',
22
22
  },
23
23
  clearScreen: false,
@@ -89,4 +89,4 @@ export function pluginHotRestart(command) {
89
89
  },
90
90
  };
91
91
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5iYXNlLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvdml0ZS5iYXNlLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzdDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRztJQUN0QixVQUFVO0lBQ1YsaUJBQWlCO0lBQ2pCLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO0NBQ3RELENBQUM7QUFFRiw2Q0FBNkM7QUFDN0MsTUFBTSxjQUFjLEdBQWtDLEVBQUUsQ0FBQztBQUN6RCxNQUFNLGlCQUFpQixHQUEyQixFQUFFLENBQUM7QUFFckQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUF1QjtJQUNwRCxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFFcEMsT0FBTztRQUNMLElBQUk7UUFDSixJQUFJO1FBQ0osS0FBSyxFQUFFO1lBQ0wsNERBQTREO1lBQzVELFdBQVcsRUFBRSxLQUFLO1lBQ2xCLG1DQUFtQztZQUNuQyxNQUFNLEVBQUUsYUFBYTtZQUNyQixLQUFLLEVBQUUsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3RDLE1BQU0sRUFBRSxPQUFPLEtBQUssT0FBTztTQUM1QjtRQUNELFdBQVcsRUFBRSxLQUFLO0tBQ25CLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFlO0lBQzNDLE1BQU0sTUFBTSxHQUE4QyxFQUFFLENBQUM7SUFFN0QsbUZBQW1GO0lBQ25GLGdGQUFnRjtJQUVoRixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMs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
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5iYXNlLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvdml0ZS5iYXNlLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzdDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRztJQUN0QixVQUFVO0lBQ1YsaUJBQWlCO0lBQ2pCLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO0NBQ3RELENBQUM7QUFFRiw2Q0FBNkM7QUFDN0MsTUFBTSxjQUFjLEdBQWtDLEVBQUUsQ0FBQztBQUN6RCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBMkIsRUFBRSxDQUFDO0FBRTVELE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBdUI7SUFDcEQsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBRXBDLE9BQU87UUFDTCxJQUFJO1FBQ0osSUFBSTtRQUNKLEtBQUssRUFBRTtZQUNMLDREQUE0RDtZQUM1RCxXQUFXLEVBQUUsS0FBSztZQUNsQixtQ0FBbUM7WUFDbkMsTUFBTSxFQUFFLGFBQWE7WUFDckIsS0FBSyxFQUFFLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQzdELE1BQU0sRUFBRSxPQUFPLEtBQUssT0FBTztTQUM1QjtRQUNELFdBQVcsRUFBRSxLQUFLO0tBQ25CLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFlO0lBQzNDLE1BQU0sTUFBTSxHQUE4QyxFQUFFLENBQUM7SUFFN0QsbUZBQW1GO0lBQ25GLGdGQUFnRjtJ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
@@ -11,8 +11,8 @@ export function getConfig(forgeEnv, userConfig = {}) {
11
11
  input: forgeConfigSelf.entry,
12
12
  output: {
13
13
  format: 'cjs',
14
- // It should not be split chunks.
15
- inlineDynamicImports: true,
14
+ // Preload scripts require a single entrypoint.
15
+ codeSplitting: false,
16
16
  entryFileNames: '[name].js',
17
17
  chunkFileNames: '[name].js',
18
18
  assetFileNames: '[name].[ext]',
@@ -24,4 +24,4 @@ export function getConfig(forgeEnv, userConfig = {}) {
24
24
  const buildConfig = getBuildConfig(forgeEnv);
25
25
  return mergeConfig(mergeConfig(buildConfig, config), userConfig);
26
26
  }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5wcmVsb2FkLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvdml0ZS5wcmVsb2FkLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLFdBQVcsRUFBbUIsTUFBTSxNQUFNLENBQUM7QUFFcEUsT0FBTyxFQUNMLFFBQVEsRUFDUixjQUFjLEVBQ2QsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsUUFBNEIsRUFDNUIsYUFBeUIsRUFBRTtJQUUzQixNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFlO1FBQ3pCLEtBQUssRUFBRTtZQUNMLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLGFBQWEsRUFBRTtnQkFDYixRQUFRLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQztnQkFDNUMsNEdBQTRHO2dCQUM1RyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUs7Z0JBQzVCLE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUUsS0FBSztvQkFDYixpQ0FBaUM7b0JBQ2pDLG9CQUFvQixFQUFFLElBQUk7b0JBQzFCLGNBQWMsRUFBRSxXQUFXO29CQUMzQixjQUFjLEVBQUUsV0FBVztvQkFDM0IsY0FBYyxFQUFFLGNBQWM7aUJBQy9CO2FBQ0Y7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3RDLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFN0MsT0FBTyxXQUFXLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNuRSxDQUFDIn0=
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5wcmVsb2FkLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvdml0ZS5wcmVsb2FkLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLFdBQVcsRUFBbUIsTUFBTSxNQUFNLENBQUM7QUFFcEUsT0FBTyxFQUNMLFFBQVEsRUFDUixjQUFjLEVBQ2QsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsUUFBNEIsRUFDNUIsYUFBeUIsRUFBRTtJQUUzQixNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFlO1FBQ3pCLEtBQUssRUFBRTtZQUNMLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLGFBQWEsRUFBRTtnQkFDYixRQUFRLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQztnQkFDNUMsNEdBQTRHO2dCQUM1RyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUs7Z0JBQzVCLE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUUsS0FBSztvQkFDYiwrQ0FBK0M7b0JBQy9DLGFBQWEsRUFBRSxLQUFLO29CQUNwQixjQUFjLEVBQUUsV0FBVztvQkFDM0IsY0FBYyxFQUFFLFdBQVc7b0JBQzNCLGNBQWMsRUFBRSxjQUFjO2lCQUMvQjthQUNGO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN0QyxDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLE9BQU8sV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDbkUsQ0FBQyJ9
@@ -1,9 +1,13 @@
1
+ import chalk from 'chalk';
1
2
  import { build } from 'vite';
3
+ import { viteDevServerUrls } from './config/vite.base.config.js';
2
4
  import ViteConfigGenerator from './ViteConfig.js';
3
5
  const projectDir = process.env.FORGE_VITE_PROJECT_DIR;
4
6
  const kind = process.env.FORGE_VITE_KIND;
5
7
  const index = Number(process.env.FORGE_VITE_INDEX);
6
8
  const rawConfig = process.env.FORGE_VITE_CONFIG;
9
+ const watch = process.env.FORGE_VITE_WATCH === '1';
10
+ const rawDevServerUrls = process.env.FORGE_VITE_DEV_SERVER_URLS;
7
11
  if (!projectDir || !kind || !rawConfig || !Number.isInteger(index)) {
8
12
  console.error('subprocess-worker: missing one of FORGE_VITE_PROJECT_DIR, FORGE_VITE_KIND, FORGE_VITE_INDEX, FORGE_VITE_CONFIG');
9
13
  process.exit(1);
@@ -12,7 +16,7 @@ if (!projectDir || !kind || !rawConfig || !Number.isInteger(index)) {
12
16
  // getBuildDefine() reads forgeConfig.renderer to generate ${NAME}_VITE_NAME
13
17
  // defines when building main targets.
14
18
  const pluginConfig = JSON.parse(rawConfig);
15
- const generator = new ViteConfigGenerator(pluginConfig, projectDir, true);
19
+ const generator = new ViteConfigGenerator(pluginConfig, projectDir, !watch);
16
20
  let spec;
17
21
  let target;
18
22
  if (kind === 'build') {
@@ -23,11 +27,93 @@ else {
23
27
  spec = pluginConfig.renderer[index];
24
28
  target = 'renderer';
25
29
  }
30
+ // Seed the module-level URL map so getBuildDefine() produces the same
31
+ // *_VITE_DEV_SERVER_URL defines the in-process path would have.
32
+ if (rawDevServerUrls) {
33
+ Object.assign(viteDevServerUrls, JSON.parse(rawDevServerUrls));
34
+ }
26
35
  const resolved = await generator.resolveConfig(spec, target);
27
- await build({
28
- configFile: false,
29
- logLevel: 'error',
30
- ...resolved,
31
- clearScreen: false,
32
- });
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VicHJvY2Vzcy13b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3VicHJvY2Vzcy13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLG1CQUFtQixNQUFNLGlCQUFpQixDQUFDO0FBUWxELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7QUFDdEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUF1QyxDQUFDO0FBQ2pFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDbkQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztBQUVoRCxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQ25FLE9BQU8sQ0FBQyxLQUFLLENBQ1gsZ0hBQWdILENBQ2pILENBQUM7SUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsNEVBQTRFO0FBQzVFLHNDQUFzQztBQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBcUIsQ0FBQztBQUUvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFMUUsSUFBSSxJQUFzRCxDQUFDO0FBQzNELElBQUksTUFBdUMsQ0FBQztBQUM1QyxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztJQUNyQixJQUFJLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxNQUFNLEdBQUksSUFBOEIsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO0FBQzVELENBQUM7S0FBTSxDQUFDO0lBQ04sSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUU3RCxNQUFNLEtBQUssQ0FBQztJQUNWLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLEdBQUcsUUFBUTtJQUNYLFdBQVcsRUFBRSxLQUFLO0NBQ25CLENBQUMsQ0FBQyJ9
36
+ if (!watch) {
37
+ await build({
38
+ configFile: false,
39
+ logLevel: 'error',
40
+ ...resolved,
41
+ clearScreen: false,
42
+ });
43
+ }
44
+ else {
45
+ // Matches the format of the default Vite logger
46
+ const timeFormatter = new Intl.DateTimeFormat(undefined, {
47
+ hour: 'numeric',
48
+ minute: 'numeric',
49
+ second: 'numeric',
50
+ });
51
+ // Rollup's `input` can be a string, an array of strings, or an object.
52
+ // https://rollupjs.org/configuration-options/#input
53
+ const input = resolved.build?.rollupOptions?.input ??
54
+ (typeof resolved.build?.lib !== 'boolean'
55
+ ? resolved.build?.lib?.entry
56
+ : undefined);
57
+ const targetDisplay = !input
58
+ ? ''
59
+ : typeof input === 'string'
60
+ ? input
61
+ : Array.isArray(input)
62
+ ? input.join(' ')
63
+ : Object.keys(input).join(' ');
64
+ let firstBuildSent = false;
65
+ const sendOnce = (msg) => {
66
+ if (firstBuildSent)
67
+ return;
68
+ firstBuildSent = true;
69
+ process.send?.(msg);
70
+ };
71
+ const result = await build({
72
+ // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
73
+ configFile: false,
74
+ // We suppress Vite output and instead log lines using RollupWatcher events
75
+ logLevel: 'silent',
76
+ ...resolved,
77
+ plugins: [
78
+ // `buildEnd` and `closeBundle` are Rollup output generation hooks.
79
+ // https://rollupjs.org/plugin-development/#output-generation-hooks
80
+ {
81
+ name: '@electron-forge/plugin-vite:build-done',
82
+ buildEnd(err) {
83
+ if (err instanceof Error) {
84
+ sendOnce({ type: 'first-build-error', message: err.message });
85
+ }
86
+ },
87
+ closeBundle() {
88
+ sendOnce({ type: 'first-build-done' });
89
+ if (target === 'preload') {
90
+ // pluginHotRestart('reload') is a no-op here because viteDevServers
91
+ // lives in the parent; ask the parent to fan out the ws full-reload.
92
+ process.send?.({ type: 'reload-renderers' });
93
+ }
94
+ },
95
+ },
96
+ ...(resolved.plugins ?? []),
97
+ ],
98
+ clearScreen: false,
99
+ });
100
+ const isRollupWatcher = (x) => !!x &&
101
+ typeof x === 'object' &&
102
+ 'on' in x &&
103
+ typeof x.on === 'function' &&
104
+ 'close' in x &&
105
+ typeof x.close === 'function';
106
+ if (isRollupWatcher(result)) {
107
+ // The Rollup watcher emits events for subsequent builds.
108
+ result.on('event', (event) => {
109
+ if (event.code === 'ERROR' && resolved.logLevel !== 'silent') {
110
+ console.error(`\n${chalk.dim(timeFormatter.format(new Date()))} ${event.error.message}`);
111
+ }
112
+ else if (event.code === 'BUNDLE_END' &&
113
+ (!resolved.logLevel || resolved.logLevel === 'info')) {
114
+ console.log(`${chalk.dim(timeFormatter.format(new Date()))} ${chalk.cyan.bold('[@electron-forge/plugin-vite]')} ${chalk.green('target built')} ${chalk.dim(targetDisplay)}`);
115
+ }
116
+ });
117
+ }
118
+ }
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VicHJvY2Vzcy13b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3VicHJvY2Vzcy13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxtQkFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQVNsRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDO0FBQ3RELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBdUMsQ0FBQztBQUNqRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ25ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7QUFDaEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsS0FBSyxHQUFHLENBQUM7QUFDbkQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0FBRWhFLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDbkUsT0FBTyxDQUFDLEtBQUssQ0FDWCxnSEFBZ0gsQ0FDakgsQ0FBQztJQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFDNUUsc0NBQXNDO0FBQ3RDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electron-forge/plugin-vite",
3
- "version": "8.0.0-alpha.7",
3
+ "version": "8.0.0-alpha.8",
4
4
  "type": "module",
5
5
  "description": "Vite plugin for Electron Forge, lets you use Vite directly in your tooling",
6
6
  "repository": {
@@ -18,8 +18,8 @@
18
18
  "./forge-vite-env": "./forge-vite-env.d.ts"
19
19
  },
20
20
  "dependencies": {
21
- "@electron-forge/plugin-base": "8.0.0-alpha.7",
22
- "@electron-forge/shared-types": "8.0.0-alpha.7",
21
+ "@electron-forge/plugin-base": "8.0.0-alpha.8",
22
+ "@electron-forge/shared-types": "8.0.0-alpha.8",
23
23
  "chalk": "^4.0.0",
24
24
  "debug": "^4.3.1",
25
25
  "fs-extra": "^10.0.0",
@@ -43,5 +43,5 @@
43
43
  "src",
44
44
  "forge-vite-env.d.ts"
45
45
  ],
46
- "gitHead": "2f61a07d341c7a5b79052f1a3dbe9dab903a1b3e"
46
+ "gitHead": "e6e0d0024702cdeccce2a612d7115479ab07244c"
47
47
  }
package/src/VitePlugin.ts CHANGED
@@ -8,6 +8,7 @@ import fs from 'fs-extra';
8
8
  import { Listr, PRESET_TIMER } from 'listr2';
9
9
  import * as vite from 'vite';
10
10
 
11
+ import { viteDevServerUrls } from './config/vite.base.config.js';
11
12
  import ViteConfigGenerator from './ViteConfig.js';
12
13
 
13
14
  import type { VitePluginConfig } from './Config.js';
@@ -16,6 +17,7 @@ import type {
16
17
  ForgeMultiHookMap,
17
18
  ResolvedForgeConfig,
18
19
  } from '@electron-forge/shared-types';
20
+ import type { ChildProcess } from 'node:child_process';
19
21
  import type { AddressInfo } from 'node:net';
20
22
  import type { LibraryOptions } from 'vite';
21
23
 
@@ -76,6 +78,72 @@ function spawnViteBuild(
76
78
  });
77
79
  }
78
80
 
81
+ function spawnViteBuildWatch(
82
+ pluginConfig: Pick<VitePluginConfig, 'build' | 'renderer'>,
83
+ index: number,
84
+ projectDir: string,
85
+ devServerUrls: Record<string, string>,
86
+ onReloadRenderers: () => void,
87
+ ): { child: ChildProcess; firstBuild: Promise<void> } {
88
+ const child = spawn(process.execPath, [subprocessWorkerPath], {
89
+ cwd: projectDir,
90
+ env: {
91
+ ...process.env,
92
+ FORGE_VITE_PROJECT_DIR: projectDir,
93
+ FORGE_VITE_KIND: 'build',
94
+ FORGE_VITE_INDEX: String(index),
95
+ FORGE_VITE_CONFIG: JSON.stringify(pluginConfig),
96
+ FORGE_VITE_WATCH: '1',
97
+ FORGE_VITE_DEV_SERVER_URLS: JSON.stringify(devServerUrls),
98
+ },
99
+ stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
100
+ });
101
+
102
+ let settled = false;
103
+ let stderr = '';
104
+ child.stderr!.setEncoding('utf8');
105
+ child.stderr!.on('data', (chunk) => {
106
+ if (!settled) stderr += chunk;
107
+ process.stderr.write(chunk);
108
+ });
109
+ child.stdout!.setEncoding('utf8');
110
+ child.stdout!.on('data', (chunk) => process.stdout.write(chunk));
111
+
112
+ const firstBuild = new Promise<void>((resolve, reject) => {
113
+ const settle = (fn: () => void) => {
114
+ if (settled) return;
115
+ settled = true;
116
+ stderr = '';
117
+ fn();
118
+ };
119
+
120
+ child.on('message', (msg: { type: string; message?: string }) => {
121
+ if (msg.type === 'first-build-done') {
122
+ settle(resolve);
123
+ } else if (msg.type === 'first-build-error') {
124
+ settle(() => reject(new Error(msg.message)));
125
+ } else if (msg.type === 'reload-renderers') {
126
+ onReloadRenderers();
127
+ }
128
+ });
129
+ child.on('error', (err) => settle(() => reject(err)));
130
+ child.on('close', (code, signal) => {
131
+ const reason = signal
132
+ ? `killed by signal ${signal}`
133
+ : `exited with code ${code}`;
134
+ settle(() =>
135
+ reject(
136
+ new Error(
137
+ `Vite watch subprocess ${reason} before first build completed${stderr ? `:\n${stderr}` : ''}`,
138
+ ),
139
+ ),
140
+ );
141
+ });
142
+ });
143
+
144
+ return { child, firstBuild };
145
+ }
146
+
79
147
  function entryToDisplay(entry: LibraryOptions['entry']): string {
80
148
  if (typeof entry === 'string') return entry;
81
149
  if (Array.isArray(entry)) return entry.join(' ');
@@ -101,17 +169,10 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
101
169
 
102
170
  private configGeneratorCache!: ViteConfigGenerator;
103
171
 
104
- private watchers: vite.Rollup.RollupWatcher[] = [];
172
+ private watchChildren: ChildProcess[] = [];
105
173
 
106
174
  private servers: vite.ViteDevServer[] = [];
107
175
 
108
- // Matches the format of the default Vite logger
109
- private timeFormatter = new Intl.DateTimeFormat(undefined, {
110
- hour: 'numeric',
111
- minute: 'numeric',
112
- second: 'numeric',
113
- });
114
-
115
176
  init = (dir: string): void => {
116
177
  this.setDirectories(dir);
117
178
 
@@ -285,10 +346,11 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}.`);
285
346
 
286
347
  // Main process, Preload scripts and Worker process, etc.
287
348
  build = async (task?: ForgeListrTask<null>): Promise<Listr | void> => {
349
+ const targets = this.config.build
350
+ .map((spec, index) => ({ spec, index }))
351
+ .filter(({ spec }) => spec.config);
352
+
288
353
  if (this.isProd) {
289
- const targets = this.config.build
290
- .map((spec, index) => ({ spec, index }))
291
- .filter(({ spec }) => spec.config);
292
354
  return task?.newListr(
293
355
  targets.map(({ spec, index }) => ({
294
356
  title: `Building ${chalk.green(entryToDisplay(spec.entry))}`,
@@ -309,129 +371,28 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}.`);
309
371
  );
310
372
  }
311
373
 
312
- const configs = await this.configGenerator.getBuildConfigs();
313
- /**
314
- * Checks if the result of the Vite build is a Rollup watcher.
315
- * This should happen iff we're running `electron-forge start`.
316
- */
317
- const isRollupWatcher = (
318
- x:
319
- | vite.Rollup.RollupWatcher
320
- | vite.Rollup.RollupOutput
321
- | vite.Rollup.RollupOutput[],
322
- ): x is vite.Rollup.RollupWatcher =>
323
- x &&
324
- typeof x === 'object' &&
325
- 'on' in x &&
326
- typeof x.on === 'function' &&
327
- 'close' in x &&
328
- typeof x.close === 'function';
329
-
330
- /**
331
- * Rollup's `input` can be a string, an array of strings, or an object.
332
- * This function converts the input to a string for the Forge CLI to consume.
333
- *
334
- * @see https://rollupjs.org/configuration-options/#input
335
- */
336
- const parseInputOptionToString = (input: vite.Rollup.InputOption) => {
337
- if (typeof input === 'string') {
338
- return input;
339
- } else if (Array.isArray(input)) {
340
- return input.join(' ');
341
- } else {
342
- return Object.keys(input).join(' ');
343
- }
344
- };
345
-
346
374
  return task?.newListr(
347
- configs.map((userConfig) => {
348
- let target = '';
349
- const input = userConfig.build?.rollupOptions?.input;
350
- if (input) {
351
- target = parseInputOptionToString(input);
352
- } else if (
353
- typeof userConfig.build?.lib !== 'boolean' &&
354
- userConfig.build?.lib?.entry
355
- ) {
356
- target = parseInputOptionToString(userConfig.build.lib.entry);
357
- }
358
-
359
- return {
360
- title: `Building ${chalk.green(target)} target`,
361
- task: async (_ctx, subtask) => {
362
- // We wrap this function in a Promise to ensure that the task is marked as completed
363
- // only after all bundles are done generated. This is done in the `closeBundle` Rollup hook
364
- // rather than when the `vite.build` promise resolves.
365
- await new Promise<void>((resolve, reject) => {
366
- vite
367
- .build({
368
- // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
369
- configFile: false,
370
- // We suppress Vite output and instead log lines using RollupWatcher events
371
- logLevel: 'silent',
372
- ...userConfig,
373
- plugins: [
374
- // This plugin controls the output of the first-time Vite build that happens.
375
- // `buildEnd` and `closeBundle` are Rollup output generation hooks.
376
- // See https://rollupjs.org/plugin-development/#output-generation-hooks
377
- {
378
- name: '@electron-forge/plugin-vite:build-done',
379
- buildEnd(err) {
380
- if (err instanceof Error) {
381
- d(
382
- 'buildEnd rollup hook called with error so build failed',
383
- );
384
- reject(err);
385
- }
386
- },
387
- closeBundle() {
388
- d(
389
- 'no error in buildEnd and reached closeBundle so build succeeded',
390
- );
391
- resolve();
392
- },
393
- },
394
- ...(userConfig.plugins ?? []),
395
- ],
396
- clearScreen: false,
397
- })
398
- .then((result) => {
399
- // When running `start` and enabling watch mode in Vite, the Rollup watcher
400
- // emits events for subsequent builds.
401
- if (isRollupWatcher(result)) {
402
- result.on('event', (event) => {
403
- if (
404
- event.code === 'ERROR' &&
405
- userConfig.logLevel !== 'silent'
406
- ) {
407
- console.error(
408
- `\n${chalk.dim(this.timeFormatter.format(new Date()))} ${event.error.message}`,
409
- );
410
- } else if (
411
- event.code === 'BUNDLE_END' &&
412
- (!userConfig.logLevel || userConfig.logLevel === 'info')
413
- ) {
414
- console.log(
415
- `${chalk.dim(this.timeFormatter.format(new Date()))} ${chalk.cyan.bold('[@electron-forge/plugin-vite]')} ${chalk.green(
416
- 'target built',
417
- )} ${chalk.dim(target)}`,
418
- );
419
- }
420
- });
421
- this.watchers.push(result);
422
- } else {
423
- subtask.title = `Built target ${chalk.dim(target)}`;
424
- }
425
- return result;
426
- })
427
- .catch(reject);
428
- });
429
- },
430
- };
431
- }),
375
+ targets.map(({ spec, index }) => ({
376
+ title: `Building ${chalk.green(entryToDisplay(spec.entry))} target`,
377
+ task: async () => {
378
+ const { child, firstBuild } = spawnViteBuildWatch(
379
+ this.serializableConfig,
380
+ index,
381
+ this.projectDir,
382
+ viteDevServerUrls,
383
+ () => {
384
+ for (const server of this.servers) {
385
+ server.ws.send({ type: 'full-reload' });
386
+ }
387
+ },
388
+ );
389
+ this.watchChildren.push(child);
390
+ await firstBuild;
391
+ },
392
+ })),
432
393
  {
433
394
  concurrent: this.config.concurrent ?? true,
434
- exitOnError: this.isProd,
395
+ exitOnError: false,
435
396
  },
436
397
  );
437
398
  };
@@ -524,11 +485,11 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}.`);
524
485
  ): void => {
525
486
  d('handling process exit with:', options);
526
487
  if (options.cleanup) {
527
- for (const watcher of this.watchers) {
528
- d('cleaning vite watcher');
529
- watcher.close();
488
+ for (const child of this.watchChildren) {
489
+ d('killing vite watch subprocess');
490
+ child.kill();
530
491
  }
531
- this.watchers = [];
492
+ this.watchChildren = [];
532
493
 
533
494
  for (const server of this.servers) {
534
495
  d('cleaning http server');
@@ -11,7 +11,7 @@ export const external = [
11
11
 
12
12
  // Used for hot reload after preload scripts.
13
13
  const viteDevServers: Record<string, ViteDevServer> = {};
14
- const viteDevServerUrls: Record<string, string> = {};
14
+ export const viteDevServerUrls: Record<string, string> = {};
15
15
 
16
16
  export function getBuildConfig(env: ConfigEnv<'build'>): UserConfig {
17
17
  const { root, mode, command } = env;
@@ -24,7 +24,7 @@ export function getBuildConfig(env: ConfigEnv<'build'>): UserConfig {
24
24
  emptyOutDir: false,
25
25
  // 🚧 Multiple builds may conflict.
26
26
  outDir: '.vite/build',
27
- watch: command === 'serve' ? {} : null,
27
+ watch: command === 'serve' ? { exclude: '**/.git/**' } : null,
28
28
  minify: command === 'build',
29
29
  },
30
30
  clearScreen: false,
@@ -20,8 +20,8 @@ export function getConfig(
20
20
  input: forgeConfigSelf.entry,
21
21
  output: {
22
22
  format: 'cjs',
23
- // It should not be split chunks.
24
- inlineDynamicImports: true,
23
+ // Preload scripts require a single entrypoint.
24
+ codeSplitting: false,
25
25
  entryFileNames: '[name].js',
26
26
  chunkFileNames: '[name].js',
27
27
  assetFileNames: '[name].[ext]',
@@ -1,5 +1,7 @@
1
+ import chalk from 'chalk';
1
2
  import { build } from 'vite';
2
3
 
4
+ import { viteDevServerUrls } from './config/vite.base.config.js';
3
5
  import ViteConfigGenerator from './ViteConfig.js';
4
6
 
5
7
  import type {
@@ -7,11 +9,14 @@ import type {
7
9
  VitePluginConfig,
8
10
  VitePluginRendererConfig,
9
11
  } from './Config.js';
12
+ import type { Rollup } from 'vite';
10
13
 
11
14
  const projectDir = process.env.FORGE_VITE_PROJECT_DIR;
12
15
  const kind = process.env.FORGE_VITE_KIND as 'build' | 'renderer';
13
16
  const index = Number(process.env.FORGE_VITE_INDEX);
14
17
  const rawConfig = process.env.FORGE_VITE_CONFIG;
18
+ const watch = process.env.FORGE_VITE_WATCH === '1';
19
+ const rawDevServerUrls = process.env.FORGE_VITE_DEV_SERVER_URLS;
15
20
 
16
21
  if (!projectDir || !kind || !rawConfig || !Number.isInteger(index)) {
17
22
  console.error(
@@ -25,7 +30,7 @@ if (!projectDir || !kind || !rawConfig || !Number.isInteger(index)) {
25
30
  // defines when building main targets.
26
31
  const pluginConfig = JSON.parse(rawConfig) as VitePluginConfig;
27
32
 
28
- const generator = new ViteConfigGenerator(pluginConfig, projectDir, true);
33
+ const generator = new ViteConfigGenerator(pluginConfig, projectDir, !watch);
29
34
 
30
35
  let spec: VitePluginBuildConfig | VitePluginRendererConfig;
31
36
  let target: 'main' | 'preload' | 'renderer';
@@ -37,11 +42,106 @@ if (kind === 'build') {
37
42
  target = 'renderer';
38
43
  }
39
44
 
45
+ // Seed the module-level URL map so getBuildDefine() produces the same
46
+ // *_VITE_DEV_SERVER_URL defines the in-process path would have.
47
+ if (rawDevServerUrls) {
48
+ Object.assign(viteDevServerUrls, JSON.parse(rawDevServerUrls));
49
+ }
50
+
40
51
  const resolved = await generator.resolveConfig(spec, target);
41
52
 
42
- await build({
43
- configFile: false,
44
- logLevel: 'error',
45
- ...resolved,
46
- clearScreen: false,
47
- });
53
+ if (!watch) {
54
+ await build({
55
+ configFile: false,
56
+ logLevel: 'error',
57
+ ...resolved,
58
+ clearScreen: false,
59
+ });
60
+ } else {
61
+ // Matches the format of the default Vite logger
62
+ const timeFormatter = new Intl.DateTimeFormat(undefined, {
63
+ hour: 'numeric',
64
+ minute: 'numeric',
65
+ second: 'numeric',
66
+ });
67
+
68
+ // Rollup's `input` can be a string, an array of strings, or an object.
69
+ // https://rollupjs.org/configuration-options/#input
70
+ const input =
71
+ resolved.build?.rollupOptions?.input ??
72
+ (typeof resolved.build?.lib !== 'boolean'
73
+ ? resolved.build?.lib?.entry
74
+ : undefined);
75
+ const targetDisplay = !input
76
+ ? ''
77
+ : typeof input === 'string'
78
+ ? input
79
+ : Array.isArray(input)
80
+ ? input.join(' ')
81
+ : Object.keys(input).join(' ');
82
+
83
+ let firstBuildSent = false;
84
+ const sendOnce = (msg: { type: string; message?: string }) => {
85
+ if (firstBuildSent) return;
86
+ firstBuildSent = true;
87
+ process.send?.(msg);
88
+ };
89
+
90
+ const result = await build({
91
+ // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
92
+ configFile: false,
93
+ // We suppress Vite output and instead log lines using RollupWatcher events
94
+ logLevel: 'silent',
95
+ ...resolved,
96
+ plugins: [
97
+ // `buildEnd` and `closeBundle` are Rollup output generation hooks.
98
+ // https://rollupjs.org/plugin-development/#output-generation-hooks
99
+ {
100
+ name: '@electron-forge/plugin-vite:build-done',
101
+ buildEnd(err) {
102
+ if (err instanceof Error) {
103
+ sendOnce({ type: 'first-build-error', message: err.message });
104
+ }
105
+ },
106
+ closeBundle() {
107
+ sendOnce({ type: 'first-build-done' });
108
+ if (target === 'preload') {
109
+ // pluginHotRestart('reload') is a no-op here because viteDevServers
110
+ // lives in the parent; ask the parent to fan out the ws full-reload.
111
+ process.send?.({ type: 'reload-renderers' });
112
+ }
113
+ },
114
+ },
115
+ ...(resolved.plugins ?? []),
116
+ ],
117
+ clearScreen: false,
118
+ });
119
+
120
+ const isRollupWatcher = (x: unknown): x is Rollup.RollupWatcher =>
121
+ !!x &&
122
+ typeof x === 'object' &&
123
+ 'on' in x &&
124
+ typeof x.on === 'function' &&
125
+ 'close' in x &&
126
+ typeof x.close === 'function';
127
+
128
+ if (isRollupWatcher(result)) {
129
+ // The Rollup watcher emits events for subsequent builds.
130
+ result.on('event', (event) => {
131
+ if (event.code === 'ERROR' && resolved.logLevel !== 'silent') {
132
+ console.error(
133
+ `\n${chalk.dim(timeFormatter.format(new Date()))} ${event.error.message}`,
134
+ );
135
+ } else if (
136
+ event.code === 'BUNDLE_END' &&
137
+ (!resolved.logLevel || resolved.logLevel === 'info')
138
+ ) {
139
+ console.log(
140
+ `${chalk.dim(timeFormatter.format(new Date()))} ${chalk.cyan.bold('[@electron-forge/plugin-vite]')} ${chalk.green(
141
+ 'target built',
142
+ )} ${chalk.dim(targetDisplay)}`,
143
+ );
144
+ }
145
+ });
146
+ }
147
+ }