muon-ui 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +1 -1
  2. package/dist/{build-CCuZpajl.cjs → build-xwfaxosJ.cjs} +121 -28
  3. package/dist/build-xwfaxosJ.cjs.map +1 -0
  4. package/dist/cli.cjs +19 -10
  5. package/dist/cli.cjs.map +1 -1
  6. package/dist/index.cjs +2 -2
  7. package/dist/index.mjs +2 -2
  8. package/dist/native/linux64/muon-bootstrap +0 -0
  9. package/dist/native/linux64/muon-prepare +0 -0
  10. package/dist/native/linuxarm/muon-bootstrap +0 -0
  11. package/dist/native/linuxarm/muon-prepare +0 -0
  12. package/dist/native/linuxarm64/muon-bootstrap +0 -0
  13. package/dist/native/linuxarm64/muon-prepare +0 -0
  14. package/dist/native/windows32/muon-bootstrap.exe +0 -0
  15. package/dist/native/windows32/muon-prepare.exe +0 -0
  16. package/dist/native/windows64/muon-bootstrap.exe +0 -0
  17. package/dist/native/windows64/muon-prepare.exe +0 -0
  18. package/dist/runtime/{linuxarm64/THIRD_PARTY_NOTICES.md → linux64/LICENSE_muon} +156 -16
  19. package/dist/runtime/linux64/libmuon-ui.so +0 -0
  20. package/dist/runtime/linux64/muon-core +0 -0
  21. package/dist/runtime/{windows32/THIRD_PARTY_NOTICES.md → linuxarm/LICENSE_muon} +156 -16
  22. package/dist/runtime/linuxarm/libmuon-ui.so +0 -0
  23. package/dist/runtime/linuxarm/muon-core +0 -0
  24. package/dist/runtime/{linux64/THIRD_PARTY_NOTICES.md → linuxarm64/LICENSE_muon} +156 -16
  25. package/dist/runtime/linuxarm64/libmuon-ui.so +0 -0
  26. package/dist/runtime/linuxarm64/muon-core +0 -0
  27. package/dist/runtime/{linuxarm/THIRD_PARTY_NOTICES.md → windows32/LICENSE_muon} +156 -16
  28. package/dist/runtime/windows32/libcardio.dll +0 -0
  29. package/dist/runtime/windows32/libmuon-ui.dll +0 -0
  30. package/dist/runtime/windows32/muon-core.exe +0 -0
  31. package/dist/runtime/windows64/LICENSE_muon +363 -0
  32. package/dist/runtime/windows64/libcardio.dll +0 -0
  33. package/dist/runtime/windows64/libmuon-ui.dll +0 -0
  34. package/dist/runtime/windows64/muon-core.exe +0 -0
  35. package/dist/vite.cjs +90 -41
  36. package/dist/vite.cjs.map +1 -1
  37. package/dist/vite.mjs +197 -72
  38. package/dist/vite.mjs.map +1 -1
  39. package/muon.d.ts +17 -0
  40. package/package.json +8 -8
  41. package/vite.d.ts +18 -2
  42. package/dist/build-CCuZpajl.cjs.map +0 -1
  43. package/dist/runtime/windows64/THIRD_PARTY_NOTICES.md +0 -223
package/dist/vite.cjs CHANGED
@@ -1,25 +1,28 @@
1
1
  /*!
2
2
  * name: muon-ui
3
- * version: 0.1.0
3
+ * version: 0.3.0
4
4
  * description: A multi-platform GUI application framework that uses CEF as its backend
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/muon-ui.git
8
- * git.commit.hash: 35f9658786642562593735d3b589c1d7ab270ecf
8
+ * git.commit.hash: e3c2c87d50dddb0bf6c2b4d5ebf0a37ab2d3b433
9
9
  */
10
- const require_build = require("./build-CCuZpajl.cjs");
10
+ const require_build = require("./build-xwfaxosJ.cjs");
11
+ let node_child_process = require("node:child_process");
11
12
  let node_fs = require("node:fs");
12
13
  let node_fs_promises = require("node:fs/promises");
13
14
  let node_url = require("node:url");
14
15
  let node_path = require("node:path");
15
16
  let node_os = require("node:os");
16
17
  //#region src/vite-internals.ts
17
- var getServerOpenValue = (server) => {
18
- const open = server.config.server.open;
19
- return open === true || typeof open === "string" ? open : false;
20
- };
18
+ var import_dist = require_build.require_dist();
21
19
  var resolveFromRoot = (root, path) => (0, node_path.isAbsolute)(path) ? path : (0, node_path.resolve)(root, path);
22
20
  var moduleDirectory = typeof __dirname === "string" ? __dirname : (0, node_path.dirname)((0, node_url.fileURLToPath)({}.url));
