@interopio/iocd-cli 0.0.52 → 0.0.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +20 -15
- package/dist/cli.js.map +1 -1
- package/dist/schemas/iocd.cli.config.schema.json +6 -6
- package/dist/services/app.service.js +1 -1
- package/dist/services/app.service.js.map +1 -1
- package/dist/services/components/component.config.js +1 -1
- package/dist/services/components/component.config.js.map +1 -1
- package/dist/services/components/components.registry.js +17 -17
- package/dist/services/components/components.registry.js.map +1 -1
- package/dist/services/components/components.service.js +16 -15
- package/dist/services/components/components.service.js.map +1 -1
- package/dist/services/components/file.helper.js +7 -7
- package/dist/services/components/file.helper.js.map +1 -1
- package/dist/services/components/platform.utils.js +39 -34
- package/dist/services/components/platform.utils.js.map +1 -1
- package/dist/services/components/stores/github.store.js +52 -34
- package/dist/services/components/stores/github.store.js.map +1 -1
- package/dist/services/components/stores/local.store.js +19 -18
- package/dist/services/components/stores/local.store.js.map +1 -1
- package/dist/services/components/stores/s3.store.js +63 -56
- package/dist/services/components/stores/s3.store.js.map +1 -1
- package/dist/services/components/version.selector.js +3 -3
- package/dist/services/components/version.selector.js.map +1 -1
- package/dist/services/config/config.service.js +84 -45
- package/dist/services/config/config.service.js.map +1 -1
- package/dist/services/installer/electronForge.js +44 -44
- package/dist/services/installer/electronForge.js.map +1 -1
- package/dist/services/installer/installer.service.js +24 -24
- package/dist/services/installer/installer.service.js.map +1 -1
- package/dist/services/installer/macOS.helper.js +135 -77
- package/dist/services/installer/macOS.helper.js.map +1 -1
- package/dist/services/installer/prerequisites.js +10 -10
- package/dist/services/installer/windows.helper.js +53 -53
- package/dist/services/modifications/macOS.helper.js +28 -24
- package/dist/services/modifications/macOS.helper.js.map +1 -1
- package/dist/services/modifications/modifications.service.js +57 -57
- package/dist/services/modifications/windows.helper.js +54 -14
- package/dist/services/modifications/windows.helper.js.map +1 -1
- package/dist/templates/groups/apps/groups/src/App.tsx +3 -3
- package/dist/templates/groups/apps/groups/src/index.tsx +15 -13
- package/dist/templates/groups/apps/groups/vite.config.ts +4 -4
- package/dist/templates/launchpad/apps/launchpad/src/app/app.tsx +34 -29
- package/dist/templates/launchpad/apps/launchpad/src/app/constants.ts +20 -20
- package/dist/templates/launchpad/apps/launchpad/src/components/logo.tsx +5 -5
- package/dist/templates/launchpad/apps/launchpad/src/components/main-context-menu.tsx +195 -145
- package/dist/templates/launchpad/apps/launchpad/src/components/notifications-button.tsx +41 -34
- package/dist/templates/launchpad/apps/launchpad/src/main.tsx +3 -1
- package/dist/templates/launchpad/apps/launchpad/vite.config.ts +6 -7
- package/dist/templates/tests/tests/tests/sample.spec.ts +16 -16
- package/dist/templates/tests/tests/wdio.config.ts +9 -9
- package/dist/templates/workspaces/apps/workspaces/src/AddWindowButton.tsx +40 -33
- package/dist/templates/workspaces/apps/workspaces/src/AfterTabs.tsx +40 -27
- package/dist/templates/workspaces/apps/workspaces/src/App.tsx +93 -88
- package/dist/templates/workspaces/apps/workspaces/src/GroupHeaderButtons.tsx +11 -9
- package/dist/templates/workspaces/apps/workspaces/src/index.tsx +19 -14
- package/dist/templates/workspaces/apps/workspaces/src/reportWebVitals.ts +4 -4
- package/dist/templates/workspaces/apps/workspaces/src/setupTests.ts +1 -1
- package/dist/templates/workspaces/apps/workspaces/src/useAddWindowButtonVisible.tsx +36 -30
- package/dist/templates/workspaces/apps/workspaces/vite.config.ts +4 -4
- package/dist/utils/proxy.js +68 -0
- package/dist/utils/proxy.js.map +1 -0
- package/package.json +3 -2
|
@@ -8,10 +8,10 @@ const logger_1 = require("../../utils/logger");
|
|
|
8
8
|
const license_service_1 = __importDefault(require("../license.service"));
|
|
9
9
|
const pacakge_json_helper_1 = require("../../utils/pacakge.json.helper");
|
|
10
10
|
const ensure_iocd_exists_1 = require("../../utils/ensure.iocd.exists");
|
|
11
|
-
const logger = logger_1.Logger.getInstance(
|
|
11
|
+
const logger = logger_1.Logger.getInstance("installer.prerequisites");
|
|
12
12
|
async function validatePrerequisites(packageNames) {
|
|
13
13
|
// Check if the required package is available
|
|
14
|
-
logger.info(
|
|
14
|
+
logger.info("Validating prerequisites...");
|
|
15
15
|
for (const packageName of packageNames) {
|
|
16
16
|
logger.debug(`Checking required package: ${packageName}`);
|
|
17
17
|
try {
|
|
@@ -23,7 +23,7 @@ async function validatePrerequisites(packageNames) {
|
|
|
23
23
|
catch {
|
|
24
24
|
throw new Error(`${packageName} is required but not found. Please install it as a dev dependency:\n` +
|
|
25
25
|
`npm install --save-dev ${packageName}\n` +
|
|
26
|
-
|
|
26
|
+
"or\n" +
|
|
27
27
|
`yarn add --dev ${packageName}\n\n` +
|
|
28
28
|
`Note: ${packageName} should be installed as devDependency to avoid being bundled in the final package.`);
|
|
29
29
|
}
|
|
@@ -31,24 +31,24 @@ async function validatePrerequisites(packageNames) {
|
|
|
31
31
|
(0, ensure_iocd_exists_1.ensureIOCDComponentExists)();
|
|
32
32
|
// Validate license
|
|
33
33
|
const licenseInfo = license_service_1.default.validateLicense();
|
|
34
|
-
if (licenseInfo.status !==
|
|
35
|
-
throw new Error(`Valid license required for packaging: ${licenseInfo.errorMessage ||
|
|
34
|
+
if (licenseInfo.status !== "Active") {
|
|
35
|
+
throw new Error(`Valid license required for packaging: ${licenseInfo.errorMessage || "Unknown issue"}`);
|
|
36
36
|
}
|
|
37
|
-
logger.info(
|
|
37
|
+
logger.info("Prerequisites validated successfully!");
|
|
38
38
|
}
|
|
39
39
|
async function validatePackageInstallation(packageName) {
|
|
40
40
|
try {
|
|
41
41
|
// Read the current package.json to check dependency installation
|
|
42
42
|
const packageJson = await pacakge_json_helper_1.PackageJSONHelper.getPackageJson();
|
|
43
43
|
if (!packageJson) {
|
|
44
|
-
logger.debug(
|
|
44
|
+
logger.debug("No package.json found in the current directory, skipping package installation validation.");
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
47
|
// Check if package is in dependencies (bad for build tools)
|
|
48
48
|
if (packageJson.dependencies && packageJson.dependencies[packageName]) {
|
|
49
49
|
logger.warn(`${packageName} is installed as a regular dependency. ` +
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
"It should be installed as devDependency to avoid being bundled in the final package.\n" +
|
|
51
|
+
"Please move it to devDependencies:\n" +
|
|
52
52
|
`1. Remove: npm uninstall ${packageName}\n` +
|
|
53
53
|
`2. Reinstall: npm install --save-dev ${packageName}`);
|
|
54
54
|
}
|
|
@@ -65,7 +65,7 @@ async function validatePackageInstallation(packageName) {
|
|
|
65
65
|
// Package is available (import worked) but not in package.json
|
|
66
66
|
// This could happen if it's installed globally or in a parent node_modules
|
|
67
67
|
logger.warn(`${packageName} is available but not found in package.json dependencies. ` +
|
|
68
|
-
|
|
68
|
+
"For best practices, install it as devDependency:\n" +
|
|
69
69
|
`npm install --save-dev ${packageName}`);
|
|
70
70
|
}
|
|
71
71
|
}
|
|
@@ -11,8 +11,8 @@ const path_1 = require("../../utils/path");
|
|
|
11
11
|
const child_process_1 = require("child_process");
|
|
12
12
|
const fs_1 = require("fs");
|
|
13
13
|
const path_2 = __importDefault(require("path"));
|
|
14
|
-
const logger = logger_1.Logger.getInstance(
|
|
15
|
-
const signableExtensions = [
|
|
14
|
+
const logger = logger_1.Logger.getInstance("installer.windows.helper");
|
|
15
|
+
const signableExtensions = [".exe", ".dll", ".ocx", ".sys", ".node"];
|
|
16
16
|
async function signBinary(binaryPath) {
|
|
17
17
|
logger.debug(`Signing binary: ${path_2.default.basename(binaryPath)}`);
|
|
18
18
|
if (!(0, fs_1.existsSync)(binaryPath)) {
|
|
@@ -20,8 +20,8 @@ async function signBinary(binaryPath) {
|
|
|
20
20
|
}
|
|
21
21
|
const config = config_service_1.ConfigManager.config;
|
|
22
22
|
const codeSignConfig = config.win.codeSign;
|
|
23
|
-
if (codeSignConfig.type ===
|
|
24
|
-
logger.info(
|
|
23
|
+
if (codeSignConfig.type === "off") {
|
|
24
|
+
logger.info("Code signing is disabled (type: off)");
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
27
|
const ext = path_2.default.extname(binaryPath).toLowerCase();
|
|
@@ -34,11 +34,11 @@ async function signBinary(binaryPath) {
|
|
|
34
34
|
logger.debug(`Successfully signed: ${path_2.default.basename(binaryPath)}`);
|
|
35
35
|
}
|
|
36
36
|
async function signIOCDBinaries() {
|
|
37
|
-
logger.info(
|
|
37
|
+
logger.info("Starting signing of all Windows binaries...");
|
|
38
38
|
const config = config_service_1.ConfigManager.config;
|
|
39
39
|
const codeSignConfig = config.win.codeSign;
|
|
40
|
-
if (codeSignConfig.type ===
|
|
41
|
-
logger.info(
|
|
40
|
+
if (codeSignConfig.type === "off") {
|
|
41
|
+
logger.info("Code signing is disabled (type: off)");
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
44
|
storeUnsignedExeIfNeeded();
|
|
@@ -46,14 +46,14 @@ async function signIOCDBinaries() {
|
|
|
46
46
|
const iocdDir = path_1.PathUtils.getIOCDDir();
|
|
47
47
|
const binariesToSign = await findSignableBinaries(iocdDir);
|
|
48
48
|
if (binariesToSign.length === 0) {
|
|
49
|
-
logger.info(
|
|
49
|
+
logger.info("No signable binaries found");
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
52
|
logger.info(`Signing ${binariesToSign.length} binaries...`);
|
|
53
53
|
for (const binaryPath of binariesToSign) {
|
|
54
54
|
await signBinaryCore(binaryPath, codeSignConfig);
|
|
55
55
|
}
|
|
56
|
-
logger.info(
|
|
56
|
+
logger.info("Signing binaries completed successfully!");
|
|
57
57
|
}
|
|
58
58
|
catch (error) {
|
|
59
59
|
logger.error(`Signing failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -65,13 +65,13 @@ function storeUnsignedExeIfNeeded() {
|
|
|
65
65
|
// this means that if we do rcedit->sign, we can not longer do rcedit without breaking the signature
|
|
66
66
|
// to overcome this we are storing the original exe in a _temp folder and restore it before any modifications
|
|
67
67
|
// see restoreOriginalUnsignedExeIfNeeded in modifications/windows.helper.ts for restore logic
|
|
68
|
-
const tempDir = path_1.PathUtils.getComponentDir(
|
|
68
|
+
const tempDir = path_1.PathUtils.getComponentDir("_temp");
|
|
69
69
|
const tempExePath = path_2.default.join(tempDir, path_2.default.basename(path_1.PathUtils.getIOCDExePath()));
|
|
70
70
|
if (!(0, fs_1.existsSync)(tempDir)) {
|
|
71
71
|
(0, fs_1.mkdirSync)(tempDir);
|
|
72
72
|
}
|
|
73
73
|
if (!(0, fs_1.existsSync)(tempExePath)) {
|
|
74
|
-
logger.debug(
|
|
74
|
+
logger.debug("Storing current executable into _temp directory before signing. Will restore before next modifications");
|
|
75
75
|
(0, fs_1.copyFileSync)(path_1.PathUtils.getIOCDExePath(), tempExePath);
|
|
76
76
|
}
|
|
77
77
|
}
|
|
@@ -79,13 +79,13 @@ async function findSignableBinaries(directory) {
|
|
|
79
79
|
const binaries = [];
|
|
80
80
|
// Common files that should NOT be signed
|
|
81
81
|
const skipFiles = [
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
"msvcp140.dll",
|
|
83
|
+
"vcruntime140.dll",
|
|
84
|
+
"vcruntime140_1.dll",
|
|
85
|
+
"msvcp140_1.dll",
|
|
86
|
+
"msvcp140_2.dll",
|
|
87
|
+
"api-ms-win-*.dll",
|
|
88
|
+
"ucrtbase.dll",
|
|
89
89
|
];
|
|
90
90
|
function scanDirectory(dir) {
|
|
91
91
|
try {
|
|
@@ -106,9 +106,9 @@ async function findSignableBinaries(directory) {
|
|
|
106
106
|
if (signableExtensions.includes(ext)) {
|
|
107
107
|
// Skip system files and runtime libraries
|
|
108
108
|
const shouldSkip = skipFiles.some(skipPattern => {
|
|
109
|
-
if (skipPattern.includes(
|
|
109
|
+
if (skipPattern.includes("*")) {
|
|
110
110
|
// Simple wildcard matching
|
|
111
|
-
const regex = new RegExp(
|
|
111
|
+
const regex = new RegExp("^" + skipPattern.replace(/\*/g, ".*") + "$", "i");
|
|
112
112
|
return regex.test(basename);
|
|
113
113
|
}
|
|
114
114
|
return basename === skipPattern.toLowerCase();
|
|
@@ -129,13 +129,13 @@ async function findSignableBinaries(directory) {
|
|
|
129
129
|
}
|
|
130
130
|
async function signBinaryCore(binaryPath, codeSignConfig) {
|
|
131
131
|
switch (codeSignConfig.type) {
|
|
132
|
-
case
|
|
132
|
+
case "off":
|
|
133
133
|
// do nothing
|
|
134
134
|
break;
|
|
135
|
-
case
|
|
135
|
+
case "signtool":
|
|
136
136
|
await signWithSigntool(binaryPath, codeSignConfig);
|
|
137
137
|
break;
|
|
138
|
-
case
|
|
138
|
+
case "custom":
|
|
139
139
|
await signWithCustomScript(binaryPath, codeSignConfig);
|
|
140
140
|
break;
|
|
141
141
|
default:
|
|
@@ -147,44 +147,44 @@ async function signWithSigntool(exePath, codeSignConfig) {
|
|
|
147
147
|
const hasCertificateSha1 = !!codeSignConfig.certificateSha1;
|
|
148
148
|
// Validate that exactly one method is provided
|
|
149
149
|
if (!hasPfxPath && !hasCertificateSha1) {
|
|
150
|
-
throw new Error(
|
|
150
|
+
throw new Error("PFX signing requires either pfxPath or certificateSha1 to be configured");
|
|
151
151
|
}
|
|
152
152
|
if (hasPfxPath && hasCertificateSha1) {
|
|
153
|
-
throw new Error(
|
|
153
|
+
throw new Error("PFX signing requires either pfxPath OR certificateSha1, not both");
|
|
154
154
|
}
|
|
155
155
|
const args = [
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
config_service_1.ConfigManager.config.win.codeSign.tsaURL ||
|
|
156
|
+
"sign",
|
|
157
|
+
"/fd",
|
|
158
|
+
"SHA256",
|
|
159
|
+
"/td",
|
|
160
|
+
"SHA256",
|
|
161
|
+
"/tr",
|
|
162
|
+
config_service_1.ConfigManager.config.win.codeSign.tsaURL || "http://timestamp.digicert.com",
|
|
163
163
|
];
|
|
164
164
|
if (hasPfxPath) {
|
|
165
165
|
// Signing with .pfx file
|
|
166
|
-
logger.debug(
|
|
166
|
+
logger.debug("Signing with PFX certificate file...");
|
|
167
167
|
if (!(0, fs_1.existsSync)(codeSignConfig.pfxPath)) {
|
|
168
168
|
throw new Error(`PFX file not found: ${codeSignConfig.pfxPath}`);
|
|
169
169
|
}
|
|
170
|
-
args.push(
|
|
170
|
+
args.push("/f", codeSignConfig.pfxPath);
|
|
171
171
|
if (codeSignConfig.pfxPassword) {
|
|
172
|
-
args.push(
|
|
172
|
+
args.push("/p", codeSignConfig.pfxPassword);
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
else {
|
|
176
176
|
// Signing with certificate SHA1 hash from Windows certificate store
|
|
177
177
|
const sha1Hash = codeSignConfig.certificateSha1.trim();
|
|
178
178
|
logger.debug(`Signing with certificate from Windows store (SHA1: ${sha1Hash})...`);
|
|
179
|
-
args.push(
|
|
179
|
+
args.push("/sha1", sha1Hash);
|
|
180
180
|
}
|
|
181
181
|
args.push(exePath);
|
|
182
182
|
await runSigntool(args);
|
|
183
183
|
}
|
|
184
184
|
async function signWithCustomScript(exePath, codeSignConfig) {
|
|
185
|
-
logger.debug(
|
|
185
|
+
logger.debug("Signing with custom script...");
|
|
186
186
|
if (!codeSignConfig.customCodeSignScriptPath) {
|
|
187
|
-
throw new Error(
|
|
187
|
+
throw new Error("Custom signing requires customCodeSignScriptPath to be configured");
|
|
188
188
|
}
|
|
189
189
|
if (!(0, fs_1.existsSync)(codeSignConfig.customCodeSignScriptPath)) {
|
|
190
190
|
throw new Error(`Custom signing script not found: ${codeSignConfig.customCodeSignScriptPath}`);
|
|
@@ -199,13 +199,13 @@ async function signWithCustomScript(exePath, codeSignConfig) {
|
|
|
199
199
|
const customScript = require(scriptPath);
|
|
200
200
|
// Check if the module exports a function (default export or named export)
|
|
201
201
|
let signFunction;
|
|
202
|
-
if (typeof customScript ===
|
|
202
|
+
if (typeof customScript === "function") {
|
|
203
203
|
signFunction = customScript;
|
|
204
204
|
}
|
|
205
|
-
else if (typeof customScript.default ===
|
|
205
|
+
else if (typeof customScript.default === "function") {
|
|
206
206
|
signFunction = customScript.default;
|
|
207
207
|
}
|
|
208
|
-
else if (typeof customScript.sign ===
|
|
208
|
+
else if (typeof customScript.sign === "function") {
|
|
209
209
|
signFunction = customScript.sign;
|
|
210
210
|
}
|
|
211
211
|
else {
|
|
@@ -213,7 +213,7 @@ async function signWithCustomScript(exePath, codeSignConfig) {
|
|
|
213
213
|
}
|
|
214
214
|
// Execute the signing function with the binary path and full config
|
|
215
215
|
await signFunction(exePath, codeSignConfig);
|
|
216
|
-
logger.debug(
|
|
216
|
+
logger.debug("Custom signing script executed successfully");
|
|
217
217
|
}
|
|
218
218
|
catch (error) {
|
|
219
219
|
if (error instanceof Error) {
|
|
@@ -225,13 +225,13 @@ async function signWithCustomScript(exePath, codeSignConfig) {
|
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
async function runSigntool(args) {
|
|
228
|
-
await runCommand(
|
|
228
|
+
await runCommand("signtool", args);
|
|
229
229
|
}
|
|
230
230
|
async function verifySignature(exePath) {
|
|
231
231
|
logger.debug(`Verifying signature for: ${exePath}`);
|
|
232
232
|
try {
|
|
233
|
-
await runSigntool([
|
|
234
|
-
logger.debug(
|
|
233
|
+
await runSigntool(["verify", "/pa", "/all", exePath]);
|
|
234
|
+
logger.debug("Signature verification successful");
|
|
235
235
|
}
|
|
236
236
|
catch {
|
|
237
237
|
logger.warn(`Signature verification failed! The binary at ${exePath} may not be signed correctly.`);
|
|
@@ -239,25 +239,25 @@ async function verifySignature(exePath) {
|
|
|
239
239
|
}
|
|
240
240
|
async function runCommand(command, args, options = {}) {
|
|
241
241
|
return new Promise((resolve, reject) => {
|
|
242
|
-
logger.debug(`Executing: ${command} ${args.join(
|
|
242
|
+
logger.debug(`Executing: ${command} ${args.join(" ")}`);
|
|
243
243
|
const proc = (0, child_process_1.spawn)(command, args, {
|
|
244
|
-
stdio: [
|
|
244
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
245
245
|
env: process.env,
|
|
246
246
|
...options,
|
|
247
247
|
});
|
|
248
|
-
let stdout =
|
|
249
|
-
let stderr =
|
|
248
|
+
let stdout = "";
|
|
249
|
+
let stderr = "";
|
|
250
250
|
if (proc.stdout) {
|
|
251
|
-
proc.stdout.on(
|
|
251
|
+
proc.stdout.on("data", data => {
|
|
252
252
|
stdout += data.toString();
|
|
253
253
|
});
|
|
254
254
|
}
|
|
255
255
|
if (proc.stderr) {
|
|
256
|
-
proc.stderr.on(
|
|
256
|
+
proc.stderr.on("data", data => {
|
|
257
257
|
stderr += data.toString();
|
|
258
258
|
});
|
|
259
259
|
}
|
|
260
|
-
proc.on(
|
|
260
|
+
proc.on("close", code => {
|
|
261
261
|
if (code === 0) {
|
|
262
262
|
if (stdout)
|
|
263
263
|
logger.debug(`Command output: ${stdout.trim()}`);
|
|
@@ -272,7 +272,7 @@ async function runCommand(command, args, options = {}) {
|
|
|
272
272
|
reject(new Error(errorMessage));
|
|
273
273
|
}
|
|
274
274
|
});
|
|
275
|
-
proc.on(
|
|
275
|
+
proc.on("error", error => {
|
|
276
276
|
logger.error(`Failed to start command: ${error.message}`);
|
|
277
277
|
reject(error);
|
|
278
278
|
});
|
|
@@ -21,15 +21,15 @@ const logger = logger_1.Logger.getInstance("modifications.macOS.helper");
|
|
|
21
21
|
*/
|
|
22
22
|
async function renameAppBundleContents(appBundlePath, newBaseName) {
|
|
23
23
|
logger.debug(`Renaming app bundle contents to a new ${newBaseName}`);
|
|
24
|
-
const contentsPath = (0, path_1.join)(appBundlePath,
|
|
24
|
+
const contentsPath = (0, path_1.join)(appBundlePath, "Contents");
|
|
25
25
|
await renameAppBundleExe(contentsPath);
|
|
26
26
|
await updateInfoPlist(contentsPath);
|
|
27
|
-
await renameElectronHelpers(appBundlePath, newBaseName.replace(
|
|
27
|
+
await renameElectronHelpers(appBundlePath, newBaseName.replace(".app", ""));
|
|
28
28
|
await copyLogoToResources(contentsPath);
|
|
29
29
|
}
|
|
30
30
|
async function renameAppBundleExe(contentsPath) {
|
|
31
31
|
const currentExePath = (0, path_1.join)(contentsPath, "MacOS/io.Connect Desktop");
|
|
32
|
-
const newExePath = (0, path_1.join)(contentsPath, "MacOS", config_service_1.ConfigManager.config.mac.appBundleName.replace(
|
|
32
|
+
const newExePath = (0, path_1.join)(contentsPath, "MacOS", config_service_1.ConfigManager.config.mac.appBundleName.replace(".app", ""));
|
|
33
33
|
if ((0, fs_1.existsSync)(newExePath)) {
|
|
34
34
|
logger.debug(`Executable already correctly named: ${newExePath}`);
|
|
35
35
|
return;
|
|
@@ -56,21 +56,23 @@ async function renameAppBundleExe(contentsPath) {
|
|
|
56
56
|
async function renameElectronHelpers(appBundlePath, newBaseName) {
|
|
57
57
|
try {
|
|
58
58
|
logger.debug(`Renaming Electron Helper apps to match: ${newBaseName}`);
|
|
59
|
-
const frameworksPath = (0, path_1.join)(appBundlePath,
|
|
59
|
+
const frameworksPath = (0, path_1.join)(appBundlePath, "Contents", "Frameworks");
|
|
60
60
|
if (!(0, fs_1.existsSync)(frameworksPath)) {
|
|
61
|
-
logger.debug(
|
|
61
|
+
logger.debug("No Frameworks directory found - skipping Electron Helper renaming");
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
64
|
// Find all Helper app bundles in Frameworks (they may have various names)
|
|
65
65
|
const frameworkItems = (0, fs_1.readdirSync)(frameworksPath, { withFileTypes: true });
|
|
66
66
|
const helperApps = frameworkItems
|
|
67
|
-
.filter(item => item.isDirectory() &&
|
|
67
|
+
.filter(item => item.isDirectory() &&
|
|
68
|
+
item.name.includes("Helper") &&
|
|
69
|
+
item.name.endsWith(".app"))
|
|
68
70
|
.map(item => item.name);
|
|
69
71
|
if (helperApps.length === 0) {
|
|
70
|
-
logger.debug(
|
|
72
|
+
logger.debug("No Helper apps found in Frameworks directory");
|
|
71
73
|
return;
|
|
72
74
|
}
|
|
73
|
-
logger.debug(`Found ${helperApps.length} Helper apps to rename: ${helperApps.join(
|
|
75
|
+
logger.debug(`Found ${helperApps.length} Helper apps to rename: ${helperApps.join(", ")}`);
|
|
74
76
|
for (const helperAppName of helperApps) {
|
|
75
77
|
const currentHelperPath = (0, path_1.join)(frameworksPath, helperAppName);
|
|
76
78
|
// Determine the new helper app name based on the current helper type
|
|
@@ -108,7 +110,7 @@ async function renameElectronHelpers(appBundlePath, newBaseName) {
|
|
|
108
110
|
function getNewHelperAppName(currentHelperName, newBaseName) {
|
|
109
111
|
// Helper patterns can be:
|
|
110
112
|
// - "Electron Helper.app"
|
|
111
|
-
// - "Electron Helper (GPU).app"
|
|
113
|
+
// - "Electron Helper (GPU).app"
|
|
112
114
|
// - "io.Connect Desktop Helper.app"
|
|
113
115
|
// - "io.Connect Desktop Helper (GPU).app"
|
|
114
116
|
// - "SomeApp Helper.app"
|
|
@@ -116,19 +118,19 @@ function getNewHelperAppName(currentHelperName, newBaseName) {
|
|
|
116
118
|
// Extract the suffix (e.g., " (GPU)", " (Plugin)", etc.) and the word "Helper"
|
|
117
119
|
const helperMatch = currentHelperName.match(/^(.+?)\s+Helper(\s\([^)]+\))?\.app$/);
|
|
118
120
|
if (helperMatch) {
|
|
119
|
-
const suffix = helperMatch[2] ||
|
|
121
|
+
const suffix = helperMatch[2] || ""; // The part like " (GPU)" or empty string
|
|
120
122
|
return `${newBaseName} Helper${suffix}.app`;
|
|
121
123
|
}
|
|
122
124
|
// Fallback: if we can't parse the pattern, try to preserve any suffix after "Helper"
|
|
123
125
|
const suffixMatch = currentHelperName.match(/Helper(\s\([^)]+\))?\.app$/);
|
|
124
|
-
const suffix = suffixMatch ? suffixMatch[1] ||
|
|
126
|
+
const suffix = suffixMatch ? suffixMatch[1] || "" : "";
|
|
125
127
|
return `${newBaseName} Helper${suffix}.app`;
|
|
126
128
|
}
|
|
127
129
|
/**
|
|
128
130
|
* Rename the executable inside the helper app's MacOS folder
|
|
129
131
|
*/
|
|
130
132
|
async function renameHelperExecutable(helperAppPath, newBaseName) {
|
|
131
|
-
const macOSPath = (0, path_1.join)(helperAppPath,
|
|
133
|
+
const macOSPath = (0, path_1.join)(helperAppPath, "Contents", "MacOS");
|
|
132
134
|
if (!(0, fs_1.existsSync)(macOSPath)) {
|
|
133
135
|
logger.debug(`No MacOS directory found in helper app: ${helperAppPath}`);
|
|
134
136
|
return;
|
|
@@ -174,20 +176,20 @@ function getNewHelperExecutableName(currentExeName, newBaseName) {
|
|
|
174
176
|
// - "io.Connect Desktop Helper (Plugin)"
|
|
175
177
|
const helperMatch = currentExeName.match(/^(.+?)\s+Helper(\s\([^)]+\))?$/);
|
|
176
178
|
if (helperMatch) {
|
|
177
|
-
const suffix = helperMatch[2] ||
|
|
179
|
+
const suffix = helperMatch[2] || ""; // The part like " (GPU)" or empty string
|
|
178
180
|
return `${newBaseName} Helper${suffix}`;
|
|
179
181
|
}
|
|
180
182
|
// Fallback patterns for specific suffixes
|
|
181
|
-
if (currentExeName.includes(
|
|
183
|
+
if (currentExeName.includes("Helper (GPU)")) {
|
|
182
184
|
return `${newBaseName} Helper (GPU)`;
|
|
183
185
|
}
|
|
184
|
-
else if (currentExeName.includes(
|
|
186
|
+
else if (currentExeName.includes("Helper (Plugin)")) {
|
|
185
187
|
return `${newBaseName} Helper (Plugin)`;
|
|
186
188
|
}
|
|
187
|
-
else if (currentExeName.includes(
|
|
189
|
+
else if (currentExeName.includes("Helper (Renderer)")) {
|
|
188
190
|
return `${newBaseName} Helper (Renderer)`;
|
|
189
191
|
}
|
|
190
|
-
else if (currentExeName.includes(
|
|
192
|
+
else if (currentExeName.includes("Helper")) {
|
|
191
193
|
return `${newBaseName} Helper`;
|
|
192
194
|
}
|
|
193
195
|
// If no recognized pattern, keep original name
|
|
@@ -196,7 +198,7 @@ function getNewHelperExecutableName(currentExeName, newBaseName) {
|
|
|
196
198
|
async function updateInfoPlist(contentsPath) {
|
|
197
199
|
logger.debug(`Patching Info.plist for iocd component on macOS`);
|
|
198
200
|
const plistPath = (0, path_1.join)(contentsPath, "Info.plist");
|
|
199
|
-
const bundleNameWithoutApp = config_service_1.ConfigManager.config.mac.appBundleName.replace(
|
|
201
|
+
const bundleNameWithoutApp = config_service_1.ConfigManager.config.mac.appBundleName.replace(".app", "");
|
|
200
202
|
const plist = require("plist");
|
|
201
203
|
const info = plist.parse((0, fs_1.readFileSync)(plistPath, "utf8"));
|
|
202
204
|
// replace any special characters with dots and lowercase the name from package.json
|
|
@@ -215,7 +217,7 @@ async function updateInfoPlist(contentsPath) {
|
|
|
215
217
|
* Update the Info.plist file inside the helper app
|
|
216
218
|
*/
|
|
217
219
|
async function updateHelperInfoPlist(helperAppPath, newBaseName) {
|
|
218
|
-
const infoPlistPath = (0, path_1.join)(helperAppPath,
|
|
220
|
+
const infoPlistPath = (0, path_1.join)(helperAppPath, "Contents", "Info.plist");
|
|
219
221
|
const plist = require("plist");
|
|
220
222
|
logger.debug(`Patching ${infoPlistPath} for helper app`);
|
|
221
223
|
if (!(0, fs_1.existsSync)(infoPlistPath)) {
|
|
@@ -223,7 +225,7 @@ async function updateHelperInfoPlist(helperAppPath, newBaseName) {
|
|
|
223
225
|
return;
|
|
224
226
|
}
|
|
225
227
|
try {
|
|
226
|
-
const plistContent = (0, fs_1.readFileSync)(infoPlistPath,
|
|
228
|
+
const plistContent = (0, fs_1.readFileSync)(infoPlistPath, "utf8");
|
|
227
229
|
const plistData = plist.parse(plistContent);
|
|
228
230
|
// Update relevant fields
|
|
229
231
|
if (plistData.CFBundleName) {
|
|
@@ -241,19 +243,21 @@ async function updateHelperInfoPlist(helperAppPath, newBaseName) {
|
|
|
241
243
|
// Update bundle identifier to reflect new name
|
|
242
244
|
if (plistData.CFBundleIdentifier) {
|
|
243
245
|
const mainIdentifier = config_service_1.ConfigManager.config.mac.appBundleId;
|
|
244
|
-
// If the main bundle identifier is "com.interopio.io.connect.desktop",
|
|
246
|
+
// If the main bundle identifier is "com.interopio.io.connect.desktop",
|
|
245
247
|
// then helper might be "com.interopio.io.connect.desktop.helper"
|
|
246
248
|
// or "com.interopio.io.connect.desktop.helper.GPU", etc.
|
|
247
249
|
// get suffix from the string in () in the new bundle name
|
|
248
|
-
const suffixMatch = plistData.CFBundleName.indexOf(
|
|
249
|
-
|
|
250
|
+
const suffixMatch = plistData.CFBundleName.indexOf("(") !== -1
|
|
251
|
+
? plistData.CFBundleName.match(/\(([^)]+)\)/)
|
|
252
|
+
: null;
|
|
253
|
+
const suffix = suffixMatch ? `helper.${suffixMatch[1]}` : "helper";
|
|
250
254
|
const identifier = `${mainIdentifier}.${suffix}`;
|
|
251
255
|
// Replace any old app name in bundle identifier with new name
|
|
252
256
|
plistData.CFBundleIdentifier = identifier;
|
|
253
257
|
}
|
|
254
258
|
// Write updated plist
|
|
255
259
|
const updatedPlistContent = plist.build(plistData);
|
|
256
|
-
(0, fs_1.writeFileSync)(infoPlistPath, updatedPlistContent,
|
|
260
|
+
(0, fs_1.writeFileSync)(infoPlistPath, updatedPlistContent, "utf8");
|
|
257
261
|
logger.debug(`Patched Info.plist for helper app: ${helperAppPath}`);
|
|
258
262
|
}
|
|
259
263
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macOS.helper.js","sourceRoot":"","sources":["../../../src/services/modifications/macOS.helper.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"macOS.helper.js","sourceRoot":"","sources":["../../../src/services/modifications/macOS.helper.ts"],"names":[],"mappings":"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"}
|