testplane 8.35.1 → 8.36.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.
Files changed (70) hide show
  1. package/build/package.json +3 -1
  2. package/build/src/browser/cdp/selectivity/debug.d.ts +2 -0
  3. package/build/src/browser/cdp/selectivity/debug.js +9 -0
  4. package/build/src/browser/cdp/selectivity/debug.js.map +1 -0
  5. package/build/src/browser/cdp/selectivity/hash-provider.d.ts +6 -0
  6. package/build/src/browser/cdp/selectivity/hash-provider.js +81 -0
  7. package/build/src/browser/cdp/selectivity/hash-provider.js.map +1 -0
  8. package/build/src/browser/cdp/selectivity/hash-reader.d.ts +17 -0
  9. package/build/src/browser/cdp/selectivity/hash-reader.js +70 -0
  10. package/build/src/browser/cdp/selectivity/hash-reader.js.map +1 -0
  11. package/build/src/browser/cdp/selectivity/hash-writer.d.ts +18 -0
  12. package/build/src/browser/cdp/selectivity/hash-writer.js +141 -0
  13. package/build/src/browser/cdp/selectivity/hash-writer.js.map +1 -0
  14. package/build/src/browser/cdp/selectivity/index.d.ts +6 -0
  15. package/build/src/browser/cdp/selectivity/index.js +45 -11
  16. package/build/src/browser/cdp/selectivity/index.js.map +1 -1
  17. package/build/src/browser/cdp/selectivity/runner.d.ts +19 -0
  18. package/build/src/browser/cdp/selectivity/runner.js +129 -0
  19. package/build/src/browser/cdp/selectivity/runner.js.map +1 -0
  20. package/build/src/browser/cdp/selectivity/test-dependencies-reader.d.ts +10 -0
  21. package/build/src/browser/cdp/selectivity/test-dependencies-reader.js +41 -0
  22. package/build/src/browser/cdp/selectivity/test-dependencies-reader.js.map +1 -0
  23. package/build/src/browser/cdp/selectivity/test-dependencies-writer.d.ts +2 -2
  24. package/build/src/browser/cdp/selectivity/test-dependencies-writer.js +25 -14
  25. package/build/src/browser/cdp/selectivity/test-dependencies-writer.js.map +1 -1
  26. package/build/src/browser/cdp/selectivity/testplane-selectivity.d.ts +1 -0
  27. package/build/src/browser/cdp/selectivity/testplane-selectivity.js +29 -9
  28. package/build/src/browser/cdp/selectivity/testplane-selectivity.js.map +1 -1
  29. package/build/src/browser/cdp/selectivity/types.d.ts +5 -0
  30. package/build/src/browser/cdp/selectivity/utils.d.ts +8 -1
  31. package/build/src/browser/cdp/selectivity/utils.js +66 -3
  32. package/build/src/browser/cdp/selectivity/utils.js.map +1 -1
  33. package/build/src/bundle/cjs/index.js +207 -108
  34. package/build/src/config/browser-options.js +7 -2
  35. package/build/src/config/browser-options.js.map +1 -1
  36. package/build/src/config/defaults.d.ts +1 -0
  37. package/build/src/config/defaults.js +1 -0
  38. package/build/src/config/defaults.js.map +1 -1
  39. package/build/src/config/options.js +1 -2
  40. package/build/src/config/options.js.map +1 -1
  41. package/build/src/config/types.d.ts +1 -0
  42. package/build/src/config/utils.d.ts +3 -0
  43. package/build/src/config/utils.js +14 -1
  44. package/build/src/config/utils.js.map +1 -1
  45. package/build/src/constants/config.d.ts +1 -0
  46. package/build/src/constants/config.js +2 -1
  47. package/build/src/constants/config.js.map +1 -1
  48. package/build/src/events/index.d.ts +4 -0
  49. package/build/src/events/index.js +1 -0
  50. package/build/src/events/index.js.map +1 -1
  51. package/build/src/runner/index.d.ts +5 -2
  52. package/build/src/runner/index.js +11 -4
  53. package/build/src/runner/index.js.map +1 -1
  54. package/build/src/testplane.js +8 -1
  55. package/build/src/testplane.js.map +1 -1
  56. package/build/src/types/index.d.ts +11 -0
  57. package/build/src/types/index.js.map +1 -1
  58. package/build/src/utils/typescript.js +3 -0
  59. package/build/src/utils/typescript.js.map +1 -1
  60. package/build/src/utils/workers-registry.js +4 -0
  61. package/build/src/utils/workers-registry.js.map +1 -1
  62. package/build/src/worker/runner/index.js +7 -5
  63. package/build/src/worker/runner/index.js.map +1 -1
  64. package/package.json +3 -1
  65. package/build/src/browser/cdp/selectivity/file-hash-provider.d.ts +0 -4
  66. package/build/src/browser/cdp/selectivity/file-hash-provider.js +0 -28
  67. package/build/src/browser/cdp/selectivity/file-hash-provider.js.map +0 -1
  68. package/build/src/browser/cdp/selectivity/file-hash-writer.d.ts +0 -17
  69. package/build/src/browser/cdp/selectivity/file-hash-writer.js +0 -123
  70. package/build/src/browser/cdp/selectivity/file-hash-writer.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testplane",
