intellitester 0.2.42 → 0.2.44
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/{chunk-YTTMMYRA.cjs → chunk-C46Q6B6I.cjs} +78 -15
- package/dist/chunk-C46Q6B6I.cjs.map +1 -0
- package/dist/{chunk-4MKGIPFO.js → chunk-ETAMKABR.js} +78 -15
- package/dist/chunk-ETAMKABR.js.map +1 -0
- package/dist/cli/index.cjs +47 -24
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +33 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +13 -13
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-4MKGIPFO.js.map +0 -1
- package/dist/chunk-YTTMMYRA.cjs.map +0 -1
|
@@ -945,18 +945,43 @@ var cleanupStaleSession = async (entry, cleanupConfig) => {
|
|
|
945
945
|
} catch {
|
|
946
946
|
}
|
|
947
947
|
};
|
|
948
|
+
var cleanupOrphanedTrackFiles = async (cwd, state, trackDir) => {
|
|
949
|
+
const dir = getTrackDir(cwd, trackDir);
|
|
950
|
+
try {
|
|
951
|
+
const files = await fs__default.default.readdir(dir);
|
|
952
|
+
const activeFiles = new Set(Object.values(state.sessions).map((s) => path2__default.default.basename(s.trackFile)));
|
|
953
|
+
for (const file of files) {
|
|
954
|
+
if (!file.endsWith(".jsonl")) continue;
|
|
955
|
+
if (activeFiles.has(file)) continue;
|
|
956
|
+
const filePath = path2__default.default.join(dir, file);
|
|
957
|
+
try {
|
|
958
|
+
const stat = await fs__default.default.stat(filePath);
|
|
959
|
+
const staleMs = Number(process.env.INTELLITESTER_STALE_TEST_MS ?? DEFAULT_STALE_MS);
|
|
960
|
+
const isOld = Date.now() - stat.mtimeMs > staleMs;
|
|
961
|
+
const isEmpty = stat.size === 0;
|
|
962
|
+
if (isEmpty || isOld) {
|
|
963
|
+
await fs__default.default.rm(filePath, { force: true });
|
|
964
|
+
}
|
|
965
|
+
} catch {
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
} catch {
|
|
969
|
+
}
|
|
970
|
+
};
|
|
948
971
|
var pruneStaleTests = async (cwd, cleanupConfig, trackDir) => {
|
|
949
972
|
const state = await loadActiveTests(cwd, trackDir);
|
|
950
973
|
const staleMs = Number(process.env.INTELLITESTER_STALE_TEST_MS ?? DEFAULT_STALE_MS);
|
|
951
974
|
let changed = false;
|
|
952
975
|
for (const [sessionId, entry] of Object.entries(state.sessions)) {
|
|
953
976
|
let missingFile = false;
|
|
977
|
+
let isEmpty = false;
|
|
954
978
|
try {
|
|
955
|
-
await fs__default.default.
|
|
979
|
+
const stat = await fs__default.default.stat(entry.trackFile);
|
|
980
|
+
isEmpty = stat.size === 0;
|
|
956
981
|
} catch {
|
|
957
982
|
missingFile = true;
|
|
958
983
|
}
|
|
959
|
-
if (!missingFile && !isStale(entry, staleMs)) continue;
|
|
984
|
+
if (!missingFile && !isEmpty && !isStale(entry, staleMs)) continue;
|
|
960
985
|
changed = true;
|
|
961
986
|
await cleanupStaleSession(entry, cleanupConfig);
|
|
962
987
|
try {
|
|
@@ -968,6 +993,7 @@ var pruneStaleTests = async (cwd, cleanupConfig, trackDir) => {
|
|
|
968
993
|
if (changed) {
|
|
969
994
|
await saveActiveTests(cwd, state, trackDir);
|
|
970
995
|
}
|
|
996
|
+
await cleanupOrphanedTrackFiles(cwd, state, trackDir);
|
|
971
997
|
};
|
|
972
998
|
async function initFileTracking(options) {
|
|
973
999
|
const cwd = options.cwd ?? process.cwd();
|
|
@@ -1188,14 +1214,6 @@ async function isServerRunning(url) {
|
|
|
1188
1214
|
return false;
|
|
1189
1215
|
}
|
|
1190
1216
|
}
|
|
1191
|
-
async function waitForServer(url, timeout) {
|
|
1192
|
-
const start = Date.now();
|
|
1193
|
-
while (Date.now() - start < timeout) {
|
|
1194
|
-
if (await isServerRunning(url)) return;
|
|
1195
|
-
await new Promise((r) => setTimeout(r, 500));
|
|
1196
|
-
}
|
|
1197
|
-
throw new Error(`Server at ${url} not ready after ${timeout}ms`);
|
|
1198
|
-
}
|
|
1199
1217
|
async function detectBuildDirectory(cwd) {
|
|
1200
1218
|
const commonDirs = [
|
|
1201
1219
|
".next",
|
|
@@ -1308,7 +1326,7 @@ async function detectServerCommand(cwd) {
|
|
|
1308
1326
|
throw new Error("Could not auto-detect server command. Please specify command explicitly.");
|
|
1309
1327
|
}
|
|
1310
1328
|
async function startWebServer(config) {
|
|
1311
|
-
const { url, reuseExistingServer = true, timeout = 3e4 } = config;
|
|
1329
|
+
const { url, reuseExistingServer = true, timeout = 3e4, idleTimeout = 2e4 } = config;
|
|
1312
1330
|
const cwd = config.workdir ?? config.cwd ?? process.cwd();
|
|
1313
1331
|
if (reuseExistingServer && await isServerRunning(url)) {
|
|
1314
1332
|
console.log(`Server already running at ${url}`);
|
|
@@ -1332,13 +1350,58 @@ async function startWebServer(config) {
|
|
|
1332
1350
|
cwd,
|
|
1333
1351
|
detached: false
|
|
1334
1352
|
});
|
|
1353
|
+
let stderrOutput = "";
|
|
1354
|
+
let lastOutputTime = Date.now();
|
|
1335
1355
|
serverProcess.stdout?.on("data", (data) => {
|
|
1356
|
+
lastOutputTime = Date.now();
|
|
1336
1357
|
process.stdout.write(`[server] ${data}`);
|
|
1337
1358
|
});
|
|
1338
1359
|
serverProcess.stderr?.on("data", (data) => {
|
|
1360
|
+
lastOutputTime = Date.now();
|
|
1361
|
+
stderrOutput += data.toString();
|
|
1339
1362
|
process.stderr.write(`[server] ${data}`);
|
|
1340
1363
|
});
|
|
1341
|
-
await
|
|
1364
|
+
await new Promise((resolve, reject) => {
|
|
1365
|
+
let resolved = false;
|
|
1366
|
+
const startTime = Date.now();
|
|
1367
|
+
const cleanup = () => {
|
|
1368
|
+
resolved = true;
|
|
1369
|
+
clearInterval(pollInterval);
|
|
1370
|
+
};
|
|
1371
|
+
serverProcess.on("close", (code) => {
|
|
1372
|
+
if (!resolved && code !== 0 && code !== null) {
|
|
1373
|
+
cleanup();
|
|
1374
|
+
reject(new Error(`Server exited with code ${code}
|
|
1375
|
+
${stderrOutput}`));
|
|
1376
|
+
}
|
|
1377
|
+
});
|
|
1378
|
+
serverProcess.on("error", (err) => {
|
|
1379
|
+
if (!resolved) {
|
|
1380
|
+
cleanup();
|
|
1381
|
+
reject(err);
|
|
1382
|
+
}
|
|
1383
|
+
});
|
|
1384
|
+
const pollInterval = setInterval(async () => {
|
|
1385
|
+
if (resolved) return;
|
|
1386
|
+
if (await isServerRunning(url)) {
|
|
1387
|
+
cleanup();
|
|
1388
|
+
resolve();
|
|
1389
|
+
return;
|
|
1390
|
+
}
|
|
1391
|
+
if (Date.now() - startTime > timeout) {
|
|
1392
|
+
cleanup();
|
|
1393
|
+
reject(new Error(`Server at ${url} not ready after ${timeout}ms`));
|
|
1394
|
+
return;
|
|
1395
|
+
}
|
|
1396
|
+
if (Date.now() - lastOutputTime > idleTimeout) {
|
|
1397
|
+
cleanup();
|
|
1398
|
+
serverProcess.kill("SIGTERM");
|
|
1399
|
+
reject(new Error(`Server stalled - no output for ${idleTimeout}ms. Last output:
|
|
1400
|
+
${stderrOutput.slice(-500)}`));
|
|
1401
|
+
return;
|
|
1402
|
+
}
|
|
1403
|
+
}, 500);
|
|
1404
|
+
});
|
|
1342
1405
|
console.log(`Server ready at ${url}`);
|
|
1343
1406
|
return serverProcess;
|
|
1344
1407
|
}
|
|
@@ -3013,7 +3076,7 @@ Starting workflow: ${workflow.name}`);
|
|
|
3013
3076
|
executionContext.variables.set(key, interpolated);
|
|
3014
3077
|
}
|
|
3015
3078
|
}
|
|
3016
|
-
const result = await runTestInWorkflow(test, page, executionContext, options, workflowDir, workflow.config?.web?.baseUrl);
|
|
3079
|
+
const result = await runTestInWorkflow(test, page, executionContext, options, workflowDir, workflow.config?.web?.baseUrl ?? options.baseUrl);
|
|
3017
3080
|
const testResult = {
|
|
3018
3081
|
id: testRef.id,
|
|
3019
3082
|
file: testRef.file,
|
|
@@ -3368,5 +3431,5 @@ exports.runWorkflowWithContext = runWorkflowWithContext;
|
|
|
3368
3431
|
exports.setupAppwriteTracking = setupAppwriteTracking;
|
|
3369
3432
|
exports.startTrackingServer = startTrackingServer;
|
|
3370
3433
|
exports.startWebServer = startWebServer;
|
|
3371
|
-
//# sourceMappingURL=chunk-
|
|
3372
|
-
//# sourceMappingURL=chunk-
|
|
3434
|
+
//# sourceMappingURL=chunk-C46Q6B6I.cjs.map
|
|
3435
|
+
//# sourceMappingURL=chunk-C46Q6B6I.cjs.map
|