@validate.qa/runner 1.0.101 → 1.0.102

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.
Files changed (31) hide show
  1. package/README.md +3 -0
  2. package/dist/{chunk-IGXGSDE3.mjs → chunk-3JM6XTSZ.mjs} +1298 -384
  3. package/dist/{chunk-BBTK6OX6.mjs → chunk-4WLP3RWN.mjs} +383 -11
  4. package/dist/{chunk-XZUUBMP3.mjs → chunk-5DFBEL72.mjs} +1 -1
  5. package/dist/{chunk-M3VZGHZQ.mjs → chunk-BXLEPT4M.mjs} +20 -10
  6. package/dist/{chunk-FQUH2PU2.mjs → chunk-CBVHPYVJ.mjs} +62 -2
  7. package/dist/{chunk-4SZC5ZX3.mjs → chunk-DN3O6EYT.mjs} +19461 -4077
  8. package/dist/{chunk-SN3PN4G4.mjs → chunk-E2RRAE27.mjs} +6 -2
  9. package/dist/{chunk-2OKZY3WN.mjs → chunk-E2VEMBQQ.mjs} +2 -2
  10. package/dist/{chunk-CYWHPXNZ.mjs → chunk-HJ6FKHMM.mjs} +1 -1
  11. package/dist/{chunk-CO5KHIVX.mjs → chunk-PWFWMVZU.mjs} +1 -1
  12. package/dist/{chunk-TPU42VH2.mjs → chunk-ZZYBRIBT.mjs} +10 -5
  13. package/dist/cli.js +135916 -118926
  14. package/dist/cli.mjs +349 -101
  15. package/dist/credential-mcp-server.js +1327 -348
  16. package/dist/credential-mcp-server.mjs +3 -3
  17. package/dist/discovery-mcp-server.js +1328 -400
  18. package/dist/discovery-mcp-server.mjs +4 -4
  19. package/dist/dist-52M5RDZ6.mjs +17 -0
  20. package/dist/inbox-mcp-server.js +1579 -605
  21. package/dist/inbox-mcp-server.mjs +3 -3
  22. package/dist/route-seed-worker.js +1244 -330
  23. package/dist/route-seed-worker.mjs +4 -4
  24. package/dist/run-write-guard-preload.js +1622 -332
  25. package/dist/run-write-guard-preload.mjs +4 -4
  26. package/dist/run-write-guard.js +1622 -332
  27. package/dist/run-write-guard.mjs +3 -3
  28. package/dist/spec-driver.js +1 -1
  29. package/dist/spec-driver.mjs +1 -1
  30. package/package.json +3 -2
  31. package/dist/dist-VTPBY2C4.mjs +0 -17
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  dist_exports,
3
3
  init_dist