21
+ var defaultProjectConfigFileNames = [
22
+ "muon.json5",
23
+ "muon.jsonc",
24
+ "muon.json"
25
+ ];
23
26
  /**
24
27
  * Resolves the muon-core runtime directory used by the Vite plugin.
25
28
  *
@@ -31,16 +34,21 @@ var getMuonExecutablePath = (runtimePath, platform) => (0, node_path.join)(runti
31
34
  var getLaunchScriptFileName = (platform) => platform === "win32" ? "open-muon.cmd" : "open-muon.sh";
32
35
  var quotePosix = (value) => `'${value.replaceAll("'", "'\\''")}'`;
33
36
  var getPlatformDirectoryName = (path, platform) => platform === "win32" ? node_path.win32.dirname(path) : (0, node_path.dirname)(path);
37
+ var getOptionalPosixValue = (value) => value === void 0 ? "''" : quotePosix(value);
34
38
  var createPosixMuonLaunchScript = ({ muonExecutablePath, projectConfigPath, overrideConfigPath }) => `#!/usr/bin/env bash
35
39
  set -euo pipefail
36
40
  MUON_EXECUTABLE=${quotePosix(muonExecutablePath)}
37
41
  MUON_EXECUTABLE_DIRECTORY=${quotePosix(getPlatformDirectoryName(muonExecutablePath, "linux"))}
38
- MUON_PROJECT_CONFIG=${quotePosix(projectConfigPath)}
42
+ MUON_PROJECT_CONFIG=${getOptionalPosixValue(projectConfigPath)}
39
43
  MUON_OVERRIDE_CONFIG=${quotePosix(overrideConfigPath)}
40
44
 
41
- if [[ ! -f "$MUON_PROJECT_CONFIG" ]]; then
42
- echo "Muon startup failed: project config does not exist: $MUON_PROJECT_CONFIG" >&2
43
- exit 1
45
+ MUON_CONFIG_ARGS=()
46
+ if [[ -n "$MUON_PROJECT_CONFIG" ]]; then
47
+ if [[ ! -f "$MUON_PROJECT_CONFIG" ]]; then
48
+ echo "Muon startup failed: project config does not exist: $MUON_PROJECT_CONFIG" >&2
49
+ exit 1
50
+ fi
51
+ MUON_CONFIG_ARGS+=("-c" "$MUON_PROJECT_CONFIG")
44
52
  fi
45
53
 
46
54
  if [[ ! -x "$MUON_EXECUTABLE" ]]; then
@@ -52,23 +60,20 @@ if [[ ! -f "$MUON_OVERRIDE_CONFIG" ]]; then
52
60
  echo "Muon startup failed: generated override config does not exist: $MUON_OVERRIDE_CONFIG" >&2
53
61
  exit 1
54
62
  fi
63
+ MUON_CONFIG_ARGS+=("-c" "$MUON_OVERRIDE_CONFIG")
55
64
 
56
65
  cd "$MUON_EXECUTABLE_DIRECTORY"
57
- exec "$MUON_EXECUTABLE" -c "$MUON_PROJECT_CONFIG" -c "$MUON_OVERRIDE_CONFIG"
66
+ exec "$MUON_EXECUTABLE" "\${MUON_CONFIG_ARGS[@]}"
58
67
  `;
59
68
  var escapeWindowsCmdValue = (value) => value.replaceAll("%", "%%").replaceAll("\r", "").replaceAll("\n", "");
69
+ var getOptionalWindowsCmdValue = (value) => value === void 0 ? "" : escapeWindowsCmdValue(value);
60
70
  var createWindowsMuonLaunchScript = ({ muonExecutablePath, projectConfigPath, overrideConfigPath }) => `@echo off
61
71
  setlocal
62
72
  set "MUON_EXECUTABLE=${escapeWindowsCmdValue(muonExecutablePath)}"
63
73
  set "MUON_EXECUTABLE_DIRECTORY=${escapeWindowsCmdValue(getPlatformDirectoryName(muonExecutablePath, "win32"))}"
64
- set "MUON_PROJECT_CONFIG=${escapeWindowsCmdValue(projectConfigPath)}"
74
+ set "MUON_PROJECT_CONFIG=${getOptionalWindowsCmdValue(projectConfigPath)}"
65
75
  set "MUON_OVERRIDE_CONFIG=${escapeWindowsCmdValue(overrideConfigPath)}"
66
76
 
67
- if not exist "%MUON_PROJECT_CONFIG%" (
68
- echo Muon startup failed: project config does not exist: %MUON_PROJECT_CONFIG% 1>&2
69
- exit /b 1
70
- )
71
-
72
77
  if not exist "%MUON_EXECUTABLE%" (
73
78
  echo Muon startup failed: executable does not exist: %MUON_EXECUTABLE% 1>&2
74
79
  exit /b 1
@@ -80,52 +85,83 @@ if not exist "%MUON_OVERRIDE_CONFIG%" (
80
85
  )
81
86
 
82
87
  pushd "%MUON_EXECUTABLE_DIRECTORY%"
83
- "%MUON_EXECUTABLE%" -c "%MUON_PROJECT_CONFIG%" -c "%MUON_OVERRIDE_CONFIG%"
88
+ if defined MUON_PROJECT_CONFIG (
89
+ if not exist "%MUON_PROJECT_CONFIG%" (
90
+ echo Muon startup failed: project config does not exist: %MUON_PROJECT_CONFIG% 1>&2
91
+ popd
92
+ exit /b 1
93
+ )
94
+ "%MUON_EXECUTABLE%" -c "%MUON_PROJECT_CONFIG%" -c "%MUON_OVERRIDE_CONFIG%"
95
+ ) else (
96
+ "%MUON_EXECUTABLE%" -c "%MUON_OVERRIDE_CONFIG%"
97
+ )
84
98
  set "MUON_EXIT_CODE=%ERRORLEVEL%"
85
99
  popd
86
100
  exit /b %MUON_EXIT_CODE%
87
101
  `;
88
102
  var createMuonLaunchScript = (options) => options.platform === "win32" ? createWindowsMuonLaunchScript(options) : createPosixMuonLaunchScript(options);
89
103
  var getBaseUrl = (server) => server.resolvedUrls?.local[0] ?? server.resolvedUrls?.network[0];
90
- var getStartUrl = (server, openValue) => {
91
- const baseUrl = getBaseUrl(server);
92
- if (baseUrl === void 0) return;
93
- return typeof openValue === "string" ? new URL(openValue, baseUrl).href : baseUrl;
94
- };
95
104
  var getWebSocketOrigin = (startUrl) => {
96
105
  const url = new URL(startUrl);
97
106
  if (url.protocol === "https:") url.protocol = "wss:";
98
107
  else if (url.protocol === "http:") url.protocol = "ws:";
99
108
  return url.origin;
100
109
  };
101
- var createMuonOverrideConfig = (startUrl) => {
110
+ var createMuonOverrideConfig = (startUrl, enableDebugger) => {
102
111
  const origin = new URL(startUrl).origin;
103
112
  return {
113
+ ...enableDebugger ? { cdp: { enable: true } } : {},
104
114
  browser: {
105
115
  startPage: startUrl,
116
+ ...enableDebugger ? { keybind: { devtools: "f12" } } : {},
106
117
  plugin: { allow: [`${origin}/**`] }
107
118
  },
108
119
  network: { allow: [`${origin}/**`, `${getWebSocketOrigin(startUrl)}/**`] }
109
120
  };
110
121
  };
111
- var writeMuonOverrideConfig = (server, openValue, overrideConfigPath) => {
112
- const startUrl = getStartUrl(server, openValue);
122
+ var writeMuonOverrideConfig = (server, overrideConfigPath, enableDebugger) => {
123
+ const startUrl = getBaseUrl(server);
113
124
  if (startUrl === void 0) {
114
125
  server.config.logger.warn("Muon Vite plugin could not resolve a Vite URL.");
115
- return;
126
+ return false;
116
127
  }
117
- (0, node_fs.writeFileSync)(overrideConfigPath, `${JSON.stringify(createMuonOverrideConfig(startUrl), null, 2)}\n`);
128
+ (0, node_fs.writeFileSync)(overrideConfigPath, `${JSON.stringify(createMuonOverrideConfig(startUrl, enableDebugger), null, 2)}\n`);
129
+ return true;
118
130
  };
119
- var createRuntimePaths = async (server, stagePath, platform) => {
131
+ var createRuntimePaths = async (server, stagePath, platform, projectConfigPath) => {
120
132
  const temporaryDirectory = await (0, node_fs_promises.mkdtemp)((0, node_path.join)((0, node_os.tmpdir)(), "muon-vite-"));
121
133
  return {
122
134
  temporaryDirectory,
123
135
  launchScriptPath: (0, node_path.join)(temporaryDirectory, getLaunchScriptFileName(platform)),
124
136
  overrideConfigPath: (0, node_path.join)(temporaryDirectory, "muon.vite.json"),
125
- projectConfigPath: (0, node_path.join)(server.config.root, "muon.json"),
137
+ projectConfigPath,
126
138
  muonExecutablePath: getMuonExecutablePath(stagePath, platform)
127
139
  };
128
140
  };
141
+ var fileExists = async (path) => {
142
+ try {
143
+ await (0, node_fs_promises.access)(path, node_fs.constants.F_OK);
144
+ return true;
145
+ } catch {
146
+ return false;
147
+ }
148
+ };
149
+ var isJsonObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
150
+ var getErrorMessage = (error) => error instanceof Error ? error.message : String(error);
151
+ var resolveProjectConfigPath = async (server) => {
152
+ for (const fileName of defaultProjectConfigFileNames) {
153
+ const candidatePath = (0, node_path.join)(server.config.root, fileName);
154
+ if (!await fileExists(candidatePath)) continue;
155
+ try {
156
+ if (!isJsonObject((0, import_dist.parse)(await (0, node_fs_promises.readFile)(candidatePath, "utf8")))) throw new Error("muon config root must be an object");
157
+ return candidatePath;
158
+ } catch (error) {
159
+ server.config.logger.warn(`Muon project config will be ignored because it could not be read or parsed: ${candidatePath}: ${getErrorMessage(error)}`);
160
+ return;
161
+ }
162
+ }
163
+ server.config.logger.warn(`Muon project config was not found in ${server.config.root}; launching with generated Vite config only.`);
164
+ };
129
165
  var writeLaunchScript = async (paths, platform) => {
130
166
  await (0, node_fs_promises.writeFile)(paths.launchScriptPath, createMuonLaunchScript({
131
167
  muonExecutablePath: paths.muonExecutablePath,
@@ -135,9 +171,26 @@ var writeLaunchScript = async (paths, platform) => {
135
171
  }));
136
172
  if (platform !== "win32") await (0, node_fs_promises.chmod)(paths.launchScriptPath, 448);
137
173
  };
174
+ var quoteWindowsCommandArgument = (value) => `"${value.replaceAll("\"", "\\\"")}"`;
175
+ var launchMuon = (paths, platform, server) => {
176
+ const child = (0, node_child_process.spawn)(platform === "win32" ? "cmd.exe" : paths.launchScriptPath, platform === "win32" ? [
177
+ "/d",
178
+ "/s",
179
+ "/c",
180
+ quoteWindowsCommandArgument(paths.launchScriptPath)
181
+ ] : [], {
182
+ detached: true,
183
+ stdio: "ignore",
184
+ windowsHide: false
185
+ });
186
+ child.once("error", (error) => {
187
+ server.config.logger.warn(`Muon startup failed: ${getErrorMessage(error)}`);
188
+ });
189
+ child.unref();
190
+ };
138
191
  var startMuonViteBrowserBridge = async ({ server, pluginOptions, platform, architecture, environment }) => {
139
- const openValue = getServerOpenValue(server);
140
- if (openValue === false || server.httpServer === null) return;
192
+ await require_build.ensureMuonGitignoreEntry(server.config.root);
193
+ if (pluginOptions.open === false || server.httpServer === null) return;
141
194
  const target = require_build.getDefaultMuonPrepareTarget(platform, architecture);
142
195
  const preparedRuntime = await require_build.runMuonPrepare({
143
196
  muonPath: resolveMuonRuntimePath({
@@ -156,16 +209,12 @@ var startMuonViteBrowserBridge = async ({ server, pluginOptions, platform, archi
156
209
  cwd: server.config.root
157
210
  });
158
211
  if (preparedRuntime.stagePath === void 0) throw new Error("muon-prepare did not return a staged runtime path.");
159
- const paths = await createRuntimePaths(server, preparedRuntime.stagePath, platform);
212
+ const paths = await createRuntimePaths(server, preparedRuntime.stagePath, platform, await resolveProjectConfigPath(server));
160
213
  await writeLaunchScript(paths, platform);
161
- const previousBrowser = environment.BROWSER;
162
- environment.BROWSER = paths.launchScriptPath;
163
214
  let cleanupPromise = void 0;
164
215
  const cleanup = async () => {
165
216
  if (cleanupPromise !== void 0) return cleanupPromise;
166
217
  cleanupPromise = (async () => {
167
- if (previousBrowser === void 0) delete environment.BROWSER;
168
- else environment.BROWSER = previousBrowser;
169
218
  await (0, node_fs_promises.rm)(paths.temporaryDirectory, {
170
219
  recursive: true,
171
220
  force: true
@@ -185,15 +234,15 @@ var startMuonViteBrowserBridge = async ({ server, pluginOptions, platform, archi
185
234
  cleanup();
186
235
  });
187
236
  server.httpServer.once("listening", () => {
188
- writeMuonOverrideConfig(server, openValue, paths.overrideConfigPath);
237
+ if (writeMuonOverrideConfig(server, paths.overrideConfigPath, pluginOptions.enableDebugger !== false)) launchMuon(paths, platform, server);
189
238
  });
190
239
  };
191
240
  //#endregion
192
241
  //#region src/vite.ts
193
242
  /**
194
- * Creates a Vite plugin that launches Muon through Vite's server.open flow.
243
+ * Creates a Vite plugin that launches Muon during Vite dev startup.
195
244
  *
196
- * @param options Muon runtime location used for development startup.
245
+ * @param options Muon plugin options used for development startup and build.
197
246
  * @returns Vite plugin instance.
198
247
  */
