testplane 8.32.2 → 8.32.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/build/package.json +5 -3
  2. package/build/src/browser/cdp/connection.d.ts +1 -1
  3. package/build/src/browser/cdp/connection.js +4 -4
  4. package/build/src/browser/cdp/connection.js.map +1 -1
  5. package/build/src/browser/cdp/domains/css.d.ts +46 -0
  6. package/build/src/browser/cdp/domains/css.js +35 -0
  7. package/build/src/browser/cdp/domains/css.js.map +1 -0
  8. package/build/src/browser/cdp/domains/debugger.d.ts +65 -0
  9. package/build/src/browser/cdp/domains/debugger.js +31 -0
  10. package/build/src/browser/cdp/domains/debugger.js.map +1 -0
  11. package/build/src/browser/cdp/domains/dom.d.ts +24 -0
  12. package/build/src/browser/cdp/domains/dom.js +23 -0
  13. package/build/src/browser/cdp/domains/dom.js.map +1 -0
  14. package/build/src/browser/cdp/{profiler.d.ts → domains/profiler.d.ts} +3 -3
  15. package/build/src/browser/cdp/{profiler.js → domains/profiler.js} +2 -5
  16. package/build/src/browser/cdp/domains/profiler.js.map +1 -0
  17. package/build/src/browser/cdp/domains/runtime.d.ts +57 -0
  18. package/build/src/browser/cdp/domains/runtime.js +34 -0
  19. package/build/src/browser/cdp/domains/runtime.js.map +1 -0
  20. package/build/src/browser/cdp/{target.d.ts → domains/target.d.ts} +5 -3
  21. package/build/src/browser/cdp/{target.js → domains/target.js} +7 -5
  22. package/build/src/browser/cdp/domains/target.js.map +1 -0
  23. package/build/src/browser/cdp/emitter.d.ts +1 -0
  24. package/build/src/browser/cdp/emitter.js +3 -0
  25. package/build/src/browser/cdp/emitter.js.map +1 -1
  26. package/build/src/browser/cdp/index.d.ts +10 -2
  27. package/build/src/browser/cdp/index.js +25 -3
  28. package/build/src/browser/cdp/index.js.map +1 -1
  29. package/build/src/browser/cdp/selectivity/constants.d.ts +1 -0
  30. package/build/src/browser/cdp/selectivity/constants.js +5 -0
  31. package/build/src/browser/cdp/selectivity/constants.js.map +1 -0
  32. package/build/src/browser/cdp/selectivity/css-selectivity.d.ts +14 -0
  33. package/build/src/browser/cdp/selectivity/css-selectivity.js +112 -0
  34. package/build/src/browser/cdp/selectivity/css-selectivity.js.map +1 -0
  35. package/build/src/browser/cdp/selectivity/file-hash-provider.d.ts +4 -0
  36. package/build/src/browser/cdp/selectivity/file-hash-provider.js +28 -0
  37. package/build/src/browser/cdp/selectivity/file-hash-provider.js.map +1 -0
  38. package/build/src/browser/cdp/selectivity/file-hash-writer.d.ts +17 -0
  39. package/build/src/browser/cdp/selectivity/file-hash-writer.js +123 -0
  40. package/build/src/browser/cdp/selectivity/file-hash-writer.js.map +1 -0
  41. package/build/src/browser/cdp/selectivity/index.d.ts +5 -0
  42. package/build/src/browser/cdp/selectivity/index.js +55 -0
  43. package/build/src/browser/cdp/selectivity/index.js.map +1 -0
  44. package/build/src/browser/cdp/selectivity/js-selectivity.d.ts +16 -0
  45. package/build/src/browser/cdp/selectivity/js-selectivity.js +129 -0
  46. package/build/src/browser/cdp/selectivity/js-selectivity.js.map +1 -0
  47. package/build/src/browser/cdp/selectivity/json-utils.d.ts +10 -0
  48. package/build/src/browser/cdp/selectivity/json-utils.js +123 -0
  49. package/build/src/browser/cdp/selectivity/json-utils.js.map +1 -0
  50. package/build/src/browser/cdp/selectivity/test-dependencies-writer.d.ts +11 -0
  51. package/build/src/browser/cdp/selectivity/test-dependencies-writer.js +57 -0
  52. package/build/src/browser/cdp/selectivity/test-dependencies-writer.js.map +1 -0
  53. package/build/src/browser/cdp/selectivity/types.d.ts +15 -0
  54. package/build/src/browser/cdp/selectivity/types.js +10 -0
  55. package/build/src/browser/cdp/selectivity/types.js.map +1 -0
  56. package/build/src/browser/cdp/selectivity/utils.d.ts +39 -0
  57. package/build/src/browser/cdp/selectivity/utils.js +198 -0
  58. package/build/src/browser/cdp/selectivity/utils.js.map +1 -0
  59. package/build/src/browser/cdp/types.d.ts +83 -4
  60. package/build/src/browser/commands/index.js +2 -0
  61. package/build/src/browser/commands/index.js.map +1 -1
  62. package/build/src/browser/commands/restoreState/index.d.ts +8 -0
  63. package/build/src/browser/commands/restoreState/index.js +124 -0
  64. package/build/src/browser/commands/restoreState/index.js.map +1 -0
  65. package/build/src/browser/commands/restoreState/restoreStorage.d.ts +1 -0
  66. package/build/src/browser/commands/restoreState/restoreStorage.js +12 -0
  67. package/build/src/browser/commands/restoreState/restoreStorage.js.map +1 -0
  68. package/build/src/browser/commands/saveState/dumpStorage.d.ts +5 -0
  69. package/build/src/browser/commands/saveState/dumpStorage.js +29 -0
  70. package/build/src/browser/commands/saveState/dumpStorage.js.map +1 -0
  71. package/build/src/browser/commands/saveState/index.d.ts +25 -0
  72. package/build/src/browser/commands/saveState/index.js +154 -0
  73. package/build/src/browser/commands/saveState/index.js.map +1 -0
  74. package/build/src/browser/existing-browser.d.ts +9 -0
  75. package/build/src/browser/existing-browser.js +97 -8
  76. package/build/src/browser/existing-browser.js.map +1 -1
  77. package/build/src/browser/types.d.ts +4 -0
  78. package/build/src/browser/types.js.map +1 -1
  79. package/build/src/config/browser-options.js +7 -0
  80. package/build/src/config/browser-options.js.map +1 -1
  81. package/build/src/config/defaults.d.ts +6 -0
  82. package/build/src/config/defaults.js +6 -0
  83. package/build/src/config/defaults.js.map +1 -1
  84. package/build/src/config/types.d.ts +9 -1
  85. package/build/src/config/types.js.map +1 -1
  86. package/build/src/error-snippets/constants.d.ts +2 -1
  87. package/build/src/error-snippets/constants.js +3 -2
  88. package/build/src/error-snippets/constants.js.map +1 -1
  89. package/build/src/error-snippets/source-maps.js +4 -4
  90. package/build/src/error-snippets/source-maps.js.map +1 -1
  91. package/build/src/error-snippets/utils.js +2 -2
  92. package/build/src/error-snippets/utils.js.map +1 -1
  93. package/build/src/index.d.ts +1 -0
  94. package/build/src/worker/runner/test-runner/index.js +3 -0
  95. package/build/src/worker/runner/test-runner/index.js.map +1 -1
  96. package/package.json +5 -3
  97. package/build/src/browser/cdp/profiler.js.map +0 -1
  98. package/build/src/browser/cdp/target.js.map +0 -1