4
- } from "./chunk-IGXGSDE3.mjs";
4
+ } from "./chunk-3JM6XTSZ.mjs";
5
5
  import {
6
6
  __commonJS,
7
7
  __esm,
@@ -67455,23 +67455,41 @@ var require_harness_init_script = __commonJS({
67455
67455
  exports.isHarnessInitConsoleLine = isHarnessInitConsoleLine;
67456
67456
  exports.stripHarnessConsoleEntries = stripHarnessConsoleEntries;
67457
67457
  var node_crypto_1 = __require("crypto");
67458
+ var shared_1 = (init_dist(), __toCommonJS(dist_exports));
67458
67459
  exports.HARNESS_INIT_SOURCE_URL = `vqa-harness-init-${(0, node_crypto_1.randomBytes)(4).toString("hex")}.js`;
67460
+ var TRANSITION_LOOP_LIMIT = 8;
67461
+ var TRANSITION_LOOP_WINDOW_MS = 1e3;
67459
67462
  function withHarnessSourceUrl(content) {
67460
67463
  return `${content}
67461
67464
  //# sourceURL=${exports.HARNESS_INIT_SOURCE_URL}`;
67462
67465
  }
67463
67466
  function buildAnimationDisablingSource(opts) {
67467
+ const finishTransitions = opts.finishTransitions ?? (0, shared_1.parseBoolFlag)(process.env.HARNESS_FINISH_CSS_TRANSITIONS);
67468
+ const css = finishTransitions ? "*, *::before, *::after { animation-duration: 0s !important; animation-delay: 0s !important; }" : "*, *::before, *::after { transition-duration: 0s !important; animation-duration: 0s !important; transition-delay: 0s !important; animation-delay: 0s !important; }";
67464
67469
  return withHarnessSourceUrl(`(() => {
67465
67470
  // Layer 1: CSS transitions and animations - instant, not removed
67466
67471
  // (duration 0s preserves final state; 'none' would prevent keyframes from completing)
67472
+ // The rule goes in a constructed stylesheet on document.adoptedStyleSheets, which adds no node to the DOM:
67473
+ // a <style> element changed what the test sees (locator('style') and 'head > *' counts, document.styleSheets,
67474
+ // an iframe's empty head), so a spec stock Playwright passes failed. The <style> is the fallback for a
67475
+ // browser with no constructable stylesheets.
67476
+ let adopted = false;
67467
67477
  try {
67478
+ if (typeof CSSStyleSheet === 'function' && typeof Document === 'function' && 'adoptedStyleSheets' in Document.prototype) {
67479
+ const sheet = new CSSStyleSheet();
67480
+ sheet.replaceSync(${JSON.stringify(css)});
67481
+ document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];
67482
+ adopted = true;
67483
+ }
67484
+ } catch (e) {}
67485
+ if (!adopted) try {
67468
67486
  let applied = false;
67469
67487
  const apply = () => {
67470
67488
  if (applied) return true;
67471
67489
  const root = document.head || document.documentElement;
67472
67490
  if (!root) return false;
67473
67491
  const style = document.createElement('style');
67474
- style.textContent = '*, *::before, *::after { transition-duration: 0s !important; animation-duration: 0s !important; transition-delay: 0s !important; animation-delay: 0s !important; }';
67492
+ style.textContent = ${JSON.stringify(css)};
67475
67493
  root.appendChild(style);
67476
67494
  applied = true;
67477
67495
  return true;
@@ -67493,6 +67511,48 @@ ${opts.hideWebdriver ? `
67493
67511
  try {
67494
67512
  Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
67495
67513
  } catch (e) {}
67514
+ ` : ""}
67515
+ ${finishTransitions ? `
67516
+ // Layer 1b: CSS transitions run, and are finished as they start, so transitionend fires.
67517
+ // - finish() is deferred to a task: called inside the transitionrun dispatch (or a microtask of it) after a
67518
+ // real input event, Chromium finishes the transition but never fires its transitionstart/transitionend.
67519
+ // - setTimeout and performance.now are the ones present when this script runs, before the page's own
67520
+ // scripts: fake timers the page installs later cannot hold a finish back.
67521
+ // - The subtree is walked only for a pseudo-element's transition (its animations hang off the element).
67522
+ // - An element whose same transition restarts more than ${TRANSITION_LOOP_LIMIT} times within ${TRANSITION_LOOP_WINDOW_MS} ms (an app that starts it again on
67523
+ // each transitionend: carousel, pulse) is left to run at its own pace from then on, instead of cycling at
67524
+ // frame rate for the rest of the run.
67525
+ try {
67526
+ const st = setTimeout;
67527
+ const perf = typeof performance === 'object' && performance && typeof performance.now === 'function' ? performance : null;
67528
+ const now = perf ? perf.now.bind(perf) : Date.now;
67529
+ const seen = new WeakMap();
67530
+ const looping = (el, key) => {
67531
+ let byKey = seen.get(el);
67532
+ if (!byKey) { byKey = new Map(); seen.set(el, byKey); }
67533
+ const t = now();
67534
+ let s = byKey.get(key);
67535
+ if (s && s.loop) return true;
67536
+ if (!s || t - s.since > ${TRANSITION_LOOP_WINDOW_MS}) { s = { n: 0, since: t, loop: false }; byKey.set(key, s); }
67537
+ s.n += 1;
67538
+ if (s.n > ${TRANSITION_LOOP_LIMIT}) s.loop = true;
67539
+ return s.loop;
67540
+ };
67541
+ window.addEventListener('transitionrun', (ev) => {
67542
+ try {
67543
+ const el = ev && ev.target;
67544
+ if (!el || typeof el.getAnimations !== 'function' || typeof CSSTransition !== 'function') return;
67545
+ const pseudo = ev.pseudoElement || '';
67546
+ if (looping(el, ev.propertyName + '|' + pseudo)) return;
67547
+ for (const a of (pseudo ? el.getAnimations({ subtree: true }) : el.getAnimations())) {
67548
+ if (a instanceof CSSTransition && a.transitionProperty === ev.propertyName && a.effect
67549
+ && a.effect.target === el && (a.effect.pseudoElement || '') === pseudo) {
67550
+ st(() => { try { a.finish(); } catch (e) {} }, 0);
67551
+ }
67552
+ }
67553
+ } catch (e) {}
67554
+ }, true);
67555
+ } catch (e) {}
67496
67556
  ` : ""}
67497
67557
  // Layer 2: Web Animations API - make instant instead of no-op
67498
67558
  // (preserves animation completion callbacks that app code may depend on)