@electron-spark/vite-plugin-electron-main 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -21,6 +21,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  let node_child_process = require("node:child_process");
24
+ let node_fs = require("node:fs");
24
25
  let node_module = require("node:module");
25
26
  let node_path = require("node:path");
26
27
  node_path = __toESM(node_path, 1);
@@ -48,7 +49,8 @@ function electronMain(environmentName = "electron") {
48
49
  } })];
49
50
  }
50
51
  function createSession(server) {
51
- const executable = (0, node_module.createRequire)(node_path.default.resolve(server.config.root, "package.json"))("electron");
52
+ const electronPath = (0, node_module.createRequire)(node_path.default.resolve(server.config.root, "package.json"))("electron");
53
+ const executable = process.platform === "darwin" ? (0, node_fs.realpathSync)(electronPath) : electronPath;
52
54
  let child;
53
55
  let closed = false;
54
56
  let pending = Promise.resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;wBAQgB,aAAa,2BAA+B"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;wBASgB,aAAa,2BAA+B"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;wBAQgB,aAAa,2BAA+B"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;wBASgB,aAAa,2BAA+B"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { spawn } from "node:child_process";
2
+ import { realpathSync } from "node:fs";
2
3
  import { createRequire } from "node:module";
3
4
  import path from "node:path";
4
5
  import { buildOnServe } from "@electron-spark/vite-plugin-build-on-serve";
@@ -25,7 +26,8 @@ function electronMain(environmentName = "electron") {
25
26
  } })];
26
27
  }
