@electron-forge/plugin-vite 7.8.1 → 7.8.2

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.
@@ -8,7 +8,7 @@ export default class ViteConfigGenerator {
8
8
  constructor(pluginConfig: VitePluginConfig, projectDir: string, isProd: boolean);
9
9
  resolveConfig(buildConfig: VitePluginBuildConfig | VitePluginRendererConfig, target: Target): Promise<UserConfig>;
10
10
  get mode(): string;
11
- getBuildConfig(): Promise<UserConfig[]>;
11
+ getBuildConfigs(): Promise<UserConfig[]>;
12
12
  getRendererConfig(): Promise<UserConfig[]>;
13
13
  }
14
14
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"ViteConfig.d.ts","sourceRoot":"","sources":["../src/ViteConfig.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAClG,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,MAAM,CAAC;AAIlD,KAAK,MAAM,GAAG,WAAW,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,GAAG,UAAU,CAAC;AAExE,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;IAI5H,aAAa,CAAC,WAAW,EAAE,qBAAqB,GAAG,wBAAwB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BvH,IAAI,IAAI,IAAI,MAAM,CAKjB;IAEK,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAavC,iBAAiB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAYjD"}
1
+ {"version":3,"file":"ViteConfig.d.ts","sourceRoot":"","sources":["../src/ViteConfig.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAClG,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,MAAM,CAAC;AAIlD,KAAK,MAAM,GAAG,WAAW,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,GAAG,UAAU,CAAC;AAExE,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;IAI5H,aAAa,CAAC,WAAW,EAAE,qBAAqB,GAAG,wBAAwB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BvH,IAAI,IAAI,IAAI,MAAM,CAKjB;IAEK,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAaxC,iBAAiB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAYjD"}
@@ -46,7 +46,7 @@ class ViteConfigGenerator {
46
46
  // The `mode` set by the end user in `vite.config.js` has a higher priority.
47
47
  return this.isProd ? 'production' : 'development';
48
48
  }
49
- async getBuildConfig() {
49
+ async getBuildConfigs() {
50
50
  if (!Array.isArray(this.pluginConfig.build)) {
51
51
  throw new Error('"config.build" must be an Array');
52
52
  }
@@ -68,4 +68,4 @@ class ViteConfigGenerator {
68
68
  }
69
69
  }
70
70
  exports.default = ViteConfigGenerator;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZUNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLCtCQUEwQztBQUUxQyxnRUFBMkU7QUFDM0Usc0VBQWlGO0FBQ2pGLHdFQUFtRjtBQUtuRixNQUFNLENBQUMsR0FBRyxJQUFBLGVBQUssRUFBQyx3Q0FBd0MsQ0FBQyxDQUFDO0FBSTFELE1BQXFCLG1CQUFtQjtJQUN0QyxZQUE2QixZQUE4QixFQUFtQixVQUFrQixFQUFtQixNQUFlO1FBQXJHLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUFtQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQW1CLFdBQU0sR0FBTixNQUFNLENBQVM7UUFDaEksQ0FBQyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBNkQsRUFBRSxNQUFjO1FBQy9GLE1BQU0sU0FBUyxHQUFjO1lBQzNCLHVEQUF1RDtZQUN2RCxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3hDLDBDQUEwQztZQUMxQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFFZiw2QkFBNkI7WUFDN0IsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUM5QixlQUFlLEVBQUUsV0FBVztTQUM3QixDQUFDO1FBRUYsbUdBQW1HO1FBQ25HLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxJQUFBLHlCQUFrQixFQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDckYsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUEsNEJBQWlCLEVBQUMsU0FBK0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4RSxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxJQUFBLCtCQUFvQixFQUFDLFNBQStCLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDM0UsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBQSxnQ0FBcUIsRUFBQyxTQUFrQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQy9FO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLE1BQU0sNENBQTRDLENBQUMsQ0FBQztRQUMzRixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLDhDQUE4QztRQUM5QyxpSEFBaUg7UUFDakgsNEVBQTRFO1FBQzVFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztZQUNyQyxrREFBa0Q7YUFDakQsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO2FBQzlCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXZGLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUTtZQUN4QyxrREFBa0Q7YUFDakQsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO2FBQzlCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUVyRSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFoRUQsc0NBZ0VDIn0=
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZUNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLCtCQUEwQztBQUUxQyxnRUFBMkU7QUFDM0Usc0VBQWlGO0FBQ2pGLHdFQUFtRjtBQUtuRixNQUFNLENBQUMsR0FBRyxJQUFBLGVBQUssRUFBQyx3Q0FBd0MsQ0FBQyxDQUFDO0FBSTFELE1BQXFCLG1CQUFtQjtJQUN0QyxZQUE2QixZQUE4QixFQUFtQixVQUFrQixFQUFtQixNQUFlO1FBQXJHLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUFtQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQW1CLFdBQU0sR0FBTixNQUFNLENBQVM7UUFDaEksQ0FBQyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBNkQsRUFBRSxNQUFjO1FBQy9GLE1BQU0sU0FBUyxHQUFjO1lBQzNCLHVEQUF1RDtZQUN2RCxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3hDLDBDQUEwQztZQUMxQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFFZiw2QkFBNkI7WUFDN0IsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUM5QixlQUFlLEVBQUUsV0FBVztTQUM3QixDQUFDO1FBRUYsbUdBQW1HO1FBQ25HLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxJQUFBLHlCQUFrQixFQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDckYsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUEsNEJBQWlCLEVBQUMsU0FBK0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4RSxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxJQUFBLCtCQUFvQixFQUFDLFNBQStCLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDM0UsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBQSxnQ0FBcUIsRUFBQyxTQUFrQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQy9FO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLE1BQU0sNENBQTRDLENBQUMsQ0FBQztRQUMzRixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLDhDQUE4QztRQUM5QyxpSEFBaUg7UUFDakgsNEVBQTRFO1FBQzVFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztZQUNyQyxrREFBa0Q7YUFDakQsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO2FBQzlCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXZGLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUTtZQUN4QyxrREFBa0Q7YUFDakQsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO2FBQzlCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUVyRSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFoRUQsc0NBZ0VDIn0=
@@ -1,24 +1,32 @@
1
1
  import { PluginBase } from '@electron-forge/plugin-base';
2
+ import { Listr } from 'listr2';
2
3
  import type { VitePluginConfig } from './Config';
3
- import type { ForgeMultiHookMap, ResolvedForgeConfig } from '@electron-forge/shared-types';
4
+ import type { ForgeListrTask, ForgeMultiHookMap, ResolvedForgeConfig } from '@electron-forge/shared-types';
4
5
  export default class VitePlugin extends PluginBase<VitePluginConfig> {
5
6
  private static alreadyStarted;
6
7
  name: string;
7
8
  private isProd;
9
+ /**
10
+ * Path to the root of the Electron app
11
+ */
8
12
  private projectDir;
13
+ /**
14
+ * Path where Vite output is generated. Usually `${projectDir}/.vite`
15
+ */
9
16
  private baseDir;
10
17
  private configGeneratorCache;
11
18
  private watchers;
12
19
  private servers;
20
+ private timeFormatter;
13
21
  init: (dir: string) => void;
14
22
  setDirectories(dir: string): void;
15
23
  private get configGenerator();
16
24
  getHooks: () => ForgeMultiHookMap;
17
25
  resolveForgeConfig: (forgeConfig: ResolvedForgeConfig) => Promise<ResolvedForgeConfig>;
18
26
  packageAfterCopy: (_forgeConfig: ResolvedForgeConfig, buildPath: string) => Promise<void>;
19
- build: () => Promise<void>;
20
- buildRenderer: () => Promise<void>;
21
- launchRendererDevServers: () => Promise<void>;
27
+ build: (task?: ForgeListrTask<null>) => Promise<Listr | void>;
28
+ buildRenderer: (task?: ForgeListrTask<null>) => Promise<Listr<NewCtx, any, any> | undefined>;
29
+ launchRendererDevServers: (task?: ForgeListrTask<null>) => Promise<Listr<NewCtx, any, any> | undefined>;
22
30
  exitHandler: (options: {
23
31
  cleanup?: boolean;
24
32
  exit?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"VitePlugin.d.ts","sourceRoot":"","sources":["../src/VitePlugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAU9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAO3F,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,CAmD9B;IAEF,kBAAkB,gBAAuB,mBAAmB,KAAG,QAAQ,mBAAmB,CAAC,CAwBzF;IAEF,gBAAgB,iBAAwB,mBAAmB,aAAa,MAAM,KAAG,QAAQ,IAAI,CAAC,CAc5F;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,QAAQ,KAAK,KAAG,IAAI,CAmB/E;CACH;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"VitePlugin.d.ts","sourceRoot":"","sources":["../src/VitePlugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAuB,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAI9E,OAAO,EAAE,KAAK,EAAgB,MAAM,QAAQ,CAAC;AAM7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAK3G,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,QAAS,MAAM,KAAG,IAAI,CAUxB;IAEK,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKxC,OAAO,KAAK,eAAe,GAE1B;IAED,QAAQ,QAAO,iBAAiB,CA8E9B;IAEF,kBAAkB,gBAAuB,mBAAmB,KAAG,QAAQ,mBAAmB,CAAC,CAwBzF;IAEF,gBAAgB,iBAAwB,mBAAmB,aAAa,MAAM,KAAG,QAAQ,IAAI,CAAC,CAc5F;IAGF,KAAK,UAAiB,eAAe,IAAI,CAAC,KAAG,QAAQ,KAAK,GAAG,IAAI,CAAC,CAyDhE;IAGF,aAAa,UAAiB,eAAe,IAAI,CAAC,kDAchD;IAEF,wBAAwB,UAAiB,eAAe,IAAI,CAAC,kDAiC3D;IAEF,WAAW,YAAa;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,QAAQ,KAAK,KAAG,IAAI,CAiB/E;CACH;AAuBD,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -4,6 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.VitePlugin = void 0;
7
+ // TODO(erickzhao): Remove this when upgrading to Vite 6 and converting to ESM
8
+ process.env.VITE_CJS_IGNORE_WARNING = 'true';
7
9
  const node_path_1 = __importDefault(require("node:path"));
8
10
  const plugin_base_1 = require("@electron-forge/plugin-base");
9
11
  const chalk_1 = __importDefault(require("chalk"));
@@ -21,11 +23,21 @@ class VitePlugin extends plugin_base_1.PluginBase {
21
23
  this.isProd = false;
22
24
  this.watchers = [];
23
25
  this.servers = [];
26
+ // Matches the format of the default Vite logger
27
+ this.timeFormatter = new Intl.DateTimeFormat(undefined, {
28
+ hour: 'numeric',
29
+ minute: 'numeric',
30
+ second: 'numeric',
31
+ });
24
32
  this.init = (dir) => {
25
33
  this.setDirectories(dir);
26
34
  d('hooking process events');
27
- process.on('exit', (_code) => this.exitHandler({ cleanup: true }));
28
- process.on('SIGINT', (_signal) => this.exitHandler({ exit: true }));
35
+ process.on('exit', (_code) => {
36
+ this.exitHandler({ cleanup: true });
37
+ });
38
+ process.on('SIGINT', (_signal) => {
39
+ this.exitHandler({ exit: true });
40
+ });
29
41
  };
30
42
  this.getHooks = () => {
31
43
  return {
@@ -34,12 +46,15 @@ class VitePlugin extends plugin_base_1.PluginBase {
34
46
  if (VitePlugin.alreadyStarted)
35
47
  return;
36
48
  VitePlugin.alreadyStarted = true;
49
+ d(`preStart: removing old content from ${this.baseDir}`);
37
50
  await fs_extra_1.default.remove(this.baseDir);
38
51
  return task?.newListr([
39
52
  {
40
- title: 'Launching dev servers for renderer process code',
41
- task: async () => {
42
- await this.launchRendererDevServers();
53
+ title: 'Launching Vite dev servers for renderer process code...',
54
+ task: async (_ctx, task) => {
55
+ const result = await this.launchRendererDevServers(task);
56
+ task.title = 'Launched Vite dev servers for renderer process code';
57
+ return result;
43
58
  },
44
59
  rendererOptions: {
45
60
  persistentOutput: true,
@@ -48,23 +63,41 @@ class VitePlugin extends plugin_base_1.PluginBase {
48
63
  },
49
64
  // The main process depends on the `server.port` of the renderer process, so the renderer process is run first.
50
65
  {
51
- title: 'Compiling main process code',
52
- task: async () => {
53
- await this.build();
66
+ title: 'Building main process and preload bundles...',
67
+ task: async (_ctx, task) => {
68
+ const result = await this.build(task);
69
+ task.title = 'Built main process and preload bundles';
70
+ return result;
54
71
  },
55
72
  rendererOptions: {
73
+ persistentOutput: true,
56
74
  timer: { ...listr2_1.PRESET_TIMER },
57
75
  },
58
76
  },
59
- ]);
60
- }, 'Preparing vite bundles'),
77
+ ], { concurrent: false });
78
+ }, 'Preparing Vite bundles'),
61
79
  ],
62
80
  prePackage: [
63
- (0, plugin_base_1.namedHookWithTaskFn)(async () => {
81
+ (0, plugin_base_1.namedHookWithTaskFn)(async (task) => {
64
82
  this.isProd = true;
65
83
  await fs_extra_1.default.remove(this.baseDir);
66
- await Promise.all([this.build(), this.buildRenderer()]);
67
- }, 'Building vite bundles'),
84
+ return task?.newListr([
85
+ {
86
+ title: 'Building main and preload targets...',
87
+ task: async (_ctx, subtask) => {
88
+ const results = await this.build(subtask);
89
+ return results;
90
+ },
91
+ },
92
+ {
93
+ title: 'Building renderer targets...',
94
+ task: async (_ctx, subtask) => {
95
+ const results = await this.buildRenderer(subtask);
96
+ return results;
97
+ },
98
+ },
99
+ ], { concurrent: true });
100
+ }, 'Building production Vite bundles'),
68
101
  ],
69
102
  postStart: async (_config, child) => {
70
103
  d('hooking electron process exit');
@@ -103,7 +136,7 @@ Your packaged app may be larger than expected if you dont ignore everything othe
103
136
  if (!pj.main?.includes('.vite/')) {
104
137
  throw new Error(`Electron Forge is configured to use the Vite plugin. The plugin expects the
105
138
  "main" entry point in "package.json" to be ".vite/*" (where the plugin outputs
106
- the generated files). Instead, it is ${JSON.stringify(pj.main)}`);
139
+ the generated files). Instead, it is ${JSON.stringify(pj.main)}.`);
107
140
  }
108
141
  if (pj.config) {
109
142
  delete pj.config.forge;
@@ -111,59 +144,98 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}`);
111
144
  await fs_extra_1.default.writeJson(node_path_1.default.resolve(buildPath, 'package.json'), pj, { spaces: 2 });
112
145
  };
113
146
  // Main process, Preload scripts and Worker process, etc.
114
- this.build = async () => {
115
- const configs = await this.configGenerator.getBuildConfig();
116
- const buildTasks = [];
117
- const isWatcher = (x) => typeof x?.close === 'function';
118
- for (const userConfig of configs) {
119
- const buildTask = new Promise((resolve, reject) => {
120
- vite_1.default
121
- .build({
122
- // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
123
- configFile: false,
124
- ...userConfig,
125
- plugins: [(0, plugins_1.onBuildDone)(resolve), ...(userConfig.plugins ?? [])],
126
- })
127
- .then((result) => {
128
- if (isWatcher(result)) {
129
- this.watchers.push(result);
130
- }
131
- return result;
132
- })
133
- .catch(reject);
134
- });
135
- buildTasks.push(buildTask);
136
- }
137
- await Promise.all(buildTasks);
147
+ this.build = async (task) => {
148
+ const configs = await this.configGenerator.getBuildConfigs();
149
+ const isRollupWatcher = (x) => x && typeof x === 'object' && 'on' in x && typeof x.on === 'function' && 'close' in x && typeof x.close === 'function';
150
+ return task?.newListr(configs.map((userConfig) => {
151
+ const target = (userConfig.build?.rollupOptions?.input || (typeof userConfig.build?.lib !== 'boolean' && userConfig.build?.lib?.entry)) ?? '';
152
+ return {
153
+ title: `Building ${chalk_1.default.green(target)} target`,
154
+ task: async (_ctx, subtask) => {
155
+ // We wrap this function in a Promise to ensure that the task is marked as completed
156
+ // only after all bundles are done generated. This is done in the `closeBundle` Rollup hook
157
+ // rather than when the `vite.build` promise resolves.
158
+ await new Promise((resolve, reject) => {
159
+ vite_1.default
160
+ .build({
161
+ // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
162
+ configFile: false,
163
+ logLevel: 'silent', // We suppress Vite output and instead log lines using RollupWatcher events
164
+ ...userConfig,
165
+ plugins: [(0, plugins_1.onBuildDone)(resolve), ...(userConfig.plugins ?? [])],
166
+ clearScreen: false,
167
+ })
168
+ .then((result) => {
169
+ if (isRollupWatcher(result)) {
170
+ result.on('event', (event) => {
171
+ if (event.code === 'ERROR') {
172
+ console.error(`\n${this.timeFormatter.format(new Date())} ${event.error.message}`);
173
+ reject(event.error);
174
+ }
175
+ else if (event.code === 'BUNDLE_END') {
176
+ console.log(`${chalk_1.default.dim(this.timeFormatter.format(new Date()))} ${chalk_1.default.cyan.bold('[@electron-forge/plugin-vite]')} ${chalk_1.default.green('target built')} ${chalk_1.default.dim(target)}`);
177
+ }
178
+ });
179
+ this.watchers.push(result);
180
+ }
181
+ else {
182
+ subtask.title = `Built target ${chalk_1.default.dim(target)}`;
183
+ }
184
+ return result;
185
+ })
186
+ .catch(reject);
187
+ });
188
+ },
189
+ rendererOptions: {
190
+ persistentOutput: true,
191
+ },
192
+ exitOnError: true,
193
+ };
194
+ }), {
195
+ concurrent: true,
196
+ });
138
197
  };
139
198
  // Renderer process
140
- this.buildRenderer = async () => {
141
- for (const userConfig of await this.configGenerator.getRendererConfig()) {
142
- await vite_1.default.build({
143
- configFile: false,
144
- ...userConfig,
145
- });
146
- }
199
+ this.buildRenderer = async (task) => {
200
+ const rendererConfigs = await this.configGenerator.getRendererConfig();
201
+ return task?.newListr(rendererConfigs.map((userConfig) => ({
202
+ task: async (_ctx, subtask) => {
203
+ await vite_1.default.build({
204
+ configFile: false,
205
+ logLevel: 'error',
206
+ ...userConfig,
207
+ });
208
+ subtask.title = `Built target ${chalk_1.default.dim(node_path_1.default.basename(userConfig.build?.outDir ?? ''))}`;
209
+ },
210
+ })));
147
211
  };
148
- this.launchRendererDevServers = async () => {
149
- for (const userConfig of await this.configGenerator.getRendererConfig()) {
150
- const viteDevServer = await vite_1.default.createServer({
151
- configFile: false,
152
- ...userConfig,
153
- });
154
- await viteDevServer.listen();
155
- viteDevServer.printUrls();
156
- this.servers.push(viteDevServer);
157
- if (viteDevServer.httpServer) {
158
- // Make sure that `getDefines` in VitePlugin.ts gets the correct `server.port`. (#3198)
159
- const addressInfo = viteDevServer.httpServer.address();
160
- const isAddressInfo = (x) => x?.address;
161
- if (isAddressInfo(addressInfo)) {
162
- userConfig.server ??= {};
163
- userConfig.server.port = addressInfo.port;
212
+ this.launchRendererDevServers = async (task) => {
213
+ const rendererConfigs = await this.configGenerator.getRendererConfig();
214
+ return task?.newListr(rendererConfigs.map((userConfig) => ({
215
+ title: `Target ${chalk_1.default.cyan(node_path_1.default.basename(userConfig.build?.outDir ?? ''))}`,
216
+ task: async (_ctx, subtask) => {
217
+ const viteDevServer = await vite_1.default.createServer({
218
+ configFile: false,
219
+ ...userConfig,
220
+ });
221
+ await viteDevServer.listen();
222
+ const urls = getServerURLs(viteDevServer.resolvedUrls);
223
+ subtask.output = urls;
224
+ this.servers.push(viteDevServer);
225
+ if (viteDevServer.httpServer) {
226
+ // Make sure that `getDefines` in VitePlugin.ts gets the correct `server.port`. (#3198)
227
+ const addressInfo = viteDevServer.httpServer.address();
228
+ const isAddressInfo = (x) => (typeof x === 'object' ? typeof x?.address === 'string' : false);
229
+ if (isAddressInfo(addressInfo)) {
230
+ userConfig.server ??= {};
231
+ userConfig.server.port = addressInfo.port;
232
+ }
164
233
  }
165
- }
166
- }
234
+ },
235
+ rendererOptions: {
236
+ persistentOutput: true,
237
+ },
238
+ })));
167
239
  };
168
240
  this.exitHandler = (options, err) => {
169
241
  d('handling process exit with:', options);
@@ -181,10 +253,8 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}`);
181
253
  }
182
254
  if (err)
183
255
  console.error(err.stack);
184
- // Why: This is literally what the option says to do.
185
- // eslint-disable-next-line no-process-exit
186
256
  if (options.exit)
187
- process.exit();
257
+ process.exit(0);
188
258
  };
189
259
  }
190
260
  setDirectories(dir) {
@@ -198,4 +268,23 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}`);
198
268
  exports.VitePlugin = VitePlugin;
199
269
  VitePlugin.alreadyStarted = false;
200
270
  exports.default = VitePlugin;
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUE2QjtBQUU3Qiw2REFBOEU7QUFDOUUsa0RBQTBCO0FBQzFCLGtEQUEwQjtBQUMxQix3REFBMEI7QUFDMUIsbUNBQXNDO0FBQ3RDLGdEQUF1QztBQUV2Qyw0Q0FBNkM7QUFDN0MsOERBQStDO0FBUS9DLE1BQU0sQ0FBQyxHQUFHLElBQUEsZUFBSyxFQUFDLDRCQUE0QixDQUFDLENBQUM7QUFFOUMsTUFBcUIsVUFBVyxTQUFRLHdCQUE0QjtJQUFwRTs7UUFHUyxTQUFJLEdBQUcsTUFBTSxDQUFDO1FBRWIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQVVmLGFBQVEsR0FBb0IsRUFBRSxDQUFDO1FBRS9CLFlBQU8sR0FBeUIsRUFBRSxDQUFDO1FBRTNDLFNBQUksR0FBRyxDQUFDLEdBQVcsRUFBUSxFQUFFO1lBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekIsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDNUIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBMEIsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDO1FBV0YsYUFBUSxHQUFHLEdBQXNCLEVBQUU7WUFDakMsT0FBTztnQkFDTCxRQUFRLEVBQUU7b0JBQ1IsSUFBQSxpQ0FBbUIsRUFBYSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7d0JBQzdDLElBQUksVUFBVSxDQUFDLGNBQWM7NEJBQUUsT0FBTzt3QkFDdEMsVUFBVSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7d0JBRWpDLE1BQU0sa0JBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUU5QixPQUFPLElBQUksRUFBRSxRQUFRLENBQUM7NEJBQ3BCO2dDQUNFLEtBQUssRUFBRSxpREFBaUQ7Z0NBQ3hELElBQUksRUFBRSxLQUFLLElBQUksRUFBRTtvQ0FDZixNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dDQUN4QyxDQUFDO2dDQUNELGVBQWUsRUFBRTtvQ0FDZixnQkFBZ0IsRUFBRSxJQUFJO29DQUN0QixLQUFLLEVBQUUsRUFBRSxHQUFHLHFCQUFZLEVBQUU7aUNBQzNCOzZCQUNGOzRCQUNELCtHQUErRzs0QkFDL0c7Z0NBQ0UsS0FBSyxFQUFFLDZCQUE2QjtnQ0FDcEMsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO29DQUNmLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dDQUNyQixDQUFDO2dDQUNELGVBQWUsRUFBRTtvQ0FDZixLQUFLLEVBQUUsRUFBRSxHQUFHLHFCQUFZLEVBQUU7aUNBQzNCOzZCQUNGO3lCQUNGLENBQVEsQ0FBQztvQkFDWixDQUFDLEVBQUUsd0JBQXdCLENBQUM7aUJBQzdCO2dCQUNELFVBQVUsRUFBRTtvQkFDVixJQUFBLGlDQUFtQixFQUFlLEtBQUssSUFBSSxFQUFFO3dCQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQzt3QkFDbkIsTUFBTSxrQkFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBRTlCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMxRCxDQUFDLEVBQUUsdUJBQXVCLENBQUM7aUJBQzVCO2dCQUNELFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO29CQUNsQyxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQztvQkFDbkMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO3dCQUNwQixJQUFJLEtBQUssQ0FBQyxTQUFTOzRCQUFFLE9BQU87d0JBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNsRCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQzNDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7YUFDeEMsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGLHVCQUFrQixHQUFHLEtBQUssRUFBRSxXQUFnQyxFQUFnQyxFQUFFO1lBQzVGLFdBQVcsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUFDO1lBRWxDLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUM1RCxPQUFPLENBQUMsS0FBSyxDQUNYLGVBQUssQ0FBQyxNQUFNLENBQUM7OzBHQUVtRixDQUFDLENBQ2xHLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxPQUFPLFdBQVcsQ0FBQztZQUNyQixDQUFDO1lBRUQsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtnQkFDbkQsSUFBSSxDQUFDLElBQUk7b0JBQUUsT0FBTyxLQUFLLENBQUM7Z0JBRXhCLGdDQUFnQztnQkFDaEMsc0ZBQXNGO2dCQUV0RixrQ0FBa0M7Z0JBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQztZQUNGLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsQ0FBQztRQUVGLHFCQUFnQixHQUFHLEtBQUssRUFBRSxZQUFpQyxFQUFFLFNBQWlCLEVBQWlCLEVBQUU7WUFDL0YsTUFBTSxFQUFFLEdBQUcsTUFBTSxrQkFBRSxDQUFDLFFBQVEsQ0FBQyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFFNUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUM7O3VDQUVpQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUVELElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDekIsQ0FBQztZQUVELE1BQU0sa0JBQUUsQ0FBQyxTQUFTLENBQUMsbUJBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FBQztRQUVGLHlEQUF5RDtRQUN6RCxVQUFLLEdBQUcsS0FBSyxJQUFtQixFQUFFO1lBQ2hDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1RCxNQUFNLFVBQVUsR0FBb0IsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBTSxFQUFzQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFVBQVUsQ0FBQztZQUVqRixLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtvQkFDdEQsY0FBSTt5QkFDRCxLQUFLLENBQUM7d0JBQ0wsc0dBQXNHO3dCQUN0RyxVQUFVLEVBQUUsS0FBSzt3QkFDakIsR0FBRyxVQUFVO3dCQUNiLE9BQU8sRUFBRSxDQUFDLElBQUEscUJBQVcsRUFBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDL0QsQ0FBQzt5QkFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDZixJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDOzRCQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDN0IsQ0FBQzt3QkFFRCxPQUFPLE1BQU0sQ0FBQztvQkFDaEIsQ0FBQyxDQUFDO3lCQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBRUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQztRQUVGLG1CQUFtQjtRQUNuQixrQkFBYSxHQUFHLEtBQUssSUFBbUIsRUFBRTtZQUN4QyxLQUFLLE1BQU0sVUFBVSxJQUFJLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7Z0JBQ3hFLE1BQU0sY0FBSSxDQUFDLEtBQUssQ0FBQztvQkFDZixVQUFVLEVBQUUsS0FBSztvQkFDakIsR0FBRyxVQUFVO2lCQUNkLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRiw2QkFBd0IsR0FBRyxLQUFLLElBQW1CLEVBQUU7WUFDbkQsS0FBSyxNQUFNLFVBQVUsSUFBSSxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO2dCQUN4RSxNQUFNLGFBQWEsR0FBRyxNQUFNLGNBQUksQ0FBQyxZQUFZLENBQUM7b0JBQzVDLFVBQVUsRUFBRSxLQUFLO29CQUNqQixHQUFHLFVBQVU7aUJBQ2QsQ0FBQyxDQUFDO2dCQUVILE1BQU0sYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBRTFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUVqQyxJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDN0IsdUZBQXVGO29CQUN2RixNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN2RCxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQU0sRUFBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7b0JBRS9ELElBQUksYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7d0JBQy9CLFVBQVUsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO3dCQUN6QixVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUM1QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsZ0JBQVcsR0FBRyxDQUFDLE9BQThDLEVBQUUsR0FBVyxFQUFRLEVBQUU7WUFDbEYsQ0FBQyxDQUFDLDZCQUE2QixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUM7b0JBQzNCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEIsQ0FBQztnQkFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFFbkIsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2xDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO29CQUMxQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2pCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDcEIsQ0FBQztZQUNELElBQUksR0FBRztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxxREFBcUQ7WUFDckQsMkNBQTJDO1lBQzNDLElBQUksT0FBTyxDQUFDLElBQUk7Z0JBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQztJQUNKLENBQUM7SUE5TFEsY0FBYyxDQUFDLEdBQVc7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxtQkFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELElBQVksZUFBZTtRQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksb0JBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVHLENBQUM7O0FBeUxNLGdDQUFVO0FBMU5GLHlCQUFjLEdBQUcsS0FBSyxBQUFSLENBQVM7a0JBRG5CLFVBQVUifQ==
271
+ /**
272
+ * Get a string for Vite's printServerUrls function without actually printing it.
273
+ * Allows us to set `task.output` to that value without having to pass a custom logger into Vite.
274
+ * @see https://github.com/vitejs/vite/blob/42233d39674be808a6a1a79f1a6e44ed23ba0d61/packages/vite/src/node/logger.ts#L168-L188
275
+ */
276
+ function getServerURLs(urls) {
277
+ let output = '';
278
+ const colorUrl = (url) => chalk_1.default.cyan(url.replace(/:(\d+)\//, (_, port) => `:${chalk_1.default.bold(port)}/`));
279
+ for (const url of urls.local) {
280
+ output += ` ${chalk_1.default.green('➜')} ${chalk_1.default.bold('Local')}: ${colorUrl(url)}`;
281
+ }
282
+ for (const url of urls.network) {
283
+ output += ` \n${chalk_1.default.green('➜')} ${chalk_1.default.bold('Network')}: ${colorUrl(url)}`;
284
+ }
285
+ if (urls.network.length === 0) {
286
+ output += chalk_1.default.dim(` \n${chalk_1.default.green('➜')} ${chalk_1.default.bold('Network')}: use `) + chalk_1.default.bold('--host') + chalk_1.default.dim(' to expose');
287
+ }
288
+ return output;
289
+ }
290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhFQUE4RTtBQUM5RSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQztBQUU3QywwREFBNkI7QUFFN0IsNkRBQThFO0FBQzlFLGtEQUEwQjtBQUMxQixrREFBMEI7QUFDMUIsd0RBQTBCO0FBQzFCLG1DQUE2QztBQUM3QyxnREFBdUM7QUFFdkMsNENBQTZDO0FBQzdDLDhEQUErQztBQU0vQyxNQUFNLENBQUMsR0FBRyxJQUFBLGVBQUssRUFBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBRTlDLE1BQXFCLFVBQVcsU0FBUSx3QkFBNEI7SUFBcEU7O1FBR1MsU0FBSSxHQUFHLE1BQU0sQ0FBQztRQUViLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFjZixhQUFRLEdBQWdDLEVBQUUsQ0FBQztRQUUzQyxZQUFPLEdBQXlCLEVBQUUsQ0FBQztRQUUzQyxnREFBZ0Q7UUFDeEMsa0JBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO1lBQ3pELElBQUksRUFBRSxTQUFTO1lBQ2YsTUFBTSxFQUFFLFNBQVM7WUFDakIsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsU0FBSSxHQUFHLENBQUMsR0FBVyxFQUFRLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV6QixDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUM1QixPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsRUFBRSxDQUFD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electron-forge/plugin-vite",
3
- "version": "7.8.1",
3
+ "version": "7.8.2",
4
4
  "description": "Vite plugin for Electron Forge, lets you use Vite directly in your tooling",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,10 +12,8 @@
12
12
  "main": "dist/VitePlugin.js",
13
13
  "typings": "dist/VitePlugin.d.ts",
14
14
  "dependencies": {
15
- "@electron-forge/core-utils": "7.8.1",
16
- "@electron-forge/plugin-base": "7.8.1",
17
- "@electron-forge/shared-types": "7.8.1",
18
- "@electron-forge/web-multi-logger": "7.8.1",
15
+ "@electron-forge/plugin-base": "7.8.2",
16
+ "@electron-forge/shared-types": "7.8.2",
19
17
  "chalk": "^4.0.0",
20
18
  "debug": "^4.3.1",
21
19
  "fs-extra": "^10.0.0",
@@ -26,7 +24,7 @@
26
24
  "@malept/cross-spawn-promise": "^2.0.0",
27
25
  "@types/node": "^18.0.3",
28
26
  "vite": "^5.0.12",
29
- "vitest": "^3.0.3",
27
+ "vitest": "^3.1.3",
30
28
  "which": "^2.0.2",
31
29
  "xvfb-maybe": "^0.2.1"
32
30
  },
@@ -41,5 +39,5 @@
41
39
  "src",
42
40
  "forge-vite-env.d.ts"
43
41
  ],
44
- "gitHead": "9f35bdea87fe0df5b2566b74ff909f2f037ef556"
42
+ "gitHead": "b8bc79894f2aa410f037784b848fbd947ff53417"
45
43
  }
package/src/ViteConfig.ts CHANGED
@@ -51,7 +51,7 @@ export default class ViteConfigGenerator {
51
51
  return this.isProd ? 'production' : 'development';
52
52
  }
53
53
 
54
- async getBuildConfig(): Promise<UserConfig[]> {
54
+ async getBuildConfigs(): Promise<UserConfig[]> {
55
55
  if (!Array.isArray(this.pluginConfig.build)) {
56
56
  throw new Error('"config.build" must be an Array');
57
57
  }
package/src/VitePlugin.ts CHANGED
@@ -1,20 +1,21 @@
1
+ // TODO(erickzhao): Remove this when upgrading to Vite 6 and converting to ESM
2
+ process.env.VITE_CJS_IGNORE_WARNING = 'true';
3
+
1
4
  import path from 'node:path';
2
5
 
3
6
  import { namedHookWithTaskFn, PluginBase } from '@electron-forge/plugin-base';
4
7
  import chalk from 'chalk';
5
8
  import debug from 'debug';
6
9
  import fs from 'fs-extra';
7
- import { PRESET_TIMER } from 'listr2';
10
+ import { Listr, PRESET_TIMER } from 'listr2';
8
11
  import { default as vite } from 'vite';
9
12
 
10
13
  import { onBuildDone } from './util/plugins';
11
14
  import ViteConfigGenerator from './ViteConfig';
12
15
 
13
16
  import type { VitePluginConfig } from './Config';
14
- import type { ForgeMultiHookMap, ResolvedForgeConfig } from '@electron-forge/shared-types';
17
+ import type { ForgeListrTask, ForgeMultiHookMap, ResolvedForgeConfig } from '@electron-forge/shared-types';
15
18
  import type { AddressInfo } from 'node:net';
16
- // eslint-disable-next-line n/no-extraneous-import
17
- import type { RollupWatcher } from 'rollup';
18
19
 
19
20
  const d = debug('electron-forge:plugin:vite');
20
21
 
@@ -25,24 +26,39 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
25
26
 
26
27
  private isProd = false;
27
28
 
28
- // The root of the Electron app
29
+ /**
30
+ * Path to the root of the Electron app
31
+ */
29
32
  private projectDir!: string;
30
33
 
31
- // Where the Vite output is generated. Usually `${projectDir}/.vite`
34
+ /**
35
+ * Path where Vite output is generated. Usually `${projectDir}/.vite`
36
+ */
32
37
  private baseDir!: string;
33
38
 
34
39
  private configGeneratorCache!: ViteConfigGenerator;
35
40
 
36
- private watchers: RollupWatcher[] = [];
41
+ private watchers: vite.Rollup.RollupWatcher[] = [];
37
42
 
38
43
  private servers: vite.ViteDevServer[] = [];
39
44
 
45
+ // Matches the format of the default Vite logger
46
+ private timeFormatter = new Intl.DateTimeFormat(undefined, {
47
+ hour: 'numeric',
48
+ minute: 'numeric',
49
+ second: 'numeric',
50
+ });
51
+
40
52
  init = (dir: string): void => {
41
53
  this.setDirectories(dir);
42
54
 
43
55
  d('hooking process events');
44
- process.on('exit', (_code) => this.exitHandler({ cleanup: true }));
45
- process.on('SIGINT' as NodeJS.Signals, (_signal) => this.exitHandler({ exit: true }));
56
+ process.on('exit', (_code) => {
57
+ this.exitHandler({ cleanup: true });
58
+ });
59
+ process.on('SIGINT' as NodeJS.Signals, (_signal) => {
60
+ this.exitHandler({ exit: true });
61
+ });
46
62
  };
47
63
 
48
64
  public setDirectories(dir: string): void {
@@ -61,39 +77,66 @@ export default class VitePlugin extends PluginBase<VitePluginConfig> {
61
77
  if (VitePlugin.alreadyStarted) return;
62
78
  VitePlugin.alreadyStarted = true;
63
79
 
80
+ d(`preStart: removing old content from ${this.baseDir}`);
64
81
  await fs.remove(this.baseDir);
65
82
 
66
- return task?.newListr([
67
- {
68
- title: 'Launching dev servers for renderer process code',
69
- task: async () => {
70
- await this.launchRendererDevServers();
71
- },
72
- rendererOptions: {
73
- persistentOutput: true,
74
- timer: { ...PRESET_TIMER },
75
- },
76
- },
77
- // The main process depends on the `server.port` of the renderer process, so the renderer process is run first.
78
- {
79
- title: 'Compiling main process code',
80
- task: async () => {
81
- await this.build();
83
+ return task?.newListr(
84
+ [
85
+ {
86
+ title: 'Launching Vite dev servers for renderer process code...',
87
+ task: async (_ctx, task) => {
88
+ const result = await this.launchRendererDevServers(task);
89
+ task.title = 'Launched Vite dev servers for renderer process code';
90
+ return result;
91
+ },
92
+ rendererOptions: {
93
+ persistentOutput: true,
94
+ timer: { ...PRESET_TIMER },
95
+ },
82
96
  },
83
- rendererOptions: {
84
- timer: { ...PRESET_TIMER },
97
+ // The main process depends on the `server.port` of the renderer process, so the renderer process is run first.
98
+ {
99
+ title: 'Building main process and preload bundles...',
100
+ task: async (_ctx, task) => {
101
+ const result = await this.build(task);
102
+ task.title = 'Built main process and preload bundles';
103
+ return result;
104
+ },
105
+ rendererOptions: {
106
+ persistentOutput: true,
107
+ timer: { ...PRESET_TIMER },
108
+ },
85
109
  },
86
- },
87
- ]) as any;
88
- }, 'Preparing vite bundles'),
110
+ ],
111
+ { concurrent: false }
112
+ );
113
+ }, 'Preparing Vite bundles'),
89
114
  ],
90
115
  prePackage: [
91
- namedHookWithTaskFn<'prePackage'>(async () => {
116
+ namedHookWithTaskFn<'prePackage'>(async (task) => {
92
117
  this.isProd = true;
93
118
  await fs.remove(this.baseDir);
94
119
 
95
- await Promise.all([this.build(), this.buildRenderer()]);
96
- }, 'Building vite bundles'),
120
+ return task?.newListr(
121
+ [
122
+ {
123
+ title: 'Building main and preload targets...',
124
+ task: async (_ctx, subtask) => {
125
+ const results = await this.build(subtask);
126
+ return results;
127
+ },
128
+ },
129
+ {
130
+ title: 'Building renderer targets...',
131
+ task: async (_ctx, subtask) => {
132
+ const results = await this.buildRenderer(subtask);
133
+ return results;
134
+ },
135
+ },
136
+ ],
137
+ { concurrent: true }
138
+ );
139
+ }, 'Building production Vite bundles'),
97
140
  ],
98
141
  postStart: async (_config, child) => {
99
142
  d('hooking electron process exit');
@@ -139,7 +182,7 @@ Your packaged app may be larger than expected if you dont ignore everything othe
139
182
  if (!pj.main?.includes('.vite/')) {
140
183
  throw new Error(`Electron Forge is configured to use the Vite plugin. The plugin expects the
141
184
  "main" entry point in "package.json" to be ".vite/*" (where the plugin outputs
142
- the generated files). Instead, it is ${JSON.stringify(pj.main)}`);
185
+ the generated files). Instead, it is ${JSON.stringify(pj.main)}.`);
143
186
  }
144
187
 
145
188
  if (pj.config) {
@@ -150,69 +193,115 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}`);
150
193
  };
151
194
 
152
195
  // Main process, Preload scripts and Worker process, etc.
153
- build = async (): Promise<void> => {
154
- const configs = await this.configGenerator.getBuildConfig();
155
- const buildTasks: Promise<void>[] = [];
156
- const isWatcher = (x: any): x is RollupWatcher => typeof x?.close === 'function';
157
-
158
- for (const userConfig of configs) {
159
- const buildTask = new Promise<void>((resolve, reject) => {
160
- vite
161
- .build({
162
- // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
163
- configFile: false,
164
- ...userConfig,
165
- plugins: [onBuildDone(resolve), ...(userConfig.plugins ?? [])],
166
- })
167
- .then((result) => {
168
- if (isWatcher(result)) {
169
- this.watchers.push(result);
170
- }
171
-
172
- return result;
173
- })
174
- .catch(reject);
175
- });
176
-
177
- buildTasks.push(buildTask);
178
- }
179
-
180
- await Promise.all(buildTasks);
196
+ build = async (task?: ForgeListrTask<null>): Promise<Listr | void> => {
197
+ const configs = await this.configGenerator.getBuildConfigs();
198
+ const isRollupWatcher = (x: vite.Rollup.RollupWatcher | vite.Rollup.RollupOutput | vite.Rollup.RollupOutput[]): x is vite.Rollup.RollupWatcher =>
199
+ x && typeof x === 'object' && 'on' in x && typeof x.on === 'function' && 'close' in x && typeof x.close === 'function';
200
+
201
+ return task?.newListr(
202
+ configs.map((userConfig) => {
203
+ const target = (userConfig.build?.rollupOptions?.input || (typeof userConfig.build?.lib !== 'boolean' && userConfig.build?.lib?.entry)) ?? '';
204
+ return {
205
+ title: `Building ${chalk.green(target)} target`,
206
+ task: async (_ctx, subtask) => {
207
+ // We wrap this function in a Promise to ensure that the task is marked as completed
208
+ // only after all bundles are done generated. This is done in the `closeBundle` Rollup hook
209
+ // rather than when the `vite.build` promise resolves.
210
+ await new Promise<void>((resolve, reject) => {
211
+ vite
212
+ .build({
213
+ // Avoid recursive builds caused by users configuring @electron-forge/plugin-vite in Vite config file.
214
+ configFile: false,
215
+ logLevel: 'silent', // We suppress Vite output and instead log lines using RollupWatcher events
216
+ ...userConfig,
217
+ plugins: [onBuildDone(resolve), ...(userConfig.plugins ?? [])],
218
+ clearScreen: false,
219
+ })
220
+ .then((result) => {
221
+ if (isRollupWatcher(result)) {
222
+ result.on('event', (event) => {
223
+ if (event.code === 'ERROR') {
224
+ console.error(`\n${this.timeFormatter.format(new Date())} ${event.error.message}`);
225
+ reject(event.error);
226
+ } else if (event.code === 'BUNDLE_END') {
227
+ console.log(
228
+ `${chalk.dim(this.timeFormatter.format(new Date()))} ${chalk.cyan.bold('[@electron-forge/plugin-vite]')} ${chalk.green(
229
+ 'target built'
230
+ )} ${chalk.dim(target)}`
231
+ );
232
+ }
233
+ });
234
+ this.watchers.push(result);
235
+ } else {
236
+ subtask.title = `Built target ${chalk.dim(target)}`;
237
+ }
238
+ return result;
239
+ })
240
+ .catch(reject);
241
+ });
242
+ },
243
+ rendererOptions: {
244
+ persistentOutput: true,
245
+ },
246
+ exitOnError: true,
247
+ };
248
+ }),
249
+ {
250
+ concurrent: true,
251
+ }
252
+ );
181
253
  };
182
254
 
183
255
  // Renderer process
184
- buildRenderer = async (): Promise<void> => {
185
- for (const userConfig of await this.configGenerator.getRendererConfig()) {
186
- await vite.build({
187
- configFile: false,
188
- ...userConfig,
189
- });
190
- }
256
+ buildRenderer = async (task?: ForgeListrTask<null>) => {
257
+ const rendererConfigs = await this.configGenerator.getRendererConfig();
258
+ return task?.newListr(
259
+ rendererConfigs.map((userConfig) => ({
260
+ task: async (_ctx, subtask) => {
261
+ await vite.build({
262
+ configFile: false,
263
+ logLevel: 'error',
264
+ ...userConfig,
265
+ });
266
+ subtask.title = `Built target ${chalk.dim(path.basename(userConfig.build?.outDir ?? ''))}`;
267
+ },
268
+ }))
269
+ );
191
270
  };
192
271
 
193
- launchRendererDevServers = async (): Promise<void> => {
194
- for (const userConfig of await this.configGenerator.getRendererConfig()) {
195
- const viteDevServer = await vite.createServer({
196
- configFile: false,
197
- ...userConfig,
198
- });
272
+ launchRendererDevServers = async (task?: ForgeListrTask<null>) => {
273
+ const rendererConfigs = await this.configGenerator.getRendererConfig();
274
+ return task?.newListr(
275
+ rendererConfigs.map((userConfig) => ({
276
+ title: `Target ${chalk.cyan(path.basename(userConfig.build?.outDir ?? ''))}`,
277
+ task: async (_ctx, subtask) => {
278
+ const viteDevServer = await vite.createServer({
279
+ configFile: false,
280
+ ...userConfig,
281
+ });
199
282
 
200
- await viteDevServer.listen();
201
- viteDevServer.printUrls();
283
+ await viteDevServer.listen();
284
+ const urls = getServerURLs(viteDevServer.resolvedUrls!);
285
+ subtask.output = urls;
202
286
 
203
- this.servers.push(viteDevServer);
287
+ this.servers.push(viteDevServer);
204
288
 
205
- if (viteDevServer.httpServer) {
206
- // Make sure that `getDefines` in VitePlugin.ts gets the correct `server.port`. (#3198)
207
- const addressInfo = viteDevServer.httpServer.address();
208
- const isAddressInfo = (x: any): x is AddressInfo => x?.address;
289
+ if (viteDevServer.httpServer) {
290
+ // Make sure that `getDefines` in VitePlugin.ts gets the correct `server.port`. (#3198)
291
+ const addressInfo = viteDevServer.httpServer.address();
292
+ const isAddressInfo = (x: AddressInfo | string | null): x is AddressInfo => (typeof x === 'object' ? typeof x?.address === 'string' : false);
209
293
 
210
- if (isAddressInfo(addressInfo)) {
211
- userConfig.server ??= {};
212
- userConfig.server.port = addressInfo.port;
213
- }
214
- }
215
- }
294
+ if (isAddressInfo(addressInfo)) {
295
+ userConfig.server ??= {};
296
+ userConfig.server.port = addressInfo.port;
297
+ }
298
+ }
299
+ },
300
+ rendererOptions: {
301
+ persistentOutput: true,
302
+ },
303
+ }))
304
+ );
216
305
  };
217
306
 
218
307
  exitHandler = (options: { cleanup?: boolean; exit?: boolean }, err?: Error): void => {
@@ -231,10 +320,29 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}`);
231
320
  this.servers = [];
232
321
  }
233
322
  if (err) console.error(err.stack);
234
- // Why: This is literally what the option says to do.
235
- // eslint-disable-next-line no-process-exit
236
- if (options.exit) process.exit();
323
+ if (options.exit) process.exit(0);
237
324
  };
238
325
  }
239
326
 
327
+ /**
328
+ * Get a string for Vite's printServerUrls function without actually printing it.
329
+ * Allows us to set `task.output` to that value without having to pass a custom logger into Vite.
330
+ * @see https://github.com/vitejs/vite/blob/42233d39674be808a6a1a79f1a6e44ed23ba0d61/packages/vite/src/node/logger.ts#L168-L188
331
+ */
332
+ function getServerURLs(urls: vite.ResolvedServerUrls) {
333
+ let output = '';
334
+ const colorUrl = (url: string) => chalk.cyan(url.replace(/:(\d+)\//, (_, port) => `:${chalk.bold(port)}/`));
335
+ for (const url of urls.local) {
336
+ output += ` ${chalk.green('➜')} ${chalk.bold('Local')}: ${colorUrl(url)}`;
337
+ }
338
+ for (const url of urls.network) {
339
+ output += ` \n${chalk.green('➜')} ${chalk.bold('Network')}: ${colorUrl(url)}`;
340
+ }
341
+ if (urls.network.length === 0) {
342
+ output += chalk.dim(` \n${chalk.green('➜')} ${chalk.bold('Network')}: use `) + chalk.bold('--host') + chalk.dim(' to expose');
343
+ }
344
+
345
+ return output;
346
+ }
347
+
240
348
  export { VitePlugin };