199
248
  var muon = (options = {}) => {
package/dist/vite.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.cjs","names":[],"sources":["../src/vite-internals.ts","../src/vite.ts"],"sourcesContent":["// muon - Multi-platform GUI application framework that uses CEF as its backend\n// Copyright (c) Kouji Matsui. (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/muon\n\nimport { chmod, mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, isAbsolute, join, resolve, win32 } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { ViteDevServer } from \"vite\";\n\nimport { getDefaultMuonPrepareTarget, runMuonPrepare } from \"./prepare.js\";\nimport type { MuonVitePluginOptions } from \"./vite.js\";\n\nexport interface MuonLaunchScriptOptions {\n muonExecutablePath: string;\n projectConfigPath: string;\n overrideConfigPath: string;\n platform: NodeJS.Platform;\n}\n\ninterface MuonViteSessionOptions {\n server: ViteDevServer;\n pluginOptions: MuonVitePluginOptions;\n platform: NodeJS.Platform;\n architecture: NodeJS.Architecture;\n environment: NodeJS.ProcessEnv;\n}\n\ninterface MuonRuntimePaths {\n temporaryDirectory: string;\n launchScriptPath: string;\n overrideConfigPath: string;\n projectConfigPath: string;\n muonExecutablePath: string;\n}\n\ninterface MuonOverrideConfig {\n browser: {\n startPage: string;\n plugin: {\n allow: string[];\n };\n };\n network: {\n allow: string[];\n };\n}\n\n/**\n * Options for resolving a Muon runtime directory used by the Vite plugin.\n */\nexport interface MuonRuntimePathOptions {\n /**\n * Vite project root used to resolve explicit relative paths.\n */\n root: string;\n\n /**\n * Muon runtime target such as linux64, linuxarm, linuxarm64, windows32, or windows64.\n */\n target: string;\n\n /**\n * Explicit custom muon-core runtime path.\n */\n muonPath: string | undefined;\n\n /**\n * Directory containing the packaged Muon JavaScript files.\n *\n * @remarks This is injectable for tests. Production code uses the module directory.\n */\n packageDirectory?: string;\n}\n\nconst getServerOpenValue = (\n server: ViteDevServer,\n): boolean | string | false => {\n const open = server.config.server.open;\n return open === true || typeof open === \"string\" ? open : false;\n};\n\nconst resolveFromRoot = (root: string, path: string): string =>\n isAbsolute(path) ? path : resolve(root, path);\n\nconst moduleDirectory =\n typeof __dirname === \"string\"\n ? __dirname\n : dirname(fileURLToPath(import.meta.url));\n\n/**\n * Resolves the muon-core runtime directory used by the Vite plugin.\n *\n * @param options Runtime path resolution inputs.\n * @returns Absolute or package-relative runtime directory path.\n */\nexport const resolveMuonRuntimePath = ({\n root,\n target,\n muonPath,\n packageDirectory = moduleDirectory,\n}: MuonRuntimePathOptions): string =>\n muonPath === undefined\n ? join(packageDirectory, \"runtime\", target)\n : resolveFromRoot(root, muonPath);\n\nexport const getMuonExecutablePath = (\n runtimePath: string,\n platform: NodeJS.Platform,\n): string =>\n join(runtimePath, platform === \"win32\" ? \"muon-core.exe\" : \"muon-core\");\n\nconst getLaunchScriptFileName = (platform: NodeJS.Platform): string =>\n platform === \"win32\" ? \"open-muon.cmd\" : \"open-muon.sh\";\n\nconst quotePosix = (value: string): string =>\n `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n\nconst getPlatformDirectoryName = (\n path: string,\n platform: NodeJS.Platform,\n): string => (platform === \"win32\" ? win32.dirname(path) : dirname(path));\n\nconst createPosixMuonLaunchScript = ({\n muonExecutablePath,\n projectConfigPath,\n overrideConfigPath,\n}: MuonLaunchScriptOptions): string => `#!/usr/bin/env bash\nset -euo pipefail\nMUON_EXECUTABLE=${quotePosix(muonExecutablePath)}\nMUON_EXECUTABLE_DIRECTORY=${quotePosix(getPlatformDirectoryName(muonExecutablePath, \"linux\"))}\nMUON_PROJECT_CONFIG=${quotePosix(projectConfigPath)}\nMUON_OVERRIDE_CONFIG=${quotePosix(overrideConfigPath)}\n\nif [[ ! -f \"$MUON_PROJECT_CONFIG\" ]]; then\n echo \"Muon startup failed: project config does not exist: $MUON_PROJECT_CONFIG\" >&2\n exit 1\nfi\n\nif [[ ! -x \"$MUON_EXECUTABLE\" ]]; then\n echo \"Muon startup failed: executable does not exist or is not executable: $MUON_EXECUTABLE\" >&2\n exit 1\nfi\n\nif [[ ! -f \"$MUON_OVERRIDE_CONFIG\" ]]; then\n echo \"Muon startup failed: generated override config does not exist: $MUON_OVERRIDE_CONFIG\" >&2\n exit 1\nfi\n\ncd \"$MUON_EXECUTABLE_DIRECTORY\"\nexec \"$MUON_EXECUTABLE\" -c \"$MUON_PROJECT_CONFIG\" -c \"$MUON_OVERRIDE_CONFIG\"\n`;\n\nconst escapeWindowsCmdValue = (value: string): string =>\n value.replaceAll(\"%\", \"%%\").replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\");\n\nconst createWindowsMuonLaunchScript = ({\n muonExecutablePath,\n projectConfigPath,\n overrideConfigPath,\n}: MuonLaunchScriptOptions): string => `@echo off\nsetlocal\nset \"MUON_EXECUTABLE=${escapeWindowsCmdValue(muonExecutablePath)}\"\nset \"MUON_EXECUTABLE_DIRECTORY=${escapeWindowsCmdValue(getPlatformDirectoryName(muonExecutablePath, \"win32\"))}\"\nset \"MUON_PROJECT_CONFIG=${escapeWindowsCmdValue(projectConfigPath)}\"\nset \"MUON_OVERRIDE_CONFIG=${escapeWindowsCmdValue(overrideConfigPath)}\"\n\nif not exist \"%MUON_PROJECT_CONFIG%\" (\n echo Muon startup failed: project config does not exist: %MUON_PROJECT_CONFIG% 1>&2\n exit /b 1\n)\n\nif not exist \"%MUON_EXECUTABLE%\" (\n echo Muon startup failed: executable does not exist: %MUON_EXECUTABLE% 1>&2\n exit /b 1\n)\n\nif not exist \"%MUON_OVERRIDE_CONFIG%\" (\n echo Muon startup failed: generated override config does not exist: %MUON_OVERRIDE_CONFIG% 1>&2\n exit /b 1\n)\n\npushd \"%MUON_EXECUTABLE_DIRECTORY%\"\n\"%MUON_EXECUTABLE%\" -c \"%MUON_PROJECT_CONFIG%\" -c \"%MUON_OVERRIDE_CONFIG%\"\nset \"MUON_EXIT_CODE=%ERRORLEVEL%\"\npopd\nexit /b %MUON_EXIT_CODE%\n`;\n\nexport const createMuonLaunchScript = (\n options: MuonLaunchScriptOptions,\n): string =>\n options.platform === \"win32\"\n ? createWindowsMuonLaunchScript(options)\n : createPosixMuonLaunchScript(options);\n\nconst getBaseUrl = (server: ViteDevServer): string | undefined =>\n server.resolvedUrls?.local[0] ?? server.resolvedUrls?.network[0];\n\nconst getStartUrl = (\n server: ViteDevServer,\n openValue: boolean | string,\n): string | undefined => {\n const baseUrl = getBaseUrl(server);\n if (baseUrl === undefined) {\n return undefined;\n }\n return typeof openValue === \"string\"\n ? new URL(openValue, baseUrl).href\n : baseUrl;\n};\n\nconst getWebSocketOrigin = (startUrl: string): string => {\n const url = new URL(startUrl);\n if (url.protocol === \"https:\") {\n url.protocol = \"wss:\";\n } else if (url.protocol === \"http:\") {\n url.protocol = \"ws:\";\n }\n return url.origin;\n};\n\nconst createMuonOverrideConfig = (startUrl: string): MuonOverrideConfig => {\n const origin = new URL(startUrl).origin;\n return {\n browser: {\n startPage: startUrl,\n plugin: {\n allow: [`${origin}/**`],\n },\n },\n network: {\n allow: [`${origin}/**`, `${getWebSocketOrigin(startUrl)}/**`],\n },\n };\n};\n\nconst writeMuonOverrideConfig = (\n server: ViteDevServer,\n openValue: boolean | string,\n overrideConfigPath: string,\n): void => {\n const startUrl = getStartUrl(server, openValue);\n if (startUrl === undefined) {\n server.config.logger.warn(\"Muon Vite plugin could not resolve a Vite URL.\");\n return;\n }\n writeFileSync(\n overrideConfigPath,\n `${JSON.stringify(createMuonOverrideConfig(startUrl), null, 2)}\\n`,\n );\n};\n\nconst createRuntimePaths = async (\n server: ViteDevServer,\n stagePath: string,\n platform: NodeJS.Platform,\n): Promise<MuonRuntimePaths> => {\n const temporaryDirectory = await mkdtemp(join(tmpdir(), \"muon-vite-\"));\n return {\n temporaryDirectory,\n launchScriptPath: join(\n temporaryDirectory,\n getLaunchScriptFileName(platform),\n ),\n overrideConfigPath: join(temporaryDirectory, \"muon.vite.json\"),\n projectConfigPath: join(server.config.root, \"muon.json\"),\n muonExecutablePath: getMuonExecutablePath(stagePath, platform),\n };\n};\n\nconst writeLaunchScript = async (\n paths: MuonRuntimePaths,\n platform: NodeJS.Platform,\n): Promise<void> => {\n await writeFile(\n paths.launchScriptPath,\n createMuonLaunchScript({\n muonExecutablePath: paths.muonExecutablePath,\n projectConfigPath: paths.projectConfigPath,\n overrideConfigPath: paths.overrideConfigPath,\n platform,\n }),\n );\n if (platform !== \"win32\") {\n await chmod(paths.launchScriptPath, 0o700);\n }\n};\n\nexport const startMuonViteBrowserBridge = async ({\n server,\n pluginOptions,\n platform,\n architecture,\n environment,\n}: MuonViteSessionOptions): Promise<void> => {\n const openValue = getServerOpenValue(server);\n if (openValue === false || server.httpServer === null) {\n return;\n }\n\n const target = getDefaultMuonPrepareTarget(platform, architecture);\n const muonPath = resolveMuonRuntimePath({\n root: server.config.root,\n target,\n muonPath: pluginOptions.muonPath,\n });\n const cefPath =\n pluginOptions.cefPath === undefined\n ? undefined\n : resolveFromRoot(server.config.root, pluginOptions.cefPath);\n const stagePath =\n pluginOptions.stagePath === undefined\n ? resolve(server.config.root, \".muon\", target)\n : resolveFromRoot(server.config.root, pluginOptions.stagePath);\n const preparedRuntime = await runMuonPrepare({\n muonPath,\n cefPath,\n stageDir: stagePath,\n target,\n cacheDir: environment.MUON_CACHE_DIR,\n force: false,\n quiet: false,\n prepareExecutablePath: undefined,\n environment,\n cwd: server.config.root,\n });\n if (preparedRuntime.stagePath === undefined) {\n throw new Error(\"muon-prepare did not return a staged runtime path.\");\n }\n const paths = await createRuntimePaths(\n server,\n preparedRuntime.stagePath,\n platform,\n );\n await writeLaunchScript(paths, platform);\n const previousBrowser = environment.BROWSER;\n environment.BROWSER = paths.launchScriptPath;\n\n let cleanupPromise: Promise<void> | undefined = undefined;\n const cleanup = async (): Promise<void> => {\n if (cleanupPromise !== undefined) {\n return cleanupPromise;\n }\n cleanupPromise = (async () => {\n if (previousBrowser === undefined) {\n delete environment.BROWSER;\n } else {\n environment.BROWSER = previousBrowser;\n }\n await rm(paths.temporaryDirectory, { recursive: true, force: true });\n })();\n return cleanupPromise;\n };\n\n const originalClose = server.close.bind(server);\n server.close = async (): Promise<void> => {\n try {\n await originalClose();\n } finally {\n await cleanup();\n }\n };\n server.httpServer.once(\"close\", () => {\n void cleanup();\n });\n server.httpServer.once(\"listening\", () => {\n writeMuonOverrideConfig(server, openValue, paths.overrideConfigPath);\n });\n};\n","// muon - Multi-platform GUI application framework that uses CEF as its backend\n// Copyright (c) Kouji Matsui. (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/muon\n\nimport type { Plugin } from \"vite\";\nimport type { ResolvedConfig } from \"vite\";\nimport { isAbsolute, resolve } from \"node:path\";\n\nimport { buildMuonApp, type MuonBuildOptions } from \"./build.js\";\nimport { startMuonViteBrowserBridge } from \"./vite-internals.js\";\n\n/**\n * Options for generating Muon app distributions after Vite build.\n */\nexport interface MuonViteBuildOptions {\n /**\n * Target aliases or internal target names to build.\n */\n targets?: readonly string[];\n\n /**\n * Build every supported target from the installed package.\n */\n allTargets?: boolean;\n\n /**\n * File name used for the app launcher.\n *\n * @remarks The .exe suffix is added automatically for Windows targets.\n */\n appName?: string;\n\n /**\n * Parent directory that receives dist-linux-amd64/ style outputs.\n */\n outputRoot?: string;\n\n /**\n * Muon config path to embed.\n */\n configPath?: string;\n\n /**\n * Directory containing package runtime/ and native/ folders.\n *\n * @remarks This defaults to the installed muon package dist directory.\n */\n packageDirectory?: string;\n\n /**\n * Asset salt override for deterministic tests.\n *\n * @remarks Production builds should omit this option.\n */\n assetSalt?: Uint8Array;\n}\n\n/**\n * Options for the Muon Vite development plugin.\n */\nexport interface MuonVitePluginOptions {\n /**\n * Directory containing muon-core runtime files such as muon-core and plugins.\n *\n * @remarks Relative paths are resolved from the Vite project root. When omitted,\n * the packaged runtime at dist/runtime/<target> is used.\n */\n muonPath?: string;\n\n /**\n * Directory containing CEF files, or a CEF archive root with Release/Resources.\n *\n * @remarks Relative paths are resolved from the Vite project root. When omitted,\n * muon-prepare downloads and caches the tested CEF artifact from muonPath.\n */\n cefPath?: string;\n\n /**\n * Runtime staging directory used for development startup.\n *\n * @remarks Relative paths are resolved from the Vite project root. Defaults to\n * .muon/<target>.\n */\n stagePath?: string;\n\n /**\n * Build app distributions from Vite output.\n *\n * @remarks Defaults to true during Vite build. Set false to disable the build\n * hook while keeping the development bridge enabled.\n */\n build?: boolean | MuonViteBuildOptions;\n}\n\n/**\n * Creates a Vite plugin that launches Muon through Vite's server.open flow.\n *\n * @param options Muon runtime location used for development startup.\n * @returns Vite plugin instance.\n */\nconst muon = (options: MuonVitePluginOptions = {}): Plugin => {\n let resolvedConfig: ResolvedConfig | undefined = undefined;\n\n return {\n name: \"muon\",\n configResolved: (config) => {\n resolvedConfig = config;\n },\n configureServer: async (server) => {\n await startMuonViteBrowserBridge({\n server,\n pluginOptions: options,\n platform: process.platform,\n architecture: process.arch,\n environment: process.env,\n });\n },\n closeBundle: async () => {\n if (resolvedConfig === undefined || resolvedConfig.command !== \"build\") {\n return;\n }\n if (options.build === false) {\n return;\n }\n\n const buildOptions =\n typeof options.build === \"object\" ? options.build : {};\n await buildMuonApp(createMuonBuildOptions(resolvedConfig, buildOptions));\n },\n };\n};\n\nconst createMuonBuildOptions = (\n config: ResolvedConfig,\n buildOptions: MuonViteBuildOptions,\n): MuonBuildOptions => {\n const outDir = isAbsolute(config.build.outDir)\n ? config.build.outDir\n : resolve(config.root, config.build.outDir);\n const options: MuonBuildOptions = {\n root: config.root,\n assetSourcePath: outDir,\n assetPrefix: \"main\",\n };\n\n if (buildOptions.allTargets !== undefined) {\n options.allTargets = buildOptions.allTargets;\n }\n if (buildOptions.targets !== undefined) {\n options.targets = buildOptions.targets;\n }\n if (buildOptions.appName !== undefined) {\n options.appName = buildOptions.appName;\n }\n if (buildOptions.outputRoot !== undefined) {\n options.outputRoot = buildOptions.outputRoot;\n }\n if (buildOptions.configPath !== undefined) {\n options.configPath = buildOptions.configPath;\n }\n if (buildOptions.packageDirectory !== undefined) {\n options.packageDirectory = buildOptions.packageDirectory;\n }\n if (buildOptions.assetSalt !== undefined) {\n options.assetSalt = buildOptions.assetSalt;\n }\n\n return options;\n};\n\nexport default muon;\n"],"mappings":"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"}
1
+ {"version":3,"file":"vite.cjs","names":[],"sources":["../src/vite-internals.ts","../src/vite.ts"],"sourcesContent":["// muon - Multi-platform GUI application framework that uses CEF as its backend\n// Copyright (c) Kouji Matsui. (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/muon\n\nimport { spawn } from \"node:child_process\";\nimport { constants, writeFileSync } from \"node:fs\";\nimport {\n access,\n chmod,\n mkdtemp,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, isAbsolute, join, resolve, win32 } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { parse } from \"json5\";\nimport type { ViteDevServer } from \"vite\";\n\nimport { ensureMuonGitignoreEntry } from \"./gitignore.js\";\nimport { getDefaultMuonPrepareTarget, runMuonPrepare } from \"./prepare.js\";\nimport type { MuonVitePluginOptions } from \"./vite.js\";\n\nexport interface MuonLaunchScriptOptions {\n muonExecutablePath: string;\n projectConfigPath: string | undefined;\n overrideConfigPath: string;\n platform: NodeJS.Platform;\n}\n\ninterface MuonViteSessionOptions {\n server: ViteDevServer;\n pluginOptions: MuonVitePluginOptions;\n platform: NodeJS.Platform;\n architecture: NodeJS.Architecture;\n environment: NodeJS.ProcessEnv;\n}\n\ninterface MuonRuntimePaths {\n temporaryDirectory: string;\n launchScriptPath: string;\n overrideConfigPath: string;\n projectConfigPath: string | undefined;\n muonExecutablePath: string;\n}\n\ninterface MuonOverrideConfig {\n cdp?: {\n enable: true;\n };\n browser: {\n startPage: string;\n titleBarType?: \"native\" | \"muon\";\n initialTitleBarVisibility?: boolean;\n keybind?: {\n devtools: \"f12\";\n };\n plugin: {\n allow: string[];\n };\n };\n network: {\n allow: string[];\n };\n}\n\n/**\n * Options for resolving a Muon runtime directory used by the Vite plugin.\n */\nexport interface MuonRuntimePathOptions {\n /**\n * Vite project root used to resolve explicit relative paths.\n */\n root: string;\n\n /**\n * Muon runtime target such as linux64, linuxarm, linuxarm64, windows32, or windows64.\n */\n target: string;\n\n /**\n * Explicit custom muon-core runtime path.\n */\n muonPath: string | undefined;\n\n /**\n * Directory containing the packaged Muon JavaScript files.\n *\n * @remarks This is injectable for tests. Production code uses the module directory.\n */\n packageDirectory?: string;\n}\n\nconst resolveFromRoot = (root: string, path: string): string =>\n isAbsolute(path) ? path : resolve(root, path);\n\nconst moduleDirectory =\n typeof __dirname === \"string\"\n ? __dirname\n : dirname(fileURLToPath(import.meta.url));\nconst defaultProjectConfigFileNames = [\"muon.json5\", \"muon.jsonc\", \"muon.json\"];\n\n/**\n * Resolves the muon-core runtime directory used by the Vite plugin.\n *\n * @param options Runtime path resolution inputs.\n * @returns Absolute or package-relative runtime directory path.\n */\nexport const resolveMuonRuntimePath = ({\n root,\n target,\n muonPath,\n packageDirectory = moduleDirectory,\n}: MuonRuntimePathOptions): string =>\n muonPath === undefined\n ? join(packageDirectory, \"runtime\", target)\n : resolveFromRoot(root, muonPath);\n\nexport const getMuonExecutablePath = (\n runtimePath: string,\n platform: NodeJS.Platform,\n): string =>\n join(runtimePath, platform === \"win32\" ? \"muon-core.exe\" : \"muon-core\");\n\nconst getLaunchScriptFileName = (platform: NodeJS.Platform): string =>\n platform === \"win32\" ? \"open-muon.cmd\" : \"open-muon.sh\";\n\nconst quotePosix = (value: string): string =>\n `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n\nconst getPlatformDirectoryName = (\n path: string,\n platform: NodeJS.Platform,\n): string => (platform === \"win32\" ? win32.dirname(path) : dirname(path));\n\nconst getOptionalPosixValue = (value: string | undefined): string =>\n value === undefined ? \"''\" : quotePosix(value);\n\nconst createPosixMuonLaunchScript = ({\n muonExecutablePath,\n projectConfigPath,\n overrideConfigPath,\n}: MuonLaunchScriptOptions): string => `#!/usr/bin/env bash\nset -euo pipefail\nMUON_EXECUTABLE=${quotePosix(muonExecutablePath)}\nMUON_EXECUTABLE_DIRECTORY=${quotePosix(getPlatformDirectoryName(muonExecutablePath, \"linux\"))}\nMUON_PROJECT_CONFIG=${getOptionalPosixValue(projectConfigPath)}\nMUON_OVERRIDE_CONFIG=${quotePosix(overrideConfigPath)}\n\nMUON_CONFIG_ARGS=()\nif [[ -n \"$MUON_PROJECT_CONFIG\" ]]; then\n if [[ ! -f \"$MUON_PROJECT_CONFIG\" ]]; then\n echo \"Muon startup failed: project config does not exist: $MUON_PROJECT_CONFIG\" >&2\n exit 1\n fi\n MUON_CONFIG_ARGS+=(\"-c\" \"$MUON_PROJECT_CONFIG\")\nfi\n\nif [[ ! -x \"$MUON_EXECUTABLE\" ]]; then\n echo \"Muon startup failed: executable does not exist or is not executable: $MUON_EXECUTABLE\" >&2\n exit 1\nfi\n\nif [[ ! -f \"$MUON_OVERRIDE_CONFIG\" ]]; then\n echo \"Muon startup failed: generated override config does not exist: $MUON_OVERRIDE_CONFIG\" >&2\n exit 1\nfi\nMUON_CONFIG_ARGS+=(\"-c\" \"$MUON_OVERRIDE_CONFIG\")\n\ncd \"$MUON_EXECUTABLE_DIRECTORY\"\nexec \"$MUON_EXECUTABLE\" \"\\${MUON_CONFIG_ARGS[@]}\"\n`;\n\nconst escapeWindowsCmdValue = (value: string): string =>\n value.replaceAll(\"%\", \"%%\").replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\");\n\nconst getOptionalWindowsCmdValue = (value: string | undefined): string =>\n value === undefined ? \"\" : escapeWindowsCmdValue(value);\n\nconst createWindowsMuonLaunchScript = ({\n muonExecutablePath,\n projectConfigPath,\n overrideConfigPath,\n}: MuonLaunchScriptOptions): string => `@echo off\nsetlocal\nset \"MUON_EXECUTABLE=${escapeWindowsCmdValue(muonExecutablePath)}\"\nset \"MUON_EXECUTABLE_DIRECTORY=${escapeWindowsCmdValue(getPlatformDirectoryName(muonExecutablePath, \"win32\"))}\"\nset \"MUON_PROJECT_CONFIG=${getOptionalWindowsCmdValue(projectConfigPath)}\"\nset \"MUON_OVERRIDE_CONFIG=${escapeWindowsCmdValue(overrideConfigPath)}\"\n\nif not exist \"%MUON_EXECUTABLE%\" (\n echo Muon startup failed: executable does not exist: %MUON_EXECUTABLE% 1>&2\n exit /b 1\n)\n\nif not exist \"%MUON_OVERRIDE_CONFIG%\" (\n echo Muon startup failed: generated override config does not exist: %MUON_OVERRIDE_CONFIG% 1>&2\n exit /b 1\n)\n\npushd \"%MUON_EXECUTABLE_DIRECTORY%\"\nif defined MUON_PROJECT_CONFIG (\n if not exist \"%MUON_PROJECT_CONFIG%\" (\n echo Muon startup failed: project config does not exist: %MUON_PROJECT_CONFIG% 1>&2\n popd\n exit /b 1\n )\n \"%MUON_EXECUTABLE%\" -c \"%MUON_PROJECT_CONFIG%\" -c \"%MUON_OVERRIDE_CONFIG%\"\n) else (\n \"%MUON_EXECUTABLE%\" -c \"%MUON_OVERRIDE_CONFIG%\"\n)\nset \"MUON_EXIT_CODE=%ERRORLEVEL%\"\npopd\nexit /b %MUON_EXIT_CODE%\n`;\n\nexport const createMuonLaunchScript = (\n options: MuonLaunchScriptOptions,\n): string =>\n options.platform === \"win32\"\n ? createWindowsMuonLaunchScript(options)\n : createPosixMuonLaunchScript(options);\n\nconst getBaseUrl = (server: ViteDevServer): string | undefined =>\n server.resolvedUrls?.local[0] ?? server.resolvedUrls?.network[0];\n\nconst getWebSocketOrigin = (startUrl: string): string => {\n const url = new URL(startUrl);\n if (url.protocol === \"https:\") {\n url.protocol = \"wss:\";\n } else if (url.protocol === \"http:\") {\n url.protocol = \"ws:\";\n }\n return url.origin;\n};\n\nconst createMuonOverrideConfig = (\n startUrl: string,\n enableDebugger: boolean,\n): MuonOverrideConfig => {\n const origin = new URL(startUrl).origin;\n return {\n ...(enableDebugger\n ? {\n cdp: {\n enable: true,\n },\n }\n : {}),\n browser: {\n startPage: startUrl,\n ...(enableDebugger\n ? {\n keybind: {\n devtools: \"f12\",\n },\n }\n : {}),\n plugin: {\n allow: [`${origin}/**`],\n },\n },\n network: {\n allow: [`${origin}/**`, `${getWebSocketOrigin(startUrl)}/**`],\n },\n };\n};\n\nconst writeMuonOverrideConfig = (\n server: ViteDevServer,\n overrideConfigPath: string,\n enableDebugger: boolean,\n): boolean => {\n const startUrl = getBaseUrl(server);\n if (startUrl === undefined) {\n server.config.logger.warn(\"Muon Vite plugin could not resolve a Vite URL.\");\n return false;\n }\n writeFileSync(\n overrideConfigPath,\n `${JSON.stringify(createMuonOverrideConfig(startUrl, enableDebugger), null, 2)}\\n`,\n );\n return true;\n};\n\nconst createRuntimePaths = async (\n server: ViteDevServer,\n stagePath: string,\n platform: NodeJS.Platform,\n projectConfigPath: string | undefined,\n): Promise<MuonRuntimePaths> => {\n const temporaryDirectory = await mkdtemp(join(tmpdir(), \"muon-vite-\"));\n return {\n temporaryDirectory,\n launchScriptPath: join(\n temporaryDirectory,\n getLaunchScriptFileName(platform),\n ),\n overrideConfigPath: join(temporaryDirectory, \"muon.vite.json\"),\n projectConfigPath,\n muonExecutablePath: getMuonExecutablePath(stagePath, platform),\n };\n};\n\nconst fileExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n\nconst isJsonObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst getErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst resolveProjectConfigPath = async (\n server: ViteDevServer,\n): Promise<string | undefined> => {\n for (const fileName of defaultProjectConfigFileNames) {\n const candidatePath = join(server.config.root, fileName);\n if (!(await fileExists(candidatePath))) {\n continue;\n }\n\n try {\n const parsed = parse(await readFile(candidatePath, \"utf8\"));\n if (!isJsonObject(parsed)) {\n throw new Error(\"muon config root must be an object\");\n }\n return candidatePath;\n } catch (error) {\n server.config.logger.warn(\n `Muon project config will be ignored because it could not be read or parsed: ${candidatePath}: ${getErrorMessage(error)}`,\n );\n return undefined;\n }\n }\n\n server.config.logger.warn(\n `Muon project config was not found in ${server.config.root}; launching with generated Vite config only.`,\n );\n return undefined;\n};\n\nconst writeLaunchScript = async (\n paths: MuonRuntimePaths,\n platform: NodeJS.Platform,\n): Promise<void> => {\n await writeFile(\n paths.launchScriptPath,\n createMuonLaunchScript({\n muonExecutablePath: paths.muonExecutablePath,\n projectConfigPath: paths.projectConfigPath,\n overrideConfigPath: paths.overrideConfigPath,\n platform,\n }),\n );\n if (platform !== \"win32\") {\n await chmod(paths.launchScriptPath, 0o700);\n }\n};\n\nconst quoteWindowsCommandArgument = (value: string): string =>\n `\"${value.replaceAll('\"', '\\\\\"')}\"`;\n\nconst launchMuon = (\n paths: MuonRuntimePaths,\n platform: NodeJS.Platform,\n server: ViteDevServer,\n): void => {\n const command = platform === \"win32\" ? \"cmd.exe\" : paths.launchScriptPath;\n const args =\n platform === \"win32\"\n ? [\"/d\", \"/s\", \"/c\", quoteWindowsCommandArgument(paths.launchScriptPath)]\n : [];\n const child = spawn(command, args, {\n detached: true,\n stdio: \"ignore\",\n windowsHide: false,\n });\n child.once(\"error\", (error) => {\n server.config.logger.warn(`Muon startup failed: ${getErrorMessage(error)}`);\n });\n child.unref();\n};\n\nexport const startMuonViteBrowserBridge = async ({\n server,\n pluginOptions,\n platform,\n architecture,\n environment,\n}: MuonViteSessionOptions): Promise<void> => {\n await ensureMuonGitignoreEntry(server.config.root);\n\n if (pluginOptions.open === false || server.httpServer === null) {\n return;\n }\n\n const target = getDefaultMuonPrepareTarget(platform, architecture);\n const muonPath = resolveMuonRuntimePath({\n root: server.config.root,\n target,\n muonPath: pluginOptions.muonPath,\n });\n const cefPath =\n pluginOptions.cefPath === undefined\n ? undefined\n : resolveFromRoot(server.config.root, pluginOptions.cefPath);\n const stagePath =\n pluginOptions.stagePath === undefined\n ? resolve(server.config.root, \".muon\", target)\n : resolveFromRoot(server.config.root, pluginOptions.stagePath);\n const preparedRuntime = await runMuonPrepare({\n muonPath,\n cefPath,\n stageDir: stagePath,\n target,\n cacheDir: environment.MUON_CACHE_DIR,\n force: false,\n quiet: false,\n prepareExecutablePath: undefined,\n environment,\n cwd: server.config.root,\n });\n if (preparedRuntime.stagePath === undefined) {\n throw new Error(\"muon-prepare did not return a staged runtime path.\");\n }\n const paths = await createRuntimePaths(\n server,\n preparedRuntime.stagePath,\n platform,\n await resolveProjectConfigPath(server),\n );\n await writeLaunchScript(paths, platform);\n\n let cleanupPromise: Promise<void> | undefined = undefined;\n const cleanup = async (): Promise<void> => {\n if (cleanupPromise !== undefined) {\n return cleanupPromise;\n }\n cleanupPromise = (async () => {\n await rm(paths.temporaryDirectory, { recursive: true, force: true });\n })();\n return cleanupPromise;\n };\n\n const originalClose = server.close.bind(server);\n server.close = async (): Promise<void> => {\n try {\n await originalClose();\n } finally {\n await cleanup();\n }\n };\n server.httpServer.once(\"close\", () => {\n void cleanup();\n });\n server.httpServer.once(\"listening\", () => {\n const configWritten = writeMuonOverrideConfig(\n server,\n paths.overrideConfigPath,\n pluginOptions.enableDebugger !== false,\n );\n if (configWritten) {\n launchMuon(paths, platform, server);\n }\n });\n};\n","// muon - Multi-platform GUI application framework that uses CEF as its backend\n// Copyright (c) Kouji Matsui. (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/muon\n\nimport type { Plugin } from \"vite\";\nimport type { ResolvedConfig } from \"vite\";\nimport { isAbsolute, resolve } from \"node:path\";\n\nimport { buildMuonApp, type MuonBuildOptions } from \"./build.js\";\nimport { startMuonViteBrowserBridge } from \"./vite-internals.js\";\n\n/**\n * Options for generating Muon app distributions after Vite build.\n */\nexport interface MuonViteBuildOptions {\n /**\n * Target aliases or internal target names to build.\n */\n targets?: readonly string[];\n\n /**\n * Build every supported target from the installed package.\n */\n allTargets?: boolean;\n\n /**\n * File name used for the app launcher.\n *\n * @remarks The .exe suffix is added automatically for Windows targets.\n */\n appName?: string;\n\n /**\n * Parent directory that receives dist-linux-amd64/ style outputs.\n */\n outputRoot?: string;\n\n /**\n * Muon config path to embed.\n */\n configPath?: string;\n\n /**\n * Directory containing package runtime/ and native/ folders.\n *\n * @remarks This defaults to the installed muon package dist directory.\n */\n packageDirectory?: string;\n\n /**\n * Asset salt override for deterministic tests.\n *\n * @remarks Production builds should omit this option.\n */\n assetSalt?: Uint8Array;\n}\n\n/**\n * Options for the Muon Vite development plugin.\n */\nexport interface MuonVitePluginOptions {\n /**\n * Directory containing muon-core runtime files such as muon-core and plugins.\n *\n * @remarks Relative paths are resolved from the Vite project root. When omitted,\n * the packaged runtime at dist/runtime/<target> is used.\n */\n muonPath?: string;\n\n /**\n * Directory containing CEF files, or a CEF archive root with Release/Resources.\n *\n * @remarks Relative paths are resolved from the Vite project root. When omitted,\n * muon-prepare downloads and caches the tested CEF artifact from muonPath.\n */\n cefPath?: string;\n\n /**\n * Runtime staging directory used for development startup.\n *\n * @remarks Relative paths are resolved from the Vite project root. Defaults to\n * .muon/<target>.\n */\n stagePath?: string;\n\n /**\n * Launch Muon automatically during Vite dev startup.\n *\n * @remarks Defaults to true. This is independent from Vite's server.open\n * browser startup option. Vite build ignores this option.\n */\n open?: boolean;\n\n /**\n * Enable the Muon debugger defaults during Vite dev startup.\n *\n * @remarks Defaults to true. When enabled, the generated development config\n * enables CDP and binds DevTools to F12. Vite build ignores this option.\n */\n enableDebugger?: boolean;\n\n /**\n * Build app distributions from Vite output.\n *\n * @remarks Defaults to true during Vite build. Set false to disable the build\n * hook while keeping the development bridge enabled.\n */\n build?: boolean | MuonViteBuildOptions;\n}\n\n/**\n * Creates a Vite plugin that launches Muon during Vite dev startup.\n *\n * @param options Muon plugin options used for development startup and build.\n * @returns Vite plugin instance.\n */\nconst muon = (options: MuonVitePluginOptions = {}): Plugin => {\n let resolvedConfig: ResolvedConfig | undefined = undefined;\n\n return {\n name: \"muon\",\n configResolved: (config) => {\n resolvedConfig = config;\n },\n configureServer: async (server) => {\n await startMuonViteBrowserBridge({\n server,\n pluginOptions: options,\n platform: process.platform,\n architecture: process.arch,\n environment: process.env,\n });\n },\n closeBundle: async () => {\n if (resolvedConfig === undefined || resolvedConfig.command !== \"build\") {\n return;\n }\n if (options.build === false) {\n return;\n }\n\n const buildOptions =\n typeof options.build === \"object\" ? options.build : {};\n await buildMuonApp(createMuonBuildOptions(resolvedConfig, buildOptions));\n },\n };\n};\n\nconst createMuonBuildOptions = (\n config: ResolvedConfig,\n buildOptions: MuonViteBuildOptions,\n): MuonBuildOptions => {\n const outDir = isAbsolute(config.build.outDir)\n ? config.build.outDir\n : resolve(config.root, config.build.outDir);\n const options: MuonBuildOptions = {\n root: config.root,\n assetSourcePath: outDir,\n assetPrefix: \"main\",\n };\n\n if (buildOptions.allTargets !== undefined) {\n options.allTargets = buildOptions.allTargets;\n }\n if (buildOptions.targets !== undefined) {\n options.targets = buildOptions.targets;\n }\n if (buildOptions.appName !== undefined) {\n options.appName = buildOptions.appName;\n }\n if (buildOptions.outputRoot !== undefined) {\n options.outputRoot = buildOptions.outputRoot;\n }\n if (buildOptions.configPath !== undefined) {\n options.configPath = buildOptions.configPath;\n }\n if (buildOptions.packageDirectory !== undefined) {\n options.packageDirectory = buildOptions.packageDirectory;\n }\n if (buildOptions.assetSalt !== undefined) {\n options.assetSalt = buildOptions.assetSalt;\n }\n\n return options;\n};\n\nexport default muon;\n"],"mappings":"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"}