@interopio/iocd-cli 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -865
- package/changelog.md +17 -0
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/apps.command.js +1 -6
- package/dist/commands/apps.command.js.map +1 -1
- package/dist/commands/modifications.command.js +2 -2
- package/dist/commands/modifications.command.js.map +1 -1
- package/dist/commands/test.command.js +6 -0
- package/dist/commands/test.command.js.map +1 -1
- package/dist/services/components/components.service.js +17 -3
- package/dist/services/components/components.service.js.map +1 -1
- package/dist/services/components/stores/github.store.js +30 -2
- package/dist/services/components/stores/github.store.js.map +1 -1
- package/dist/services/installer/electronForge.js +5 -0
- package/dist/services/installer/electronForge.js.map +1 -1
- package/dist/services/installer/installer.service.js +26 -0
- package/dist/services/installer/installer.service.js.map +1 -1
- package/dist/services/installer/prerequisites.js +10 -3
- package/dist/services/installer/prerequisites.js.map +1 -1
- package/dist/services/installer/windows.helper.js +17 -1
- package/dist/services/installer/windows.helper.js.map +1 -1
- package/dist/services/installer/zip-maker.js +122 -0
- package/dist/services/installer/zip-maker.js.map +1 -0
- package/dist/services/installer/zip.helper.js +94 -0
- package/dist/services/installer/zip.helper.js.map +1 -0
- package/dist/services/license.service.js +58 -8
- package/dist/services/license.service.js.map +1 -1
- package/dist/services/modifications/modifications.service.js +22 -1
- package/dist/services/modifications/modifications.service.js.map +1 -1
- package/dist/services/modifications/windows.helper.js +95 -49
- package/dist/services/modifications/windows.helper.js.map +1 -1
- package/dist/services/test-infrastructure.service.js +23 -0
- package/dist/services/test-infrastructure.service.js.map +1 -1
- package/dist/services/test.service.js +57 -21
- package/dist/services/test.service.js.map +1 -1
- package/dist/templates/ioconnect-desktop/README.md +2 -865
- package/dist/templates/ioconnect-desktop/config/forge.config.js +2 -2
- package/dist/templates/ioconnect-desktop/package.json +1 -2
- package/dist/templates/tests/.agents/skills/iocd-wdio-testing/references/configuration.md +7 -3
- package/dist/utils/error.handler.js +6 -2
- package/dist/utils/error.handler.js.map +1 -1
- package/dist/utils/external-tool.js +34 -0
- package/dist/utils/external-tool.js.map +1 -0
- package/dist/utils/template-update.js +10 -1
- package/dist/utils/template-update.js.map +1 -1
- package/dist/utils/terminal-output-guard.js +5 -0
- package/dist/utils/terminal-output-guard.js.map +1 -0
- package/dist/utils/terminal-output.js +25 -0
- package/dist/utils/terminal-output.js.map +1 -0
- package/package.json +2 -1
|
@@ -10,6 +10,7 @@ const child_process_1 = require("child_process");
|
|
|
10
10
|
const find_package_dir_1 = require("../../utils/find.package.dir");
|
|
11
11
|
const version_1 = require("../../utils/version");
|
|
12
12
|
const error_handler_1 = require("../../utils/error.handler");
|
|
13
|
+
const external_tool_1 = require("../../utils/external-tool");
|
|
13
14
|
const logger = logger_1.Logger.getInstance("modifications.windows.helper");
|
|
14
15
|
async function modifyExe() {
|
|
15
16
|
logger.info("Modifying Windows executable...");
|
|
@@ -17,11 +18,21 @@ async function modifyExe() {
|
|
|
17
18
|
const newExePath = (0, path_1.join)(path_2.PathUtils.getComponentDir("iocd"), `${options.win.exe.exeName}`);
|
|
18
19
|
logger.info(`Checking if target ${newExePath} is locked by another process...`);
|
|
19
20
|
if ((0, fs_1.existsSync)(newExePath)) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
const fileLockStatus = checkFileLock(newExePath);
|
|
22
|
+
if (fileLockStatus.isLocked) {
|
|
23
|
+
const isExpectedLock = !fileLockStatus.reportToSentry;
|
|
24
|
+
throw new error_handler_1.CLIError(isExpectedLock
|
|
25
|
+
? `Cannot modify executable because it is locked: ${newExePath}.`
|
|
26
|
+
: `Cannot access executable for modification: ${newExePath}.`, {
|
|
27
|
+
cause: fileLockStatus.cause,
|
|
28
|
+
reportToSentry: fileLockStatus.reportToSentry,
|
|
29
|
+
suggestions: isExpectedLock
|
|
30
|
+
? [
|
|
31
|
+
"Please close any running instances of the application and try again.",
|
|
32
|
+
]
|
|
33
|
+
: [
|
|
34
|
+
"Check that the executable is writable and that you have permission to modify it.",
|
|
35
|
+
],
|
|
25
36
|
});
|
|
26
37
|
}
|
|
27
38
|
logger.debug("Executable is not locked, proceeding with modifications.");
|
|
@@ -91,62 +102,97 @@ function restoreOriginalUnsignedExe(newExePath) {
|
|
|
91
102
|
}
|
|
92
103
|
}
|
|
93
104
|
async function changeIconAndMetadata(exePath, options) {
|
|
105
|
+
logger.debug(`Updating icon and metadata for executable: ${exePath}`);
|
|
106
|
+
const rceditPath = (0, path_1.join)((0, find_package_dir_1.findPackageRoot)(), "tools", "rcedit-x64.exe");
|
|
107
|
+
const args = [
|
|
108
|
+
exePath,
|
|
109
|
+
"--set-icon",
|
|
110
|
+
options.win.exe.exeIconPath,
|
|
111
|
+
"--set-version-string",
|
|
112
|
+
"CompanyName",
|
|
113
|
+
options.company,
|
|
114
|
+
"--set-version-string",
|
|
115
|
+
"FileDescription",
|
|
116
|
+
options.productDescription,
|
|
117
|
+
"--set-version-string",
|
|
118
|
+
"ProductName",
|
|
119
|
+
options.productName,
|
|
120
|
+
"--set-file-version",
|
|
121
|
+
(0, version_1.makeVersionFourDigitsIfNeeded)(options.version),
|
|
122
|
+
"--set-product-version",
|
|
123
|
+
options.version,
|
|
124
|
+
];
|
|
125
|
+
logger.debug(`Executing rcedit with args: ${args.join(" ")}`);
|
|
126
|
+
try {
|
|
127
|
+
const result = process.platform === "linux"
|
|
128
|
+
? await runRceditWithWine(rceditPath, args)
|
|
129
|
+
: await runExecutable(rceditPath, args);
|
|
130
|
+
if (result.stderr) {
|
|
131
|
+
logger.error("rcedit stderr:", result.stderr);
|
|
132
|
+
}
|
|
133
|
+
logger.debug("rcedit output:", result.stdout);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
logger.error("rcedit error:", error);
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async function runRceditWithWine(rceditPath, args) {
|
|
141
|
+
let lastMissingExecutableError = new Error("Neither wine64 nor wine was found on PATH");
|
|
142
|
+
for (const wineCommand of ["wine64", "wine"]) {
|
|
143
|
+
try {
|
|
144
|
+
return await runExecutable(wineCommand, [rceditPath, ...args]);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (!(0, external_tool_1.isMissingExecutableError)(error)) {
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
lastMissingExecutableError = error;
|
|
151
|
+
logger.debug(`${wineCommand} was not found on PATH`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
throw new error_handler_1.CLIError("Wine is required to update Windows executable metadata on Linux.", {
|
|
155
|
+
code: error_handler_1.ErrorCode.NOT_FOUND,
|
|
156
|
+
cause: lastMissingExecutableError,
|
|
157
|
+
reportToSentry: false,
|
|
158
|
+
suggestions: [
|
|
159
|
+
"Install Wine with 64-bit support and ensure `wine64` or `wine` is available on PATH.",
|
|
160
|
+
"Alternatively, run the command on Windows.",
|
|
161
|
+
],
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function runExecutable(command, args) {
|
|
94
165
|
return new Promise((resolve, reject) => {
|
|
95
|
-
|
|
96
|
-
const rceditPath = (0, path_1.join)((0, find_package_dir_1.findPackageRoot)(), "tools", "rcedit-x64.exe");
|
|
97
|
-
const args = [
|
|
98
|
-
exePath,
|
|
99
|
-
"--set-icon",
|
|
100
|
-
options.win.exe.exeIconPath,
|
|
101
|
-
"--set-version-string",
|
|
102
|
-
"CompanyName",
|
|
103
|
-
options.company,
|
|
104
|
-
"--set-version-string",
|
|
105
|
-
"FileDescription",
|
|
106
|
-
options.productDescription,
|
|
107
|
-
"--set-version-string",
|
|
108
|
-
"ProductName",
|
|
109
|
-
options.productName,
|
|
110
|
-
"--set-file-version",
|
|
111
|
-
(0, version_1.makeVersionFourDigitsIfNeeded)(options.version),
|
|
112
|
-
"--set-product-version",
|
|
113
|
-
options.version,
|
|
114
|
-
];
|
|
115
|
-
const callback = (error, stdout, stderr) => {
|
|
166
|
+
(0, child_process_1.execFile)(command, args, (error, stdout, stderr) => {
|
|
116
167
|
if (error) {
|
|
117
|
-
|
|
118
|
-
return
|
|
168
|
+
reject(error);
|
|
169
|
+
return;
|
|
119
170
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
logger.debug("rcedit output:", stdout);
|
|
124
|
-
resolve();
|
|
125
|
-
};
|
|
126
|
-
logger.debug(`Executing rcedit with args: ${args.join(" ")}`);
|
|
127
|
-
if (process.platform === "linux") {
|
|
128
|
-
(0, child_process_1.execFile)("wine64", [rceditPath, ...args], callback);
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
(0, child_process_1.execFile)(rceditPath, args, callback);
|
|
132
|
-
}
|
|
171
|
+
resolve({ stdout, stderr });
|
|
172
|
+
});
|
|
133
173
|
});
|
|
134
174
|
}
|
|
135
|
-
function
|
|
175
|
+
function checkFileLock(path) {
|
|
136
176
|
try {
|
|
137
177
|
logger.debug(`Checking if file is locked: ${path}`);
|
|
138
178
|
const fd = (0, fs_1.openSync)(path, "r+"); // request read/write exclusive access
|
|
139
179
|
(0, fs_1.closeSync)(fd);
|
|
140
180
|
logger.debug(`File is not locked: ${path}`);
|
|
141
|
-
return
|
|
181
|
+
return { isLocked: false };
|
|
142
182
|
}
|
|
143
|
-
catch (
|
|
144
|
-
logger.debug(`Error while checking if file is locked: ${path}`,
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
183
|
+
catch (error) {
|
|
184
|
+
logger.debug(`Error while checking if file is locked: ${path}`, error);
|
|
185
|
+
if (!(error instanceof Error) || !("code" in error)) {
|
|
186
|
+
return { isLocked: false };
|
|
187
|
+
}
|
|
188
|
+
const code = error.code;
|
|
189
|
+
if (code === "EBUSY") {
|
|
190
|
+
return { isLocked: true, reportToSentry: false, cause: error };
|
|
191
|
+
}
|
|
192
|
+
if (code === "EPERM" || code === "EACCES") {
|
|
193
|
+
return { isLocked: true, reportToSentry: true, cause: error };
|
|
148
194
|
}
|
|
149
|
-
return false;
|
|
195
|
+
return { isLocked: false };
|
|
150
196
|
}
|
|
151
197
|
}
|
|
152
198
|
//# sourceMappingURL=windows.helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windows.helper.js","sourceRoot":"","sources":["../../../src/services/modifications/windows.helper.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"windows.helper.js","sourceRoot":"","sources":["../../../src/services/modifications/windows.helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,9 @@ const path_1 = require("path");
|
|
|
6
6
|
const child_process_1 = require("child_process");
|
|
7
7
|
const path_2 = require("../utils/path");
|
|
8
8
|
const skills_service_1 = require("./skills.service");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
9
10
|
class TestInfrastructureService {
|
|
11
|
+
logger = logger_1.Logger.getInstance("test-infrastructure.service");
|
|
10
12
|
rootDir;
|
|
11
13
|
testsDir;
|
|
12
14
|
templateDir;
|
|
@@ -24,18 +26,30 @@ class TestInfrastructureService {
|
|
|
24
26
|
this.runNpm = options.runNpm ?? this.runNpmCommand.bind(this);
|
|
25
27
|
}
|
|
26
28
|
async setup() {
|
|
29
|
+
this.logger.info("Starting test infrastructure setup...");
|
|
30
|
+
this.logger.debug(`Seed root directory: ${this.rootDir}`);
|
|
31
|
+
this.logger.debug(`Test infrastructure directory: ${this.testsDir}`);
|
|
32
|
+
this.logger.debug(`Test template directory: ${this.templateDir}`);
|
|
27
33
|
this.assertTestsDirWithinRoot();
|
|
28
34
|
if ((0, fs_1.existsSync)(this.testsDir)) {
|
|
35
|
+
this.logger.warn(`Test infrastructure directory already exists: ${this.testsDir}`);
|
|
29
36
|
throw new Error(`The tests directory already exists at '${this.testsDir}'. Back up or remove it, then run 'iocd test setup' again.`);
|
|
30
37
|
}
|
|
31
38
|
try {
|
|
39
|
+
this.logger.info("Creating test infrastructure files...");
|
|
32
40
|
(0, fs_1.mkdirSync)(this.testsDir, { recursive: true });
|
|
33
41
|
this.copyDirectory((0, path_1.join)(this.templateDir, "tests"), this.testsDir, true);
|
|
34
42
|
await this.validateInstallation();
|
|
43
|
+
this.logger.info("Installing missing Agent Skills...");
|
|
35
44
|
this.skillsService.installMissing();
|
|
45
|
+
this.logger.debug("Agent Skill installation completed");
|
|
46
|
+
this.logger.info("Test infrastructure setup completed successfully.");
|
|
36
47
|
}
|
|
37
48
|
catch (error) {
|
|
49
|
+
this.logger.error("Test infrastructure setup failed:", error);
|
|
50
|
+
this.logger.warn("Removing partially created test infrastructure...");
|
|
38
51
|
(0, fs_1.rmSync)(this.testsDir, { recursive: true, force: true });
|
|
52
|
+
this.logger.debug("Partial test infrastructure cleanup completed");
|
|
39
53
|
throw new Error(`Test infrastructure setup failed and the created files were removed: ${error.message}`);
|
|
40
54
|
}
|
|
41
55
|
}
|
|
@@ -59,6 +73,7 @@ class TestInfrastructureService {
|
|
|
59
73
|
? (0, path_1.join)((0, fs_1.realpathSync)(existingAncestor), suffix)
|
|
60
74
|
: (0, fs_1.realpathSync)(existingAncestor);
|
|
61
75
|
if (!realTarget.startsWith(realRoot + path_1.sep)) {
|
|
76
|
+
this.logger.error(`Test infrastructure directory resolves outside the seed root: ${realTarget}`);
|
|
62
77
|
throw new Error(`The tests directory must resolve inside the seed root. '${this.testsDir}' escapes '${this.rootDir}'. Set 'testsDirectory' to a path within the project.`);
|
|
63
78
|
}
|
|
64
79
|
}
|
|
@@ -72,16 +87,24 @@ class TestInfrastructureService {
|
|
|
72
87
|
}
|
|
73
88
|
else if (overwrite || !(0, fs_1.existsSync)(destinationPath)) {
|
|
74
89
|
(0, fs_1.cpSync)(sourcePath, destinationPath);
|
|
90
|
+
this.logger.debug(`Copied ${sourcePath} to ${destinationPath}`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.logger.debug(`Preserved existing file: ${destinationPath}`);
|
|
75
94
|
}
|
|
76
95
|
}
|
|
77
96
|
}
|
|
78
97
|
async validateInstallation() {
|
|
98
|
+
this.logger.info("Installing test infrastructure dependencies...");
|
|
79
99
|
await this.runNpm(["install"], this.testsDir);
|
|
100
|
+
this.logger.info("Validating test infrastructure types...");
|
|
80
101
|
await this.runNpm(["run", "typecheck"], this.testsDir);
|
|
102
|
+
this.logger.debug("Test infrastructure validation completed");
|
|
81
103
|
}
|
|
82
104
|
runNpmCommand(args, cwd) {
|
|
83
105
|
return new Promise((resolve, reject) => {
|
|
84
106
|
const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
107
|
+
this.logger.debug(`Running ${npmCommand} ${args.join(" ")} in ${cwd}`);
|
|
85
108
|
const child = (0, child_process_1.spawn)(npmCommand, args, {
|
|
86
109
|
cwd,
|
|
87
110
|
stdio: "inherit",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-infrastructure.service.js","sourceRoot":"","sources":["../../src/services/test-infrastructure.service.ts"],"names":[],"mappings":";;;AAAA,2BAOY;AACZ,+BAA6D;AAC7D,iDAAsC;AACtC,wCAA0C;AAC1C,qDAAiD;
|
|
1
|
+
{"version":3,"file":"test-infrastructure.service.js","sourceRoot":"","sources":["../../src/services/test-infrastructure.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,7 @@ const path = __importStar(require("path"));
|
|
|
40
40
|
const path_1 = require("../utils/path");
|
|
41
41
|
const child_process_1 = require("child_process");
|
|
42
42
|
const license_service_1 = require("./license.service");
|
|
43
|
+
const error_handler_1 = require("../utils/error.handler");
|
|
43
44
|
/**
|
|
44
45
|
* TestService handles running automated tests for the io.Connect Desktop application.
|
|
45
46
|
*
|
|
@@ -55,6 +56,7 @@ class TestService {
|
|
|
55
56
|
logger = logger_1.Logger.getInstance("test.service");
|
|
56
57
|
prepareIocd;
|
|
57
58
|
getLicenseKey;
|
|
59
|
+
spawnProcess;
|
|
58
60
|
constructor(options = {}) {
|
|
59
61
|
this.prepareIocd =
|
|
60
62
|
options.prepareIocd ??
|
|
@@ -64,31 +66,53 @@ class TestService {
|
|
|
64
66
|
});
|
|
65
67
|
this.getLicenseKey =
|
|
66
68
|
options.getLicenseKey ?? (() => new license_service_1.LicenseService().getLicenseKey());
|
|
69
|
+
this.spawnProcess = options.spawnProcess ?? child_process_1.spawn;
|
|
67
70
|
}
|
|
68
71
|
/**
|
|
69
72
|
* Run tests for the io.Connect Desktop application
|
|
70
73
|
*/
|
|
71
74
|
async runTests(args = []) {
|
|
72
75
|
this.logger.info("Starting test execution...");
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
this.logger.debug(`Forwarding ${args.length} test runner arguments`);
|
|
77
|
+
try {
|
|
78
|
+
// Find tests directory
|
|
79
|
+
const testsDir = path_1.PathUtils.getTestsDir();
|
|
80
|
+
if (!fs.existsSync(testsDir)) {
|
|
81
|
+
throw new Error(`Tests directory not found. Expected '${testsDir}' folder in project root.`);
|
|
82
|
+
}
|
|
83
|
+
this.logger.debug(`Tests directory: ${testsDir}`);
|
|
84
|
+
// Check if node_modules exists, if not run npm install
|
|
85
|
+
await this.ensureNodeModulesInstalled(testsDir);
|
|
86
|
+
this.ensureTestScriptConfigured(testsDir);
|
|
87
|
+
// Prepare the in-place component exactly as dev mode does before launching it.
|
|
88
|
+
this.logger.info("Preparing io.Connect Desktop for test execution...");
|
|
89
|
+
await this.prepareIocd();
|
|
90
|
+
this.logger.debug("io.Connect Desktop test preparation completed");
|
|
91
|
+
// Get the binary path based on platform
|
|
92
|
+
const binaryPath = path_1.PathUtils.getIOCDExePath();
|
|
93
|
+
this.logger.debug(`Binary path: ${binaryPath}`);
|
|
94
|
+
// Verify binary exists
|
|
95
|
+
if (!fs.existsSync(binaryPath)) {
|
|
96
|
+
throw new Error(`Binary not found at ${binaryPath} after dev preparation. Run 'iocd setup' to reinstall the configured component.`);
|
|
97
|
+
}
|
|
98
|
+
const licenseKey = this.getLicenseKey();
|
|
99
|
+
this.logger.debug(`Test license: ${licenseKey ? "configured" : "not configured"}`);
|
|
100
|
+
// Run the test script
|
|
101
|
+
await this.runTestScript(testsDir, binaryPath, args, licenseKey);
|
|
77
102
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
// Prepare the in-place component exactly as dev mode does before launching it.
|
|
82
|
-
await this.prepareIocd();
|
|
83
|
-
// Get the binary path based on platform
|
|
84
|
-
const binaryPath = path_1.PathUtils.getIOCDExePath();
|
|
85
|
-
this.logger.info(`Binary path: ${binaryPath}`);
|
|
86
|
-
// Verify binary exists
|
|
87
|
-
if (!fs.existsSync(binaryPath)) {
|
|
88
|
-
throw new Error(`Binary not found at ${binaryPath} after dev preparation. Run 'iocd setup' to reinstall the configured component.`);
|
|
103
|
+
catch (error) {
|
|
104
|
+
this.logger.error("Test execution failed:", error);
|
|
105
|
+
throw error;
|
|
89
106
|
}
|
|
90
|
-
|
|
91
|
-
|
|
107
|
+
}
|
|
108
|
+
ensureTestScriptConfigured(testsDir) {
|
|
109
|
+
const packageJsonPath = path.join(testsDir, "package.json");
|
|
110
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
111
|
+
const testScript = packageJson.scripts?.test;
|
|
112
|
+
if (typeof testScript !== "string" || testScript.trim().length === 0) {
|
|
113
|
+
throw new Error(`No test script found in tests package.json: ${packageJsonPath}`);
|
|
114
|
+
}
|
|
115
|
+
this.logger.debug("Test script is configured");
|
|
92
116
|
}
|
|
93
117
|
/**
|
|
94
118
|
* Ensure node_modules are installed in the tests directory
|
|
@@ -113,7 +137,8 @@ class TestService {
|
|
|
113
137
|
async runNpmInstall(cwd) {
|
|
114
138
|
return new Promise((resolve, reject) => {
|
|
115
139
|
const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
116
|
-
|
|
140
|
+
this.logger.debug(`Running ${npmCommand} install in ${cwd}`);
|
|
141
|
+
const child = this.spawnProcess(npmCommand, ["install"], {
|
|
117
142
|
cwd,
|
|
118
143
|
stdio: "inherit",
|
|
119
144
|
shell: true,
|
|
@@ -139,7 +164,8 @@ class TestService {
|
|
|
139
164
|
return new Promise((resolve, reject) => {
|
|
140
165
|
const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
141
166
|
const npmArgs = args.length > 0 ? ["test", "--", ...args] : ["test"];
|
|
142
|
-
|
|
167
|
+
this.logger.debug(`Running ${npmCommand} test in ${testsDir}`);
|
|
168
|
+
const child = this.spawnProcess(npmCommand, npmArgs, {
|
|
143
169
|
cwd: testsDir,
|
|
144
170
|
stdio: "inherit",
|
|
145
171
|
shell: true,
|
|
@@ -149,13 +175,23 @@ class TestService {
|
|
|
149
175
|
...(licenseKey ? { IOCD_LICENSE_KEY: licenseKey } : {}),
|
|
150
176
|
},
|
|
151
177
|
});
|
|
152
|
-
child.on("close", code => {
|
|
178
|
+
child.on("close", (code, signal) => {
|
|
153
179
|
if (code === 0) {
|
|
154
180
|
this.logger.info("Tests completed successfully");
|
|
155
181
|
resolve();
|
|
156
182
|
}
|
|
183
|
+
else if (code !== null && signal === null) {
|
|
184
|
+
reject(new error_handler_1.CLIError(`Tests failed with code ${code}`, {
|
|
185
|
+
reportToSentry: false,
|
|
186
|
+
suggestions: [
|
|
187
|
+
"Review the test runner output above for the cause of the failure.",
|
|
188
|
+
],
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
157
191
|
else {
|
|
158
|
-
reject(new Error(
|
|
192
|
+
reject(new Error(signal
|
|
193
|
+
? `Test process terminated by signal ${signal}`
|
|
194
|
+
: `Test process failed with unexpected code ${code}`));
|
|
159
195
|
}
|
|
160
196
|
});
|
|
161
197
|
child.on("error", err => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.service.js","sourceRoot":"","sources":["../../src/services/test.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAyC;AACzC,uCAAyB;AACzB,2CAA6B;AAC7B,wCAA0C;AAC1C,
|
|
1
|
+
{"version":3,"file":"test.service.js","sourceRoot":"","sources":["../../src/services/test.service.ts"],"names":[],"mappings":"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"}
|