@qawolf/cli 1.11.0 → 1.12.0

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 CHANGED
@@ -8514,7 +8514,7 @@ var require_BufferList = __commonJS((exports, module) => {
8514
8514
  this.head = this.tail = null;
8515
8515
  this.length = 0;
8516
8516
  };
8517
- BufferList.prototype.join = function join35(s3) {
8517
+ BufferList.prototype.join = function join36(s3) {
8518
8518
  if (this.length === 0)
8519
8519
  return "";
8520
8520
  var p3 = this.head;
@@ -19251,7 +19251,7 @@ var require_path = __commonJS((exports, module) => {
19251
19251
  module.exports = isWindows ? { sep: "\\" } : { sep: "/" };
19252
19252
  });
19253
19253
 
19254
- // node_modules/balanced-match/index.js
19254
+ // node_modules/readdir-glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js
19255
19255
  var require_balanced_match = __commonJS((exports, module) => {
19256
19256
  module.exports = balanced;
19257
19257
  function balanced(a2, b3, str) {
@@ -19308,7 +19308,7 @@ var require_balanced_match = __commonJS((exports, module) => {
19308
19308
  }
19309
19309
  });
19310
19310
 
19311
- // node_modules/brace-expansion/index.js
19311
+ // node_modules/readdir-glob/node_modules/minimatch/node_modules/brace-expansion/index.js
19312
19312
  var require_brace_expansion = __commonJS((exports, module) => {
19313
19313
  var balanced = require_balanced_match();
19314
19314
  module.exports = expandTop;
@@ -20363,7 +20363,7 @@ var require_readdir_glob = __commonJS((exports, module) => {
20363
20363
  readdirGlob.ReaddirGlob = ReaddirGlob;
20364
20364
  });
20365
20365
 
20366
- // node_modules/archiver/node_modules/async/dist/async.js
20366
+ // node_modules/async/dist/async.js
20367
20367
  var require_async = __commonJS((exports, module) => {
20368
20368
  (function(global2, factory) {
20369
20369
  typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global2 = typeof globalThis !== "undefined" ? globalThis : global2 || self, factory(global2.async = {}));
@@ -23182,7 +23182,7 @@ var require_BufferList2 = __commonJS((exports, module) => {
23182
23182
  this.head = this.tail = null;
23183
23183
  this.length = 0;
23184
23184
  };
23185
- BufferList.prototype.join = function join35(s3) {
23185
+ BufferList.prototype.join = function join36(s3) {
23186
23186
  if (this.length === 0)
23187
23187
  return "";
23188
23188
  var p3 = this.head;
@@ -32626,7 +32626,272 @@ var require_isPlainObject = __commonJS((exports, module) => {
32626
32626
  module.exports = isPlainObject4;
32627
32627
  });
32628
32628
 
32629
- // node_modules/minimatch/dist/commonjs/assert-valid-pattern.js
32629
+ // node_modules/archiver-utils/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js
32630
+ var require_balanced_match2 = __commonJS((exports, module) => {
32631
+ module.exports = balanced;
32632
+ function balanced(a2, b3, str) {
32633
+ if (a2 instanceof RegExp)
32634
+ a2 = maybeMatch(a2, str);
32635
+ if (b3 instanceof RegExp)
32636
+ b3 = maybeMatch(b3, str);
32637
+ var r2 = range(a2, b3, str);
32638
+ return r2 && {
32639
+ start: r2[0],
32640
+ end: r2[1],
32641
+ pre: str.slice(0, r2[0]),
32642
+ body: str.slice(r2[0] + a2.length, r2[1]),
32643
+ post: str.slice(r2[1] + b3.length)
32644
+ };
32645
+ }
32646
+ function maybeMatch(reg, str) {
32647
+ var m4 = str.match(reg);
32648
+ return m4 ? m4[0] : null;
32649
+ }
32650
+ balanced.range = range;
32651
+ function range(a2, b3, str) {
32652
+ var begs, beg, left, right, result;
32653
+ var ai2 = str.indexOf(a2);
32654
+ var bi2 = str.indexOf(b3, ai2 + 1);
32655
+ var i2 = ai2;
32656
+ if (ai2 >= 0 && bi2 > 0) {
32657
+ if (a2 === b3) {
32658
+ return [ai2, bi2];
32659
+ }
32660
+ begs = [];
32661
+ left = str.length;
32662
+ while (i2 >= 0 && !result) {
32663
+ if (i2 == ai2) {
32664
+ begs.push(i2);
32665
+ ai2 = str.indexOf(a2, i2 + 1);
32666
+ } else if (begs.length == 1) {
32667
+ result = [begs.pop(), bi2];
32668
+ } else {
32669
+ beg = begs.pop();
32670
+ if (beg < left) {
32671
+ left = beg;
32672
+ right = bi2;
32673
+ }
32674
+ bi2 = str.indexOf(b3, i2 + 1);
32675
+ }
32676
+ i2 = ai2 < bi2 && ai2 >= 0 ? ai2 : bi2;
32677
+ }
32678
+ if (begs.length) {
32679
+ result = [left, right];
32680
+ }
32681
+ }
32682
+ return result;
32683
+ }
32684
+ });
32685
+
32686
+ // node_modules/archiver-utils/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js
32687
+ var require_brace_expansion2 = __commonJS((exports, module) => {
32688
+ var balanced = require_balanced_match2();
32689
+ module.exports = expandTop;
32690
+ var escSlash = "\x00SLASH" + Math.random() + "\x00";
32691
+ var escOpen = "\x00OPEN" + Math.random() + "\x00";
32692
+ var escClose = "\x00CLOSE" + Math.random() + "\x00";
32693
+ var escComma = "\x00COMMA" + Math.random() + "\x00";
32694
+ var escPeriod = "\x00PERIOD" + Math.random() + "\x00";
32695
+ var EXPANSION_MAX = 1e5;
32696
+ var EXPANSION_MAX_LENGTH = 4000000;
32697
+ function numeric(str) {
32698
+ return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0);
32699
+ }
32700
+ function escapeBraces(str) {
32701
+ return str.split("\\\\").join(escSlash).split("\\{").join(escOpen).split("\\}").join(escClose).split("\\,").join(escComma).split("\\.").join(escPeriod);
32702
+ }
32703
+ function unescapeBraces(str) {
32704
+ return str.split(escSlash).join("\\").split(escOpen).join("{").split(escClose).join("}").split(escComma).join(",").split(escPeriod).join(".");
32705
+ }
32706
+ function parseCommaParts(str) {
32707
+ if (!str)
32708
+ return [""];
32709
+ var parts = [];
32710
+ var m4 = balanced("{", "}", str);
32711
+ if (!m4)
32712
+ return str.split(",");
32713
+ var pre = m4.pre;
32714
+ var body = m4.body;
32715
+ var post = m4.post;
32716
+ var p3 = pre.split(",");
32717
+ p3[p3.length - 1] += "{" + body + "}";
32718
+ var postParts = parseCommaParts(post);
32719
+ if (post.length) {
32720
+ p3[p3.length - 1] += postParts.shift();
32721
+ p3.push.apply(p3, postParts);
32722
+ }
32723
+ parts.push.apply(parts, p3);
32724
+ return parts;
32725
+ }
32726
+ function expandTop(str, options) {
32727
+ if (!str)
32728
+ return [];
32729
+ options = options || {};
32730
+ var max = options.max == null ? EXPANSION_MAX : options.max;
32731
+ var maxLength = options.maxLength == null ? EXPANSION_MAX_LENGTH : options.maxLength;
32732
+ if (str.substr(0, 2) === "{}") {
32733
+ str = "\\{\\}" + str.substr(2);
32734
+ }
32735
+ return expand(escapeBraces(str), max, maxLength, true).map(unescapeBraces);
32736
+ }
32737
+ function embrace(str) {
32738
+ return "{" + str + "}";
32739
+ }
32740
+ function isPadded(el) {
32741
+ return /^-?0\d/.test(el);
32742
+ }
32743
+ function lte(i2, y) {
32744
+ return i2 <= y;
32745
+ }
32746
+ function gte(i2, y) {
32747
+ return i2 >= y;
32748
+ }
32749
+ function combine(acc, pre, values, max, maxLength, dropEmpties) {
32750
+ var out = [];
32751
+ var length = 0;
32752
+ for (var a2 = 0;a2 < acc.length; a2++) {
32753
+ for (var v2 = 0;v2 < values.length; v2++) {
32754
+ if (out.length >= max)
32755
+ return out;
32756
+ var expansion = acc[a2] + pre + values[v2];
32757
+ if (dropEmpties && !expansion)
32758
+ continue;
32759
+ if (length + expansion.length > maxLength)
32760
+ return out;
32761
+ out.push(expansion);
32762
+ length += expansion.length;
32763
+ }
32764
+ }
32765
+ return out;
32766
+ }
32767
+ function expandSequence(body, isAlphaSequence, max, maxLength) {
32768
+ var n2 = body.split(/\.\./);
32769
+ var N2 = [];
32770
+ if (n2[0] === undefined || n2[1] === undefined) {
32771
+ return N2;
32772
+ }
32773
+ var x = numeric(n2[0]);
32774
+ var y = numeric(n2[1]);
32775
+ var width = Math.max(n2[0].length, n2[1].length);
32776
+ var incr = n2.length === 3 && n2[2] !== undefined ? Math.max(Math.abs(numeric(n2[2])), 1) : 1;
32777
+ var test = lte;
32778
+ var reverse = y < x;
32779
+ if (reverse) {
32780
+ incr *= -1;
32781
+ test = gte;
32782
+ }
32783
+ var pad = n2.some(isPadded);
32784
+ var length = 0;
32785
+ for (var i2 = x;test(i2, y) && N2.length < max; i2 += incr) {
32786
+ var c3;
32787
+ if (isAlphaSequence) {
32788
+ c3 = String.fromCharCode(i2);
32789
+ if (c3 === "\\") {
32790
+ c3 = "";
32791
+ }
32792
+ } else {
32793
+ c3 = String(i2);
32794
+ if (pad) {
32795
+ var need = width - c3.length;
32796
+ if (need > 0) {
32797
+ var z3 = new Array(need + 1).join("0");
32798
+ if (i2 < 0) {
32799
+ c3 = "-" + z3 + c3.slice(1);
32800
+ } else {
32801
+ c3 = z3 + c3;
32802
+ }
32803
+ }
32804
+ }
32805
+ }
32806
+ if (length + c3.length > maxLength)
32807
+ break;
32808
+ N2.push(c3);
32809
+ length += c3.length;
32810
+ }
32811
+ return N2;
32812
+ }
32813
+ function expand(str, max, maxLength, isTop) {
32814
+ var acc = [""];
32815
+ var dropEmpties = false;
32816
+ var firstGroup = true;
32817
+ for (;; ) {
32818
+ const m4 = balanced("{", "}", str);
32819
+ if (!m4) {
32820
+ return combine(acc, str, [""], max, maxLength, dropEmpties);
32821
+ }
32822
+ const pre = m4.pre;
32823
+ if (/\$$/.test(pre)) {
32824
+ acc = combine(acc, pre + "{" + m4.body + "}", [""], max, maxLength, dropEmpties && !m4.post.length);
32825
+ firstGroup = false;
32826
+ if (!m4.post.length)
32827
+ break;
32828
+ str = m4.post;
32829
+ continue;
32830
+ }
32831
+ var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m4.body);
32832
+ var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m4.body);
32833
+ var isSequence = isNumericSequence || isAlphaSequence;
32834
+ var isOptions = m4.body.indexOf(",") >= 0;
32835
+ if (!isSequence && !isOptions) {
32836
+ if (m4.post.match(/,(?!,).*\}/)) {
32837
+ str = m4.pre + "{" + m4.body + escClose + m4.post;
32838
+ isTop = true;
32839
+ continue;
32840
+ }
32841
+ return combine(acc, pre + "{" + m4.body + "}" + m4.post, [""], max, maxLength, dropEmpties);
32842
+ }
32843
+ if (firstGroup) {
32844
+ dropEmpties = isTop && !isSequence;
32845
+ firstGroup = false;
32846
+ }
32847
+ var values;
32848
+ if (isSequence) {
32849
+ values = expandSequence(m4.body, isAlphaSequence, max, maxLength);
32850
+ } else {
32851
+ var n2 = parseCommaParts(m4.body);
32852
+ if (n2.length === 1 && n2[0] !== undefined) {
32853
+ n2 = expand(n2[0], max, maxLength, false).map(embrace);
32854
+ if (n2.length === 1) {
32855
+ acc = combine(acc, pre + n2[0], [""], max, maxLength, dropEmpties && !m4.post.length);
32856
+ if (!m4.post.length)
32857
+ break;
32858
+ str = m4.post;
32859
+ continue;
32860
+ }
32861
+ }
32862
+ var dropsEmpties = dropEmpties && !m4.post.length && !pre;
32863
+ for (var d = 0;dropsEmpties && d < acc.length; d++) {
32864
+ if (acc[d]) {
32865
+ dropsEmpties = false;
32866
+ }
32867
+ }
32868
+ values = [];
32869
+ var valuesLength = 0;
32870
+ outer:
32871
+ for (var j2 = 0;j2 < n2.length; j2++) {
32872
+ var expanded = expand(n2[j2], max, maxLength, false);
32873
+ for (var k2 = 0;k2 < expanded.length; k2++) {
32874
+ var v2 = expanded[k2];
32875
+ if (dropsEmpties && !v2)
32876
+ continue;
32877
+ if (values.length >= max || valuesLength + v2.length > maxLength) {
32878
+ break outer;
32879
+ }
32880
+ values.push(v2);
32881
+ valuesLength += v2.length;
32882
+ }
32883
+ }
32884
+ }
32885
+ acc = combine(acc, pre, values, max, maxLength, dropEmpties && !m4.post.length);
32886
+ if (!m4.post.length)
32887
+ break;
32888
+ str = m4.post;
32889
+ }
32890
+ return acc;
32891
+ }
32892
+ });
32893
+
32894
+ // node_modules/archiver-utils/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js
32630
32895
  var require_assert_valid_pattern = __commonJS((exports) => {
32631
32896
  Object.defineProperty(exports, "__esModule", { value: true });
32632
32897
  exports.assertValidPattern = undefined;
@@ -32642,7 +32907,7 @@ var require_assert_valid_pattern = __commonJS((exports) => {
32642
32907
  exports.assertValidPattern = assertValidPattern;
32643
32908
  });
32644
32909
 
32645
- // node_modules/minimatch/dist/commonjs/brace-expressions.js
32910
+ // node_modules/archiver-utils/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js
32646
32911
  var require_brace_expressions = __commonJS((exports) => {
32647
32912
  Object.defineProperty(exports, "__esModule", { value: true });
32648
32913
  exports.parseClass = undefined;
@@ -32757,7 +33022,7 @@ var require_brace_expressions = __commonJS((exports) => {
32757
33022
  exports.parseClass = parseClass;
32758
33023
  });
32759
33024
 
32760
- // node_modules/minimatch/dist/commonjs/unescape.js
33025
+ // node_modules/archiver-utils/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js
32761
33026
  var require_unescape = __commonJS((exports) => {
32762
33027
  Object.defineProperty(exports, "__esModule", { value: true });
32763
33028
  exports.unescape = undefined;
@@ -32767,7 +33032,7 @@ var require_unescape = __commonJS((exports) => {
32767
33032
  exports.unescape = unescape;
32768
33033
  });
32769
33034
 
32770
- // node_modules/minimatch/dist/commonjs/ast.js
33035
+ // node_modules/archiver-utils/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js
32771
33036
  var require_ast = __commonJS((exports) => {
32772
33037
  var _a3;
32773
33038
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -33304,7 +33569,7 @@ var require_ast = __commonJS((exports) => {
33304
33569
  _a3 = AST;
33305
33570
  });
33306
33571
 
33307
- // node_modules/minimatch/dist/commonjs/escape.js
33572
+ // node_modules/archiver-utils/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js
33308
33573
  var require_escape = __commonJS((exports) => {
33309
33574
  Object.defineProperty(exports, "__esModule", { value: true });
33310
33575
  exports.escape = undefined;
@@ -33314,14 +33579,14 @@ var require_escape = __commonJS((exports) => {
33314
33579
  exports.escape = escape;
33315
33580
  });
33316
33581
 
33317
- // node_modules/minimatch/dist/commonjs/index.js
33582
+ // node_modules/archiver-utils/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js
33318
33583
  var require_commonjs = __commonJS((exports) => {
33319
33584
  var __importDefault = exports && exports.__importDefault || function(mod) {
33320
33585
  return mod && mod.__esModule ? mod : { default: mod };
33321
33586
  };
33322
33587
  Object.defineProperty(exports, "__esModule", { value: true });
33323
33588
  exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = undefined;
33324
- var brace_expansion_1 = __importDefault(require_brace_expansion());
33589
+ var brace_expansion_1 = __importDefault(require_brace_expansion2());
33325
33590
  var assert_valid_pattern_js_1 = require_assert_valid_pattern();
33326
33591
  var ast_js_1 = require_ast();
33327
33592
  var escape_js_1 = require_escape();
@@ -34094,7 +34359,7 @@ var require_commonjs = __commonJS((exports) => {
34094
34359
  exports.minimatch.unescape = unescape_js_1.unescape;
34095
34360
  });
34096
34361
 
34097
- // node_modules/lru-cache/dist/commonjs/index.js
34362
+ // node_modules/archiver-utils/node_modules/glob/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js
34098
34363
  var require_commonjs2 = __commonJS((exports) => {
34099
34364
  Object.defineProperty(exports, "__esModule", { value: true });
34100
34365
  exports.LRUCache = undefined;
@@ -35883,7 +36148,7 @@ var require_commonjs3 = __commonJS((exports) => {
35883
36148
  exports.Minipass = Minipass;
35884
36149
  });
35885
36150
 
35886
- // node_modules/path-scurry/dist/commonjs/index.js
36151
+ // node_modules/archiver-utils/node_modules/glob/node_modules/path-scurry/dist/commonjs/index.js
35887
36152
  var require_commonjs4 = __commonJS((exports) => {
35888
36153
  var __createBinding = exports && exports.__createBinding || (Object.create ? function(o2, m4, k2, k22) {
35889
36154
  if (k22 === undefined)
@@ -37233,7 +37498,7 @@ var require_commonjs4 = __commonJS((exports) => {
37233
37498
  exports.PathScurry = process.platform === "win32" ? PathScurryWin32 : process.platform === "darwin" ? PathScurryDarwin : PathScurryPosix;
37234
37499
  });
37235
37500
 
37236
- // node_modules/glob/dist/commonjs/pattern.js
37501
+ // node_modules/archiver-utils/node_modules/glob/dist/commonjs/pattern.js
37237
37502
  var require_pattern = __commonJS((exports) => {
37238
37503
  Object.defineProperty(exports, "__esModule", { value: true });
37239
37504
  exports.Pattern = undefined;
@@ -37357,7 +37622,7 @@ var require_pattern = __commonJS((exports) => {
37357
37622
  exports.Pattern = Pattern;
37358
37623
  });
37359
37624
 
37360
- // node_modules/glob/dist/commonjs/ignore.js
37625
+ // node_modules/archiver-utils/node_modules/glob/dist/commonjs/ignore.js
37361
37626
  var require_ignore = __commonJS((exports) => {
37362
37627
  Object.defineProperty(exports, "__esModule", { value: true });
37363
37628
  exports.Ignore = undefined;
@@ -37452,7 +37717,7 @@ var require_ignore = __commonJS((exports) => {
37452
37717
  exports.Ignore = Ignore;
37453
37718
  });
37454
37719
 
37455
- // node_modules/glob/dist/commonjs/processor.js
37720
+ // node_modules/archiver-utils/node_modules/glob/dist/commonjs/processor.js
37456
37721
  var require_processor = __commonJS((exports) => {
37457
37722
  Object.defineProperty(exports, "__esModule", { value: true });
37458
37723
  exports.Processor = exports.SubWalks = exports.MatchRecord = exports.HasWalkedCache = undefined;
@@ -37680,7 +37945,7 @@ var require_processor = __commonJS((exports) => {
37680
37945
  exports.Processor = Processor;
37681
37946
  });
37682
37947
 
37683
- // node_modules/glob/dist/commonjs/walker.js
37948
+ // node_modules/archiver-utils/node_modules/glob/dist/commonjs/walker.js
37684
37949
  var require_walker = __commonJS((exports) => {
37685
37950
  Object.defineProperty(exports, "__esModule", { value: true });
37686
37951
  exports.GlobStream = exports.GlobWalker = exports.GlobUtil = undefined;
@@ -38017,7 +38282,7 @@ var require_walker = __commonJS((exports) => {
38017
38282
  exports.GlobStream = GlobStream;
38018
38283
  });
38019
38284
 
38020
- // node_modules/glob/dist/commonjs/glob.js
38285
+ // node_modules/archiver-utils/node_modules/glob/dist/commonjs/glob.js
38021
38286
  var require_glob = __commonJS((exports) => {
38022
38287
  Object.defineProperty(exports, "__esModule", { value: true });
38023
38288
  exports.Glob = undefined;
@@ -38201,7 +38466,7 @@ var require_glob = __commonJS((exports) => {
38201
38466
  exports.Glob = Glob;
38202
38467
  });
38203
38468
 
38204
- // node_modules/glob/dist/commonjs/has-magic.js
38469
+ // node_modules/archiver-utils/node_modules/glob/dist/commonjs/has-magic.js
38205
38470
  var require_has_magic = __commonJS((exports) => {
38206
38471
  Object.defineProperty(exports, "__esModule", { value: true });
38207
38472
  exports.hasMagic = undefined;
@@ -38219,7 +38484,7 @@ var require_has_magic = __commonJS((exports) => {
38219
38484
  exports.hasMagic = hasMagic;
38220
38485
  });
38221
38486
 
38222
- // node_modules/glob/dist/commonjs/index.js
38487
+ // node_modules/archiver-utils/node_modules/glob/dist/commonjs/index.js
38223
38488
  var require_commonjs5 = __commonJS((exports) => {
38224
38489
  Object.defineProperty(exports, "__esModule", { value: true });
38225
38490
  exports.glob = exports.sync = exports.iterate = exports.iterateSync = exports.stream = exports.streamSync = exports.Ignore = exports.hasMagic = exports.Glob = exports.unescape = exports.escape = undefined;
@@ -60371,7 +60636,7 @@ var init_build3 = __esm(() => {
60371
60636
  ];
60372
60637
  });
60373
60638
 
60374
- // node_modules/ws/lib/stream.js
60639
+ // node_modules/webdriver/node_modules/ws/lib/stream.js
60375
60640
  var require_stream5 = __commonJS((exports, module) => {
60376
60641
  var { Duplex } = __require("stream");
60377
60642
  function emitClose(stream) {
@@ -60473,7 +60738,7 @@ var require_stream5 = __commonJS((exports, module) => {
60473
60738
  module.exports = createWebSocketStream;
60474
60739
  });
60475
60740
 
60476
- // node_modules/ws/lib/constants.js
60741
+ // node_modules/webdriver/node_modules/ws/lib/constants.js
60477
60742
  var require_constants6 = __commonJS((exports, module) => {
60478
60743
  var BINARY_TYPES = ["nodebuffer", "arraybuffer", "fragments"];
60479
60744
  var hasBlob = typeof Blob !== "undefined";
@@ -60492,7 +60757,7 @@ var require_constants6 = __commonJS((exports, module) => {
60492
60757
  };
60493
60758
  });
60494
60759
 
60495
- // node_modules/ws/lib/buffer-util.js
60760
+ // node_modules/webdriver/node_modules/ws/lib/buffer-util.js
60496
60761
  var require_buffer_util = __commonJS((exports, module) => {
60497
60762
  var { EMPTY_BUFFER } = require_constants6();
60498
60763
  var FastBuffer = Buffer[Symbol.species];
@@ -60570,7 +60835,7 @@ var require_buffer_util = __commonJS((exports, module) => {
60570
60835
  }
60571
60836
  });
60572
60837
 
60573
- // node_modules/ws/lib/limiter.js
60838
+ // node_modules/webdriver/node_modules/ws/lib/limiter.js
60574
60839
  var require_limiter = __commonJS((exports, module) => {
60575
60840
  var kDone = Symbol("kDone");
60576
60841
  var kRun = Symbol("kRun");
@@ -60602,7 +60867,7 @@ var require_limiter = __commonJS((exports, module) => {
60602
60867
  module.exports = Limiter;
60603
60868
  });
60604
60869
 
60605
- // node_modules/ws/lib/permessage-deflate.js
60870
+ // node_modules/webdriver/node_modules/ws/lib/permessage-deflate.js
60606
60871
  var require_permessage_deflate = __commonJS((exports, module) => {
60607
60872
  var zlib = __require("zlib");
60608
60873
  var bufferUtil = require_buffer_util();
@@ -60862,7 +61127,7 @@ var require_permessage_deflate = __commonJS((exports, module) => {
60862
61127
  }
60863
61128
  });
60864
61129
 
60865
- // node_modules/ws/lib/validation.js
61130
+ // node_modules/webdriver/node_modules/ws/lib/validation.js
60866
61131
  var require_validation = __commonJS((exports, module) => {
60867
61132
  var { isUtf8 } = __require("buffer");
60868
61133
  var { hasBlob } = require_constants6();
@@ -61049,7 +61314,7 @@ var require_validation = __commonJS((exports, module) => {
61049
61314
  }
61050
61315
  });
61051
61316
 
61052
- // node_modules/ws/lib/receiver.js
61317
+ // node_modules/webdriver/node_modules/ws/lib/receiver.js
61053
61318
  var require_receiver = __commonJS((exports, module) => {
61054
61319
  var { Writable } = __require("stream");
61055
61320
  var PerMessageDeflate = require_permessage_deflate();
@@ -61430,7 +61695,7 @@ var require_receiver = __commonJS((exports, module) => {
61430
61695
  module.exports = Receiver;
61431
61696
  });
61432
61697
 
61433
- // node_modules/ws/lib/sender.js
61698
+ // node_modules/webdriver/node_modules/ws/lib/sender.js
61434
61699
  var require_sender = __commonJS((exports, module) => {
61435
61700
  var { Duplex } = __require("stream");
61436
61701
  var { randomFillSync } = __require("crypto");
@@ -61784,7 +62049,7 @@ var require_sender = __commonJS((exports, module) => {
61784
62049
  }
61785
62050
  });
61786
62051
 
61787
- // node_modules/ws/lib/event-target.js
62052
+ // node_modules/webdriver/node_modules/ws/lib/event-target.js
61788
62053
  var require_event_target = __commonJS((exports, module) => {
61789
62054
  var { kForOnEventAttribute, kListener } = require_constants6();
61790
62055
  var kCode = Symbol("kCode");
@@ -61935,7 +62200,7 @@ var require_event_target = __commonJS((exports, module) => {
61935
62200
  }
61936
62201
  });
61937
62202
 
61938
- // node_modules/ws/lib/extension.js
62203
+ // node_modules/webdriver/node_modules/ws/lib/extension.js
61939
62204
  var require_extension = __commonJS((exports, module) => {
61940
62205
  var { tokenChars } = require_validation();
61941
62206
  function push(dest, name, elem) {
@@ -62100,7 +62365,7 @@ var require_extension = __commonJS((exports, module) => {
62100
62365
  module.exports = { format, parse: parse6 };
62101
62366
  });
62102
62367
 
62103
- // node_modules/ws/lib/websocket.js
62368
+ // node_modules/webdriver/node_modules/ws/lib/websocket.js
62104
62369
  var require_websocket = __commonJS((exports, module) => {
62105
62370
  var EventEmitter = __require("events");
62106
62371
  var https = __require("https");
@@ -62859,7 +63124,7 @@ var require_websocket = __commonJS((exports, module) => {
62859
63124
  }
62860
63125
  });
62861
63126
 
62862
- // node_modules/ws/lib/subprotocol.js
63127
+ // node_modules/webdriver/node_modules/ws/lib/subprotocol.js
62863
63128
  var require_subprotocol = __commonJS((exports, module) => {
62864
63129
  var { tokenChars } = require_validation();
62865
63130
  function parse6(header) {
@@ -62904,7 +63169,7 @@ var require_subprotocol = __commonJS((exports, module) => {
62904
63169
  module.exports = { parse: parse6 };
62905
63170
  });
62906
63171
 
62907
- // node_modules/ws/lib/websocket-server.js
63172
+ // node_modules/webdriver/node_modules/ws/lib/websocket-server.js
62908
63173
  var require_websocket_server = __commonJS((exports, module) => {
62909
63174
  var EventEmitter = __require("events");
62910
63175
  var http = __require("http");
@@ -63203,7 +63468,7 @@ var require_websocket_server = __commonJS((exports, module) => {
63203
63468
  }
63204
63469
  });
63205
63470
 
63206
- // node_modules/ws/wrapper.mjs
63471
+ // node_modules/webdriver/node_modules/ws/wrapper.mjs
63207
63472
  var import_stream, import_receiver, import_sender, import_websocket, import_websocket_server, wrapper_default;
63208
63473
  var init_wrapper = __esm(() => {
63209
63474
  import_stream = __toESM(require_stream5(), 1);
@@ -87563,21 +87828,19 @@ var require_supports_color = __commonJS((exports, module) => {
87563
87828
  var tty2 = __require("tty");
87564
87829
  var hasFlag2 = require_has_flag();
87565
87830
  var { env: env3 } = process;
87566
- var flagForceColor2;
87831
+ var forceColor;
87567
87832
  if (hasFlag2("no-color") || hasFlag2("no-colors") || hasFlag2("color=false") || hasFlag2("color=never")) {
87568
- flagForceColor2 = 0;
87833
+ forceColor = 0;
87569
87834
  } else if (hasFlag2("color") || hasFlag2("colors") || hasFlag2("color=true") || hasFlag2("color=always")) {
87570
- flagForceColor2 = 1;
87835
+ forceColor = 1;
87571
87836
  }
87572
- function envForceColor2() {
87573
- if ("FORCE_COLOR" in env3) {
87574
- if (env3.FORCE_COLOR === "true") {
87575
- return 1;
87576
- }
87577
- if (env3.FORCE_COLOR === "false") {
87578
- return 0;
87579
- }
87580
- return env3.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env3.FORCE_COLOR, 10), 3);
87837
+ if ("FORCE_COLOR" in env3) {
87838
+ if (env3.FORCE_COLOR === "true") {
87839
+ forceColor = 1;
87840
+ } else if (env3.FORCE_COLOR === "false") {
87841
+ forceColor = 0;
87842
+ } else {
87843
+ forceColor = env3.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env3.FORCE_COLOR, 10), 3);
87581
87844
  }
87582
87845
  }
87583
87846
  function translateLevel2(level) {
@@ -87591,22 +87854,15 @@ var require_supports_color = __commonJS((exports, module) => {
87591
87854
  has16m: level >= 3
87592
87855
  };
87593
87856
  }
87594
- function supportsColor2(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
87595
- const noFlagForceColor = envForceColor2();
87596
- if (noFlagForceColor !== undefined) {
87597
- flagForceColor2 = noFlagForceColor;
87598
- }
87599
- const forceColor = sniffFlags ? flagForceColor2 : noFlagForceColor;
87857
+ function supportsColor2(haveStream, streamIsTTY) {
87600
87858
  if (forceColor === 0) {
87601
87859
  return 0;
87602
87860
  }
87603
- if (sniffFlags) {
87604
- if (hasFlag2("color=16m") || hasFlag2("color=full") || hasFlag2("color=truecolor")) {
87605
- return 3;
87606
- }
87607
- if (hasFlag2("color=256")) {
87608
- return 2;
87609
- }
87861
+ if (hasFlag2("color=16m") || hasFlag2("color=full") || hasFlag2("color=truecolor")) {
87862
+ return 3;
87863
+ }
87864
+ if (hasFlag2("color=256")) {
87865
+ return 2;
87610
87866
  }
87611
87867
  if (haveStream && !streamIsTTY && forceColor === undefined) {
87612
87868
  return 0;
@@ -87623,7 +87879,7 @@ var require_supports_color = __commonJS((exports, module) => {
87623
87879
  return 1;
87624
87880
  }
87625
87881
  if ("CI" in env3) {
87626
- if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE", "DRONE"].some((sign) => (sign in env3)) || env3.CI_NAME === "codeship") {
87882
+ if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((sign) => (sign in env3)) || env3.CI_NAME === "codeship") {
87627
87883
  return 1;
87628
87884
  }
87629
87885
  return min;
@@ -87635,7 +87891,7 @@ var require_supports_color = __commonJS((exports, module) => {
87635
87891
  return 3;
87636
87892
  }
87637
87893
  if ("TERM_PROGRAM" in env3) {
87638
- const version2 = Number.parseInt((env3.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
87894
+ const version2 = parseInt((env3.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
87639
87895
  switch (env3.TERM_PROGRAM) {
87640
87896
  case "iTerm.app":
87641
87897
  return version2 >= 3 ? 3 : 2;
@@ -87654,17 +87910,14 @@ var require_supports_color = __commonJS((exports, module) => {
87654
87910
  }
87655
87911
  return min;
87656
87912
  }
87657
- function getSupportLevel(stream, options = {}) {
87658
- const level = supportsColor2(stream, {
87659
- streamIsTTY: stream && stream.isTTY,
87660
- ...options
87661
- });
87913
+ function getSupportLevel(stream) {
87914
+ const level = supportsColor2(stream, stream && stream.isTTY);
87662
87915
  return translateLevel2(level);
87663
87916
  }
87664
87917
  module.exports = {
87665
87918
  supportsColor: getSupportLevel,
87666
- stdout: getSupportLevel({ isTTY: tty2.isatty(1) }),
87667
- stderr: getSupportLevel({ isTTY: tty2.isatty(2) })
87919
+ stdout: translateLevel2(supportsColor2(true, tty2.isatty(1))),
87920
+ stderr: translateLevel2(supportsColor2(true, tty2.isatty(2)))
87668
87921
  };
87669
87922
  });
87670
87923
 
@@ -134457,7 +134710,7 @@ var require_snapshot_utils = __commonJS((exports, module) => {
134457
134710
  // node_modules/undici/lib/mock/snapshot-recorder.js
134458
134711
  var require_snapshot_recorder = __commonJS((exports, module) => {
134459
134712
  var { writeFile, readFile, mkdir } = __require("node:fs/promises");
134460
- var { dirname: dirname11, resolve: resolve10 } = __require("node:path");
134713
+ var { dirname: dirname12, resolve: resolve10 } = __require("node:path");
134461
134714
  var { setTimeout: setTimeout3, clearTimeout: clearTimeout2 } = __require("node:timers");
134462
134715
  var { InvalidArgumentError: InvalidArgumentError3, UndiciError } = require_errors7();
134463
134716
  var { hashId, isUrlExcludedFactory, normalizeHeaders, createHeaderFilters } = require_snapshot_utils();
@@ -134652,7 +134905,7 @@ var require_snapshot_recorder = __commonJS((exports, module) => {
134652
134905
  throw new InvalidArgumentError3("Snapshot path is required");
134653
134906
  }
134654
134907
  const resolvedPath = resolve10(path4);
134655
- await mkdir(dirname11(resolvedPath), { recursive: true });
134908
+ await mkdir(dirname12(resolvedPath), { recursive: true });
134656
134909
  const data2 = Array.from(this.#snapshots.entries()).map(([hash2, snapshot]) => ({
134657
134910
  hash: hash2,
134658
134911
  snapshot
@@ -156448,6 +156701,12 @@ var interactiveRunnerMessages = {
156448
156701
  targetMismatch: (runnerName, requiredRunnerName) => `This flow needs a ${requiredRunnerName} runner and ${runnerName} is running. Launch one with --name ${requiredRunnerName}.`
156449
156702
  };
156450
156703
  // src/core/messages/runner.ts
156704
+ var maxListedNames = 5;
156705
+ function listNames(names) {
156706
+ const shown = names.slice(0, maxListedNames).join(", ");
156707
+ const rest = names.length - maxListedNames;
156708
+ return rest > 0 ? `${shown} and ${rest} more` : shown;
156709
+ }
156451
156710
  var runnerMessages = {
156452
156711
  playwrightLoadFailed: (envDir, detail) => packageLoadFailed("Playwright", envDir, detail),
156453
156712
  androidWorkersUnsupported: "Android flows are not yet supported with --workers > 1; rerun Android flows with --workers 1.",
@@ -156477,6 +156736,12 @@ ${dir}`,
156477
156736
  ].join(`
156478
156737
  `),
156479
156738
  outerHopCandidateRejected: (dir, missing) => `outer-hop candidate rejected: ${dir} missing ${missing.join(", ")}`,
156739
+ outerHopFallbackNotice: (dir, missing) => [
156740
+ `Not reusing ${dir} — it is missing ${listNames(missing)}.`,
156741
+ `Installing the declared dependencies instead. Run 'npm install' there to reuse it.`
156742
+ ].join(`
156743
+ `),
156744
+ outerHopCarriedOver: (names) => `Carried over ${pluralize(names.length, "undeclared package")} from the project node_modules: ${listNames(names)}. Declare them in package.json "dependencies".`,
156480
156745
  moduleNotFoundHint: (pkg, projectDir) => projectDir === undefined ? `Hint: '${pkg}' could not be resolved. Run from within your flows project so its dependencies can be found.` : `Hint: '${pkg}' could not be resolved. Ensure it is declared in ${projectDir}/package.json "dependencies" and run npm install in that project.`
156481
156746
  };
156482
156747
  // src/core/messages/updateCheck.ts
@@ -172626,7 +172891,7 @@ var screenNotReadyDescription = "`screen-not-ready` if the runner has a screen t
172626
172891
  var runnerScreenNeedsARunSchema = exports_external.object({
172627
172892
  outcome: exports_external.literal("screen-needs-a-run")
172628
172893
  });
172629
- var screenNeedsARunDescription = "`screen-needs-a-run` if the runner has not run anything yet, so its virtual desktop has never started. Waiting will not change this and retrying is pointless — call `runner.runFlow` on the runner, then ask for the screen again. Evaluating a snippet does not start the desktop.";
172894
+ var screenNeedsARunDescription = "`screen-needs-a-run` if the runner's virtual desktop has never started. Waiting will not change this and retrying is pointless — call `runner.runFlow` with a flow that opens a browser, then ask for the screen again. On a runner image with a browser that has never run anything, any `runner.performAction` also starts the browser itself. Evaluating a snippet does not start the desktop.";
172630
172895
  var runnerHasNoScreenSchema = exports_external.object({
172631
172896
  outcome: exports_external.literal("runner-has-no-screen")
172632
172897
  });
@@ -172658,7 +172923,7 @@ var makePerformActionOnRunnerContract = () => {
172658
172923
  runnerUnreachableSchema
172659
172924
  ]);
172660
172925
  return {
172661
- description: `Perform one raw browser action on an interactive runner: click, double_click, move, drag, scroll, keypress, type, or navigate. Coordinates are whole pixels on the runner's virtual desktop, in the same space as \`runner.takeScreenshot\`. One action per request, and the runner serves one at a time. The action shapes follow the computer-use vocabulary, minus \`screenshot\` (use \`runner.takeScreenshot\`) and \`wait\` (delay on the caller's side). \`performed\` if the action took effect. \`action-failed\`, with a reason, if it reached the runner and did not take effect. ${screenNeedsARunDescription} ${screenNotReadyDescription} A \`navigate\` does not go through the screen, so a screen that is not ready does not stop it — but it still needs the runner to have run something, and until then it answers \`action-failed\` rather than \`screen-needs-a-run\`. ${runnerHasNoScreenDescription} ${unreachableDescription}`,
172926
+ description: `Perform one raw browser action on an interactive runner: click, double_click, move, drag, scroll, keypress, type, or navigate. Coordinates are whole pixels on the runner's virtual desktop, in the same space as \`runner.takeScreenshot\`. One action per request, and the runner serves one at a time. The action shapes follow the computer-use vocabulary, minus \`screenshot\` (use \`runner.takeScreenshot\`) and \`wait\` (delay on the caller's side). \`performed\` if the action took effect. \`action-failed\`, with a reason, if it reached the runner and did not take effect. On a runner image with a browser, the first action on a runner that has never run anything starts its browser and waits for it, so it can take up to a minute to answer — no \`runner.runFlow\` is needed before acting; if the browser is still starting when the wait runs out, the answer is \`screen-not-ready\` and retrying converges. \`screen-needs-a-run\` if the browser could not be started that way — usually a runner whose runs all finished without starting its desktop; call \`runner.runFlow\` with a flow that opens a browser. ${screenNotReadyDescription} A \`navigate\` does not go through the screen, so a screen that is not ready does not stop it. ${runnerHasNoScreenDescription} ${unreachableDescription}`,
172662
172927
  input,
172663
172928
  kind: "write",
172664
172929
  name: "runner.performAction",
@@ -172967,6 +173232,7 @@ var issueStatusSchema = exports_external.enum([
172967
173232
  var publicIssueTypeSchema = exports_external.enum(["bug", "coverageRequest", "maintenance"]);
172968
173233
  var openIssueStatuses = ["pending", "inProgress", "paused"];
172969
173234
  var makeIssueResourceSchema = (ids) => resource({
173235
+ coveredFlowIds: exports_external.array(ids.flow).describe("The flows a coverage request covers. Always empty on bug and maintenance reports, whose flows are listed under reproductions."),
172970
173236
  createdAt: exports_external.coerce.date().describe("When the issue was created."),
172971
173237
  description: exports_external.string().describe("The issue description in Markdown."),
172972
173238
  issueId: ids.issue,
@@ -173018,6 +173284,24 @@ var makeGetIssueContract = (ids) => {
173018
173284
  };
173019
173285
  };
173020
173286
 
173287
+ // node_modules/@qawolf/api-contracts/dist/v1/issue/addFlows.js
173288
+ var makeAddFlowsToIssueContract = (ids) => {
173289
+ const input = exports_external.object({
173290
+ flowIds: exports_external.array(ids.flow).min(1).max(300).refine((flowIds) => new Set(flowIds).size === flowIds.length, "flowIds must be unique").describe("The flows the coverage request covers."),
173291
+ issueId: ids.issue
173292
+ });
173293
+ const output = exports_external.object({
173294
+ issue: makeIssueResourceSchema(ids)
173295
+ });
173296
+ return {
173297
+ description: "Add flows to a coverage request owned by the caller's team. " + "Flows already covered stay covered. " + "Bug and maintenance reports link to flows through the runs that reproduce them, so their flows cannot be set directly.",
173298
+ input,
173299
+ kind: "write",
173300
+ name: "issue.addFlows",
173301
+ output
173302
+ };
173303
+ };
173304
+
173021
173305
  // node_modules/@qawolf/api-contracts/dist/v1/issue/create.js
173022
173306
  var makeCreateIssueContract = (ids) => {
173023
173307
  const commonFields = {
@@ -173370,6 +173654,7 @@ var makeContractsV1 = (ids) => {
173370
173654
  update: makeUpdateFlowContract(resolvedIds)
173371
173655
  },
173372
173656
  issue: {
173657
+ addFlows: makeAddFlowsToIssueContract(resolvedIds),
173373
173658
  create: makeCreateIssueContract(resolvedIds),
173374
173659
  find: makeFindIssuesContract(resolvedIds),
173375
173660
  get: makeGetIssueContract(resolvedIds),
@@ -175911,7 +176196,7 @@ function startUpdateCheck(deps) {
175911
176196
  // package.json
175912
176197
  var package_default = {
175913
176198
  name: "@qawolf/cli",
175914
- version: "1.11.0",
176199
+ version: "1.12.0",
175915
176200
  description: "Run and manage QA Wolf flows from the terminal, CI, or an AI agent",
175916
176201
  keywords: [
175917
176202
  "automation",
@@ -175971,15 +176256,13 @@ var package_default = {
175971
176256
  "@clack/prompts": "1.5.1",
175972
176257
  "@napi-rs/keyring": "1.3.0",
175973
176258
  "@oxc-node/core": "0.1.0",
175974
- "@qawolf/api-contracts": "0.25.0",
176259
+ "@qawolf/api-contracts": "0.26.0",
175975
176260
  "@qawolf/emails": "1.1.1",
175976
176261
  "@qawolf/flow-targets": "1.0.0",
175977
176262
  "@qawolf/flows": "0.1.4",
175978
176263
  "@qawolf/testkit": "1.1.1",
175979
- appium: "2.11.3",
175980
176264
  commander: "14.0.3",
175981
176265
  "env-paths": "4.0.0",
175982
- "expect-webdriverio": "5.6.5",
175983
176266
  picomatch: "4.0.4",
175984
176267
  pino: "10.3.1",
175985
176268
  playwright: "1.62.0",
@@ -175995,7 +176278,9 @@ var package_default = {
175995
176278
  "@tsconfig/strictest": "2.0.8",
175996
176279
  "@types/bun": "1.3.14",
175997
176280
  "@types/picomatch": "4.0.3",
175998
- "appium-uiautomator2-driver": "4.2.9",
176281
+ appium: "3.6.0",
176282
+ "appium-uiautomator2-driver": "8.4.0",
176283
+ "expect-webdriverio": "5.6.5",
175999
176284
  knip: "6.16.1",
176000
176285
  oxfmt: "0.54.0",
176001
176286
  oxlint: "1.69.0",
@@ -176720,8 +177005,8 @@ var flowsVersion = "0.1.4";
176720
177005
  var playwrightVersion = "1.62.0";
176721
177006
  var emailsVersion = "1.1.1";
176722
177007
  var testkitVersion = "1.1.1";
176723
- var appiumVersion = "2.11.3";
176724
- var appiumUiautomator2DriverVersion = "4.2.9";
177008
+ var appiumVersion = "3.6.0";
177009
+ var appiumUiautomator2DriverVersion = "8.4.0";
176725
177010
  var expectWebdriverioVersion = "5.6.5";
176726
177011
 
176727
177012
  // src/domains/doctor/checks/playwright.ts
@@ -177713,6 +177998,109 @@ async function glob(globInput, options) {
177713
177998
  // src/core/flowMeta.ts
177714
177999
  import { getWebBrowserInfo, parseExecutionTarget as parseExecutionTarget2 } from "@qawolf/flow-targets";
177715
178000
  import { basename as basename2 } from "node:path";
178001
+
178002
+ // src/core/stringLiteral.ts
178003
+ var lineTerminator = /[\n\r\u2028\u2029]/;
178004
+ function readStringLiteral(source, start) {
178005
+ const quote = source.charAt(start);
178006
+ if (quote !== '"' && quote !== "'" && quote !== "`")
178007
+ return;
178008
+ let value = "";
178009
+ let i2 = start + 1;
178010
+ while (i2 < source.length) {
178011
+ const char = source.charAt(i2);
178012
+ if (char === "\\") {
178013
+ const escaped = source.charAt(i2 + 1);
178014
+ if (lineTerminator.test(escaped)) {
178015
+ const crlf = escaped === "\r" && source.charAt(i2 + 2) === `
178016
+ `;
178017
+ i2 += crlf ? 3 : 2;
178018
+ continue;
178019
+ }
178020
+ value += escaped;
178021
+ i2 += 2;
178022
+ continue;
178023
+ }
178024
+ if (char === quote)
178025
+ return { value, end: i2 };
178026
+ if (quote === "`") {
178027
+ if (char === "$" && source.charAt(i2 + 1) === "{")
178028
+ return;
178029
+ } else if (char === `
178030
+ ` || char === "\r") {
178031
+ return;
178032
+ }
178033
+ value += char;
178034
+ i2++;
178035
+ }
178036
+ return;
178037
+ }
178038
+
178039
+ // src/core/flowCall.ts
178040
+ var flowCallRe = /(?<![#$\p{ID_Continue}])flow\s*\(\s*/gu;
178041
+ var argSeparatorRe = /\s*,\s*/y;
178042
+ var keyValueRe = /\s*:\s*/y;
178043
+ var wordChar = /\w/;
178044
+ function readTargetFromObject(source, start) {
178045
+ let depth = 0;
178046
+ let i2 = start;
178047
+ while (i2 < source.length) {
178048
+ const char = source.charAt(i2);
178049
+ if (char === "{") {
178050
+ depth++;
178051
+ i2++;
178052
+ continue;
178053
+ }
178054
+ if (char === "}") {
178055
+ depth--;
178056
+ if (depth === 0)
178057
+ return;
178058
+ i2++;
178059
+ continue;
178060
+ }
178061
+ const literal2 = readStringLiteral(source, i2);
178062
+ if (literal2) {
178063
+ i2 = literal2.end + 1;
178064
+ continue;
178065
+ }
178066
+ if (depth === 1 && source.startsWith("target", i2) && !wordChar.test(source.charAt(i2 - 1))) {
178067
+ keyValueRe.lastIndex = i2 + "target".length;
178068
+ if (keyValueRe.test(source)) {
178069
+ return readStringLiteral(source, keyValueRe.lastIndex)?.value;
178070
+ }
178071
+ }
178072
+ i2++;
178073
+ }
178074
+ return;
178075
+ }
178076
+ function readTarget(source, afterName) {
178077
+ argSeparatorRe.lastIndex = afterName;
178078
+ if (!argSeparatorRe.test(source))
178079
+ return;
178080
+ const argStart = argSeparatorRe.lastIndex;
178081
+ if (source.charAt(argStart) === "{") {
178082
+ return readTargetFromObject(source, argStart);
178083
+ }
178084
+ return readStringLiteral(source, argStart)?.value || undefined;
178085
+ }
178086
+ function parseFlowCall(source) {
178087
+ let name;
178088
+ let target;
178089
+ for (const match of source.matchAll(flowCallRe)) {
178090
+ const nameLiteral = readStringLiteral(source, match.index + match[0].length);
178091
+ if (!nameLiteral)
178092
+ continue;
178093
+ if (name === undefined && nameLiteral.value !== "")
178094
+ name = nameLiteral.value;
178095
+ if (target === undefined)
178096
+ target = readTarget(source, nameLiteral.end + 1);
178097
+ if (name !== undefined && target !== undefined)
178098
+ break;
178099
+ }
178100
+ return { name, target };
178101
+ }
178102
+
178103
+ // src/core/flowMeta.ts
177716
178104
  function flowBasename(file2) {
177717
178105
  return basename2(file2).replace(/\.flow\.(ts|js)$/, "");
177718
178106
  }
@@ -177756,13 +178144,8 @@ function targetToBrowser(target) {
177756
178144
  function isAndroidTarget(target) {
177757
178145
  return classifyTarget(target)?.kind === "android";
177758
178146
  }
177759
- var nameRe = /\bflow\s*\(\s*["']([^"'\n]+)["']/;
177760
- var flowTargetRe = /\bflow\s*\(\s*["'][^"'\n]*["']\s*,\s*(?:["']([^"'\n]+)["']|\{[^{}]*\btarget\s*:\s*["']([^"'\n]+)["'])/;
177761
178147
  function extractFlowMeta(source) {
177762
- const name = nameRe.exec(source)?.[1];
177763
- const flowTargetMatch = flowTargetRe.exec(source);
177764
- const target = flowTargetMatch?.[1] ?? flowTargetMatch?.[2];
177765
- return { name, target };
178148
+ return parseFlowCall(source);
177766
178149
  }
177767
178150
 
177768
178151
  // src/domains/flows/expand.ts
@@ -177789,7 +178172,8 @@ async function expandPatterns(patterns, cwd, logger, fs3) {
177789
178172
  for (const root of roots) {
177790
178173
  const matches = await glob(effectivePatterns, {
177791
178174
  cwd: root,
177792
- absolute: true
178175
+ absolute: true,
178176
+ ignore: ["**/node_modules/**"]
177793
178177
  });
177794
178178
  for (const match of matches) {
177795
178179
  const file2 = resolve3(match);
@@ -182468,6 +182852,14 @@ function buildPatternArgs(pattern) {
182468
182852
  return pattern ? [pattern] : [];
182469
182853
  }
182470
182854
 
182855
+ // src/core/flowFailureHint.ts
182856
+ function flowFailureHint(errText, projectDir) {
182857
+ const missingPackage = extractMissingPackage(errText);
182858
+ if (missingPackage === undefined)
182859
+ return;
182860
+ return runnerMessages.moduleNotFoundHint(missingPackage, projectDir);
182861
+ }
182862
+
182471
182863
  // src/shell/reporter/createCompositeReporter.ts
182472
182864
  function callEach(reporters, pick2, event) {
182473
182865
  for (const r2 of reporters) {
@@ -182534,6 +182926,26 @@ function formatErrorWithCause(err) {
182534
182926
  `);
182535
182927
  }
182536
182928
 
182929
+ // src/domains/runner/jsonFailureDetails.ts
182930
+ function collectJsonFailureDetails(reporter, projectDir) {
182931
+ const details = [];
182932
+ return {
182933
+ reporter: createCompositeReporter([
182934
+ reporter,
182935
+ {
182936
+ onFlowFail: ({ err }) => {
182937
+ const detail = formatErrorWithCause(err);
182938
+ const hint = flowFailureHint(detail, projectDir);
182939
+ details.push(hint === undefined ? detail : `${detail}
182940
+
182941
+ ${hint}`);
182942
+ }
182943
+ }
182944
+ ]),
182945
+ details
182946
+ };
182947
+ }
182948
+
182537
182949
  // src/domains/runner/runAndroidFlowUtils.ts
182538
182950
  import { parseExecutionTarget as parseExecutionTarget3 } from "@qawolf/flow-targets";
182539
182951
 
@@ -182589,7 +183001,7 @@ class FlowRunError extends Error {
182589
183001
  }
182590
183002
  }
182591
183003
 
182592
- // src/domains/runner/runInternals.ts
183004
+ // src/domains/runner/dispatchFlow.ts
182593
183005
  async function dispatchFlow({
182594
183006
  deps,
182595
183007
  flow,
@@ -182881,13 +183293,9 @@ async function flowsRun(ctx, files, flags, deps) {
182881
183293
  return { error: runnerMessages.androidWorkersUnsupported, exitCode: 2 };
182882
183294
  }
182883
183295
  const { webOptions, androidOptions } = buildRunOptions(flags);
182884
- const failureDetails = [];
182885
- const reporter = ctx.outputMode === "json" ? createCompositeReporter([
182886
- deps.reporter,
182887
- {
182888
- onFlowFail: ({ err }) => failureDetails.push(formatErrorWithCause(err))
182889
- }
182890
- ]) : deps.reporter;
183296
+ const collected = ctx.outputMode === "json" ? collectJsonFailureDetails(deps.reporter, deps.projectDir) : undefined;
183297
+ const failureDetails = collected?.details ?? [];
183298
+ const reporter = collected?.reporter ?? deps.reporter;
182891
183299
  const result = await executeFlows({
182892
183300
  ctx,
182893
183301
  deps: { ...deps, reporter },
@@ -182975,7 +183383,7 @@ async function defaultRunWebFlowDeps(envDir = process.cwd(), signals) {
182975
183383
 
182976
183384
  // src/domains/runtimeEnv/prepareRunDir.ts
182977
183385
  import { createHash as createHash4 } from "node:crypto";
182978
- import { join as join32, resolve as resolve9 } from "node:path";
183386
+ import { join as join33, resolve as resolve9 } from "node:path";
182979
183387
 
182980
183388
  // src/domains/runtimeEnv/execSubpathImports.ts
182981
183389
  import { join as join26 } from "node:path";
@@ -183044,9 +183452,82 @@ async function populateInnerHop(args) {
183044
183452
  }
183045
183453
 
183046
183454
  // src/domains/runtimeEnv/outerHop.ts
183455
+ import { lstat as lstat2 } from "node:fs/promises";
183456
+ import { dirname as dirname10, join as join30 } from "node:path";
183457
+
183458
+ // src/domains/runtimeEnv/carryOverPackages.ts
183047
183459
  import { lstat } from "node:fs/promises";
183048
183460
  import { dirname as dirname9, join as join29 } from "node:path";
183461
+
183462
+ // src/domains/runtimeEnv/carryOverPlan.ts
183049
183463
  var executorPackageNames = new Set(pinnedPackages.map((p3) => p3.name));
183464
+ function planCarryOver(args) {
183465
+ const installed = new Set(args.installed);
183466
+ return args.present.filter((name) => !name.startsWith(".") && !installed.has(name) && !executorPackageNames.has(name));
183467
+ }
183468
+
183469
+ // src/domains/runtimeEnv/carryOverPackages.ts
183470
+ async function carryOverPackages(args) {
183471
+ const { projectModulesDir, nodeModulesDir, fs: fs4 } = args;
183472
+ const present = await listPackageNames(projectModulesDir, fs4);
183473
+ if (present.length === 0)
183474
+ return [];
183475
+ const names = planCarryOver({
183476
+ present,
183477
+ installed: await listPackageNames(nodeModulesDir, fs4)
183478
+ });
183479
+ const linked = [];
183480
+ for (const name of names) {
183481
+ const segments = name.split("/");
183482
+ const target = join29(nodeModulesDir, ...segments);
183483
+ if (await pathOccupied(target))
183484
+ continue;
183485
+ if (segments.length > 1)
183486
+ await fs4.mkdir(dirname9(target), { recursive: true });
183487
+ await createDirSymlink(join29(projectModulesDir, ...segments), target);
183488
+ linked.push(name);
183489
+ }
183490
+ return linked;
183491
+ }
183492
+ async function pathOccupied(path3) {
183493
+ try {
183494
+ await lstat(path3);
183495
+ return true;
183496
+ } catch {
183497
+ return false;
183498
+ }
183499
+ }
183500
+ async function listPackageNames(dir, fs4) {
183501
+ let entries;
183502
+ try {
183503
+ entries = await fs4.readdir(dir);
183504
+ } catch {
183505
+ return [];
183506
+ }
183507
+ const names = [];
183508
+ for (const entry of entries) {
183509
+ if (!entry.startsWith("@")) {
183510
+ if (fs4.existsSync(join29(dir, entry, "package.json")))
183511
+ names.push(entry);
183512
+ continue;
183513
+ }
183514
+ let scoped;
183515
+ try {
183516
+ scoped = await fs4.readdir(join29(dir, entry));
183517
+ } catch {
183518
+ continue;
183519
+ }
183520
+ for (const inner of scoped) {
183521
+ if (fs4.existsSync(join29(dir, entry, inner, "package.json"))) {
183522
+ names.push(`${entry}/${inner}`);
183523
+ }
183524
+ }
183525
+ }
183526
+ return names;
183527
+ }
183528
+
183529
+ // src/domains/runtimeEnv/outerHop.ts
183530
+ var executorPackageNames2 = new Set(pinnedPackages.map((p3) => p3.name));
183050
183531
  async function populateOuterHop(args) {
183051
183532
  const { projectDir, runDir, fs: fs4 } = args;
183052
183533
  if (projectDir === undefined)
@@ -183055,7 +183536,7 @@ async function populateOuterHop(args) {
183055
183536
  const depNames = Object.keys(installableDeps);
183056
183537
  const { satisfying, rejected } = await findSatisfyingNodeModulesDir(projectDir, depNames, fs4);
183057
183538
  if (satisfying !== undefined) {
183058
- await createDirSymlink(satisfying, join29(runDir, "node_modules"));
183539
+ await createDirSymlink(satisfying, join30(runDir, "node_modules"));
183059
183540
  return { mode: "symlink", nodeModulesDir: satisfying };
183060
183541
  }
183061
183542
  if (depNames.length === 0)
@@ -183064,24 +183545,29 @@ async function populateOuterHop(args) {
183064
183545
  await installOuterDeps(runDir, installableDeps, fs4, args.install ?? spawnNpmInstall);
183065
183546
  await linkPinnedPackages({
183066
183547
  depsRoot: args.depsRoot,
183067
- nodeModulesDir: join29(runDir, "node_modules"),
183548
+ nodeModulesDir: join30(runDir, "node_modules"),
183549
+ fs: fs4
183550
+ });
183551
+ const carriedOver = await carryOverPackages({
183552
+ projectModulesDir: join30(projectDir, "node_modules"),
183553
+ nodeModulesDir: join30(runDir, "node_modules"),
183068
183554
  fs: fs4
183069
183555
  });
183070
- return { mode: "install", depCount: depNames.length, rejected };
183556
+ return { mode: "install", depCount: depNames.length, rejected, carriedOver };
183071
183557
  }
183072
183558
  async function findSatisfyingNodeModulesDir(startDir, depNames, fs4) {
183073
183559
  const rejected = [];
183074
183560
  let dir = startDir;
183075
183561
  while (true) {
183076
- const candidate = join29(dir, "node_modules");
183562
+ const candidate = join30(dir, "node_modules");
183077
183563
  const stats = await lstatSafe(candidate);
183078
183564
  if (stats !== undefined && stats.isDirectory() && !stats.isSymbolicLink()) {
183079
- const missing = depNames.filter((name) => !fs4.existsSync(join29(candidate, name, "package.json")));
183565
+ const missing = depNames.filter((name) => !fs4.existsSync(join30(candidate, name, "package.json")));
183080
183566
  if (missing.length === 0)
183081
183567
  return { satisfying: candidate, rejected };
183082
183568
  rejected.push({ dir: candidate, missing });
183083
183569
  }
183084
- const parent = dirname9(dir);
183570
+ const parent = dirname10(dir);
183085
183571
  if (parent === dir)
183086
183572
  return { satisfying: undefined, rejected };
183087
183573
  dir = parent;
@@ -183089,7 +183575,7 @@ async function findSatisfyingNodeModulesDir(startDir, depNames, fs4) {
183089
183575
  }
183090
183576
  async function lstatSafe(path3) {
183091
183577
  try {
183092
- return await lstat(path3);
183578
+ return await lstat2(path3);
183093
183579
  } catch {
183094
183580
  return;
183095
183581
  }
@@ -183097,7 +183583,7 @@ async function lstatSafe(path3) {
183097
183583
  async function readInstallableDeps(projectDir, fs4) {
183098
183584
  let content;
183099
183585
  try {
183100
- content = await fs4.readFile(join29(projectDir, "package.json"));
183586
+ content = await fs4.readFile(join30(projectDir, "package.json"));
183101
183587
  } catch {
183102
183588
  return {};
183103
183589
  }
@@ -183112,11 +183598,11 @@ async function readInstallableDeps(projectDir, fs4) {
183112
183598
  const rawDeps = parsed["dependencies"];
183113
183599
  if (typeof rawDeps !== "object" || rawDeps === null)
183114
183600
  return {};
183115
- return Object.fromEntries(Object.entries(rawDeps).filter(([name]) => !executorPackageNames.has(name)).filter((entry) => typeof entry[1] === "string"));
183601
+ return Object.fromEntries(Object.entries(rawDeps).filter(([name]) => !executorPackageNames2.has(name)).filter((entry) => typeof entry[1] === "string"));
183116
183602
  }
183117
183603
  async function installOuterDeps(runDir, deps, fs4, install) {
183118
- await fs4.writeFile(join29(runDir, "package.json"), JSON.stringify({ name: "qawolf-run", private: true, dependencies: deps }, undefined, 2));
183119
- await fs4.writeFile(join29(runDir, ".npmrc"), `@qawolf:registry=https://registry.npmjs.org/
183604
+ await fs4.writeFile(join30(runDir, "package.json"), JSON.stringify({ name: "qawolf-run", private: true, dependencies: deps }, undefined, 2));
183605
+ await fs4.writeFile(join30(runDir, ".npmrc"), `@qawolf:registry=https://registry.npmjs.org/
183120
183606
  `);
183121
183607
  const result = await install(runDir);
183122
183608
  if (result.exitCode !== 0) {
@@ -183126,14 +183612,14 @@ async function installOuterDeps(runDir, deps, fs4, install) {
183126
183612
 
183127
183613
  // src/domains/runtimeEnv/stageFlowFiles.ts
183128
183614
  import { createHash as createHash3 } from "node:crypto";
183129
- import { basename as basename4, dirname as dirname10, join as join31, sep as sep4 } from "node:path";
183615
+ import { basename as basename4, dirname as dirname11, join as join32, sep as sep4 } from "node:path";
183130
183616
 
183131
183617
  // src/shell/copyDir.ts
183132
183618
  import { cp, readdir as readdir2 } from "node:fs/promises";
183133
- import { basename as basename3, join as join30 } from "node:path";
183619
+ import { basename as basename3, join as join31 } from "node:path";
183134
183620
  async function copyDirExcluding(source, destination, excludedNames) {
183135
183621
  const entries = await readdir2(source, { withFileTypes: true });
183136
- await Promise.all(entries.filter((entry) => !excludedNames.has(entry.name)).map((entry) => cp(join30(source, entry.name), join30(destination, entry.name), {
183622
+ await Promise.all(entries.filter((entry) => !excludedNames.has(entry.name)).map((entry) => cp(join31(source, entry.name), join31(destination, entry.name), {
183137
183623
  recursive: true,
183138
183624
  filter: (path3) => !excludedNames.has(basename3(path3))
183139
183625
  })));
@@ -183150,14 +183636,14 @@ async function stageFlowFiles(args) {
183150
183636
  if (files.length > 1) {
183151
183637
  return Promise.all(files.map((f3) => stageOneFile(f3, execDir, fs4)));
183152
183638
  }
183153
- await Promise.all(files.map((f3) => fs4.copyFile(f3, join31(execDir, basename4(f3)))));
183154
- return files.map((f3) => join31(execDir, basename4(f3)));
183639
+ await Promise.all(files.map((f3) => fs4.copyFile(f3, join32(execDir, basename4(f3)))));
183640
+ return files.map((f3) => join32(execDir, basename4(f3)));
183155
183641
  }
183156
183642
  async function stageOneFile(file2, execDir, fs4) {
183157
- const dirHash = createHash3("sha256").update(dirname10(file2)).digest("hex").slice(0, 8);
183158
- const subDir = join31(execDir, dirHash);
183643
+ const dirHash = createHash3("sha256").update(dirname11(file2)).digest("hex").slice(0, 8);
183644
+ const subDir = join32(execDir, dirHash);
183159
183645
  await fs4.mkdir(subDir, { recursive: true });
183160
- const dest = join31(subDir, basename4(file2));
183646
+ const dest = join32(subDir, basename4(file2));
183161
183647
  await fs4.copyFile(file2, dest);
183162
183648
  return dest;
183163
183649
  }
@@ -183165,7 +183651,7 @@ function remapPath(file2, projectDir, execDir) {
183165
183651
  if (file2 === projectDir)
183166
183652
  return execDir;
183167
183653
  if (file2.startsWith(projectDir + sep4)) {
183168
- return join31(execDir, file2.slice(projectDir.length + 1));
183654
+ return join32(execDir, file2.slice(projectDir.length + 1));
183169
183655
  }
183170
183656
  return;
183171
183657
  }
@@ -183175,10 +183661,10 @@ async function prepareRunDir(args) {
183175
183661
  const { files, projectDir, depsRoot, runRoot } = args;
183176
183662
  const fs4 = args.fs ?? makeDefaultFs();
183177
183663
  const runId = buildRunId(projectDir, files);
183178
- const runDir = join32(runRoot, runId);
183664
+ const runDir = join33(runRoot, runId);
183179
183665
  await fs4.rm(runDir, { recursive: true, force: true });
183180
183666
  await fs4.mkdir(runDir, { recursive: true });
183181
- const execDir = join32(runDir, "exec");
183667
+ const execDir = join33(runDir, "exec");
183182
183668
  await fs4.mkdir(execDir, { recursive: true });
183183
183669
  await populateInnerHop({ depsRoot, execDir, fs: fs4 });
183184
183670
  const stagedFiles = await stageFlowFiles({ files, projectDir, execDir, fs: fs4 });
@@ -183209,17 +183695,17 @@ function buildRunId(projectDir, files) {
183209
183695
  }
183210
183696
 
183211
183697
  // src/shell/testkit.ts
183212
- import { join as join33 } from "node:path";
183698
+ import { join as join34 } from "node:path";
183213
183699
  function notAvailableLocally(name) {
183214
183700
  throw new Error(runnerMessages.notAvailableLocally(name));
183215
183701
  }
183216
183702
  async function loadSdkDeps(cwd) {
183217
- const testkitDir = join33(cwd, "node_modules", "@qawolf", "testkit");
183703
+ const testkitDir = join34(cwd, "node_modules", "@qawolf", "testkit");
183218
183704
  try {
183219
183705
  const clientMod = await importFromPath(resolveFromEnvDir(cwd, "@qawolf/testkit/client"));
183220
183706
  if (typeof clientMod.createTestkitClient !== "function")
183221
183707
  throw new Error("createTestkitClient is not a function");
183222
- const scopeMod = await importFromPath(join33(testkitDir, "dist", "clientScope.js"));
183708
+ const scopeMod = await importFromPath(join34(testkitDir, "dist", "clientScope.js"));
183223
183709
  if (typeof scopeMod.configureTestkitClient !== "function")
183224
183710
  throw new Error("configureTestkitClient is not a function");
183225
183711
  return {
@@ -183277,9 +183763,9 @@ async function registerLazyEmailsClient(getInbox, cwd, deps) {
183277
183763
  }
183278
183764
 
183279
183765
  // src/commands/flows/envVarDeps.ts
183280
- import { join as join34 } from "node:path";
183766
+ import { join as join35 } from "node:path";
183281
183767
  function envFilePath(envDir) {
183282
- return join34(envDir, ".env");
183768
+ return join35(envDir, ".env");
183283
183769
  }
183284
183770
  async function readEnv(envDir, fs4) {
183285
183771
  try {
@@ -183383,6 +183869,9 @@ async function createFlowRuntimeDeps({
183383
183869
  };
183384
183870
  }
183385
183871
 
183872
+ // src/commands/flows/runStagedFlows.ts
183873
+ import { join as join39 } from "node:path";
183874
+
183386
183875
  // src/shell/appium/createAppiumServer.ts
183387
183876
  import { existsSync as existsSync2 } from "node:fs";
183388
183877
 
@@ -183746,12 +184235,12 @@ Install Android Studio and open Tools > SDK Manager.`);
183746
184235
  }
183747
184236
 
183748
184237
  // src/shell/manifest/lookup.ts
183749
- import { basename as basename5, dirname as dirname11, relative as relative6 } from "node:path";
184238
+ import { basename as basename5, dirname as dirname12, relative as relative6 } from "node:path";
183750
184239
  async function findFlowStamp(flowAbsPath) {
183751
184240
  let envDir;
183752
- let current = dirname11(flowAbsPath);
183753
- while (current !== dirname11(current)) {
183754
- const parent2 = dirname11(current);
184241
+ let current = dirname12(flowAbsPath);
184242
+ while (current !== dirname12(current)) {
184243
+ const parent2 = dirname12(current);
183755
184244
  if (basename5(parent2) === ".qawolf") {
183756
184245
  envDir = current;
183757
184246
  break;
@@ -184683,14 +185172,14 @@ async function runWebFlow({
184683
185172
 
184684
185173
  // src/shell/embeddedWorkerCli.ts
184685
185174
  import { existsSync as existsSync3, mkdirSync as mkdirSync3, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "node:fs";
184686
- import { basename as basename6, join as join35 } from "node:path";
185175
+ import { basename as basename6, join as join36 } from "node:path";
184687
185176
  var embeddedCliPathEnv = "QAWOLF_EMBEDDED_CLI_PATH";
184688
185177
  function extractEmbeddedWorkerCli() {
184689
185178
  const assetPath = process.env[embeddedCliPathEnv];
184690
185179
  if (assetPath === undefined || assetPath === "")
184691
185180
  return;
184692
- const dir = join35(getDataDir(), "worker");
184693
- const dest = join35(dir, basename6(assetPath));
185181
+ const dir = join36(getDataDir(), "worker");
185182
+ const dest = join36(dir, basename6(assetPath));
184694
185183
  if (existsSync3(dest))
184695
185184
  return dest;
184696
185185
  mkdirSync3(dir, { recursive: true });
@@ -184845,7 +185334,7 @@ function makePooledDispatch(resolvedDir) {
184845
185334
  }
184846
185335
 
184847
185336
  // src/commands/flows/buildRunReporter.ts
184848
- import { dirname as dirname12 } from "node:path";
185337
+ import { dirname as dirname13 } from "node:path";
184849
185338
 
184850
185339
  // src/shell/reporter/createConsoleReporter.ts
184851
185340
  import { styleText as styleText3 } from "node:util";
@@ -184892,9 +185381,9 @@ function createConsoleReporter(deps) {
184892
185381
  deps.stderr.write(`${formatted}
184893
185382
 
184894
185383
  `);
184895
- const missingPackage = extractMissingPackage(errStr);
184896
- if (missingPackage !== undefined) {
184897
- deps.stderr.write(`${styleText3("yellow", `${indent}${runnerMessages.moduleNotFoundHint(missingPackage, deps.projectDir)}`)}
185384
+ const hint = flowFailureHint(errStr, deps.projectDir);
185385
+ if (hint !== undefined) {
185386
+ deps.stderr.write(`${styleText3("yellow", `${indent}${hint}`)}
184898
185387
 
184899
185388
  `);
184900
185389
  }
@@ -184928,7 +185417,7 @@ ${styleText3("dim", "─".repeat(width))}
184928
185417
  };
184929
185418
  }
184930
185419
  // src/shell/reporter/createJUnitReporter.ts
184931
- import { join as join36 } from "node:path";
185420
+ import { join as join37 } from "node:path";
184932
185421
 
184933
185422
  // src/shell/reporter/junitXml.ts
184934
185423
  function escapeXml(str) {
@@ -184967,7 +185456,7 @@ ${suites}`;
184967
185456
 
184968
185457
  // src/shell/reporter/createJUnitReporter.ts
184969
185458
  function resolveJUnitOutputPath(junit, outputDir) {
184970
- return typeof junit === "string" && junit.trim() !== "" ? junit : join36(outputDir, "junit-report.xml");
185459
+ return typeof junit === "string" && junit.trim() !== "" ? junit : join37(outputDir, "junit-report.xml");
184971
185460
  }
184972
185461
  function createJUnitReporter(deps) {
184973
185462
  const flows = [];
@@ -185006,7 +185495,7 @@ function buildRunReporter(flags, deps) {
185006
185495
  const junit = createJUnitReporter({
185007
185496
  outputPath: resolveJUnitOutputPath(flags.junit, flags.outputDir),
185008
185497
  writeFile: (path9, content) => {
185009
- deps.fs.mkdirSync(dirname12(path9), { recursive: true });
185498
+ deps.fs.mkdirSync(dirname13(path9), { recursive: true });
185010
185499
  deps.fs.writeFileSync(path9, content);
185011
185500
  },
185012
185501
  stderr
@@ -185045,6 +185534,7 @@ function buildFlowsRunDeps(args) {
185045
185534
  findFlowStamp,
185046
185535
  warn: (message) => ctx.ui.warn(message),
185047
185536
  logger: ctx.log("runner"),
185537
+ ...projectDir !== undefined ? { projectDir } : {},
185048
185538
  reporter: buildRunReporter(flags, {
185049
185539
  fs: ctx.fs,
185050
185540
  stdout: { write: (text3) => ctx.ui.write(text3) },
@@ -185057,11 +185547,11 @@ function buildFlowsRunDeps(args) {
185057
185547
 
185058
185548
  // src/commands/flows/loadEnvFile.ts
185059
185549
  import { readFile } from "node:fs/promises";
185060
- import { join as join37 } from "node:path";
185550
+ import { join as join38 } from "node:path";
185061
185551
  async function loadEnvFile(envDir) {
185062
185552
  let content;
185063
185553
  try {
185064
- content = await readFile(join37(envDir, ".env"), "utf8");
185554
+ content = await readFile(join38(envDir, ".env"), "utf8");
185065
185555
  } catch (err) {
185066
185556
  if (isNoEntError(err))
185067
185557
  return;
@@ -185106,6 +185596,14 @@ async function runStagedFlows(args) {
185106
185596
  for (const candidate of staged.outerHop.rejected) {
185107
185597
  log31.debug(runnerMessages.outerHopCandidateRejected(candidate.dir, candidate.missing));
185108
185598
  }
185599
+ const ownModules = projectDir === undefined ? undefined : join39(projectDir, "node_modules");
185600
+ const own = staged.outerHop.rejected.find((c3) => c3.dir === ownModules);
185601
+ if (own !== undefined) {
185602
+ ctx.ui.warn(runnerMessages.outerHopFallbackNotice(own.dir, own.missing));
185603
+ }
185604
+ if (staged.outerHop.carriedOver.length > 0) {
185605
+ ctx.ui.warn(runnerMessages.outerHopCarriedOver(staged.outerHop.carriedOver));
185606
+ }
185109
185607
  }
185110
185608
  const unregisterCleanup = ctx.signals.register(staged.cleanup);
185111
185609
  try {
@@ -185162,7 +185660,7 @@ async function handleFlowsRun(ctx, pattern, flags, deps) {
185162
185660
  }
185163
185661
 
185164
185662
  // src/commands/flows/hybridRunDefaults.ts
185165
- import { join as join38, resolve as resolve10 } from "node:path";
185663
+ import { join as join40, resolve as resolve10 } from "node:path";
185166
185664
  function makeDefaultHybridDeps(fs9) {
185167
185665
  return {
185168
185666
  expandPatterns: (patterns, cwd, logger) => expandPatterns(patterns, cwd, logger, fs9),
@@ -185181,7 +185679,7 @@ async function handleHybridFlowsRun(ctx, pattern, flags, deps) {
185181
185679
  if (validation !== "ok") {
185182
185680
  return { error: validation.error, exitCode: 2 };
185183
185681
  }
185184
- const envDir = resolve10(join38(".qawolf", flags.env));
185682
+ const envDir = resolve10(join40(".qawolf", flags.env));
185185
185683
  const patternArgs = buildPatternArgs(pattern);
185186
185684
  const globFlows = () => resolvedDeps.expandPatterns(patternArgs, envDir, ctx.log("flows"));
185187
185685
  let files = await globFlows();
@@ -185327,12 +185825,12 @@ function registerFlowsCommand(program2, signals) {
185327
185825
  }
185328
185826
 
185329
185827
  // src/domains/init/init.ts
185330
- import { dirname as dirname13, join as join40, relative as relative7 } from "node:path";
185828
+ import { dirname as dirname14, join as join42, relative as relative7 } from "node:path";
185331
185829
 
185332
185830
  // src/domains/init/ensurePackageJson.ts
185333
- import { join as join39 } from "node:path";
185831
+ import { join as join41 } from "node:path";
185334
185832
  async function ensurePackageJson(ctx, yes, deps) {
185335
- const pkgPath = join39(deps.cwd, "package.json");
185833
+ const pkgPath = join41(deps.cwd, "package.json");
185336
185834
  if (!await deps.fs.pathExists(pkgPath)) {
185337
185835
  const confirmed2 = await ctx.ui.confirm(initMessages.createPackageJsonPrompt, { yes });
185338
185836
  if (!confirmed2.ok || !confirmed2.value) {
@@ -185458,9 +185956,9 @@ function makeDefaultInitDeps() {
185458
185956
  async function handleInit(ctx, opts, deps = makeDefaultInitDeps()) {
185459
185957
  ctx.ui.gap();
185460
185958
  ctx.ui.intro(initMessages.title);
185461
- const configPath = join40(deps.cwd, "qawolf.config.ts");
185462
- const flowPath = join40(deps.cwd, "src", "flows", "example.flow.ts");
185463
- const gitignorePath = join40(deps.cwd, ".qawolf", ".gitignore");
185959
+ const configPath = join42(deps.cwd, "qawolf.config.ts");
185960
+ const flowPath = join42(deps.cwd, "src", "flows", "example.flow.ts");
185961
+ const gitignorePath = join42(deps.cwd, ".qawolf", ".gitignore");
185464
185962
  await writeWithPrompt(ctx, configPath, qawolfConfigTs, opts.yes, deps);
185465
185963
  await writeWithPrompt(ctx, flowPath, exampleFlowTs, opts.yes, deps);
185466
185964
  await writeWithPrompt(ctx, gitignorePath, qawolfGitignore, opts.yes, deps);
@@ -185479,7 +185977,7 @@ async function writeWithPrompt(ctx, filePath, content, yes, deps) {
185479
185977
  return;
185480
185978
  }
185481
185979
  }
185482
- await deps.fs.mkdir(dirname13(filePath), { recursive: true });
185980
+ await deps.fs.mkdir(dirname14(filePath), { recursive: true });
185483
185981
  await deps.fs.writeFile(filePath, content);
185484
185982
  ctx.ui.step(initMessages.createdFile(relPath));
185485
185983
  }
@@ -185498,7 +185996,7 @@ Examples:
185498
185996
  import { parseExecutionTarget as parseExecutionTarget4 } from "@qawolf/flow-targets";
185499
185997
 
185500
185998
  // src/domains/install/android/avd.ts
185501
- import { join as join41 } from "node:path";
185999
+ import { join as join43 } from "node:path";
185502
186000
  async function installAvds(ctx, specs, deps) {
185503
186001
  const sdkManagerPath = sdkManagerBin(deps.androidHome, deps.platform);
185504
186002
  const avdManagerPath = avdManagerBin(deps.androidHome, deps.platform);
@@ -185508,7 +186006,7 @@ async function installAvds(ctx, specs, deps) {
185508
186006
  if (versionResult.exitCode !== 0) {
185509
186007
  throw new Error(installMessages.android.sdkmanagerNotFound(sdkManagerPath));
185510
186008
  }
185511
- const licenseFile = join41(deps.androidHome, "licenses", "android-sdk-license");
186009
+ const licenseFile = join43(deps.androidHome, "licenses", "android-sdk-license");
185512
186010
  if (deps.checkExists(licenseFile)) {
185513
186011
  ctx.ui.info(installMessages.android.licensesAlreadyAccepted);
185514
186012
  } else {
@@ -185523,7 +186021,7 @@ async function installAvds(ctx, specs, deps) {
185523
186021
  for (const spec of specs) {
185524
186022
  if (installedImages.has(spec.systemImage))
185525
186023
  continue;
185526
- const systemImg = join41(deps.androidHome, ...spec.systemImage.split(";"), "system.img");
186024
+ const systemImg = join43(deps.androidHome, ...spec.systemImage.split(";"), "system.img");
185527
186025
  if (deps.checkExists(systemImg)) {
185528
186026
  ctx.ui.info(installMessages.android.systemImageAlreadyInstalled(spec.systemImage));
185529
186027
  installedImages.add(spec.systemImage);
@@ -186575,7 +187073,7 @@ async function handleRunnerScreenshot(ctx, options, deps) {
186575
187073
  }
186576
187074
 
186577
187075
  // src/shell/interactiveRunner/collectRunFiles.ts
186578
- import { join as join42 } from "node:path";
187076
+ import { join as join44 } from "node:path";
186579
187077
  async function collectRunFiles(options) {
186580
187078
  const paths = await glob(shippableRunFileExtensions.map((extension) => `**/*${extension}`), {
186581
187079
  cwd: options.cwd,
@@ -186585,7 +187083,7 @@ async function collectRunFiles(options) {
186585
187083
  const shippable = paths.filter(isShippableRunFilePath).sort();
186586
187084
  const files = {};
186587
187085
  const read = batchMap(shippable, async (path9) => ({
186588
- content: await options.fs.readFile(join42(options.cwd, path9)),
187086
+ content: await options.fs.readFile(join44(options.cwd, path9)),
186589
187087
  path: path9
186590
187088
  }), flowBatchSize);
186591
187089
  for await (const file2 of read)
@@ -186600,7 +187098,7 @@ function makeRunnerId() {
186600
187098
  }
186601
187099
 
186602
187100
  // src/shell/interactiveRunner/runnerStore.ts
186603
- import { join as join43 } from "node:path";
187101
+ import { join as join45 } from "node:path";
186604
187102
  var storeFileName = "runner.json";
186605
187103
  var storeSchema = exports_external.object({ defaultRunnerId: exports_external.string().optional() });
186606
187104
  function parseJson(text3) {
@@ -186611,8 +187109,8 @@ function parseJson(text3) {
186611
187109
  }
186612
187110
  }
186613
187111
  function makeRunnerStore(options) {
186614
- const directory = join43(options.cwd, qawolfDir);
186615
- const path9 = join43(directory, storeFileName);
187112
+ const directory = join45(options.cwd, qawolfDir);
187113
+ const path9 = join45(directory, storeFileName);
186616
187114
  let pendingWrites = 0;
186617
187115
  const nextPendingPath = () => `${path9}.${process.pid}.${++pendingWrites}.tmp`;
186618
187116
  return {
@@ -186639,7 +187137,7 @@ function makeRunnerStore(options) {
186639
187137
  }
186640
187138
 
186641
187139
  // src/shell/interactiveRunner/writeScreenshot.ts
186642
- import { dirname as dirname14 } from "node:path";
187140
+ import { dirname as dirname15 } from "node:path";
186643
187141
  var jpegStartOfImage = [255, 216, 255];
186644
187142
  async function writeScreenshot(options) {
186645
187143
  const bytes = Buffer.from(options.imageJpegBase64, "base64");
@@ -186647,7 +187145,7 @@ async function writeScreenshot(options) {
186647
187145
  return { ok: false, reason: "not-a-jpeg" };
186648
187146
  }
186649
187147
  try {
186650
- await options.fs.mkdir(dirname14(options.path), { recursive: true });
187148
+ await options.fs.mkdir(dirname15(options.path), { recursive: true });
186651
187149
  await options.fs.writeFile(options.path, bytes);
186652
187150
  } catch (error51) {
186653
187151
  return { detail: errorMessage(error51), ok: false, reason: "unwritable" };
@@ -187285,4 +187783,4 @@ createProgram({ signals }).parseAsync().catch(() => {
187285
187783
  process.exitCode = 1;
187286
187784
  }).finally(() => flushAndExit(typeof process.exitCode === "number" ? process.exitCode : 0));
187287
187785
 
187288
- //# debugId=229B48C8231EE6BC64756E2164756E21
187786
+ //# debugId=50767334C9C30D3E64756E2164756E21