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.
@@ -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.access(entry.trackFile);
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 waitForServer(url, timeout);
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-YTTMMYRA.cjs.map
3372
- //# sourceMappingURL=chunk-YTTMMYRA.cjs.map
3434
+ //# sourceMappingURL=chunk-C46Q6B6I.cjs.map
3435
+ //# sourceMappingURL=chunk-C46Q6B6I.cjs.map