3
- "version": "8.35.1",
3
+ "version": "8.36.0",
4
4
  "description": "Tests framework based on mocha and wdio",
5
5
  "main": "build/src/index.js",
6
6
  "files": [
@@ -98,6 +98,7 @@
98
98
  "pirates": "4.0.7",
99
99
  "plugins-loader": "1.3.4",
100
100
  "png-validator": "1.1.0",
101
+ "proper-lockfile": "4.1.2",
101
102
  "recast": "0.23.6",
102
103
  "resolve.exports": "2.0.2",
103
104
  "sizzle": "2.3.6",
@@ -138,6 +139,7 @@
138
139
  "@types/micromatch": "4.0.9",
139
140
  "@types/mocha": "10.0.1",
140
141
  "@types/node": "18.19.3",
142
+ "@types/proper-lockfile": "4.1.4",
141
143
  "@types/proxyquire": "1.3.28",
142
144
  "@types/set-cookie-parser": "2.4.10",
143
145
  "@types/sinon": "17.0.1",
@@ -0,0 +1,2 @@
1
+ import debugModule from "debug";
2
+ export declare const debugSelectivity: debugModule.Debugger;
@@ -0,0 +1,9 @@
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.debugSelectivity = void 0;
7
+ const debug_1 = __importDefault(require("debug"));
8
+ exports.debugSelectivity = (0, debug_1.default)("testplane:selectivity");
9
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/debug.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAgC;AAEnB,QAAA,gBAAgB,GAAG,IAAA,eAAW,EAAC,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare class HashProvider {
2
+ private static readonly _fileHashStore;
3
+ private static readonly _patternHashStore;
4
+ calculateForFile(filePath: string): Promise<string>;
5
+ calculateForPattern(pattern: string): Promise<string>;
6
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.HashProvider = void 0;
30
+ const node_path_1 = __importDefault(require("node:path"));
31
+ const node_crypto_1 = __importDefault(require("node:crypto"));
32
+ const node_fs_1 = __importDefault(require("node:fs"));
33
+ const calculateFileMd5Hash = (filePath) => new Promise((resolve, reject) => {
34
+ const hash = node_crypto_1.default.createHash("md5");
35
+ const fileReadStream = node_fs_1.default.createReadStream(filePath);
36
+ fileReadStream.on("data", chunk => hash.update(chunk));
37
+ fileReadStream.on("end", () => resolve(hash.digest("hex")));
38
+ fileReadStream.on("error", err => reject(new Error(`Selectivity: Couldn't calculate hash for ${filePath}: ${err}`)));
39
+ });
40
+ class HashProvider {
41
+ async calculateForFile(filePath) {
42
+ const cachedHash = HashProvider._fileHashStore.get(filePath);
43
+ if (cachedHash) {
44
+ return cachedHash;
45
+ }
46
+ const hashPromise = calculateFileMd5Hash(filePath);
47
+ HashProvider._fileHashStore.set(filePath, hashPromise);
48
+ return hashPromise;
49
+ }
50
+ async calculateForPattern(pattern) {
51
+ const cachedHash = HashProvider._patternHashStore.get(pattern);
52
+ if (cachedHash) {
53
+ return cachedHash;
54
+ }
55
+ const calculatePatternHashPromise = (async () => {
56
+ const globExtra = await Promise.resolve().then(() => __importStar(require("../../../bundle/glob-extra")));
57
+ const cwd = process.cwd();
58
+ const files = await globExtra.expandPaths(pattern, { root: cwd });
59
+ const filesSorted = files.sort();
60
+ const hash = node_crypto_1.default.createHash("md5");
61
+ let promiseQue = Promise.resolve();
62
+ for (const filePath of filesSorted) {
63
+ const fileHashPromise = calculateFileMd5Hash(filePath);
64
+ const cwdRelativePath = node_path_1.default.relative(cwd, filePath);
65
+ const posixRelativePath = node_path_1.default.sep === node_path_1.default.posix.sep
66
+ ? cwdRelativePath
67
+ : cwdRelativePath.replaceAll(node_path_1.default.sep, node_path_1.default.posix.sep);
68
+ promiseQue = promiseQue.then(() => fileHashPromise.then(fileHash => {
69
+ hash.update(`/${posixRelativePath}/${fileHash}`);
70
+ }));
71
+ }
72
+ return promiseQue.then(() => hash.digest("hex"));
73
+ })();
74
+ HashProvider._patternHashStore.set(pattern, calculatePatternHashPromise);
75
+ return calculatePatternHashPromise;
76
+ }
77
+ }
78
+ exports.HashProvider = HashProvider;
79
+ HashProvider._fileHashStore = new Map();
80
+ HashProvider._patternHashStore = new Map();
81
+ //# sourceMappingURL=hash-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-provider.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/hash-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /// <reference types="lodash" />
2
+ import type { NormalizedDependencies, SelectivityCompressionType } from "./types";
3
+ export declare class HashReader {
4
+ private readonly _hashProvider;
5
+ private readonly _selectivityHashesPath;
6
+ private readonly _compresion;
7
+ private _hashFileContents;
8
+ constructor(selectivityRootPath: string, compression: SelectivityCompressionType);
9
+ private _getHashFileContents;
10
+ private _readHashForFile;
11
+ private _readHashForModule;
12
+ private _readHashForPattern;
13
+ patternHasChanged(pattern: string): Promise<boolean>;
14
+ /** @returns changed deps or null, if nothing changed */
15
+ getTestChangedDeps(testDeps: NormalizedDependencies): Promise<NormalizedDependencies | null>;
16
+ }
17
+ export declare const getHashReader: ((selectivityRootPath: string, compression: SelectivityCompressionType) => HashReader) & import("lodash").MemoizedFunction;
@@ -0,0 +1,70 @@
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.getHashReader = exports.HashReader = void 0;
7
+ const lodash_1 = require("lodash");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const hash_provider_1 = require("./hash-provider");
10
+ const utils_1 = require("./utils");
11
+ const debug_1 = require("./debug");
12
+ class HashReader {
13
+ constructor(selectivityRootPath, compression) {
14
+ this._hashProvider = new hash_provider_1.HashProvider();
15
+ this._hashFileContents = null;
16
+ this._selectivityHashesPath = (0, utils_1.getSelectivityHashesPath)(selectivityRootPath);
17
+ this._compresion = compression;
18
+ }
19
+ _getHashFileContents() {
20
+ if (this._hashFileContents) {
21
+ return this._hashFileContents;
22
+ }
23
+ return (this._hashFileContents = (0, utils_1.readHashFileContents)(this._selectivityHashesPath, this._compresion));
24
+ }
25
+ _readHashForFile(filePath) {
26
+ return this._getHashFileContents().then(hashFileContents => hashFileContents.files[filePath]);
27
+ }
28
+ _readHashForModule(moduleName) {
29
+ return this._getHashFileContents().then(hashFileContents => hashFileContents.modules[moduleName]);
30
+ }
31
+ _readHashForPattern(pattern) {
32
+ return this._getHashFileContents().then(hashFileContents => hashFileContents.patterns[pattern]);
33
+ }
34
+ async patternHasChanged(pattern) {
35
+ const [cachedPatternHash, calculatedPatternHash] = await Promise.all([
36
+ this._readHashForPattern(pattern),
37
+ this._hashProvider.calculateForPattern(pattern),
38
+ ]);
39
+ return cachedPatternHash !== calculatedPatternHash;
40
+ }
41
+ /** @returns changed deps or null, if nothing changed */
42
+ async getTestChangedDeps(testDeps) {
43
+ const depFileTypes = ["css", "js", "modules"];
44
+ const result = { css: [], js: [], modules: [] };
45
+ let hasAnythingChanged = false;
46
+ const checkForDepFileType = async (depFileType) => {
47
+ await Promise.all(testDeps[depFileType].map(async (filePath) => {
48
+ const adjustedFilePath = depFileType === "modules" ? node_path_1.default.join(filePath, "package.json") : filePath;
49
+ const [cachedFileHash, calculatedFileHash] = await Promise.all([
50
+ depFileType === "modules" ? this._readHashForModule(filePath) : this._readHashForFile(filePath),
51
+ this._hashProvider.calculateForFile(adjustedFilePath).catch((err) => err),
52
+ ]);
53
+ if (calculatedFileHash instanceof Error) {
54
+ (0, debug_1.debugSelectivity)(`Couldn't calculate hash for ${adjustedFilePath}: ${calculatedFileHash.message}`);
55
+ }
56
+ if (cachedFileHash !== calculatedFileHash) {
57
+ hasAnythingChanged = true;
58
+ result[depFileType].push(filePath);
59
+ }
60
+ }));
61
+ };
62
+ await Promise.all(depFileTypes.map(depFileType => checkForDepFileType(depFileType)));
63
+ return hasAnythingChanged ? result : null;
64
+ }
65
+ }
66
+ exports.HashReader = HashReader;
67
+ exports.getHashReader = (0, lodash_1.memoize)((selectivityRootPath, compression) => {
68
+ return new HashReader(selectivityRootPath, compression);
69
+ }, (selectivityRootPath, compression) => `${selectivityRootPath}#${compression}`);
70
+ //# sourceMappingURL=hash-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-reader.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/hash-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /// <reference types="lodash" />
2
+ import type { NormalizedDependencies, SelectivityCompressionType } from "./types";
3
+ export declare class HashWriter {
4
+ private readonly _hashProvider;
5
+ private readonly _stagedFileHashes;
6
+ private readonly _stagedModuleHashes;
7
+ private readonly _stagedPatternHashes;
8
+ private readonly _selectivityHashesPath;
9
+ private readonly _compresion;
10
+ constructor(testDependenciesPath: string, compression: SelectivityCompressionType);
11
+ private _addFileDependency;
12
+ private _addPatternDependency;
13
+ private _addModuleDependency;
14
+ addPatternDependencyHash(dependencyPatterns: string): void;
15
+ addTestDependencyHashes(dependencies: NormalizedDependencies): void;
16
+ commit(): Promise<void>;
17
+ }
18
+ export declare const getHashWriter: ((testDependenciesPath: string, compression: SelectivityCompressionType) => HashWriter) & import("lodash").MemoizedFunction;
@@ -0,0 +1,141 @@
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.getHashWriter = exports.HashWriter = void 0;
7
+ const lodash_1 = require("lodash");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const proper_lockfile_1 = __importDefault(require("proper-lockfile"));
10
+ const hash_provider_1 = require("./hash-provider");
11
+ const utils_1 = require("./utils");
12
+ const json_utils_1 = require("./json-utils");
13
+ class HashWriter {
14
+ constructor(testDependenciesPath, compression) {
15
+ this._hashProvider = new hash_provider_1.HashProvider();
16
+ // "null" - successfully writed, "Promise<string>" - file/module hash, "Promise<Error>" - calculating hash error
17
+ this._stagedFileHashes = new Map();
18
+ this._stagedModuleHashes = new Map();
19
+ this._stagedPatternHashes = new Map();
20
+ this._selectivityHashesPath = (0, utils_1.getSelectivityHashesPath)(testDependenciesPath);
21
+ this._compresion = compression;
22
+ }
23
+ _addFileDependency(filePath) {
24
+ if (this._stagedFileHashes.has(filePath)) {
25
+ return;
26
+ }
27
+ const value = this._hashProvider.calculateForFile(filePath).catch(err => err);
28
+ this._stagedFileHashes.set(filePath, value);
29
+ }
30
+ _addPatternDependency(pattern) {
31
+ if (this._stagedPatternHashes.has(pattern)) {
32
+ return;
33
+ }
34
+ const value = this._hashProvider.calculateForPattern(pattern).catch(err => err);
35
+ this._stagedPatternHashes.set(pattern, value);
36
+ }
37
+ _addModuleDependency(modulePath) {
38
+ if (this._stagedModuleHashes.has(modulePath)) {
39
+ return;
40
+ }
41
+ const filePath = node_path_1.default.join(modulePath, "package.json");
42
+ const value = this._hashProvider.calculateForFile(filePath).catch(err => err);
43
+ this._stagedModuleHashes.set(modulePath, value);
44
+ }
45
+ addPatternDependencyHash(dependencyPatterns) {
46
+ return this._addPatternDependency(dependencyPatterns);
47
+ }
48
+ addTestDependencyHashes(dependencies) {
49
+ dependencies.css.forEach(dependency => this._addFileDependency(dependency));
50
+ dependencies.js.forEach(dependency => this._addFileDependency(dependency));
51
+ dependencies.modules.forEach(dependency => this._addModuleDependency(dependency));
52
+ }
53
+ async commit() {
54
+ const hasStaged = Boolean(this._stagedFileHashes.size || this._stagedModuleHashes.size || this._stagedPatternHashes.size);
55
+ if (!hasStaged) {
56
+ return;
57
+ }
58
+ const stagedModuleNames = Array.from(this._stagedModuleHashes.keys());
59
+ const stagedFileNames = Array.from(this._stagedFileHashes.keys());
60
+ const stagedPatternNames = Array.from(this._stagedPatternHashes.keys());
61
+ const filterMatchingHashes = async (keys, src, dest) => {
62
+ const remainingKeys = [];
63
+ for (const key of keys) {
64
+ const oldValue = dest[key];
65
+ const newValue = await src.get(key);
66
+ if (newValue === null) {
67
+ continue;
68
+ }
69
+ if (newValue === oldValue) {
70
+ src.set(key, null);
71
+ }
72
+ else {
73
+ remainingKeys.push(key);
74
+ }
75
+ }
76
+ return remainingKeys;
77
+ };
78
+ const writeTo = async (keys, src, dest) => {
79
+ let needsReSort = false;
80
+ for (const key of keys) {
81
+ const hash = await src.get(key);
82
+ if (!hash) {
83
+ continue;
84
+ }
85
+ if (hash instanceof Error) {
86
+ throw hash;
87
+ }
88
+ needsReSort = needsReSort || !Object.hasOwn(dest, key);
89
+ dest[key] = hash;
90
+ }
91
+ if (needsReSort) {
92
+ (0, utils_1.shallowSortObject)(dest);
93
+ }
94
+ };
95
+ const markAsCommited = (keys, src) => {
96
+ keys.forEach(key => src.set(key, null));
97
+ };
98
+ // Waiting for hashes to be calculated before locking file to reduce lock time
99
+ await Promise.all([
100
+ ...Object.values(this._stagedFileHashes),
101
+ ...Object.values(this._stagedModuleHashes),
102
+ ...Object.values(this._stagedPatternHashes),
103
+ ]);
104
+ const releaseLock = await proper_lockfile_1.default.lock(this._selectivityHashesPath, {
105
+ stale: 5000,
106
+ update: 1000,
107
+ retries: { minTimeout: 100, maxTimeout: 1000, retries: 15 },
108
+ realpath: false,
109
+ });
110
+ try {
111
+ const existingHashesContent = await (0, utils_1.readHashFileContents)(this._selectivityHashesPath, this._compresion);
112
+ const [updatedModules, updatedFiles, updatedPatterns] = await Promise.all([
113
+ filterMatchingHashes(stagedModuleNames, this._stagedModuleHashes, existingHashesContent.modules),
114
+ filterMatchingHashes(stagedFileNames, this._stagedFileHashes, existingHashesContent.files),
115
+ filterMatchingHashes(stagedPatternNames, this._stagedPatternHashes, existingHashesContent.patterns),
116
+ ]);
117
+ if (!updatedFiles.length && !updatedModules.length && !updatedPatterns.length) {
118
+ await releaseLock();
119
+ return;
120
+ }
121
+ await Promise.all([
122
+ writeTo(updatedModules, this._stagedModuleHashes, existingHashesContent.modules),
123
+ writeTo(updatedFiles, this._stagedFileHashes, existingHashesContent.files),
124
+ writeTo(updatedPatterns, this._stagedPatternHashes, existingHashesContent.patterns),
125
+ ]);
126
+ await (0, json_utils_1.writeJsonWithCompression)(this._selectivityHashesPath, existingHashesContent, this._compresion);
127
+ await releaseLock();
128
+ markAsCommited(updatedModules, this._stagedModuleHashes);
129
+ markAsCommited(updatedFiles, this._stagedFileHashes);
130
+ }
131
+ catch (err) {
132
+ await releaseLock();
133
+ throw err;
134
+ }
135
+ }
136
+ }
137
+ exports.HashWriter = HashWriter;
138
+ exports.getHashWriter = (0, lodash_1.memoize)((testDependenciesPath, compression) => {
139
+ return new HashWriter(testDependenciesPath, compression);
140
+ }, (testDependenciesPath, compression) => `${testDependenciesPath}#${compression}`);
141
+ //# sourceMappingURL=hash-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-writer.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/hash-writer.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  import type { ExistingBrowser } from "../../existing-browser";
2
2
  import type { Test } from "../../../types";
3
+ import type { Config } from "../../../config";
3
4
  type StopSelectivityFn = (test: Test, shouldWrite: boolean) => Promise<void>;
5
+ /**
6
+ * Called at the end of successfull testplane run
7
+ * Not using "Promise.all" here because all hashes are already calculated and cached at the start
8
+ */
9
+ export declare const updateSelectivityHashes: (config: Config) => Promise<void>;
4
10
  export declare const startSelectivity: (browser: ExistingBrowser) => Promise<StopSelectivityFn>;
5
11
  export {};
@@ -1,18 +1,45 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.startSelectivity = void 0;
3
+ exports.startSelectivity = exports.updateSelectivityHashes = void 0;
4
4
  const css_selectivity_1 = require("./css-selectivity");
5
5
  const js_selectivity_1 = require("./js-selectivity");
6
6
  const test_dependencies_writer_1 = require("./test-dependencies-writer");
7
7
  const utils_1 = require("./utils");
8
- const file_hash_writer_1 = require("./file-hash-writer");
8
+ const hash_writer_1 = require("./hash-writer");
9
9
  const types_1 = require("./types");
10
10
  const testplane_selectivity_1 = require("./testplane-selectivity");
11
+ const hash_reader_1 = require("./hash-reader");
12
+ const events_1 = require("../../../events");
13
+ /**
14
+ * Called at the end of successfull testplane run
15
+ * Not using "Promise.all" here because all hashes are already calculated and cached at the start
16
+ */
17
+ const updateSelectivityHashes = async (config) => {
18
+ const browserIds = config.getBrowserIds();
19
+ for (const browserId of browserIds) {
20
+ const browserConfig = config.forBrowser(browserId);
21
+ const { enabled, testDependenciesPath, compression, disableSelectivityPatterns } = browserConfig.selectivity;
22
+ if (!enabled) {
23
+ continue;
24
+ }
25
+ const hashReader = (0, hash_reader_1.getHashReader)(testDependenciesPath, compression);
26
+ const hashWriter = (0, hash_writer_1.getHashWriter)(testDependenciesPath, compression);
27
+ for (const pattern of disableSelectivityPatterns) {
28
+ const isChanged = await hashReader.patternHasChanged(pattern);
29
+ if (isChanged) {
30
+ hashWriter.addPatternDependencyHash(pattern);
31
+ }
32
+ }
33
+ await hashWriter.commit();
34
+ }
35
+ };
36
+ exports.updateSelectivityHashes = updateSelectivityHashes;
11
37
  const startSelectivity = async (browser) => {
12
- if (!browser.config.selectivity.enabled || !browser.publicAPI.isChromium) {
38
+ const { enabled, compression, sourceRoot, testDependenciesPath } = browser.config.selectivity;
39
+ if (!enabled || !browser.publicAPI.isChromium) {
13
40
  return () => Promise.resolve();
14
41
  }
15
- if (browser.config.selectivity.compression === types_1.Compression.ZSTD && !process.versions.zstd) {
42
+ if (compression === types_1.Compression.ZSTD && !process.versions.zstd) {
16
43
  throw new Error("Selectivity: Compression 'zstd' is not supported in your node version. Please, upgrade the node version to 22");
17
44
  }
18
45
  if (!browser.cdp) {
@@ -30,8 +57,8 @@ const startSelectivity = async (browser) => {
30
57
  ].join(""));
31
58
  }
32
59
  const sessionId = await cdpTaget.attachToTarget(cdpTargetId).then(r => r.sessionId);
33
- const cssSelectivity = new css_selectivity_1.CSSSelectivity(browser.cdp, sessionId, browser.config.selectivity.sourceRoot);
34
- const jsSelectivity = new js_selectivity_1.JSSelectivity(browser.cdp, sessionId, browser.config.selectivity.sourceRoot);
60
+ const cssSelectivity = new css_selectivity_1.CSSSelectivity(browser.cdp, sessionId, sourceRoot);
61
+ const jsSelectivity = new js_selectivity_1.JSSelectivity(browser.cdp, sessionId, sourceRoot);
35
62
  await Promise.all([cssSelectivity.start(), jsSelectivity.start()]);
36
63
  /** @param drop only performs cleanup without writing anything. Should be "true" if test is failed */
37
64
  return async function stopSelectivity(test, drop) {
@@ -43,14 +70,21 @@ const startSelectivity = async (browser) => {
43
70
  if (drop || (!cssDependencies.length && !jsDependencies.length)) {
44
71
  return;
45
72
  }
46
- const testDependenciesPath = browser.config.selectivity.testDependenciesPath;
47
- const compression = browser.config.selectivity.compression;
48
73
  const testDependencyWriter = (0, test_dependencies_writer_1.getTestDependenciesWriter)(testDependenciesPath, compression);
49
- const hashWriter = (0, file_hash_writer_1.getFileHashWriter)(testDependenciesPath, compression);
50
74
  const browserDeps = (0, utils_1.transformSourceDependencies)(cssDependencies, jsDependencies);
51
75
  const testplaneDeps = (0, utils_1.transformSourceDependencies)([], (0, testplane_selectivity_1.getCollectedTestplaneDependencies)());
52
- hashWriter.add((0, utils_1.mergeSourceDependencies)(browserDeps, testplaneDeps));
53
- await Promise.all([testDependencyWriter.saveFor(test, browserDeps, testplaneDeps), hashWriter.commit()]);
76
+ process.send?.({
77
+ event: events_1.MasterEvents.TEST_DEPENDENCIES,
78
+ context: {
79
+ testDependenciesPath,
80
+ compression,
81
+ testId: test.id,
82
+ fullTitle: test.fullTitle(),
83
+ browserId: test.browserId,
84
+ },
85
+ data: (0, utils_1.mergeSourceDependencies)(browserDeps, testplaneDeps),
86
+ });
87
+ await testDependencyWriter.saveFor(test, browserDeps, testplaneDeps);
54
88
  };
55
89
  };
56
90
  exports.startSelectivity = startSelectivity;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Config } from "../../../config";
2
+ import type { MainRunner } from "../../../runner";
3
+ import type { Test } from "../../../types";
4
+ interface SelectivityRunnerOptions {
5
+ shouldDisableSelectivity?: boolean;
6
+ }
7
+ export declare class SelectivityRunner {
8
+ private readonly _config;
9
+ private readonly _runTestFn;
10
+ private readonly _opts?;
11
+ private readonly _browserSelectivityDisabledCache;
12
+ private readonly _processingTestPromises;
13
+ static create(...args: ConstructorParameters<typeof this>): SelectivityRunner;
14
+ constructor(mainRunner: MainRunner, config: Config, runTestFn: (test: Test, browserId: string) => void, opts?: SelectivityRunnerOptions);
15
+ private _shouldDisableSelectivityForBrowser;
16
+ runIfNecessary(test: Test, browserId: string): void;
17
+ waitForTestsToRun(): Promise<void[]>;
18
+ }
19
+ export {};