test-progress-tracker 2.0.5 → 2.0.6

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/cjs/append.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"append.js","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,yCAAsC;AACtC,+BAAiC;AACjC,yCAAsC;AACtC,2CAAoE;AAEpE,qCAAkC;AAClC,mCAAgC;AAEhC,IAAI,UAAU,GAAG,YAAE,CAAC,UAAU,CAAA;AAC9B,IAAI,qBAAqB,GAAG,IAAA,gBAAS,EAAC,YAAE,CAAC,UAAU,CAAC,CAAA;AAEpD,SAAsB,MAAM,CAAC,OAAqD,EAAE,OAAoB;;QACtG,MAAM,CAAC,GAAG,IAAA,qBAAS,EAA0B,EAAE,EAAE,EAAF,YAAE,EAAE,OAAO,EAAE,aAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;QAE3F,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,2BAAe,EAAE,gCAAoB,CAAC,CAAA;QAC5E,MAAM,QAAQ,GAAG,IAAA,eAAM,EAAC,OAAO,CAAC,CAAA;QAChC,MAAM,UAAU,GAAG,IAAA,mBAAQ,EAAC,QAAQ,CAAC,CAAA;QAErC,uBAAuB;QACvB,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,KAAK,UAAU,EAAE;YAClC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,CAAA;YAC5B,qBAAqB,GAAG,IAAA,gBAAS,EAAC,UAAU,CAAC,CAAA;SAC9C;QAED,MAAM,qBAAqB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC,CAAA;IAC1D,CAAC;CAAA;AAdD,wBAcC"}
1
+ {"version":3,"file":"append.js","sourceRoot":"","sources":["../ts/append.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,yCAAsC;AACtC,+BAAiC;AACjC,yCAAsC;AACtC,2CAAoE;AAEpE,qCAAkC;AAClC,mCAAgC;AAEhC,IAAI,UAAU,GAAG,YAAE,CAAC,UAAU,CAAA;AAC9B,IAAI,qBAAqB,GAAG,IAAA,gBAAS,EAAC,YAAE,CAAC,UAAU,CAAC,CAAA;AAEpD,SAAsB,MAAM,CAAC,OAAqD,EAAE,OAAoB;;QACtG,MAAM,CAAC,GAAG,IAAA,qBAAS,EAA0B,EAAE,EAAE,EAAF,YAAE,EAAE,OAAO,EAAE,aAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;QAE3F,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,2BAAe,EAAE,gCAAoB,CAAC,CAAA;QAC5E,MAAM,QAAQ,GAAG,IAAA,eAAM,EAAC,OAAO,CAAC,CAAA;QAChC,MAAM,UAAU,GAAG,IAAA,mBAAQ,EAAC,QAAQ,CAAC,CAAA;QAErC,uBAAuB;QACvB,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,KAAK,UAAU,EAAE;YAClC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,CAAA;YAC5B,qBAAqB,GAAG,IAAA,gBAAS,EAAC,UAAU,CAAC,CAAA;SAC9C;QAED,MAAM,qBAAqB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC,CAAA;IAC1D,CAAC;CAAA;AAdD,wBAcC"}
@@ -1 +1 @@
1
- {"version":3,"file":"compress.js","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":";;;AAEA,SAAgB,QAAQ,CAAC,GAAuB;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAFD,4BAEC;AAED,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAA;AAC9C,CAAC;AAFD,gCAEC"}
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../ts/compress.ts"],"names":[],"mappings":";;;AAEA,SAAgB,QAAQ,CAAC,GAAuB;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAFD,4BAEC;AAED,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAA;AAC9C,CAAC;AAFD,gCAEC"}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,WAAW,CAAA;AAC7B,QAAA,oBAAoB,GAAG,cAAc,CAAA"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../ts/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,WAAW,CAAA;AAC7B,QAAA,oBAAoB,GAAG,cAAc,CAAA"}
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAwB;AACxB,yCAAsB;AACtB,8CAA2B;AAC3B,yCAAsB;AACtB,4CAAyB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../ts/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAwB;AACxB,yCAAsB;AACtB,8CAA2B;AAC3B,yCAAsB;AACtB,4CAAyB"}
package/cjs/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AACvB,oDAA4B;AAC5B,2CAA8C;AAC9C,mCAAgC;AAEhC;;;GAGG;AACH,SAAgB,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;IAC7C,gBAAM,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,2BAAe,CAAC,CAAC,CAAA;IACxD,aAAK,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;AACvC,CAAC;AAHD,oBAGC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../ts/init.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AACvB,oDAA4B;AAC5B,2CAA8C;AAC9C,mCAAgC;AAEhC;;;GAGG;AACH,SAAgB,IAAI,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;IAC7C,gBAAM,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,2BAAe,CAAC,CAAC,CAAA;IACxD,aAAK,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;AACvC,CAAC;AAHD,oBAGC"}
@@ -1 +1 @@
1
- {"version":3,"file":"interface.js","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../ts/interface.ts"],"names":[],"mappings":""}
package/cjs/load.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,yCAAsC;AACtC,+BAAiC;AACjC,yCAAwC;AACxC,2CAAoE;AAEpE,qCAAoC;AACpC,mCAAgC;AAEhC,IAAI,QAAQ,GAAG,YAAE,CAAC,QAAQ,CAAA;AAC1B,IAAI,mBAAmB,GAAG,IAAA,gBAAS,EAAC,YAAE,CAAC,QAAQ,CAAC,CAAA;AAEhD,SAAsB,IAAI,CAAC,OAAwC;;QACjE,MAAM,CAAC,GAAG,IAAA,qBAAS,EAAwB,EAAE,EAAE,EAAF,YAAE,EAAE,OAAO,EAAE,aAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;QAEzF,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,2BAAe,EAAE,gCAAoB,CAAC,CAAA;QAE5E,uBAAuB;QACvB,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,KAAK,QAAQ,EAAE;YAC9B,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAA;YACxB,mBAAmB,GAAG,IAAA,gBAAS,EAAC,QAAQ,CAAC,CAAA;SAC1C;QAED,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACnC,OAAO,OAAO,CAAC,MAAM,CAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC5C,IAAI,CAAC,CAAC;oBAAE,OAAO,CAAC,CAAA;gBAChB,MAAM,QAAQ,GAAG,IAAA,qBAAU,EAAC,CAAC,CAAC,CAAA;gBAC9B,CAAC,CAAC,IAAI,CAAC,IAAA,iBAAQ,EAAC,QAAQ,CAAC,CAAC,CAAA;gBAC1B,OAAO,CAAC,CAAA;YACV,CAAC,EAAE,EAAE,CAAC,CAAA;SACP;QACD,WAAM;YACJ,OAAO,EAAE,CAAA;SACV;IACH,CAAC;CAAA;AAxBD,oBAwBC"}
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../ts/load.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,yCAAsC;AACtC,+BAAiC;AACjC,yCAAwC;AACxC,2CAAoE;AAEpE,qCAAoC;AACpC,mCAAgC;AAEhC,IAAI,QAAQ,GAAG,YAAE,CAAC,QAAQ,CAAA;AAC1B,IAAI,mBAAmB,GAAG,IAAA,gBAAS,EAAC,YAAE,CAAC,QAAQ,CAAC,CAAA;AAEhD,SAAsB,IAAI,CAAC,OAAwC;;QACjE,MAAM,CAAC,GAAG,IAAA,qBAAS,EAAwB,EAAE,EAAE,EAAF,YAAE,EAAE,OAAO,EAAE,aAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;QAEzF,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,2BAAe,EAAE,gCAAoB,CAAC,CAAA;QAE5E,uBAAuB;QACvB,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,KAAK,QAAQ,EAAE;YAC9B,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAA;YACxB,mBAAmB,GAAG,IAAA,gBAAS,EAAC,QAAQ,CAAC,CAAA;SAC1C;QAED,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACnC,OAAO,OAAO,CAAC,MAAM,CAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC5C,IAAI,CAAC,CAAC;oBAAE,OAAO,CAAC,CAAA;gBAChB,MAAM,QAAQ,GAAG,IAAA,qBAAU,EAAC,CAAC,CAAC,CAAA;gBAC9B,CAAC,CAAC,IAAI,CAAC,IAAA,iBAAQ,EAAC,QAAQ,CAAC,CAAC,CAAA;gBAC1B,OAAO,CAAC,CAAA;YACV,CAAC,EAAE,EAAE,CAAC,CAAA;SACP;QACD,WAAM;YACJ,OAAO,EAAE,CAAA;SACV;IACH,CAAC;CAAA;AAxBD,oBAwBC"}
package/cjs/minify.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"minify.js","sourceRoot":"","sources":["../src/minify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"minify.js","sourceRoot":"","sources":["../ts/minify.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA+B;AAC/B,4CAAmB;AACnB,gDAAuB;AACvB,wDAA+B;AAC/B,yCAAqC;AACrC,yCAAuC;AACvC,2CAAmE;AAEnE,qCAAmC;AACnC,mCAA+B;AAwB/B,SAAgB,OAAO,CAAC,OAAiE,EAAE,QAAuD;IAChJ,MAAM,CAAC,GAAG,IAAA,qBAAS,EAAsC;QACvD,EAAE,EAAF,YAAE;QACF,QAAQ,EAAR,kBAAQ;QACR,OAAO,EAAE,aAAK,CAAC,KAAK,CAAC,OAAO;QAC5B,gBAAgB,EAAE,IAAI;KACvB,EAAE,OAAO,CAAC,CAAA;IACX,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,2BAAe,EAAE,gCAAoB,CAAC,CAAA;IAE5E,MAAM,CAAC,GAAG,kBAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAA;IAC5E,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACtD,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACzD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAA;AACnC,CAAC;AAbD,0BAaC;AAED,SAAS,cAAc,CAAC,OAA2B,EAAE,QAAgB,EAAE,QAAuD;IAC5H,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACzC,QAAQ,CAAC,SAAS,EAAE,IAAA,iBAAQ,EAAC,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9B,CAAC;AAOD,SAAS,WAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAsB,EAAE,QAAgB;IACzE,MAAM,QAAQ,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAC9C,OAAO,IAAI,OAAO,CAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;QAC7C,IAAI,QAAQ,GAAG,EAAE,CAAA;QACjB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,QAAQ,GAAG,IAAI,CAAA;aAChB;QACH,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACjB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../ts/monitor.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA+B;AAC/B,4CAAmB;AACnB,gDAAuB;AACvB,wDAA+B;AAC/B,yCAAqC;AACrC,yCAAuC;AACvC,2CAAmE;AAEnE,qCAAmC;AACnC,mCAA+B;AAwB/B,SAAgB,OAAO,CAAC,OAAiE,EAAE,QAAuD;IAChJ,MAAM,CAAC,GAAG,IAAA,qBAAS,EAAsC;QACvD,EAAE,EAAF,YAAE;QACF,QAAQ,EAAR,kBAAQ;QACR,OAAO,EAAE,aAAK,CAAC,KAAK,CAAC,OAAO;QAC5B,gBAAgB,EAAE,IAAI;KACvB,EAAE,OAAO,CAAC,CAAA;IACX,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,2BAAe,EAAE,gCAAoB,CAAC,CAAA;IAE5E,MAAM,CAAC,GAAG,kBAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAA;IAC5E,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACtD,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACzD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAA;AACnC,CAAC;AAbD,0BAaC;AAED,SAAS,cAAc,CAAC,OAA2B,EAAE,QAAgB,EAAE,QAAuD;IAC5H,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACzC,QAAQ,CAAC,SAAS,EAAE,IAAA,iBAAQ,EAAC,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9B,CAAC;AAOD,SAAS,WAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAsB,EAAE,QAAgB;IACzE,MAAM,QAAQ,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAC9C,OAAO,IAAI,OAAO,CAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;QAC7C,IAAI,QAAQ,GAAG,EAAE,CAAA;QACjB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,QAAQ,GAAG,IAAI,CAAA;aAChB;QACH,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACjB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC"}
package/cjs/store.js CHANGED
@@ -5,6 +5,7 @@ const global_store_1 = require("global-store");
5
5
  exports.store = (0, global_store_1.createStore)({
6
6
  moduleName: 'test-progress-tracker',
7
7
  version: '1.0.0',
8
+ key: 'eb969cee-8646-5b9c-9084-9093804d4121',
8
9
  initializer: (current) => (Object.assign({ rootDir: '.' }, current))
9
10
  });
10
11
  //# sourceMappingURL=store.js.map
package/cjs/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":";;;AAAA,+CAA0C;AAE7B,QAAA,KAAK,GAAG,IAAA,0BAAW,EAAsB;IACpD,UAAU,EAAE,uBAAuB;IACnC,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBACxB,OAAO,EAAE,GAAG,IACT,OAAO,EACV;CACH,CAAC,CAAA"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../ts/store.ts"],"names":[],"mappings":";;;AAAA,+CAA0C;AAE7B,QAAA,KAAK,GAAG,IAAA,0BAAW,EAAsB;IACpD,UAAU,EAAE,uBAAuB;IACnC,OAAO,EAAE,OAAO;IAChB,GAAG,EAAE,sCAAsC;IAC3C,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBACxB,OAAO,EAAE,GAAG,IACT,OAAO,EACV;CACH,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "test-progress-tracker",
3
- "version": "2.0.5",
3
+ "version": "2.0.6",
4
4
  "description": "Keep track of test progress over time",
