muon-ui 0.2.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.
- package/README.md +1 -1
- package/dist/{build-BxDRaTmF.cjs → build-xwfaxosJ.cjs} +47 -11
- package/dist/build-xwfaxosJ.cjs.map +1 -0
- package/dist/cli.cjs +12 -5
- package/dist/cli.cjs.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/native/linux64/muon-bootstrap +0 -0
- package/dist/native/linux64/muon-prepare +0 -0
- package/dist/native/linuxarm/muon-bootstrap +0 -0
- package/dist/native/linuxarm/muon-prepare +0 -0
- package/dist/native/linuxarm64/muon-bootstrap +0 -0
- package/dist/native/linuxarm64/muon-prepare +0 -0
- package/dist/native/windows32/muon-bootstrap.exe +0 -0
- package/dist/native/windows32/muon-prepare.exe +0 -0
- package/dist/native/windows64/muon-bootstrap.exe +0 -0
- package/dist/native/windows64/muon-prepare.exe +0 -0
- package/dist/runtime/linux64/LICENSE_muon +97 -0
- package/dist/runtime/linux64/libmuon-ui.so +0 -0
- package/dist/runtime/linux64/muon-core +0 -0
- package/dist/runtime/linuxarm/LICENSE_muon +97 -0
- package/dist/runtime/linuxarm/libmuon-ui.so +0 -0
- package/dist/runtime/linuxarm/muon-core +0 -0
- package/dist/runtime/linuxarm64/LICENSE_muon +97 -0
- package/dist/runtime/linuxarm64/libmuon-ui.so +0 -0
- package/dist/runtime/linuxarm64/muon-core +0 -0
- package/dist/runtime/windows32/LICENSE_muon +97 -0
- package/dist/runtime/windows32/libcardio.dll +0 -0
- package/dist/runtime/windows32/libmuon-ui.dll +0 -0
- package/dist/runtime/windows32/muon-core.exe +0 -0
- package/dist/runtime/windows64/LICENSE_muon +97 -0
- package/dist/runtime/windows64/libcardio.dll +0 -0
- package/dist/runtime/windows64/libmuon-ui.dll +0 -0
- package/dist/runtime/windows64/muon-core.exe +0 -0
- package/dist/vite.cjs +34 -26
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.mjs +70 -33
- package/dist/vite.mjs.map +1 -1
- package/muon.d.ts +17 -0
- package/package.json +7 -7
- package/vite.d.ts +18 -2
- package/dist/build-BxDRaTmF.cjs.map +0 -1
|
Binary file
|
package/dist/vite.cjs
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* name: muon-ui
|
|
3
|
-
* version: 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:
|
|
8
|
+
* git.commit.hash: e3c2c87d50dddb0bf6c2b4d5ebf0a37ab2d3b433
|
|
9
9
|
*/
|
|
10
|
-
const require_build = require("./build-
|
|
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");
|
|
@@ -15,10 +16,6 @@ let node_path = require("node:path");
|
|
|
15
16
|
let node_os = require("node:os");
|
|
16
17
|
//#region src/vite-internals.ts
|
|
17
18
|
var import_dist = require_build.require_dist();
|
|
18
|
-
var getServerOpenValue = (server) => {
|
|
19
|
-
const open = server.config.server.open;
|
|
20
|
-
return open === true || typeof open === "string" ? open : false;
|
|
21
|
-
};
|
|
22
19
|
var resolveFromRoot = (root, path) => (0, node_path.isAbsolute)(path) ? path : (0, node_path.resolve)(root, path);
|
|
23
20
|
var moduleDirectory = typeof __dirname === "string" ? __dirname : (0, node_path.dirname)((0, node_url.fileURLToPath)({}.url));
|
|
24
21
|
var defaultProjectConfigFileNames = [
|
|
@@ -104,34 +101,32 @@ exit /b %MUON_EXIT_CODE%
|
|
|
104
101
|
`;
|
|
105
102
|
var createMuonLaunchScript = (options) => options.platform === "win32" ? createWindowsMuonLaunchScript(options) : createPosixMuonLaunchScript(options);
|
|
106
103
|
var getBaseUrl = (server) => server.resolvedUrls?.local[0] ?? server.resolvedUrls?.network[0];
|
|
107
|
-
var getStartUrl = (server, openValue) => {
|
|
108
|
-
const baseUrl = getBaseUrl(server);
|
|
109
|
-
if (baseUrl === void 0) return;
|
|
110
|
-
return typeof openValue === "string" ? new URL(openValue, baseUrl).href : baseUrl;
|
|
111
|
-
};
|
|
112
104
|
var getWebSocketOrigin = (startUrl) => {
|
|
113
105
|
const url = new URL(startUrl);
|
|
114
106
|
if (url.protocol === "https:") url.protocol = "wss:";
|
|
115
107
|
else if (url.protocol === "http:") url.protocol = "ws:";
|
|
116
108
|
return url.origin;
|
|
117
109
|
};
|
|
118
|
-
var createMuonOverrideConfig = (startUrl) => {
|
|
110
|
+
var createMuonOverrideConfig = (startUrl, enableDebugger) => {
|
|
119
111
|
const origin = new URL(startUrl).origin;
|
|
120
112
|
return {
|
|
113
|
+
...enableDebugger ? { cdp: { enable: true } } : {},
|
|
121
114
|
browser: {
|
|
122
115
|
startPage: startUrl,
|
|
116
|
+
...enableDebugger ? { keybind: { devtools: "f12" } } : {},
|
|
123
117
|
plugin: { allow: [`${origin}/**`] }
|
|
124
118
|
},
|
|
125
119
|
network: { allow: [`${origin}/**`, `${getWebSocketOrigin(startUrl)}/**`] }
|
|
126
120
|
};
|
|
127
121
|
};
|
|
128
|
-
var writeMuonOverrideConfig = (server,
|
|
129
|
-
const startUrl =
|
|
122
|
+
var writeMuonOverrideConfig = (server, overrideConfigPath, enableDebugger) => {
|
|
123
|
+
const startUrl = getBaseUrl(server);
|
|
130
124
|
if (startUrl === void 0) {
|
|
131
125
|
server.config.logger.warn("Muon Vite plugin could not resolve a Vite URL.");
|
|
132
|
-
return;
|
|
126
|
+
return false;
|
|
133
127
|
}
|
|
134
|
-
(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;
|
|
135
130
|
};
|
|
136
131
|
var createRuntimePaths = async (server, stagePath, platform, projectConfigPath) => {
|
|
137
132
|
const temporaryDirectory = await (0, node_fs_promises.mkdtemp)((0, node_path.join)((0, node_os.tmpdir)(), "muon-vite-"));
|
|
@@ -176,9 +171,26 @@ var writeLaunchScript = async (paths, platform) => {
|
|
|
176
171
|
}));
|
|
177
172
|
if (platform !== "win32") await (0, node_fs_promises.chmod)(paths.launchScriptPath, 448);
|
|
178
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
|
+
};
|
|
179
191
|
var startMuonViteBrowserBridge = async ({ server, pluginOptions, platform, architecture, environment }) => {
|
|
180
|
-
|
|
181
|
-
if (
|
|
192
|
+
await require_build.ensureMuonGitignoreEntry(server.config.root);
|
|
193
|
+
if (pluginOptions.open === false || server.httpServer === null) return;
|
|
182
194
|
const target = require_build.getDefaultMuonPrepareTarget(platform, architecture);
|
|
183
195
|
const preparedRuntime = await require_build.runMuonPrepare({
|
|
184
196
|
muonPath: resolveMuonRuntimePath({
|
|
@@ -199,14 +211,10 @@ var startMuonViteBrowserBridge = async ({ server, pluginOptions, platform, archi
|
|
|
199
211
|
if (preparedRuntime.stagePath === void 0) throw new Error("muon-prepare did not return a staged runtime path.");
|
|
200
212
|
const paths = await createRuntimePaths(server, preparedRuntime.stagePath, platform, await resolveProjectConfigPath(server));
|
|
201
213
|
await writeLaunchScript(paths, platform);
|
|
202
|
-
const previousBrowser = environment.BROWSER;
|
|
203
|
-
environment.BROWSER = paths.launchScriptPath;
|
|
204
214
|
let cleanupPromise = void 0;
|
|
205
215
|
const cleanup = async () => {
|
|
206
216
|
if (cleanupPromise !== void 0) return cleanupPromise;
|
|
207
217
|
cleanupPromise = (async () => {
|
|
208
|
-
if (previousBrowser === void 0) delete environment.BROWSER;
|
|
209
|
-
else environment.BROWSER = previousBrowser;
|
|
210
218
|
await (0, node_fs_promises.rm)(paths.temporaryDirectory, {
|
|
211
219
|
recursive: true,
|
|
212
220
|
force: true
|
|
@@ -226,15 +234,15 @@ var startMuonViteBrowserBridge = async ({ server, pluginOptions, platform, archi
|
|
|
226
234
|
cleanup();
|
|
227
235
|
});
|
|
228
236
|
server.httpServer.once("listening", () => {
|
|
229
|
-
writeMuonOverrideConfig(server,
|
|
237
|
+
if (writeMuonOverrideConfig(server, paths.overrideConfigPath, pluginOptions.enableDebugger !== false)) launchMuon(paths, platform, server);
|
|
230
238
|
});
|
|
231
239
|
};
|
|
232
240
|
//#endregion
|
|
233
241
|
//#region src/vite.ts
|
|
234
242
|
/**
|
|
235
|
-
* Creates a Vite plugin that launches Muon
|
|
243
|
+
* Creates a Vite plugin that launches Muon during Vite dev startup.
|
|
236
244
|
*
|
|
237
|
-
* @param options Muon
|
|
245
|
+
* @param options Muon plugin options used for development startup and build.
|
|
238
246
|
* @returns Vite plugin instance.
|
|
239
247
|
*/
|
|
240
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 { 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 { 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 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));\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 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 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\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 await resolveProjectConfigPath(server),\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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"}
|
package/dist/vite.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* name: muon-ui
|
|
3
|
-
* version: 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:
|
|
8
|
+
* git.commit.hash: e3c2c87d50dddb0bf6c2b4d5ebf0a37ab2d3b433
|
|
9
9
|
*/
|
|
10
10
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep, win32 } from "node:path";
|
|
11
11
|
import { constants, writeFileSync } from "node:fs";
|
|
@@ -1769,7 +1769,7 @@ var defaultConfigFileNames = [
|
|
|
1769
1769
|
"muon.jsonc",
|
|
1770
1770
|
"muon.json"
|
|
1771
1771
|
];
|
|
1772
|
-
var
|
|
1772
|
+
var appConfigSourcePath = "./assets.zip";
|
|
1773
1773
|
var defaultAppName = "muon-app";
|
|
1774
1774
|
var muonLicenseFileName = "LICENSE_muon";
|
|
1775
1775
|
var directoryMode = 493;
|
|
@@ -1833,7 +1833,7 @@ var resolveBuildTargets = (options) => {
|
|
|
1833
1833
|
return [getDefaultMuonBuildTarget()];
|
|
1834
1834
|
};
|
|
1835
1835
|
var resolveAssetInput = (root, assetSourcePath, assetPrefix, buildConfig) => {
|
|
1836
|
-
const configuredAssetSourcePath = assetSourcePath === void 0 ?
|
|
1836
|
+
const configuredAssetSourcePath = assetSourcePath === void 0 ? readConfigAssetSourcePath(buildConfig.config) : void 0;
|
|
1837
1837
|
return {
|
|
1838
1838
|
sourcePath: assetSourcePath !== void 0 ? resolve(root, assetSourcePath) : configuredAssetSourcePath !== void 0 ? resolve(buildConfig.directory, configuredAssetSourcePath) : resolve(root, "assets"),
|
|
1839
1839
|
prefix: normalizeZipPrefix(assetPrefix ?? "")
|
|
@@ -1864,14 +1864,14 @@ var readBuildConfig = async (root, configPath) => {
|
|
|
1864
1864
|
directory: dirname(resolvedConfigPath)
|
|
1865
1865
|
};
|
|
1866
1866
|
};
|
|
1867
|
-
var
|
|
1867
|
+
var readConfigAssetSourcePath = (sourceConfig) => {
|
|
1868
1868
|
const sourceAsset = sourceConfig.asset;
|
|
1869
1869
|
if (sourceAsset === void 0) return;
|
|
1870
1870
|
if (!isJsonObject$1(sourceAsset)) throw new Error("muon.json asset must be an object when present.");
|
|
1871
|
-
const
|
|
1872
|
-
if (
|
|
1873
|
-
if (typeof
|
|
1874
|
-
return
|
|
1871
|
+
const sourceAssetPath = sourceAsset.sourcePath;
|
|
1872
|
+
if (sourceAssetPath === void 0) return;
|
|
1873
|
+
if (typeof sourceAssetPath !== "string") throw new Error("muon.json asset.sourcePath must be a string when present.");
|
|
1874
|
+
return sourceAssetPath;
|
|
1875
1875
|
};
|
|
1876
1876
|
var resolveConfigPath = async (root, configPath) => {
|
|
1877
1877
|
if (configPath !== void 0) {
|
|
@@ -2023,7 +2023,7 @@ var createEmbeddedConfig = (sourceConfig, asset) => {
|
|
|
2023
2023
|
...sourceConfig,
|
|
2024
2024
|
asset: {
|
|
2025
2025
|
...sourceAsset ?? {},
|
|
2026
|
-
|
|
2026
|
+
sourcePath: appConfigSourcePath,
|
|
2027
2027
|
signature: asset.signature,
|
|
2028
2028
|
salt: asset.salt
|
|
2029
2029
|
}
|
|
@@ -2070,11 +2070,37 @@ var isJsonObject$1 = (value) => {
|
|
|
2070
2070
|
};
|
|
2071
2071
|
var getErrorMessage$1 = (error) => error instanceof Error ? error.message : String(error);
|
|
2072
2072
|
//#endregion
|
|
2073
|
-
//#region src/
|
|
2074
|
-
var
|
|
2075
|
-
|
|
2076
|
-
|
|
2073
|
+
//#region src/gitignore.ts
|
|
2074
|
+
var muonGitignoreEntry = ".muon/";
|
|
2075
|
+
var isMissingFileError = (error) => error instanceof Error && error.code === "ENOENT";
|
|
2076
|
+
var hasMuonGitignoreEntry = (content) => content.split(/\r?\n/).map((line) => line.trim()).some((line) => line === muonGitignoreEntry || line === `/${muonGitignoreEntry}` || line === ".muon" || line === "/.muon");
|
|
2077
|
+
/**
|
|
2078
|
+
* Adds the Muon staging directory to a project .gitignore file.
|
|
2079
|
+
*
|
|
2080
|
+
* @param root Project root containing the .gitignore file.
|
|
2081
|
+
* @returns Gitignore update result.
|
|
2082
|
+
*/
|
|
2083
|
+
var ensureMuonGitignoreEntry = async (root) => {
|
|
2084
|
+
const gitignorePath = join(root, ".gitignore");
|
|
2085
|
+
let content = "";
|
|
2086
|
+
try {
|
|
2087
|
+
content = await readFile(gitignorePath, "utf8");
|
|
2088
|
+
} catch (error) {
|
|
2089
|
+
if (!isMissingFileError(error)) throw error;
|
|
2090
|
+
}
|
|
2091
|
+
if (hasMuonGitignoreEntry(content)) return {
|
|
2092
|
+
gitignorePath,
|
|
2093
|
+
changed: false
|
|
2094
|
+
};
|
|
2095
|
+
const separator = content.length > 0 && !content.endsWith("\n") ? "\n" : "";
|
|
2096
|
+
await writeFile(gitignorePath, `${content}${separator}${muonGitignoreEntry}\n`);
|
|
2097
|
+
return {
|
|
2098
|
+
gitignorePath,
|
|
2099
|
+
changed: true
|
|
2100
|
+
};
|
|
2077
2101
|
};
|
|
2102
|
+
//#endregion
|
|
2103
|
+
//#region src/vite-internals.ts
|
|
2078
2104
|
var resolveFromRoot = (root, path) => isAbsolute(path) ? path : resolve(root, path);
|
|
2079
2105
|
var moduleDirectory = typeof __dirname === "string" ? __dirname : dirname(fileURLToPath(import.meta.url));
|
|
2080
2106
|
var defaultProjectConfigFileNames = [
|
|
@@ -2160,34 +2186,32 @@ exit /b %MUON_EXIT_CODE%
|
|
|
2160
2186
|
`;
|
|
2161
2187
|
var createMuonLaunchScript = (options) => options.platform === "win32" ? createWindowsMuonLaunchScript(options) : createPosixMuonLaunchScript(options);
|
|
2162
2188
|
var getBaseUrl = (server) => server.resolvedUrls?.local[0] ?? server.resolvedUrls?.network[0];
|
|
2163
|
-
var getStartUrl = (server, openValue) => {
|
|
2164
|
-
const baseUrl = getBaseUrl(server);
|
|
2165
|
-
if (baseUrl === void 0) return;
|
|
2166
|
-
return typeof openValue === "string" ? new URL(openValue, baseUrl).href : baseUrl;
|
|
2167
|
-
};
|
|
2168
2189
|
var getWebSocketOrigin = (startUrl) => {
|
|
2169
2190
|
const url = new URL(startUrl);
|
|
2170
2191
|
if (url.protocol === "https:") url.protocol = "wss:";
|
|
2171
2192
|
else if (url.protocol === "http:") url.protocol = "ws:";
|
|
2172
2193
|
return url.origin;
|
|
2173
2194
|
};
|
|
2174
|
-
var createMuonOverrideConfig = (startUrl) => {
|
|
2195
|
+
var createMuonOverrideConfig = (startUrl, enableDebugger) => {
|
|
2175
2196
|
const origin = new URL(startUrl).origin;
|
|
2176
2197
|
return {
|
|
2198
|
+
...enableDebugger ? { cdp: { enable: true } } : {},
|
|
2177
2199
|
browser: {
|
|
2178
2200
|
startPage: startUrl,
|
|
2201
|
+
...enableDebugger ? { keybind: { devtools: "f12" } } : {},
|
|
2179
2202
|
plugin: { allow: [`${origin}/**`] }
|
|
2180
2203
|
},
|
|
2181
2204
|
network: { allow: [`${origin}/**`, `${getWebSocketOrigin(startUrl)}/**`] }
|
|
2182
2205
|
};
|
|
2183
2206
|
};
|
|
2184
|
-
var writeMuonOverrideConfig = (server,
|
|
2185
|
-
const startUrl =
|
|
2207
|
+
var writeMuonOverrideConfig = (server, overrideConfigPath, enableDebugger) => {
|
|
2208
|
+
const startUrl = getBaseUrl(server);
|
|
2186
2209
|
if (startUrl === void 0) {
|
|
2187
2210
|
server.config.logger.warn("Muon Vite plugin could not resolve a Vite URL.");
|
|
2188
|
-
return;
|
|
2211
|
+
return false;
|
|
2189
2212
|
}
|
|
2190
|
-
writeFileSync(overrideConfigPath, `${JSON.stringify(createMuonOverrideConfig(startUrl), null, 2)}\n`);
|
|
2213
|
+
writeFileSync(overrideConfigPath, `${JSON.stringify(createMuonOverrideConfig(startUrl, enableDebugger), null, 2)}\n`);
|
|
2214
|
+
return true;
|
|
2191
2215
|
};
|
|
2192
2216
|
var createRuntimePaths = async (server, stagePath, platform, projectConfigPath) => {
|
|
2193
2217
|
const temporaryDirectory = await mkdtemp(join(tmpdir(), "muon-vite-"));
|
|
@@ -2232,9 +2256,26 @@ var writeLaunchScript = async (paths, platform) => {
|
|
|
2232
2256
|
}));
|
|
2233
2257
|
if (platform !== "win32") await chmod(paths.launchScriptPath, 448);
|
|
2234
2258
|
};
|
|
2259
|
+
var quoteWindowsCommandArgument = (value) => `"${value.replaceAll("\"", "\\\"")}"`;
|
|
2260
|
+
var launchMuon = (paths, platform, server) => {
|
|
2261
|
+
const child = spawn(platform === "win32" ? "cmd.exe" : paths.launchScriptPath, platform === "win32" ? [
|
|
2262
|
+
"/d",
|
|
2263
|
+
"/s",
|
|
2264
|
+
"/c",
|
|
2265
|
+
quoteWindowsCommandArgument(paths.launchScriptPath)
|
|
2266
|
+
] : [], {
|
|
2267
|
+
detached: true,
|
|
2268
|
+
stdio: "ignore",
|
|
2269
|
+
windowsHide: false
|
|
2270
|
+
});
|
|
2271
|
+
child.once("error", (error) => {
|
|
2272
|
+
server.config.logger.warn(`Muon startup failed: ${getErrorMessage(error)}`);
|
|
2273
|
+
});
|
|
2274
|
+
child.unref();
|
|
2275
|
+
};
|
|
2235
2276
|
var startMuonViteBrowserBridge = async ({ server, pluginOptions, platform, architecture, environment }) => {
|
|
2236
|
-
|
|
2237
|
-
if (
|
|
2277
|
+
await ensureMuonGitignoreEntry(server.config.root);
|
|
2278
|
+
if (pluginOptions.open === false || server.httpServer === null) return;
|
|
2238
2279
|
const target = getDefaultMuonPrepareTarget(platform, architecture);
|
|
2239
2280
|
const preparedRuntime = await runMuonPrepare({
|
|
2240
2281
|
muonPath: resolveMuonRuntimePath({
|
|
@@ -2255,14 +2296,10 @@ var startMuonViteBrowserBridge = async ({ server, pluginOptions, platform, archi
|
|
|
2255
2296
|
if (preparedRuntime.stagePath === void 0) throw new Error("muon-prepare did not return a staged runtime path.");
|
|
2256
2297
|
const paths = await createRuntimePaths(server, preparedRuntime.stagePath, platform, await resolveProjectConfigPath(server));
|
|
2257
2298
|
await writeLaunchScript(paths, platform);
|
|
2258
|
-
const previousBrowser = environment.BROWSER;
|
|
2259
|
-
environment.BROWSER = paths.launchScriptPath;
|
|
2260
2299
|
let cleanupPromise = void 0;
|
|
2261
2300
|
const cleanup = async () => {
|
|
2262
2301
|
if (cleanupPromise !== void 0) return cleanupPromise;
|
|
2263
2302
|
cleanupPromise = (async () => {
|
|
2264
|
-
if (previousBrowser === void 0) delete environment.BROWSER;
|
|
2265
|
-
else environment.BROWSER = previousBrowser;
|
|
2266
2303
|
await rm(paths.temporaryDirectory, {
|
|
2267
2304
|
recursive: true,
|
|
2268
2305
|
force: true
|
|
@@ -2282,15 +2319,15 @@ var startMuonViteBrowserBridge = async ({ server, pluginOptions, platform, archi
|
|
|
2282
2319
|
cleanup();
|
|
2283
2320
|
});
|
|
2284
2321
|
server.httpServer.once("listening", () => {
|
|
2285
|
-
writeMuonOverrideConfig(server,
|
|
2322
|
+
if (writeMuonOverrideConfig(server, paths.overrideConfigPath, pluginOptions.enableDebugger !== false)) launchMuon(paths, platform, server);
|
|
2286
2323
|
});
|
|
2287
2324
|
};
|
|
2288
2325
|
//#endregion
|
|
2289
2326
|
//#region src/vite.ts
|
|
2290
2327
|
/**
|
|
2291
|
-
* Creates a Vite plugin that launches Muon
|
|
2328
|
+
* Creates a Vite plugin that launches Muon during Vite dev startup.
|
|
2292
2329
|
*
|
|
2293
|
-
* @param options Muon
|
|
2330
|
+
* @param options Muon plugin options used for development startup and build.
|
|
2294
2331
|
* @returns Vite plugin instance.
|
|
2295
2332
|
*/
|
|
2296
2333
|
var muon = (options = {}) => {
|