27
28
  function createSession(server) {
28
- const executable = createRequire(path.resolve(server.config.root, "package.json"))("electron");
29
+ const electronPath = createRequire(path.resolve(server.config.root, "package.json"))("electron");
30
+ const executable = process.platform === "darwin" ? realpathSync(electronPath) : electronPath;
29
31
  let child;
30
32
  let closed = false;
31
33
  let pending = Promise.resolve();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { spawn, type ChildProcess } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport { buildOnServe } from \"@electron-spark/vite-plugin-build-on-serve\";\nimport type { Plugin, ViteDevServer } from \"vite\";\n\n/** Build and restart only the configured Electron main environment in dev. */\nexport function electronMain(environmentName = \"electron\"): Plugin[] {\n return [\n {\n name: \"@electron-spark/vite-plugin-electron-main\",\n enforce: \"pre\",\n applyToEnvironment: (environment) => environment.name === environmentName,\n resolveId(id) {\n if (id === \"electron\" || id === \"electron/main\" || id === \"electron/common\") {\n return { id, external: true };\n }\n return null;\n },\n },\n buildOnServe(environmentName, {\n session(server) {\n const session = createSession(server);\n return { ...session, plugins: [session.launch] };\n },\n }),\n ];\n}\n\nfunction createSession(server: ViteDevServer) {\n const require = createRequire(path.resolve(server.config.root, \"package.json\"));\n const executable: string = require(\"electron\");\n let child: ChildProcess | undefined;\n let closed = false;\n let pending = Promise.resolve();\n let entry: string | undefined;\n\n async function stop() {\n const previous = child;\n child = undefined;\n if (!previous?.pid || previous.exitCode !== null || previous.signalCode !== null) return;\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => previous.kill(\"SIGKILL\"), 3000);\n previous.once(\"exit\", () => {\n clearTimeout(timeout);\n resolve();\n });\n previous.kill(\"SIGTERM\");\n });\n }\n\n return {\n close: async () => {\n closed = true;\n await pending;\n await stop();\n },\n buildStart() {\n entry = undefined;\n },\n buildSuccess() {\n const builtEntry = entry;\n if (!builtEntry || closed) return pending;\n pending = pending\n .then(async () => {\n await stop();\n if (closed) return;\n const env = { ...process.env };\n delete env.ELECTRON_RUN_AS_NODE;\n child = spawn(executable, [builtEntry], { stdio: \"inherit\", env });\n child.on(\"error\", (error) => server.config.logger.error(error.message));\n })\n .catch((error: unknown) => {\n server.config.logger.error(String(error));\n });\n return pending;\n },\n launch: {\n name: \"electron-main-launch\",\n writeBundle(options, bundle) {\n const entries = Object.values(bundle).filter(\n (output) => output.type === \"chunk\" && output.isEntry,\n );\n if (entries.length !== 1) {\n throw new Error(\"Electron main requires exactly one entry point.\");\n }\n // Use the first written output, but only launch after the whole cycle succeeds.\n entry ??= path.resolve(options.dir ?? path.dirname(options.file!), entries[0].fileName);\n },\n } satisfies Plugin,\n };\n}\n"],"mappings":";;;;;;AAQA,SAAgB,aAAa,kBAAkB,YAAsB;CACnE,OAAO,CACL;EACE,MAAM;EACN,SAAS;EACT,qBAAqB,gBAAgB,YAAY,SAAS;EAC1D,UAAU,IAAI;GACZ,IAAI,OAAO,cAAc,OAAO,mBAAmB,OAAO,mBACxD,OAAO;IAAE;IAAI,UAAU;GAAK;GAE9B,OAAO;EACT;CACF,GACA,aAAa,iBAAiB,EAC5B,QAAQ,QAAQ;EACd,MAAM,UAAU,cAAc,MAAM;EACpC,OAAO;GAAE,GAAG;GAAS,SAAS,CAAC,QAAQ,MAAM;EAAE;CACjD,EACF,CAAC,CACH;AACF;AAEA,SAAS,cAAc,QAAuB;CAE5C,MAAM,aADU,cAAc,KAAK,QAAQ,OAAO,OAAO,MAAM,cAAc,CAC5C,CAAC,CAAC,UAAU;CAC7C,IAAI;CACJ,IAAI,SAAS;CACb,IAAI,UAAU,QAAQ,QAAQ;CAC9B,IAAI;CAEJ,eAAe,OAAO;EACpB,MAAM,WAAW;EACjB,QAAQ,KAAA;EACR,IAAI,CAAC,UAAU,OAAO,SAAS,aAAa,QAAQ,SAAS,eAAe,MAAM;EAClF,MAAM,IAAI,SAAe,YAAY;GACnC,MAAM,UAAU,iBAAiB,SAAS,KAAK,SAAS,GAAG,GAAI;GAC/D,SAAS,KAAK,cAAc;IAC1B,aAAa,OAAO;IACpB,QAAQ;GACV,CAAC;GACD,SAAS,KAAK,SAAS;EACzB,CAAC;CACH;CAEA,OAAO;EACL,OAAO,YAAY;GACjB,SAAS;GACT,MAAM;GACN,MAAM,KAAK;EACb;EACA,aAAa;GACX,QAAQ,KAAA;EACV;EACA,eAAe;GACb,MAAM,aAAa;GACnB,IAAI,CAAC,cAAc,QAAQ,OAAO;GAClC,UAAU,QACP,KAAK,YAAY;IAChB,MAAM,KAAK;IACX,IAAI,QAAQ;IACZ,MAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;IAC7B,OAAO,IAAI;IACX,QAAQ,MAAM,YAAY,CAAC,UAAU,GAAG;KAAE,OAAO;KAAW;IAAI,CAAC;IACjE,MAAM,GAAG,UAAU,UAAU,OAAO,OAAO,OAAO,MAAM,MAAM,OAAO,CAAC;GACxE,CAAC,CAAC,CACD,OAAO,UAAmB;IACzB,OAAO,OAAO,OAAO,MAAM,OAAO,KAAK,CAAC;GAC1C,CAAC;GACH,OAAO;EACT;EACA,QAAQ;GACN,MAAM;GACN,YAAY,SAAS,QAAQ;IAC3B,MAAM,UAAU,OAAO,OAAO,MAAM,CAAC,CAAC,QACnC,WAAW,OAAO,SAAS,WAAW,OAAO,OAChD;IACA,IAAI,QAAQ,WAAW,GACrB,MAAM,IAAI,MAAM,iDAAiD;IAGnE,UAAU,KAAK,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,IAAK,GAAG,QAAQ,EAAE,CAAC,QAAQ;GACxF;EACF;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { spawn, type ChildProcess } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport { buildOnServe } from \"@electron-spark/vite-plugin-build-on-serve\";\nimport type { Plugin, ViteDevServer } from \"vite\";\n\n/** Build and restart only the configured Electron main environment in dev. */\nexport function electronMain(environmentName = \"electron\"): Plugin[] {\n return [\n {\n name: \"@electron-spark/vite-plugin-electron-main\",\n enforce: \"pre\",\n applyToEnvironment: (environment) => environment.name === environmentName,\n resolveId(id) {\n if (id === \"electron\" || id === \"electron/main\" || id === \"electron/common\") {\n return { id, external: true };\n }\n return null;\n },\n },\n buildOnServe(environmentName, {\n session(server) {\n const session = createSession(server);\n return { ...session, plugins: [session.launch] };\n },\n }),\n ];\n}\n\nfunction createSession(server: ViteDevServer) {\n const require = createRequire(path.resolve(server.config.root, \"package.json\"));\n const electronPath: string = require(\"electron\");\n // macOS uses the launched bundle's identity for the Dock and app switcher.\n const executable = process.platform === \"darwin\" ? realpathSync(electronPath) : electronPath;\n let child: ChildProcess | undefined;\n let closed = false;\n let pending = Promise.resolve();\n let entry: string | undefined;\n\n async function stop() {\n const previous = child;\n child = undefined;\n if (!previous?.pid || previous.exitCode !== null || previous.signalCode !== null) return;\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => previous.kill(\"SIGKILL\"), 3000);\n previous.once(\"exit\", () => {\n clearTimeout(timeout);\n resolve();\n });\n previous.kill(\"SIGTERM\");\n });\n }\n\n return {\n close: async () => {\n closed = true;\n await pending;\n await stop();\n },\n buildStart() {\n entry = undefined;\n },\n buildSuccess() {\n const builtEntry = entry;\n if (!builtEntry || closed) return pending;\n pending = pending\n .then(async () => {\n await stop();\n if (closed) return;\n const env = { ...process.env };\n delete env.ELECTRON_RUN_AS_NODE;\n child = spawn(executable, [builtEntry], { stdio: \"inherit\", env });\n child.on(\"error\", (error) => server.config.logger.error(error.message));\n })\n .catch((error: unknown) => {\n server.config.logger.error(String(error));\n });\n return pending;\n },\n launch: {\n name: \"electron-main-launch\",\n writeBundle(options, bundle) {\n const entries = Object.values(bundle).filter(\n (output) => output.type === \"chunk\" && output.isEntry,\n );\n if (entries.length !== 1) {\n throw new Error(\"Electron main requires exactly one entry point.\");\n }\n // Use the first written output, but only launch after the whole cycle succeeds.\n entry ??= path.resolve(options.dir ?? path.dirname(options.file!), entries[0].fileName);\n },\n } satisfies Plugin,\n };\n}\n"],"mappings":";;;;;;;AASA,SAAgB,aAAa,kBAAkB,YAAsB;CACnE,OAAO,CACL;EACE,MAAM;EACN,SAAS;EACT,qBAAqB,gBAAgB,YAAY,SAAS;EAC1D,UAAU,IAAI;GACZ,IAAI,OAAO,cAAc,OAAO,mBAAmB,OAAO,mBACxD,OAAO;IAAE;IAAI,UAAU;GAAK;GAE9B,OAAO;EACT;CACF,GACA,aAAa,iBAAiB,EAC5B,QAAQ,QAAQ;EACd,MAAM,UAAU,cAAc,MAAM;EACpC,OAAO;GAAE,GAAG;GAAS,SAAS,CAAC,QAAQ,MAAM;EAAE;CACjD,EACF,CAAC,CACH;AACF;AAEA,SAAS,cAAc,QAAuB;CAE5C,MAAM,eADU,cAAc,KAAK,QAAQ,OAAO,OAAO,MAAM,cAAc,CAC1C,CAAC,CAAC,UAAU;CAE/C,MAAM,aAAa,QAAQ,aAAa,WAAW,aAAa,YAAY,IAAI;CAChF,IAAI;CACJ,IAAI,SAAS;CACb,IAAI,UAAU,QAAQ,QAAQ;CAC9B,IAAI;CAEJ,eAAe,OAAO;EACpB,MAAM,WAAW;EACjB,QAAQ,KAAA;EACR,IAAI,CAAC,UAAU,OAAO,SAAS,aAAa,QAAQ,SAAS,eAAe,MAAM;EAClF,MAAM,IAAI,SAAe,YAAY;GACnC,MAAM,UAAU,iBAAiB,SAAS,KAAK,SAAS,GAAG,GAAI;GAC/D,SAAS,KAAK,cAAc;IAC1B,aAAa,OAAO;IACpB,QAAQ;GACV,CAAC;GACD,SAAS,KAAK,SAAS;EACzB,CAAC;CACH;CAEA,OAAO;EACL,OAAO,YAAY;GACjB,SAAS;GACT,MAAM;GACN,MAAM,KAAK;EACb;EACA,aAAa;GACX,QAAQ,KAAA;EACV;EACA,eAAe;GACb,MAAM,aAAa;GACnB,IAAI,CAAC,cAAc,QAAQ,OAAO;GAClC,UAAU,QACP,KAAK,YAAY;IAChB,MAAM,KAAK;IACX,IAAI,QAAQ;IACZ,MAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;IAC7B,OAAO,IAAI;IACX,QAAQ,MAAM,YAAY,CAAC,UAAU,GAAG;KAAE,OAAO;KAAW;IAAI,CAAC;IACjE,MAAM,GAAG,UAAU,UAAU,OAAO,OAAO,OAAO,MAAM,MAAM,OAAO,CAAC;GACxE,CAAC,CAAC,CACD,OAAO,UAAmB;IACzB,OAAO,OAAO,OAAO,MAAM,OAAO,KAAK,CAAC;GAC1C,CAAC;GACH,OAAO;EACT;EACA,QAAQ;GACN,MAAM;GACN,YAAY,SAAS,QAAQ;IAC3B,MAAM,UAAU,OAAO,OAAO,MAAM,CAAC,CAAC,QACnC,WAAW,OAAO,SAAS,WAAW,OAAO,OAChD;IACA,IAAI,QAAQ,WAAW,GACrB,MAAM,IAAI,MAAM,iDAAiD;IAGnE,UAAU,KAAK,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,IAAK,GAAG,QAAQ,EAAE,CAAC,QAAQ;GACxF;EACF;CACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electron-spark/vite-plugin-electron-main",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "license": "MIT",
5
5
  "author": {
6
6
  "name": "François Germain (Cahnory)",
@@ -46,7 +46,7 @@
46
46
  "check": "concurrently --names format,lint,test,types --group \"pnpm check:format\" \"pnpm check:lint\" \"pnpm check:test\" \"pnpm check:types\"",
47
47
  "check:format": "oxfmt --check .",
48
48
  "check:lint": "oxlint --deny-warnings .",
49
- "check:test": "node --test --test-reporter=../../scripts/test-reporter.mjs tests/*.test.mjs",
49
+ "check:test": "node --test --test-reporter=../../scripts/test-reporter.ts tests/*.test.ts",
50
50
  "check:types": "tsc --noEmit -p tsconfig.json",
51
51
  "test": "pnpm check:test"
52
52
  }