5
5
  "homepage": "https://github.com/unional/test-progress-tracker",
6
6
  "bugs": {
@@ -14,16 +14,22 @@
14
14
  "main": "cjs/index.js",
15
15
  "typings": "cjs/index.d.ts",
16
16
  "files": [
17
- "cjs"
17
+ "cjs",
18
+ "ts"
18
19
  ],
19
20
  "scripts": {
20
21
  "build": "tsc -p tsconfig.cjs.json",
21
22
  "clean": "rimraf cjs",
22
23
  "coverage": "jest --coverage",
23
- "dependency-check": "dependency-check . --unused --no-dev && dependency-check . --missing --no-dev",
24
+ "dependency-check": "run-p dependency-check:unused dependency-check:missing",
25
+ "dependency-check:missing": "dependency-check . --missing --no-dev",
26
+ "dependency-check:unused": "dependency-check . --unused --no-dev",
24
27
  "lint": "eslint --ext=ts,js .",
28
+ "size-limit": "echo no size-limit",
25
29
  "test": "jest",
26
- "verify": "yarn clean && yarn lint && yarn build && yarn coverage && yarn dependency-check",
30
+ "release": "npx semantic-release",
31
+ "verify": "run-p verify:build lint coverage",
32
+ "verify:build": "run-s build dependency-check size-limit",
27
33
  "watch": "jest --watch"
28
34
  },
29
35
  "husky": {
@@ -44,13 +50,13 @@
44
50
  "@babel/plugin-proposal-optional-chaining": "^7.16.0",
45
51
  "@babel/preset-env": "^7.16.4",
46
52
  "@babel/preset-typescript": "^7.16.0",
47
- "@commitlint/cli": "^15.0.0",
48
- "@commitlint/config-conventional": "^15.0.0",
53
+ "@commitlint/cli": "^16.0.0",
54
+ "@commitlint/config-conventional": "^16.0.0",
49
55
  "@types/jest": "^27.0.3",
50
56
  "@types/mkdirp": "^1.0.2",
51
57
  "@types/node": "^16.11.11",
52
58
  "@types/rimraf": "^3.0.2",
53
- "assertron": "^7.0.2",
59
+ "assertron": "^9.0.0",
54
60
  "delay": "^5.0.0",
55
61
  "dependency-check": "^4.1.0",
56
62
  "eslint": "^8.4.0",
@@ -64,6 +70,7 @@
64
70
  "jest-watch-suspend": "^1.1.2",
65
71
  "jest-watch-toggle-config": "^2.0.1",
66
72
  "jest-watch-typeahead": "^1.0.0",
73
+ "npm-run-all": "^4.1.5",
67
74
  "rimraf": "^3.0.0",
68
75
  "typescript": "^4.5.2"
69
76
  }
@@ -0,0 +1,36 @@
1
+ import rimraf from 'rimraf'
2
+ import { append, init, load } from '.'
3
+ import { noCoverage } from './testResultsExamples'
4
+
5
+ test('create new file', async () => {
6
+ const rootDir = 'fixtures/new_file'
7
+
8
+ try {
9
+ init({ rootDir })
10
+ await append(undefined, noCoverage)
11
+
12
+ const entries = await load(undefined)
13
+ expect(entries.length).toBe(1)
14
+ }
15
+ finally {
16
+ init()
17
+ rimraf.sync(rootDir)
18
+ }
19
+ })
20
+
21
+ test('append to file', async () => {
22
+ const rootDir = 'fixtures/append_file'
23
+
24
+ try {
25
+ init({ rootDir })
26
+ await append(undefined, noCoverage)
27
+ await append(undefined, noCoverage)
28
+
29
+ const entries = await load(undefined)
30
+ expect(entries.length).toBe(2)
31
+ }
32
+ finally {
33
+ init()
34
+ rimraf.sync(rootDir)
35
+ }
36
+ })
package/ts/append.ts ADDED
@@ -0,0 +1,28 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { unpartial } from 'unpartial';
4
+ import { promisify } from 'util';
5
+ import { compress } from './compress';
6
+ import { PROGRESS_FOLDER, TEST_RESULT_FILENAME } from './constants';
7
+ import { FSContext, TestResults } from './interface';
8
+ import { minify } from './minify';
9
+ import { store } from './store';
10
+
11
+ let appendFile = fs.appendFile
12
+ let promisifiedAppendFile = promisify(fs.appendFile)
13
+
14
+ export async function append(context: Partial<FSContext<'appendFile'>> | undefined, results: TestResults) {
15
+ const c = unpartial<FSContext<'appendFile'>>({ fs, rootDir: store.value.rootDir }, context)
16
+
17
+ const filepath = path.join(c.rootDir, PROGRESS_FOLDER, TEST_RESULT_FILENAME)
18
+ const minified = minify(results)
19
+ const compressed = compress(minified)
20
+
21
+ // istanbul ignore next
22
+ if (c.fs.appendFile !== appendFile) {
23
+ appendFile = c.fs.appendFile
24
+ promisifiedAppendFile = promisify(appendFile)
25
+ }
26
+
27
+ await promisifiedAppendFile(filepath, compressed + '\n')
28
+ }
package/ts/compress.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { MinifiedTestResult } from './minify';
2
+
3
+ export function compress(obj: MinifiedTestResult) {
4
+ return JSON.stringify(obj)
5
+ }
6
+
7
+ export function decompress(str: string): MinifiedTestResult {
8
+ return JSON.parse(str) as MinifiedTestResult
9
+ }
@@ -0,0 +1,2 @@
1
+ export const PROGRESS_FOLDER = '.progress'
2
+ export const TEST_RESULT_FILENAME = 'test.results'
package/ts/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './append'
2
+ export * from './init'
3
+ export * from './interface'
4
+ export * from './load'
5
+ export * from './monitor'
@@ -0,0 +1,30 @@
1
+ import t from 'assert'
2
+ import fs from 'fs'
3
+ import rimraf from 'rimraf'
4
+ import { init } from '.'
5
+ import { PROGRESS_FOLDER } from './constants'
6
+
7
+ test('create folder if not exist', () => {
8
+ try {
9
+ t.strictEqual(fs.existsSync('fixtures/init/create-if-not-exist'), false)
10
+ init({ rootDir: 'fixtures/init/create-if-not-exist' })
11
+ }
12
+ finally {
13
+ rimraf.sync('fixtures/init/create-if-not-exist')
14
+ }
15
+ })
16
+
17
+ test('ok if folder already existed', () => {
18
+ try {
19
+ fs.mkdirSync('fixtures/init/exist')
20
+ init({ rootDir: 'fixtures/init/exist' })
21
+ }
22
+ finally {
23
+ rimraf.sync('fixtures/init/exist')
24
+ }
25
+ })
26
+
27
+ test('by default init will create .progress', () => {
28
+ init()
29
+ t.strictEqual(fs.existsSync(PROGRESS_FOLDER), true)
30
+ })
package/ts/init.ts ADDED
@@ -0,0 +1,13 @@
1
+ import path from 'path'
2
+ import mkdirp from 'mkdirp';
3
+ import { PROGRESS_FOLDER } from './constants';
4
+ import { store } from './store';
5
+
6
+ /**
7
+ * Initialize environment.
8
+ * @param options optional options. Mostly for testing purpose.
9
+ */
10
+ export function init(options = { rootDir: '.' }) {
11
+ mkdirp.sync(path.join(options.rootDir, PROGRESS_FOLDER))
12
+ store.value.rootDir = options.rootDir
13
+ }
@@ -0,0 +1,36 @@
1
+ import fs from 'fs';
2
+
3
+ export interface FSContext<FSKeys extends keyof typeof fs> {
4
+ fs: Pick<typeof fs, FSKeys>,
5
+ /**
6
+ * Root directory (of the project).
7
+ */
8
+ rootDir: string
9
+ }
10
+
11
+ export interface TestResults {
12
+ startTime: number,
13
+ duration: number,
14
+ numFailedTests: number,
15
+ numFailedTestSuites: number,
16
+ numPassedTests: number,
17
+ numPassedTestSuites: number,
18
+ numTotalTests: number,
19
+ numTotalTestSuites: number,
20
+ filtered?: boolean,
21
+ coverage?: CoverageSummary
22
+ }
23
+
24
+ export interface FileCoverageTotal {
25
+ total: number,
26
+ covered: number,
27
+ skipped: number,
28
+ pct?: number;
29
+ }
30
+
31
+ export interface CoverageSummary {
32
+ lines: FileCoverageTotal,
33
+ statements: FileCoverageTotal,
34
+ branches: FileCoverageTotal,
35
+ functions: FileCoverageTotal;
36
+ }
@@ -0,0 +1,9 @@
1
+ import t from 'assert'
2
+ import { load } from '.'
3
+ import { store } from './store'
4
+
5
+ test('not exist', async () => {
6
+ store.value.rootDir = 'fixtures/not-exist'
7
+ const actual = await load(undefined)
8
+ t.strictEqual(actual.length, 0)
9
+ })
package/ts/load.ts ADDED
@@ -0,0 +1,38 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { unpartial } from 'unpartial';
4
+ import { promisify } from 'util';
5
+ import { decompress } from './compress';
6
+ import { PROGRESS_FOLDER, TEST_RESULT_FILENAME } from './constants';
7
+ import { FSContext, TestResults } from './interface';
8
+ import { unminify } from './minify';
9
+ import { store } from './store';
10
+
11
+ let readFile = fs.readFile
12
+ let promisifiedReadFile = promisify(fs.readFile)
13
+
14
+ export async function load(context?: Partial<FSContext<'readFile'>>) {
15
+ const c = unpartial<FSContext<'readFile'>>({ fs, rootDir: store.value.rootDir }, context)
16
+
17
+ const filepath = path.join(c.rootDir, PROGRESS_FOLDER, TEST_RESULT_FILENAME)
18
+
19
+ // istanbul ignore next
20
+ if (c.fs.readFile !== readFile) {
21
+ readFile = c.fs.readFile
22
+ promisifiedReadFile = promisify(readFile)
23
+ }
24
+
25
+ try {
26
+ const content = await promisifiedReadFile(filepath, 'utf-8')
27
+ const entries = content.split('\n')
28
+ return entries.reduce<TestResults[]>((r, e) => {
29
+ if (!e) return r
30
+ const minified = decompress(e)
31
+ r.push(unminify(minified))
32
+ return r
33
+ }, [])
34
+ }
35
+ catch {
36
+ return []
37
+ }
38
+ }
@@ -0,0 +1,44 @@
1
+ import t from 'assert'
2
+ import { minify, unminify } from './minify'
3
+ import {
4
+ noCoverage,
5
+ noCoverageMinified,
6
+ coverageNoPercentage,
7
+ coverageNoPercentageMinified,
8
+ coverageWithPercentage,
9
+ coverageWithPercentageMinified,
10
+ filtered,
11
+ filteredMinified
12
+ } from './testResultsExamples'
13
+
14
+ test('no coverage', () => {
15
+ const minified = minify(noCoverage)
16
+ t.deepStrictEqual(minified, noCoverageMinified)
17
+
18
+ const unminified = unminify(minified)
19
+ t.deepStrictEqual(unminified, noCoverage)
20
+ })
21
+
22
+ test('filtered', () => {
23
+ const minified = minify(filtered)
24
+ t.deepStrictEqual(minified, filteredMinified)
25
+
26
+ const unminified = unminify(minified)
27
+ t.deepStrictEqual(unminified, filtered)
28
+ })
29
+
30
+ test('with coverage no percentage', () => {
31
+ const minified = minify(coverageNoPercentage)
32
+ t.deepStrictEqual(minified, coverageNoPercentageMinified)
33
+
34
+ const unminified = unminify(minified)
35
+ t.deepStrictEqual(unminified, coverageNoPercentage)
36
+ })
37
+
38
+ test('with coverage with percentage', () => {
39
+ const minified = minify(coverageWithPercentage)
40
+ t.deepStrictEqual(minified, coverageWithPercentageMinified)
41
+
42
+ const unminified = unminify(minified)
43
+ t.deepStrictEqual(unminified, coverageWithPercentage)
44
+ })
package/ts/minify.ts ADDED
@@ -0,0 +1,94 @@
1
+ import { TestResults, CoverageSummary } from './interface';
2
+
3
+ export interface MinifiedTestResult {
4
+ d: number,
5
+ fl?: boolean,
6
+ f: number,
7
+ fs: number,
8
+ p: number,
9
+ ps: number,
10
+ t: number,
11
+ ts: number,
12
+ s: number,
13
+ c?: MinifiedCoverageSummary
14
+ }
15
+ export interface MinifiedCoverageSummary {
16
+ b: { c: number, s: number, t: number, p?: number },
17
+ f: { c: number, s: number, t: number, p?: number },
18
+ l: { c: number, s: number, t: number, p?: number },
19
+ s: { c: number, s: number, t: number, p?: number }
20
+ }
21
+
22
+ export function minify(testResults: TestResults) {
23
+ const { duration, filtered, numFailedTests, numFailedTestSuites, numPassedTests, numPassedTestSuites, numTotalTests, numTotalTestSuites, startTime, coverage } = testResults
24
+
25
+ const result: MinifiedTestResult = {
26
+ d: duration,
27
+ f: numFailedTests,
28
+ fs: numFailedTestSuites,
29
+ p: numPassedTests,
30
+ ps: numPassedTestSuites,
31
+ t: numTotalTests,
32
+ ts: numTotalTestSuites,
33
+ s: startTime
34
+ }
35
+ if (filtered) {
36
+ result.fl = filtered
37
+ }
38
+ if (coverage) {
39
+ result.c = minifyCoverage(coverage)
40
+ }
41
+ return result
42
+ }
43
+
44
+ function minifyCoverage(coverage: CoverageSummary) {
45
+ const { branches, functions, lines, statements } = coverage
46
+
47
+ const result: MinifiedCoverageSummary = {
48
+ b: { c: branches.covered, s: branches.skipped, t: branches.total },
49
+ f: { c: functions.covered, s: functions.skipped, t: functions.total },
50
+ l: { c: lines.covered, s: lines.skipped, t: lines.total },
51
+ s: { c: statements.covered, s: statements.skipped, t: statements.total }
52
+ }
53
+
54
+ if (branches.pct) result.b.p = branches.pct
55
+ if (functions.pct) result.f.p = functions.pct
56
+ if (lines.pct) result.l.p = lines.pct
57
+ if (statements.pct) result.s.p = statements.pct
58
+ return result
59
+ }
60
+
61
+ export function unminify(minified: MinifiedTestResult) {
62
+ const result: TestResults = {
63
+ duration: minified.d,
64
+ numFailedTests: minified.f,
65
+ numFailedTestSuites: minified.fs,
66
+ numPassedTests: minified.p,
67
+ numPassedTestSuites: minified.ps,
68
+ numTotalTests: minified.t,
69
+ numTotalTestSuites: minified.ts,
70
+ startTime: minified.s
71
+ }
72
+ if (minified.fl) {
73
+ result.filtered = minified.fl
74
+ }
75
+ if (minified.c) {
76
+ result.coverage = unminifyCoverage(minified.c)
77
+ }
78
+ return result
79
+ }
80
+
81
+ function unminifyCoverage(c: MinifiedCoverageSummary) {
82
+ const result: CoverageSummary = {
83
+ branches: { covered: c.b.c, skipped: c.b.s, total: c.b.t },
84
+ functions: { covered: c.f.c, skipped: c.f.s, total: c.f.t },
85
+ lines: { covered: c.l.c, skipped: c.l.s, total: c.l.t },
86
+ statements: { covered: c.s.c, skipped: c.s.s, total: c.s.t }
87
+ }
88
+
89
+ if (c.b.p !== undefined) result.branches.pct = c.b.p
90
+ if (c.f.p !== undefined) result.functions.pct = c.f.p
91
+ if (c.l.p !== undefined) result.lines.pct = c.l.p
92
+ if (c.s.p !== undefined) result.statements.pct = c.s.p
93
+ return result
94
+ }
@@ -0,0 +1,171 @@
1
+ import t from 'assert'
2
+ import { AssertOrder } from 'assertron'
3
+ import delay from 'delay'
4
+ import fs from 'fs'
5
+ import path from 'path'
6
+ import rimraf from 'rimraf'
7
+ import { append, init, monitor, MonitorSubscription, TestResults } from '.'
8
+ import { PROGRESS_FOLDER, TEST_RESULT_FILENAME } from './constants'
9
+ import { store } from './store'
10
+ import { filtered, noCoverage } from './testResultsExamples'
11
+
12
+ test('callback invoked with last save entry initially', async () => {
13
+ const rootDir = 'fixtures/monitor/monitor-first'
14
+ let sub: MonitorSubscription | undefined
15
+ try {
16
+ init({ rootDir })
17
+ await append({ rootDir }, filtered)
18
+ await append({ rootDir }, noCoverage)
19
+
20
+ const actual = await new Promise(a => {
21
+ sub = monitor({ rootDir, awaitWriteFinish: { pollInterval: 10, stabilityThreshold: 50 } }, (_, testResults) => a(testResults))
22
+ })
23
+
24
+
25
+ t.deepStrictEqual(actual, noCoverage)
26
+ }
27
+ finally {
28
+ if (sub) await sub.close()
29
+ init()
30
+ // chokidar seems to have lock issue in Windows
31
+ await delay(100)
32
+ rimraf.sync(rootDir, {})
33
+ }
34
+ })
35
+
36
+ test('extra empty line in the file is ignored', async () => {
37
+ const rootDir = 'fixtures/monitor/monitor-extra-empty-line'
38
+ let sub: MonitorSubscription | undefined
39
+ try {
40
+ init({ rootDir })
41
+ await append({ rootDir }, noCoverage)
42
+ const filepath = path.join(rootDir, PROGRESS_FOLDER, TEST_RESULT_FILENAME)
43
+ fs.appendFileSync(filepath, '\n')
44
+
45
+ const actual = await new Promise(a => {
46
+ sub = monitor({ rootDir, awaitWriteFinish: { pollInterval: 10, stabilityThreshold: 50 } }, (_, testResults) => a(testResults))
47
+ })
48
+
49
+
50
+ t.deepStrictEqual(actual, noCoverage)
51
+ }
52
+ finally {
53
+ if (sub) await sub.close()
54
+ init()
55
+ // chokidar seems to have lock issue in Windows
56
+ await delay(100)
57
+ rimraf.sync(rootDir)
58
+ }
59
+ })
60
+
61
+ test('callback not invoked when root directory not exist', async () => {
62
+ let sub: MonitorSubscription | undefined
63
+ try {
64
+ store.value.rootDir = 'fixtures/monitor/not-exist'
65
+ sub = monitor(undefined, () => { throw new Error('should not call') })
66
+ }
67
+ finally {
68
+ if (sub) await sub.close()
69
+ }
70
+ })
71
+
72
+ test('callback not invoked when result file not exist', async () => {
73
+ const rootDir = 'fixtures/monitor/monitor-no-file'
74
+ let sub: MonitorSubscription | undefined
75
+ try {
76
+ init({ rootDir })
77
+ sub = monitor({ rootDir }, () => { throw new Error('should not call') })
78
+ }
79
+ finally {
80
+ if (sub) await sub.close()
81
+ init()
82
+ // chokidar seems to have lock issue in Windows
83
+ await delay(100)
84
+ rimraf.sync(rootDir)
85
+ }
86
+ })
87
+
88
+ test('delete result file should not trigger', async () => {
89
+ const rootDir = 'fixtures/monitor/monitor-delete'
90
+
91
+ let sub: MonitorSubscription | undefined
92
+ try {
93
+ init({ rootDir })
94
+ await append({ rootDir }, noCoverage)
95
+
96
+ const o = new AssertOrder()
97
+ sub = monitor({ rootDir, awaitWriteFinish: { pollInterval: 10, stabilityThreshold: 50 } }, () => o.once(1))
98
+ const filePath = path.join(rootDir, TEST_RESULT_FILENAME)
99
+ rimraf.sync(filePath)
100
+ }
101
+ finally {
102
+ if (sub) await sub.close()
103
+ init()
104
+ // chokidar seems to have lock issue in Windows
105
+ await delay(100)
106
+ rimraf.sync(rootDir)
107
+ }
108
+ })
109
+
110
+ test('trigger on change', async () => {
111
+ const rootDir = 'fixtures/monitor/monitor-change'
112
+ let sub: MonitorSubscription | undefined
113
+ try {
114
+ init({ rootDir })
115
+ await append({ rootDir }, noCoverage)
116
+ const o = new AssertOrder(2)
117
+ sub = monitor({ rootDir, awaitWriteFinish: { pollInterval: 10, stabilityThreshold: 50 } }, () => o.any([1, 2]))
118
+ await delay(10)
119
+ await append({ rootDir }, noCoverage)
120
+ await delay(1000)
121
+ o.end()
122
+ }
123
+ finally {
124
+ if (sub) await sub.close()
125
+ init()
126
+ // chokidar seems to have lock issue in Windows
127
+ await delay(100)
128
+ rimraf.sync(rootDir)
129
+ }
130
+ })
131
+
132
+ test('trigger on new file', async () => {
133
+ const rootDir = 'fixtures/monitor/monitor-new'
134
+ let sub: MonitorSubscription | undefined
135
+ try {
136
+ init({ rootDir })
137
+
138
+ let accept: (v?: TestResults) => void
139
+ const p = new Promise<TestResults | undefined>(a => accept = a)
140
+ sub = monitor(
141
+ { rootDir, awaitWriteFinish: { pollInterval: 10, stabilityThreshold: 50 } },
142
+ (_, testResults) => accept(testResults)
143
+ )
144
+ // Add a small delay because in circleCI it seems like chokidar can't pick up the next append (new file).
145
+ await delay(10)
146
+ await append({ rootDir }, noCoverage)
147
+ const actual = await p
148
+ t.deepStrictEqual(actual, noCoverage)
149
+ }
150
+ finally {
151
+ if (sub) await sub.close()
152
+ init()
153
+ // chokidar seems to have lock issue in Windows
154
+ await delay(100)
155
+ rimraf.sync(rootDir)
156
+ }
157
+ })
158
+
159
+ test('file already exists will call once', async () => {
160
+ const rootDir = 'fixtures/monitor/exist'
161
+ let sub: MonitorSubscription | undefined
162
+ try {
163
+ let count = 0
164
+ sub = monitor({ rootDir, awaitWriteFinish: { pollInterval: 10, stabilityThreshold: 50 } }, () => count++)
165
+ await delay(10)
166
+ t.strictEqual(count, 1)
167
+ }
168
+ finally {
169
+ if (sub) await sub.close()
170
+ }
171
+ })
package/ts/monitor.ts ADDED
@@ -0,0 +1,73 @@
1
+ import chokidar from 'chokidar'
2
+ import fs from 'fs'
3
+ import path from 'path'
4
+ import readline from 'readline'
5
+ import { unpartial } from 'unpartial'
6
+ import { decompress } from './compress'
7
+ import { PROGRESS_FOLDER, TEST_RESULT_FILENAME } from './constants'
8
+ import { TestResults } from './interface'
9
+ import { unminify } from './minify'
10
+ import { store } from './store'
11
+
12
+ export interface MonitorContext {
13
+ fs: Pick<typeof fs, 'watch'>,
14
+ rootDir: string,
15
+ awaitWriteFinish: AwaitWriteFinishOptions | boolean;
16
+ }
17
+
18
+ export interface AwaitWriteFinishOptions {
19
+ /**
20
+ * Amount of time in milliseconds for a file size to remain constant before emitting its event.
21
+ */
22
+ stabilityThreshold?: number,
23
+
24
+ /**
25
+ * File size polling interval.
26
+ */
27
+ pollInterval?: number
28
+ }
29
+
30
+ export interface MonitorSubscription {
31
+ close(): Promise<void>
32
+ }
33
+
34
+ export function monitor(context: Partial<MonitorContext & GetLastLineContext> | undefined, callback: (err: any, testResults?: TestResults) => void): MonitorSubscription {
35
+ const c = unpartial<MonitorContext & GetLastLineContext>({
36
+ fs,
37
+ readline,
38
+ rootDir: store.value.rootDir,
39
+ awaitWriteFinish: true
40
+ }, context)
41
+ const filepath = path.join(c.rootDir, PROGRESS_FOLDER, TEST_RESULT_FILENAME)
42
+
43
+ const w = chokidar.watch(filepath, { awaitWriteFinish: c.awaitWriteFinish })
44
+ w.on('add', path => invokeCallback(c, path, callback))
45
+ w.on('change', path => invokeCallback(c, path, callback))
46
+ return { close: () => w.close() }
47
+ }
48
+
49
+ function invokeCallback(context: GetLastLineContext, filename: string, callback: (err: any, testResults?: TestResults) => void) {
50
+ getLastLine(context, filename).then(line => {
51
+ callback(undefined, unminify(decompress(line)))
52
+ }).catch((e) => callback(e))
53
+ }
54
+
55
+ export interface GetLastLineContext {
56
+ fs: Pick<typeof fs, 'createReadStream' | 'WriteStream'>,
57
+ readline: Pick<typeof readline, 'createInterface'>
58
+ }
59
+
60
+ function getLastLine({ fs, readline }: GetLastLineContext, filename: string) {
61
+ const inStream = fs.createReadStream(filename)
62
+ return new Promise<string>((a, r) => {
63
+ const rl = readline.createInterface(inStream)
64
+ let lastline = ''
65
+ rl.on('line', (line: string) => {
66
+ if (line.length) {
67
+ lastline = line
68
+ }
69
+ })
70
+ rl.on('error', r)
71
+ rl.on('close', () => a(lastline))
72
+ })
73
+ }
package/ts/store.ts ADDED
@@ -0,0 +1,11 @@
1
+ import { createStore } from 'global-store'
2
+
3
+ export const store = createStore<{ rootDir: string }>({
4
+ moduleName: 'test-progress-tracker',
5
+ version: '1.0.0',
6
+ key: 'eb969cee-8646-5b9c-9084-9093804d4121',
7
+ initializer: (current) => ({
8
+ rootDir: '.',
9
+ ...current
10
+ })
11
+ })
@@ -0,0 +1,108 @@
1
+ export const noCoverage = {
2
+ duration: 1,
3
+ numFailedTests: 2,
4
+ numFailedTestSuites: 3,
5
+ numPassedTests: 4,
6
+ numPassedTestSuites: 5,
7
+ numTotalTests: 6,
8
+ numTotalTestSuites: 7,
9
+ startTime: 8
10
+ }
11
+
12
+ export const noCoverageMinified = {
13
+ d: 1,
14
+ f: 2,
15
+ fs: 3,
16
+ p: 4,
17
+ ps: 5,
18
+ t: 6,
19
+ ts: 7,
20
+ s: 8
21
+ }
22
+ export const filtered = {
23
+ duration: 1,
24
+ filtered: true,
25
+ numFailedTests: 2,
26
+ numFailedTestSuites: 3,
27
+ numPassedTests: 4,
28
+ numPassedTestSuites: 5,
29
+ numTotalTests: 6,
30
+ numTotalTestSuites: 7,
31
+ startTime: 8
32
+ }
33
+
34
+ export const filteredMinified = {
35
+ d: 1,
36
+ fl: true,
37
+ f: 2,
38
+ fs: 3,
39
+ p: 4,
40
+ ps: 5,
41
+ t: 6,
42
+ ts: 7,
43
+ s: 8
44
+ }
45
+ export const coverageNoPercentage = {
46
+ duration: 1,
47
+ numFailedTests: 2,
48
+ numFailedTestSuites: 3,
49
+ numPassedTests: 4,
50
+ numPassedTestSuites: 5,
51
+ numTotalTests: 6,
52
+ numTotalTestSuites: 7,
53
+ startTime: 8,
54
+ coverage: {
55
+ branches: { covered: 0, skipped: 1, total: 2 },
56
+ functions: { covered: 3, skipped: 4, total: 5 },
57
+ lines: { covered: 6, skipped: 7, total: 8 },
58
+ statements: { covered: 9, skipped: 10, total: 11 }
59
+ }
60
+ }
61
+ export const coverageNoPercentageMinified = {
62
+ d: 1,
63
+ f: 2,
64
+ fs: 3,
65
+ p: 4,
66
+ ps: 5,
67
+ t: 6,
68
+ ts: 7,
69
+ s: 8,
70
+ c: {
71
+ b: { c: 0, s: 1, t: 2 },
72
+ f: { c: 3, s: 4, t: 5 },
73
+ l: { c: 6, s: 7, t: 8 },
74
+ s: { c: 9, s: 10, t: 11 }
75
+ }
76
+ }
77
+ export const coverageWithPercentage = {
78
+ duration: 1,
79
+ numFailedTests: 2,
80
+ numFailedTestSuites: 3,
81
+ numPassedTests: 4,
82
+ numPassedTestSuites: 5,
83
+ numTotalTests: 6,
84
+ numTotalTestSuites: 7,
85
+ startTime: 8,
86
+ coverage: {
87
+ branches: { covered: 0, skipped: 1, total: 2, pct: 0.1 },
88
+ functions: { covered: 3, skipped: 4, total: 5, pct: 0.2 },
89
+ lines: { covered: 6, skipped: 7, total: 8, pct: 0.3 },
90
+ statements: { covered: 9, skipped: 10, total: 11, pct: 0.4 }
91
+ }
92
+ }
93
+ export const coverageWithPercentageMinified = {
94
+ d: 1,
95
+ f: 2,
96
+ fs: 3,
97
+ p: 4,
98
+ ps: 5,
99
+ t: 6,
100
+ ts: 7,
101
+ s: 8,
102
+ c: {
103
+ b: { c: 0, s: 1, t: 2, p: 0.1 },
104
+ f: { c: 3, s: 4, t: 5, p: 0.2 },
105
+ l: { c: 6, s: 7, t: 8, p: 0.3 },
106
+ s: { c: 9, s: 10, t: 11, p: 0.4 }
107
+ }
108
+ }