@@ -1,11 +1,19 @@
1
1
  import type { Browser } from "../types";
2
2
  import { CDPConnection } from "./connection";
3
- import { CDPTarget } from "./target";
4
- import { CDPProfiler } from "./profiler";
3
+ import { CDPTarget } from "./domains/target";
4
+ import { CDPProfiler } from "./domains/profiler";
5
+ import { CDPDebugger } from "./domains/debugger";
6
+ import { CDPRuntime } from "./domains/runtime";
7
+ import { CDPDom } from "./domains/dom";
8
+ import { CDPCss } from "./domains/css";
5
9
  export declare class CDP {
6
10
  private readonly _connection;
7
11
  readonly target: CDPTarget;
8
12
  readonly profiler: CDPProfiler;
13
+ readonly debugger: CDPDebugger;
14
+ readonly runtime: CDPRuntime;
15
+ readonly dom: CDPDom;
16
+ readonly css: CDPCss;
9
17
  static create(browser: Browser): Promise<CDP | null>;
10
18
  constructor(connection: CDPConnection);
11
19
  close(): void;
@@ -2,11 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CDP = void 0;
4
4
  const connection_1 = require("./connection");
5
- const target_1 = require("./target");
6
- const profiler_1 = require("./profiler");
5
+ const target_1 = require("./domains/target");
6
+ const profiler_1 = require("./domains/profiler");
7
+ const debugger_1 = require("./domains/debugger");
8
+ const runtime_1 = require("./domains/runtime");
9
+ const dom_1 = require("./domains/dom");
10
+ const css_1 = require("./domains/css");
7
11
  class CDP {
8
12
  static async create(browser) {
9
- if (!browser.publicAPI.isChromium) {
13
+ // "isChrome" is "true" when automationProtocol is "devtools"
14
+ const isChromiumLike = browser.publicAPI.isChromium || browser.publicAPI.isChrome;
15
+ if (!isChromiumLike) {
10
16
  return null;
11
17
  }
12
18
  const connection = await connection_1.CDPConnection.create(browser).catch(() => null);
@@ -16,6 +22,10 @@ class CDP {
16
22
  this._connection = connection;
17
23
  this.target = new target_1.CDPTarget(connection);
18
24
  this.profiler = new profiler_1.CDPProfiler(connection);
25
+ this.debugger = new debugger_1.CDPDebugger(connection);
26
+ this.runtime = new runtime_1.CDPRuntime(connection);
27
+ this.dom = new dom_1.CDPDom(connection);
28
+ this.css = new css_1.CDPCss(connection);
19
29
  this._connection.onEventMessage = this._onEventMessage.bind(this);
20
30
  }
21
31
  close() {
@@ -30,6 +40,18 @@ class CDP {
30
40
  case "Profiler":
31
41
  this.profiler.emit(method, cdpEventMessage.params);
32
42
  break;
43
+ case "Debugger":
44
+ this.debugger.emit(method, cdpEventMessage.params);
45
+ break;
46
+ case "Runtime":
47
+ this.runtime.emit(method, cdpEventMessage.params);
48
+ break;
49
+ case "DOM":
50
+ this.dom.emit(method, cdpEventMessage.params);
51
+ break;
52
+ case "CSS":
53
+ this.css.emit(method, cdpEventMessage.params);
54
+ break;
33
55
  }
34
56
  }
35
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/browser/cdp/index.ts"],"names":[],"mappings":";;;AACA,6CAA6C;AAC7C,qCAAqC;AACrC,yCAAyC;AAGzC,MAAa,GAAG;IAKZ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAgB;QAChC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,0BAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEzE,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;IAED,YAAY,UAAyB;QACjC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAS,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAW,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,KAAK;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAEO,eAAe,CAAC,eAAyB;QAC7C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAE9D,QAAQ,MAAM,EAAE,CAAC;YACb,KAAK,QAAQ;gBACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBACjD,MAAM;YACV,KAAK,UAAU;gBACX,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBACnD,MAAM;QACd,CAAC;IACL,CAAC;CACJ;AAtCD,kBAsCC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/browser/cdp/index.ts"],"names":[],"mappings":";;;AAEA,6CAA6C;AAC7C,6CAA6C;AAC7C,iDAAiD;AACjD,iDAAiD;AACjD,+CAA+C;AAC/C,uCAAuC;AACvC,uCAAuC;AAEvC,MAAa,GAAG;IASZ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAgB;QAChC,6DAA6D;QAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,IAAK,OAAO,CAAC,SAAoC,CAAC,QAAQ,CAAC;QAE9G,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,0BAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEzE,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;IAED,YAAY,UAAyB;QACjC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAS,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAW,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAW,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,oBAAU,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,GAAG,IAAI,YAAM,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,GAAG,IAAI,YAAM,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,KAAK;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAEO,eAAe,CAAC,eAAyB;QAC7C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAE9D,QAAQ,MAAM,EAAE,CAAC;YACb,KAAK,QAAQ;gBACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBACjD,MAAM;YACV,KAAK,UAAU;gBACX,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBACnD,MAAM;YACV,KAAK,UAAU;gBACX,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBACnD,MAAM;YACV,KAAK,SAAS;gBACV,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBAClD,MAAM;YACV,KAAK,KAAK;gBACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM;YACV,KAAK,KAAK;gBACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM;QACd,CAAC;IACL,CAAC;CACJ;AA7DD,kBA6DC"}
@@ -0,0 +1 @@
1
+ export declare const WEBPACK_PROTOCOL = "webpack://";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WEBPACK_PROTOCOL = void 0;
4
+ exports.WEBPACK_PROTOCOL = "webpack://";
5
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { CDP } from "..";
2
+ import type { CDPSessionId } from "../types";
3
+ export declare class CSSSelectivity {
4
+ private readonly _cdp;
5
+ private readonly _sessionId;
6
+ private readonly _sourceRoot;
7
+ private _cssOnStyleSheetAddedFn;
8
+ private _stylesSourceMap;
9
+ constructor(cdp: CDP, sessionId: CDPSessionId, sourceRoot?: string);
10
+ private _processStyle;
11
+ start(): Promise<void>;
12
+ /** @param drop only performs cleanup without providing actual deps. Should be "true" if test is failed */
13
+ stop(drop?: boolean): Promise<string[]>;
14
+ }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CSSSelectivity = void 0;
7
+ const lodash_1 = require("lodash");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_url_1 = require("node:url");
10
+ const constants_1 = require("../../../error-snippets/constants");
11
+ const utils_1 = require("./utils");
12
+ class CSSSelectivity {
13
+ constructor(cdp, sessionId, sourceRoot = "") {
14
+ this._cssOnStyleSheetAddedFn = null;
15
+ this._stylesSourceMap = {};
16
+ this._cdp = cdp;
17
+ this._sessionId = sessionId;
18
+ this._sourceRoot = sourceRoot;
19
+ }
20
+ _processStyle({ header: { styleSheetId, sourceURL, sourceMapURL } }) {
21
+ if (!this._sessionId) {
22
+ return;
23
+ }
24
+ if (!sourceURL || !sourceMapURL) {
25
+ this._stylesSourceMap[styleSheetId] ||= null;
26
+ return;
27
+ }
28
+ this._stylesSourceMap[styleSheetId] ||= (0, utils_1.fetchTextWithBrowserFallback)((0, node_url_1.resolve)(sourceURL, sourceMapURL), this._cdp.runtime, this._sessionId);
29
+ }
30
+ async start() {
31
+ const cssOnStyleSheetAdded = (this._cssOnStyleSheetAddedFn = this._processStyle.bind(this));
32
+ this._cdp.css.on("styleSheetAdded", cssOnStyleSheetAdded);
33
+ await Promise.all([
34
+ this._cdp.target.setAutoAttach(this._sessionId, { autoAttach: true, waitForDebuggerOnStart: false }),
35
+ this._cdp.dom
36
+ .enable(this._sessionId)
37
+ .then(() => this._cdp.css.enable(this._sessionId))
38
+ .then(() => this._cdp.css.startRuleUsageTracking(this._sessionId)),
39
+ ]);
40
+ }
41
+ /** @param drop only performs cleanup without providing actual deps. Should be "true" if test is failed */
42
+ async stop(drop) {
43
+ if (drop) {
44
+ this._cssOnStyleSheetAddedFn && this._cdp.css.off("styleSheetAdded", this._cssOnStyleSheetAddedFn);
45
+ return [];
46
+ }
47
+ const coverage = await this._cdp.css.stopRuleUsageTracking(this._sessionId);
48
+ // If we haven't got "styleSheetAdded" event for the script, pull up styles + source map manually
49
+ coverage.ruleUsage.forEach(({ styleSheetId }) => {
50
+ if (Object.hasOwn(this._stylesSourceMap, styleSheetId)) {
51
+ return;
52
+ }
53
+ const scriptSourcePromise = this._cdp.css
54
+ .getStyleSheetText(this._sessionId, styleSheetId)
55
+ .then(res => res.text)
56
+ .catch((err) => err);
57
+ this._stylesSourceMap[styleSheetId] ||= scriptSourcePromise.then(sourceCode => {
58
+ if (sourceCode instanceof Error) {
59
+ return sourceCode;
60
+ }
61
+ const sourceMapsStartIndex = sourceCode.lastIndexOf(constants_1.CSS_SOURCE_MAP_URL_COMMENT);
62
+ const sourceMapsEndIndex = sourceCode.indexOf("*/", sourceMapsStartIndex);
63
+ if (sourceMapsStartIndex === -1) {
64
+ return new Error("Source maping url comment is missing");
65
+ }
66
+ const sourceMapURL = sourceMapsEndIndex === -1
67
+ ? sourceCode.slice(sourceMapsStartIndex + constants_1.CSS_SOURCE_MAP_URL_COMMENT.length)
68
+ : sourceCode.slice(sourceMapsStartIndex + constants_1.CSS_SOURCE_MAP_URL_COMMENT.length, sourceMapsEndIndex);
69
+ const isSourceMapEmbedded = new node_url_1.URL(sourceMapURL).protocol === "data:";
70
+ // If we encounter css stylesheet, that was not reported by "styleSheetAdded"
71
+ // We can only get sourcemaps if they are inlined
72
+ // Otherwise, we can't resolve actual sourcemaps url because we dont know css styles url itself.
73
+ if (!isSourceMapEmbedded) {
74
+ return new Error([
75
+ `Missed stylesheet url for stylesheet id ${styleSheetId}.`,
76
+ "Switching to inline sourcemaps for CSS will help",
77
+ ].join("\n"));
78
+ }
79
+ return (0, utils_1.fetchTextWithBrowserFallback)(sourceMapURL, this._cdp.runtime, this._sessionId);
80
+ });
81
+ });
82
+ const totalDependingSourceFiles = new Set();
83
+ const grouppedByStyleSheetCoverage = (0, lodash_1.groupBy)(coverage.ruleUsage, "styleSheetId");
84
+ const styleSheetIds = Object.keys(grouppedByStyleSheetCoverage);
85
+ await Promise.all(styleSheetIds.map(async (styleSheetId) => {
86
+ const sourceMapString = await this._stylesSourceMap[styleSheetId];
87
+ if (!sourceMapString) {
88
+ return;
89
+ }
90
+ if (sourceMapString instanceof Error) {
91
+ throw new Error(`CSS Selectivity: Couldn't load source maps for stylesheet id ${styleSheetId}: ${sourceMapString}`);
92
+ }
93
+ const rawSourceMap = (0, utils_1.patchSourceMapSources)(JSON.parse(sourceMapString), this._sourceRoot);
94
+ // We could check "if stylesheet was used" with utils.extractSourceFilesDeps
95
+ // But we dont, because if stylesheet was not used, it could be used after change
96
+ // So its safe to think "if stylesheet was loaded, it was used"
97
+ rawSourceMap.sources.forEach(sourceFilePath => {
98
+ // "Each entry is either a string that is a (potentially relative) URL", so we are using posix.jojn
99
+ // https://tc39.es/ecma426/#sec-source-map-format
100
+ // Except for file path with protocol ("turbopack://", "file://")
101
+ const sourceRootBasedPath = (0, utils_1.hasProtocol)(sourceFilePath)
102
+ ? sourceFilePath
103
+ : node_path_1.default.posix.join(rawSourceMap.sourceRoot || "", sourceFilePath);
104
+ totalDependingSourceFiles.add(sourceRootBasedPath);
105
+ });
106
+ }));
107
+ this._cssOnStyleSheetAddedFn && this._cdp.css.off("styleSheetAdded", this._cssOnStyleSheetAddedFn);
108
+ return Array.from(totalDependingSourceFiles).sort();
109
+ }
110
+ }
111
+ exports.CSSSelectivity = CSSSelectivity;
112
+ //# sourceMappingURL=css-selectivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-selectivity.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/css-selectivity.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAiC;AACjC,0DAA6B;AAC7B,uCAAsD;AACtD,iEAA+E;AAC/E,mCAA2F;AAK3F,MAAa,cAAc;IAOvB,YAAY,GAAQ,EAAE,SAAuB,EAAE,UAAU,GAAG,EAAE;QAHtD,4BAAuB,GAA4D,IAAI,CAAC;QACxF,qBAAgB,GAA+D,EAAE,CAAC;QAGtF,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAEO,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,EAAgC;QACrG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;YAC7C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,IAAA,oCAA4B,EAChE,IAAA,kBAAU,EAAC,SAAS,EAAE,YAAY,CAAC,EACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EACjB,IAAI,CAAC,UAAU,CAClB,CAAC;IACN,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,oBAAoB,GAAG,CAAC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE5F,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;QAE1D,MAAM,OAAO,CAAC,GAAG,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC;YACpG,IAAI,CAAC,IAAI,CAAC,GAAG;iBACR,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;iBACvB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;iBACjD,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SACzE,CAAC,CAAC;IACP,CAAC;IAED,0GAA0G;IAC1G,KAAK,CAAC,IAAI,CAAC,IAAc;QACrB,IAAI,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAEnG,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE5E,iGAAiG;QACjG,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;YAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,EAAE,CAAC;gBACrD,OAAO;YACX,CAAC;YAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG;iBACpC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;iBAChD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;iBACrB,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAEhC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBAC1E,IAAI,UAAU,YAAY,KAAK,EAAE,CAAC;oBAC9B,OAAO,UAAU,CAAC;gBACtB,CAAC;gBAED,MAAM,oBAAoB,GAAG,UAAU,CAAC,WAAW,CAAC,sCAA0B,CAAC,CAAC;gBAChF,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;gBAE1E,IAAI,oBAAoB,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC9B,OAAO,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBAC7D,CAAC;gBAED,MAAM,YAAY,GACd,kBAAkB,KAAK,CAAC,CAAC;oBACrB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,oBAAoB,GAAG,sCAA0B,CAAC,MAAM,CAAC;oBAC5E,CAAC,CAAC,UAAU,CAAC,KAAK,CACZ,oBAAoB,GAAG,sCAA0B,CAAC,MAAM,EACxD,kBAAkB,CACrB,CAAC;gBAEZ,MAAM,mBAAmB,GAAG,IAAI,cAAG,CAAC,YAAY,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;gBAEvE,6EAA6E;gBAC7E,iDAAiD;gBACjD,gGAAgG;gBAChG,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACvB,OAAO,IAAI,KAAK,CACZ;wBACI,2CAA2C,YAAY,GAAG;wBAC1D,kDAAkD;qBACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CACf,CAAC;gBACN,CAAC;gBAED,OAAO,IAAA,oCAA4B,EAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1F,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAU,CAAC;QACpD,MAAM,4BAA4B,GAAG,IAAA,gBAAO,EAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACjF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAEhE,MAAM,OAAO,CAAC,GAAG,CACb,aAAa,CAAC,GAAG,CAAC,KAAK,EAAC,YAAY,EAAC,EAAE;YACnC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAElE,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,OAAO;YACX,CAAC;YAED,IAAI,eAAe,YAAY,KAAK,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACX,gEAAgE,YAAY,KAAK,eAAe,EAAE,CACrG,CAAC;YACN,CAAC;YAED,MAAM,YAAY,GAAG,IAAA,6BAAqB,EAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAE1F,4EAA4E;YAC5E,iFAAiF;YACjF,+DAA+D;YAC/D,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;gBAC1C,mGAAmG;gBACnG,iDAAiD;gBACjD,iEAAiE;gBACjE,MAAM,mBAAmB,GAAG,IAAA,mBAAW,EAAC,cAAc,CAAC;oBACnD,CAAC,CAAC,cAAc;oBAChB,CAAC,CAAC,mBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;gBAErE,yBAAyB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CACL,CAAC;QAEF,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAEnG,OAAO,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;CACJ;AA/ID,wCA+IC"}
@@ -0,0 +1,4 @@
1
+ export declare class FileHashProvider {
2
+ private static readonly _hashStore;
3
+ calculateFor(filePath: string): Promise<string>;
4
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FileHashProvider = void 0;
7
+ const node_crypto_1 = __importDefault(require("node:crypto"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ class FileHashProvider {
10
+ async calculateFor(filePath) {
11
+ const cachedHash = FileHashProvider._hashStore.get(filePath);
12
+ if (cachedHash) {
13
+ return cachedHash;
14
+ }
15
+ const hash = new Promise((resolve, reject) => {
16
+ const hash = node_crypto_1.default.createHash("md5");
17
+ const fileReadStream = node_fs_1.default.createReadStream(filePath);
18
+ fileReadStream.on("data", chunk => hash.update(chunk));
19
+ fileReadStream.on("end", () => resolve(hash.digest("hex")));
20
+ fileReadStream.on("error", err => reject(new Error(`Selectivity: Couldn't calculate hash for ${filePath}: ${err}`)));
21
+ });
22
+ FileHashProvider._hashStore.set(filePath, hash);
23
+ return hash;
24
+ }
25
+ }
26
+ exports.FileHashProvider = FileHashProvider;
27
+ FileHashProvider._hashStore = new Map();
28
+ //# sourceMappingURL=file-hash-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-hash-provider.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/file-hash-provider.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAiC;AACjC,sDAAyB;AAEzB,MAAa,gBAAgB;IAGzB,KAAK,CAAC,YAAY,CAAC,QAAgB;QAC/B,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7D,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,UAAU,CAAC;QACtB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,MAAM,IAAI,GAAG,qBAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,cAAc,GAAG,iBAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAErD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAC7B,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC,CACpF,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEhD,OAAO,IAAI,CAAC;IAChB,CAAC;;AAxBL,4CAyBC;AAxB2B,2BAAU,GAAiC,IAAI,GAAG,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /// <reference types="lodash" />
2
+ import type { NormalizedDependencies, SelectivityCompressionType } from "./types";
3
+ export declare class FileHashWriter {
4
+ private readonly _fileHashProvider;
5
+ private readonly _stagedFileHashes;
6
+ private readonly _stagedModuleHashes;
7
+ private readonly _selectivityHashesPath;
8
+ private readonly _compresion;
9
+ private _hashFileContents;
10
+ constructor(selectivityRootPath: string, compression: SelectivityCompressionType);
11
+ private _addFileDependency;
12
+ private _addModuleDependency;
13
+ private _ensureInited;
14
+ add(dependencies: NormalizedDependencies): void;
15
+ commit(): Promise<void>;
16
+ }
17
+ export declare const getFileHashWriter: ((selectivityRootPath: string, compression: SelectivityCompressionType) => FileHashWriter) & import("lodash").MemoizedFunction;
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getFileHashWriter = exports.FileHashWriter = void 0;
7
+ const lodash_1 = require("lodash");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const file_hash_provider_1 = require("./file-hash-provider");
10
+ const utils_1 = require("./utils");
11
+ const json_utils_1 = require("./json-utils");
12
+ class FileHashWriter {
13
+ constructor(selectivityRootPath, compression) {
14
+ this._fileHashProvider = new file_hash_provider_1.FileHashProvider();
15
+ // "null" - successfully writed, "Promise<string>" - file/module hash, "Promise<Error>" - calculating hash error
16
+ this._stagedFileHashes = new Map();
17
+ this._stagedModuleHashes = new Map();
18
+ this._hashFileContents = null;
19
+ this._selectivityHashesPath = node_path_1.default.join(selectivityRootPath, "hashes.json");
20
+ this._compresion = compression;
21
+ }
22
+ _addFileDependency(filePath) {
23
+ if (this._stagedFileHashes.has(filePath)) {
24
+ return;
25
+ }
26
+ const value = this._fileHashProvider.calculateFor(filePath).catch(err => err);
27
+ this._stagedFileHashes.set(filePath, value);
28
+ }
29
+ _addModuleDependency(modulePath) {
30
+ if (this._stagedModuleHashes.has(modulePath)) {
31
+ return;
32
+ }
33
+ const filePath = node_path_1.default.join(modulePath, "package.json");
34
+ const value = this._fileHashProvider.calculateFor(filePath).catch(err => err);
35
+ this._stagedModuleHashes.set(modulePath, value);
36
+ }
37
+ _ensureInited() {
38
+ if (this._hashFileContents) {
39
+ return this._hashFileContents;
40
+ }
41
+ return (this._hashFileContents = (0, json_utils_1.readJsonWithCompression)(this._selectivityHashesPath, this._compresion, {
42
+ defaultValue: { files: {}, modules: {} },
43
+ })
44
+ .catch(() => ({ files: {}, modules: {} }))
45
+ .then(res => {
46
+ res.files ||= {};
47
+ res.modules ||= {};
48
+ return res;
49
+ }));
50
+ }
51
+ add(dependencies) {
52
+ this._ensureInited();
53
+ dependencies.css.forEach(dependency => this._addFileDependency(dependency));
54
+ dependencies.js.forEach(dependency => this._addFileDependency(dependency));
55
+ dependencies.modules.forEach(dependency => this._addModuleDependency(dependency));
56
+ }
57
+ async commit() {
58
+ const wasInited = Boolean(this._hashFileContents);
59
+ const hasStaged = Boolean(this._stagedFileHashes.size || this._stagedModuleHashes.size);
60
+ if (!wasInited || !hasStaged) {
61
+ return;
62
+ }
63
+ const stagedModuleNames = Array.from(this._stagedModuleHashes.keys());
64
+ const stagedFileNames = Array.from(this._stagedFileHashes.keys());
65
+ const existingHashesContent = await this._ensureInited();
66
+ const filterMatchingHashes = async (keys, src, dest) => {
67
+ const remainingKeys = [];
68
+ for (const key of keys) {
69
+ const oldValue = dest[key];
70
+ const newValue = await src.get(key);
71
+ if (newValue === null) {
72
+ continue;
73
+ }
74
+ if (newValue === oldValue) {
75
+ src.set(key, null);
76
+ }
77
+ else {
78
+ remainingKeys.push(key);
79
+ }
80
+ }
81
+ return remainingKeys;
82
+ };
83
+ const writeTo = async (keys, src, dest) => {
84
+ let needsReSort = false;
85
+ for (const key of keys) {
86
+ const hash = await src.get(key);
87
+ if (!hash) {
88
+ continue;
89
+ }
90
+ if (hash instanceof Error) {
91
+ throw hash;
92
+ }
93
+ needsReSort = needsReSort || !Object.hasOwn(dest, key);
94
+ dest[key] = hash;
95
+ }
96
+ if (needsReSort) {
97
+ (0, utils_1.shallowSortObject)(dest);
98
+ }
99
+ };
100
+ const markAsCommited = (keys, src) => {
101
+ keys.forEach(key => src.set(key, null));
102
+ };
103
+ const [updatedModules, updatedFiles] = await Promise.all([
104
+ filterMatchingHashes(stagedModuleNames, this._stagedModuleHashes, existingHashesContent.modules),
105
+ filterMatchingHashes(stagedFileNames, this._stagedFileHashes, existingHashesContent.files),
106
+ ]);
107
+ if (!updatedFiles.length && !updatedModules.length) {
108
+ return;
109
+ }
110
+ await Promise.all([
111
+ writeTo(updatedModules, this._stagedModuleHashes, existingHashesContent.modules),
112
+ writeTo(updatedFiles, this._stagedFileHashes, existingHashesContent.files),
113
+ ]);
114
+ await (0, json_utils_1.writeJsonWithCompression)(this._selectivityHashesPath, existingHashesContent, this._compresion);
115
+ markAsCommited(updatedModules, this._stagedModuleHashes);
116
+ markAsCommited(updatedFiles, this._stagedFileHashes);
117
+ }
118
+ }
119
+ exports.FileHashWriter = FileHashWriter;
120
+ exports.getFileHashWriter = (0, lodash_1.memoize)((selectivityRootPath, compression) => {
121
+ return new FileHashWriter(selectivityRootPath, compression);
122
+ });
123
+ //# sourceMappingURL=file-hash-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-hash-writer.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/file-hash-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ExistingBrowser } from "../../existing-browser";
2
+ import type { Test } from "../../../types";
3
+ type StopSelectivityFn = (test: Test, shouldWrite: boolean) => Promise<void>;
4
+ export declare const startSelectivity: (browser: ExistingBrowser) => Promise<StopSelectivityFn>;
5
+ export {};
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startSelectivity = void 0;
4
+ const css_selectivity_1 = require("./css-selectivity");
5
+ const js_selectivity_1 = require("./js-selectivity");
6
+ const test_dependencies_writer_1 = require("./test-dependencies-writer");
7
+ const utils_1 = require("./utils");
8
+ const file_hash_writer_1 = require("./file-hash-writer");
9
+ const types_1 = require("./types");
10
+ const startSelectivity = async (browser) => {
11
+ if (!browser.config.selectivity.enabled || !browser.publicAPI.isChromium) {
12
+ return () => Promise.resolve();
13
+ }
14
+ if (browser.config.selectivity.compression === types_1.Compression.ZSTD && !process.versions.zstd) {
15
+ throw new Error("Selectivity: Compression 'zstd' is not supported in your node version. Please, upgrade the node version to 22");
16
+ }
17
+ if (!browser.cdp) {
18
+ throw new Error("Selectivity: Devtools connection is not established, couldn't record selectivity without it");
19
+ }
20
+ const cdpTaget = browser.cdp.target;
21
+ const handle = await browser.publicAPI.getWindowHandle();
22
+ const { targetInfos } = await cdpTaget.getTargets();
23
+ const cdpTargetId = targetInfos.find(t => handle.includes(t.targetId))?.targetId;
24
+ if (!cdpTargetId) {
25
+ throw new Error([
26
+ "Selectivity: Couldn't find current page;",
27
+ `\n\t- webdriver handle: ${handle}`,
28
+ `\n\t- cdp targets: ${targetInfos.map(t => `"${t.targetId}"`).join(", ")}`,
29
+ ].join(""));
30
+ }
31
+ const sessionId = await cdpTaget.attachToTarget(cdpTargetId).then(r => r.sessionId);
32
+ const cssSelectivity = new css_selectivity_1.CSSSelectivity(browser.cdp, sessionId, browser.config.selectivity.sourceRoot);
33
+ const jsSelectivity = new js_selectivity_1.JSSelectivity(browser.cdp, sessionId, browser.config.selectivity.sourceRoot);
34
+ await Promise.all([cssSelectivity.start(), jsSelectivity.start()]);
35
+ /** @param drop only performs cleanup without writing anything. Should be "true" if test is failed */
36
+ return async function stopSelectivity(test, drop) {
37
+ const [cssDependencies, jsDependencies] = await Promise.all([
38
+ cssSelectivity.stop(drop),
39
+ jsSelectivity.stop(drop),
40
+ ]);
41
+ cdpTaget.detachFromTarget(sessionId).catch(() => { });
42
+ if (drop || (!cssDependencies.length && !jsDependencies.length)) {
43
+ return;
44
+ }
45
+ const testDependenciesPath = browser.config.selectivity.testDependenciesPath;
46
+ const compression = browser.config.selectivity.compression;
47
+ const testDependencyWriter = (0, test_dependencies_writer_1.getTestDependenciesWriter)(testDependenciesPath, compression);
48
+ const hashWriter = (0, file_hash_writer_1.getFileHashWriter)(testDependenciesPath, compression);
49
+ const dependencies = (0, utils_1.transformSourceDependencies)(cssDependencies, jsDependencies);
50
+ hashWriter.add(dependencies);
51
+ await Promise.all([testDependencyWriter.saveFor(test, dependencies), hashWriter.commit()]);
52
+ };
53
+ };
54
+ exports.startSelectivity = startSelectivity;
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { CDP } from "..";
2
+ import type { CDPSessionId } from "../types";
3
+ export declare class JSSelectivity {
4
+ private readonly _cdp;
5
+ private readonly _sessionId;
6
+ private readonly _sourceRoot;
7
+ private _debuggerOnPausedFn;
8
+ private _debuggerOnScriptParsedFn;
9
+ private _scriptsSource;
10
+ private _scriptsSourceMap;
11
+ constructor(cdp: CDP, sessionId: CDPSessionId, sourceRoot?: string);
12
+ private _processScript;
13
+ start(): Promise<void>;
14
+ /** @param drop only performs cleanup without providing actual deps. Should be "true" if test is failed */
15
+ stop(drop?: boolean): Promise<string[]>;
16
+ }