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.
- package/build/package.json +5 -3
- package/build/src/browser/cdp/connection.d.ts +1 -1
- package/build/src/browser/cdp/connection.js +4 -4
- package/build/src/browser/cdp/connection.js.map +1 -1
- package/build/src/browser/cdp/domains/css.d.ts +46 -0
- package/build/src/browser/cdp/domains/css.js +35 -0
- package/build/src/browser/cdp/domains/css.js.map +1 -0
- package/build/src/browser/cdp/domains/debugger.d.ts +65 -0
- package/build/src/browser/cdp/domains/debugger.js +31 -0
- package/build/src/browser/cdp/domains/debugger.js.map +1 -0
- package/build/src/browser/cdp/domains/dom.d.ts +24 -0
- package/build/src/browser/cdp/domains/dom.js +23 -0
- package/build/src/browser/cdp/domains/dom.js.map +1 -0
- package/build/src/browser/cdp/{profiler.d.ts → domains/profiler.d.ts} +3 -3
- package/build/src/browser/cdp/{profiler.js → domains/profiler.js} +2 -5
- package/build/src/browser/cdp/domains/profiler.js.map +1 -0
- package/build/src/browser/cdp/domains/runtime.d.ts +57 -0
- package/build/src/browser/cdp/domains/runtime.js +34 -0
- package/build/src/browser/cdp/domains/runtime.js.map +1 -0
- package/build/src/browser/cdp/{target.d.ts → domains/target.d.ts} +5 -3
- package/build/src/browser/cdp/{target.js → domains/target.js} +7 -5
- package/build/src/browser/cdp/domains/target.js.map +1 -0
- package/build/src/browser/cdp/emitter.d.ts +1 -0
- package/build/src/browser/cdp/emitter.js +3 -0
- package/build/src/browser/cdp/emitter.js.map +1 -1
- package/build/src/browser/cdp/index.d.ts +10 -2
- package/build/src/browser/cdp/index.js +25 -3
- package/build/src/browser/cdp/index.js.map +1 -1
- package/build/src/browser/cdp/selectivity/constants.d.ts +1 -0
- package/build/src/browser/cdp/selectivity/constants.js +5 -0
- package/build/src/browser/cdp/selectivity/constants.js.map +1 -0
- package/build/src/browser/cdp/selectivity/css-selectivity.d.ts +14 -0
- package/build/src/browser/cdp/selectivity/css-selectivity.js +112 -0
- package/build/src/browser/cdp/selectivity/css-selectivity.js.map +1 -0
- package/build/src/browser/cdp/selectivity/file-hash-provider.d.ts +4 -0
- package/build/src/browser/cdp/selectivity/file-hash-provider.js +28 -0
- package/build/src/browser/cdp/selectivity/file-hash-provider.js.map +1 -0
- package/build/src/browser/cdp/selectivity/file-hash-writer.d.ts +17 -0
- package/build/src/browser/cdp/selectivity/file-hash-writer.js +123 -0
- package/build/src/browser/cdp/selectivity/file-hash-writer.js.map +1 -0
- package/build/src/browser/cdp/selectivity/index.d.ts +5 -0
- package/build/src/browser/cdp/selectivity/index.js +55 -0
- package/build/src/browser/cdp/selectivity/index.js.map +1 -0
- package/build/src/browser/cdp/selectivity/js-selectivity.d.ts +16 -0
- package/build/src/browser/cdp/selectivity/js-selectivity.js +129 -0
- package/build/src/browser/cdp/selectivity/js-selectivity.js.map +1 -0
- package/build/src/browser/cdp/selectivity/json-utils.d.ts +10 -0
- package/build/src/browser/cdp/selectivity/json-utils.js +123 -0
- package/build/src/browser/cdp/selectivity/json-utils.js.map +1 -0
- package/build/src/browser/cdp/selectivity/test-dependencies-writer.d.ts +11 -0
- package/build/src/browser/cdp/selectivity/test-dependencies-writer.js +57 -0
- package/build/src/browser/cdp/selectivity/test-dependencies-writer.js.map +1 -0
- package/build/src/browser/cdp/selectivity/types.d.ts +15 -0
- package/build/src/browser/cdp/selectivity/types.js +10 -0
- package/build/src/browser/cdp/selectivity/types.js.map +1 -0
- package/build/src/browser/cdp/selectivity/utils.d.ts +39 -0
- package/build/src/browser/cdp/selectivity/utils.js +198 -0
- package/build/src/browser/cdp/selectivity/utils.js.map +1 -0
- package/build/src/browser/cdp/types.d.ts +83 -4
- package/build/src/browser/commands/index.js +2 -0
- package/build/src/browser/commands/index.js.map +1 -1
- package/build/src/browser/commands/restoreState/index.d.ts +8 -0
- package/build/src/browser/commands/restoreState/index.js +124 -0
- package/build/src/browser/commands/restoreState/index.js.map +1 -0
- package/build/src/browser/commands/restoreState/restoreStorage.d.ts +1 -0
- package/build/src/browser/commands/restoreState/restoreStorage.js +12 -0
- package/build/src/browser/commands/restoreState/restoreStorage.js.map +1 -0
- package/build/src/browser/commands/saveState/dumpStorage.d.ts +5 -0
- package/build/src/browser/commands/saveState/dumpStorage.js +29 -0
- package/build/src/browser/commands/saveState/dumpStorage.js.map +1 -0
- package/build/src/browser/commands/saveState/index.d.ts +25 -0
- package/build/src/browser/commands/saveState/index.js +154 -0
- package/build/src/browser/commands/saveState/index.js.map +1 -0
- package/build/src/browser/existing-browser.d.ts +9 -0
- package/build/src/browser/existing-browser.js +97 -8
- package/build/src/browser/existing-browser.js.map +1 -1
- package/build/src/browser/types.d.ts +4 -0
- package/build/src/browser/types.js.map +1 -1
- package/build/src/config/browser-options.js +7 -0
- package/build/src/config/browser-options.js.map +1 -1
- package/build/src/config/defaults.d.ts +6 -0
- package/build/src/config/defaults.js +6 -0
- package/build/src/config/defaults.js.map +1 -1
- package/build/src/config/types.d.ts +9 -1
- package/build/src/config/types.js.map +1 -1
- package/build/src/error-snippets/constants.d.ts +2 -1
- package/build/src/error-snippets/constants.js +3 -2
- package/build/src/error-snippets/constants.js.map +1 -1
- package/build/src/error-snippets/source-maps.js +4 -4
- package/build/src/error-snippets/source-maps.js.map +1 -1
- package/build/src/error-snippets/utils.js +2 -2
- package/build/src/error-snippets/utils.js.map +1 -1
- package/build/src/index.d.ts +1 -0
- package/build/src/worker/runner/test-runner/index.js +3 -0
- package/build/src/worker/runner/test-runner/index.js.map +1 -1
- package/package.json +5 -3
- package/build/src/browser/cdp/profiler.js.map +0 -1
- package/build/src/browser/cdp/target.js.map +0 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JSSelectivity = void 0;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const node_url_1 = require("node:url");
|
|
6
|
+
const constants_1 = require("../../../error-snippets/constants");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
const SOURCE_CODE_EXTENSIONS = [".js", ".jsx", ".ts", ".tsx", ".mjs", ".cjs", ".mts", ".cts"];
|
|
9
|
+
const isSourceCodeFile = (sourceFileName) => {
|
|
10
|
+
return SOURCE_CODE_EXTENSIONS.some(ext => sourceFileName.endsWith(ext));
|
|
11
|
+
};
|
|
12
|
+
class JSSelectivity {
|
|
13
|
+
constructor(cdp, sessionId, sourceRoot = "") {
|
|
14
|
+
this._debuggerOnPausedFn = null;
|
|
15
|
+
this._debuggerOnScriptParsedFn = null;
|
|
16
|
+
this._scriptsSource = {};
|
|
17
|
+
this._scriptsSourceMap = {};
|
|
18
|
+
this._cdp = cdp;
|
|
19
|
+
this._sessionId = sessionId;
|
|
20
|
+
this._sourceRoot = sourceRoot;
|
|
21
|
+
}
|
|
22
|
+
_processScript({ scriptId, url, sourceMapURL }) {
|
|
23
|
+
if (!this._sessionId) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (!url || !sourceMapURL) {
|
|
27
|
+
this._scriptsSource[scriptId] ||= null;
|
|
28
|
+
this._scriptsSourceMap[scriptId] ||= null;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this._scriptsSource[scriptId] ||= this._cdp.debugger
|
|
32
|
+
.getScriptSource(this._sessionId, scriptId)
|
|
33
|
+
.then(res => res.scriptSource)
|
|
34
|
+
.catch((err) => err);
|
|
35
|
+
this._scriptsSourceMap[scriptId] ||= (0, utils_1.fetchTextWithBrowserFallback)((0, node_url_1.resolve)(url, sourceMapURL), this._cdp.runtime, this._sessionId);
|
|
36
|
+
}
|
|
37
|
+
async start() {
|
|
38
|
+
const debuggerOnPaused = (this._debuggerOnPausedFn = async () => {
|
|
39
|
+
return this._cdp.debugger.resume(this._sessionId).catch(() => { });
|
|
40
|
+
});
|
|
41
|
+
const debuggerOnScriptParsedFn = (this._debuggerOnScriptParsedFn = this._processScript.bind(this));
|
|
42
|
+
const sessionId = this._sessionId;
|
|
43
|
+
this._cdp.debugger.on("paused", debuggerOnPaused);
|
|
44
|
+
this._cdp.debugger.on("scriptParsed", debuggerOnScriptParsedFn);
|
|
45
|
+
await Promise.all([
|
|
46
|
+
this._cdp.target.setAutoAttach(sessionId, { autoAttach: true, waitForDebuggerOnStart: false }),
|
|
47
|
+
this._cdp.debugger.enable(sessionId),
|
|
48
|
+
this._cdp.profiler.enable(sessionId).then(() => this._cdp.profiler.startPreciseCoverage(sessionId, {
|
|
49
|
+
callCount: false,
|
|
50
|
+
detailed: false,
|
|
51
|
+
allowTriggeredUpdates: false,
|
|
52
|
+
})),
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
/** @param drop only performs cleanup without providing actual deps. Should be "true" if test is failed */
|
|
56
|
+
async stop(drop) {
|
|
57
|
+
if (drop) {
|
|
58
|
+
this._debuggerOnPausedFn && this._cdp.debugger.off("paused", this._debuggerOnPausedFn);
|
|
59
|
+
this._debuggerOnScriptParsedFn && this._cdp.debugger.off("scriptParsed", this._debuggerOnScriptParsedFn);
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const coverage = await this._cdp.profiler.takePreciseCoverage(this._sessionId);
|
|
63
|
+
const scriptsWithUrl = coverage.result.filter(script => script.url);
|
|
64
|
+
// If we haven't got "scriptParsed" event for the script, pull up source code + source map manually
|
|
65
|
+
scriptsWithUrl.forEach(({ scriptId, url }) => {
|
|
66
|
+
if (Object.hasOwn(this._scriptsSource, scriptId) && Object.hasOwn(this._scriptsSourceMap, scriptId)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const scriptSourcePromise = this._cdp.debugger
|
|
70
|
+
.getScriptSource(this._sessionId, scriptId)
|
|
71
|
+
.then(res => res.scriptSource)
|
|
72
|
+
.catch((err) => err);
|
|
73
|
+
this._scriptsSource[scriptId] ||= scriptSourcePromise;
|
|
74
|
+
this._scriptsSourceMap[scriptId] ||= scriptSourcePromise.then(sourceCode => {
|
|
75
|
+
if (sourceCode instanceof Error) {
|
|
76
|
+
return sourceCode;
|
|
77
|
+
}
|
|
78
|
+
const sourceMapsStartIndex = sourceCode.lastIndexOf(constants_1.JS_SOURCE_MAP_URL_COMMENT);
|
|
79
|
+
const sourceMapsEndIndex = sourceCode.indexOf("\n", sourceMapsStartIndex);
|
|
80
|
+
if (sourceMapsStartIndex === -1) {
|
|
81
|
+
return new Error("Source maping url comment is missing");
|
|
82
|
+
}
|
|
83
|
+
const sourceMapURL = sourceMapsEndIndex === -1
|
|
84
|
+
? sourceCode.slice(sourceMapsStartIndex + constants_1.JS_SOURCE_MAP_URL_COMMENT.length)
|
|
85
|
+
: sourceCode.slice(sourceMapsStartIndex + constants_1.JS_SOURCE_MAP_URL_COMMENT.length, sourceMapsEndIndex);
|
|
86
|
+
return (0, utils_1.fetchTextWithBrowserFallback)((0, node_url_1.resolve)(url, sourceMapURL), this._cdp.runtime, this._sessionId);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
const totalDependingSourceFiles = new Set();
|
|
90
|
+
const grouppedByScriptCoverage = (0, lodash_1.groupBy)(coverage.result, "scriptId");
|
|
91
|
+
const scriptIds = Object.keys(grouppedByScriptCoverage);
|
|
92
|
+
await Promise.all(scriptIds.map(async (scriptId) => {
|
|
93
|
+
// Every "scriptId" has only one uniq "url"
|
|
94
|
+
const url = grouppedByScriptCoverage[scriptId][0].url;
|
|
95
|
+
const [source, sourceMaps] = await Promise.all([
|
|
96
|
+
this._scriptsSource[scriptId],
|
|
97
|
+
this._scriptsSourceMap[scriptId],
|
|
98
|
+
]);
|
|
99
|
+
if (!source || !sourceMaps) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (source instanceof Error) {
|
|
103
|
+
throw new Error(`JS Selectivity: Couldn't load source code at ${url}: ${source}`);
|
|
104
|
+
}
|
|
105
|
+
if (sourceMaps instanceof Error) {
|
|
106
|
+
throw new Error(`JS Selectivity: Couldn't load source maps of ${url}: ${sourceMaps}`);
|
|
107
|
+
}
|
|
108
|
+
const startOffsetsSet = new Set();
|
|
109
|
+
grouppedByScriptCoverage[scriptId].forEach(entry => {
|
|
110
|
+
entry.functions.forEach(fn => {
|
|
111
|
+
fn.ranges.forEach(range => {
|
|
112
|
+
startOffsetsSet.add(range.startOffset);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
const dependingSourceFiles = await (0, utils_1.extractSourceFilesDeps)(source, sourceMaps, Array.from(startOffsetsSet), this._sourceRoot);
|
|
117
|
+
for (const sourceFile of dependingSourceFiles.values()) {
|
|
118
|
+
if (isSourceCodeFile(sourceFile)) {
|
|
119
|
+
totalDependingSourceFiles.add(sourceFile);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}));
|
|
123
|
+
this._debuggerOnPausedFn && this._cdp.debugger.off("paused", this._debuggerOnPausedFn);
|
|
124
|
+
this._debuggerOnScriptParsedFn && this._cdp.debugger.off("scriptParsed", this._debuggerOnScriptParsedFn);
|
|
125
|
+
return Array.from(totalDependingSourceFiles).sort();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.JSSelectivity = JSSelectivity;
|
|
129
|
+
//# sourceMappingURL=js-selectivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-selectivity.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/js-selectivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type SelectivityCompressionType } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* @param jsonBasePath json path without compression suffix
|
|
4
|
+
* @param preferredCompressionType
|
|
5
|
+
* @returns decompressed and parsed JSON
|
|
6
|
+
*/
|
|
7
|
+
export declare const readJsonWithCompression: <T>(jsonBasePath: string, preferredCompressionType: SelectivityCompressionType, opts?: {
|
|
8
|
+
defaultValue?: T | undefined;
|
|
9
|
+
} | undefined) => Promise<T>;
|
|
10
|
+
export declare const writeJsonWithCompression: (jsonBasePath: string, data: unknown, preferredCompressionType: SelectivityCompressionType) => Promise<void>;
|
|
@@ -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.writeJsonWithCompression = exports.readJsonWithCompression = void 0;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_zlib_1 = __importDefault(require("node:zlib"));
|
|
9
|
+
const types_1 = require("./types");
|
|
10
|
+
const getCompressionPrefix = (type) => (type === "none" ? "" : "." + type);
|
|
11
|
+
const compressionPriorities = process.versions.zstd
|
|
12
|
+
? [types_1.Compression.ZSTD, types_1.Compression.GZIP, types_1.Compression.BROTLI, types_1.Compression.NONE]
|
|
13
|
+
: [types_1.Compression.GZIP, types_1.Compression.BROTLI, types_1.Compression.NONE];
|
|
14
|
+
const getExistingJsonPathWithCompression = (jsonBasePath, preferredCompressionType) => {
|
|
15
|
+
const jsonPathWithPrefix = jsonBasePath + getCompressionPrefix(preferredCompressionType);
|
|
16
|
+
if (node_fs_1.default.existsSync(jsonPathWithPrefix)) {
|
|
17
|
+
return { jsonPath: jsonPathWithPrefix, compressionType: preferredCompressionType };
|
|
18
|
+
}
|
|
19
|
+
for (const compressionType of compressionPriorities) {
|
|
20
|
+
if (compressionType === preferredCompressionType) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const jsonPathWithCurrentPrefix = jsonBasePath + getCompressionPrefix(compressionType);
|
|
24
|
+
if (node_fs_1.default.existsSync(jsonPathWithCurrentPrefix)) {
|
|
25
|
+
return { jsonPath: jsonPathWithCurrentPrefix, compressionType: compressionType };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { jsonPath: null, compressionType: preferredCompressionType };
|
|
29
|
+
};
|
|
30
|
+
const readCompressedTextFile = (filePath, compression) => {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
let fileData = "";
|
|
33
|
+
const readStream = node_fs_1.default.createReadStream(filePath);
|
|
34
|
+
let stream = readStream;
|
|
35
|
+
if (compression === types_1.Compression.ZSTD && !("createZstdDecompress" in node_zlib_1.default)) {
|
|
36
|
+
reject(new Error("zstd decompression is not supported in your version of node.js. Please, upgrade the node version to 22"));
|
|
37
|
+
}
|
|
38
|
+
switch (compression) {
|
|
39
|
+
case types_1.Compression.ZSTD:
|
|
40
|
+
stream = readStream.pipe(node_zlib_1.default.createZstdDecompress());
|
|
41
|
+
break;
|
|
42
|
+
case types_1.Compression.GZIP:
|
|
43
|
+
stream = readStream.pipe(node_zlib_1.default.createGunzip());
|
|
44
|
+
break;
|
|
45
|
+
case types_1.Compression.BROTLI:
|
|
46
|
+
stream = readStream.pipe(node_zlib_1.default.createBrotliDecompress());
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
stream.setEncoding("utf8");
|
|
50
|
+
stream.on("data", chunk => {
|
|
51
|
+
fileData += chunk;
|
|
52
|
+
});
|
|
53
|
+
stream.on("end", () => {
|
|
54
|
+
resolve(fileData);
|
|
55
|
+
});
|
|
56
|
+
stream.on("error", err => {
|
|
57
|
+
reject(new Error(`Couldn't read ${filePath} with ${compression} compression:\n${err}`));
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const writeCompressedTextFile = (filePath, data, compression) => {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
const writeStream = node_fs_1.default.createWriteStream(filePath);
|
|
64
|
+
let stream = writeStream;
|
|
65
|
+
if (compression === types_1.Compression.ZSTD && !("createZstdCompress" in node_zlib_1.default)) {
|
|
66
|
+
reject(new Error("zstd compression is not supported in your version of node.js. Please, upgrade the node version to 22"));
|
|
67
|
+
}
|
|
68
|
+
switch (compression) {
|
|
69
|
+
case types_1.Compression.ZSTD:
|
|
70
|
+
stream = node_zlib_1.default.createZstdCompress();
|
|
71
|
+
stream.pipe(writeStream);
|
|
72
|
+
break;
|
|
73
|
+
case types_1.Compression.GZIP:
|
|
74
|
+
stream = node_zlib_1.default.createGzip();
|
|
75
|
+
stream.pipe(writeStream);
|
|
76
|
+
break;
|
|
77
|
+
case types_1.Compression.BROTLI:
|
|
78
|
+
stream = node_zlib_1.default.createBrotliCompress();
|
|
79
|
+
stream.pipe(writeStream);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
stream.write(data, "utf8", err => {
|
|
83
|
+
if (err) {
|
|
84
|
+
reject(new Error(`Couldn't write to ${filePath} with ${compression} compression:\n${err}`));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
stream.end();
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
writeStream.on("finish", () => {
|
|
91
|
+
resolve();
|
|
92
|
+
});
|
|
93
|
+
writeStream.on("error", err => {
|
|
94
|
+
reject(new Error(`Couldn't save to ${filePath} with ${compression} compression:\n${err}`));
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* @param jsonBasePath json path without compression suffix
|
|
100
|
+
* @param preferredCompressionType
|
|
101
|
+
* @returns decompressed and parsed JSON
|
|
102
|
+
*/
|
|
103
|
+
const readJsonWithCompression = async (jsonBasePath, preferredCompressionType, opts) => {
|
|
104
|
+
const { jsonPath, compressionType } = getExistingJsonPathWithCompression(jsonBasePath, preferredCompressionType);
|
|
105
|
+
if (!jsonPath) {
|
|
106
|
+
if (opts?.defaultValue) {
|
|
107
|
+
return Promise.resolve(opts.defaultValue);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
throw new Error(`Couldn't read ${jsonBasePath} with following compression: ${compressionPriorities}: file does not exist`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const fileData = await readCompressedTextFile(jsonPath, compressionType);
|
|
114
|
+
return JSON.parse(fileData);
|
|
115
|
+
};
|
|
116
|
+
exports.readJsonWithCompression = readJsonWithCompression;
|
|
117
|
+
const writeJsonWithCompression = (jsonBasePath, data, preferredCompressionType) => {
|
|
118
|
+
const filePath = jsonBasePath + getCompressionPrefix(preferredCompressionType);
|
|
119
|
+
const fileData = JSON.stringify(data, null, preferredCompressionType === "none" ? 2 : 0);
|
|
120
|
+
return writeCompressedTextFile(filePath, fileData, preferredCompressionType);
|
|
121
|
+
};
|
|
122
|
+
exports.writeJsonWithCompression = writeJsonWithCompression;
|
|
123
|
+
//# sourceMappingURL=json-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-utils.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/json-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="lodash" />
|
|
2
|
+
import type { Test } from "../../../types";
|
|
3
|
+
import type { NormalizedDependencies, SelectivityCompressionType } from "./types";
|
|
4
|
+
export declare class TestDependenciesWriter {
|
|
5
|
+
private readonly _selectivityTestsPath;
|
|
6
|
+
private readonly _compression;
|
|
7
|
+
private _directoryCreated;
|
|
8
|
+
constructor(selectivityRootPath: string, compression: SelectivityCompressionType);
|
|
9
|
+
saveFor(test: Test, browserDependencies: NormalizedDependencies): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare const getTestDependenciesWriter: ((selectivityRootPath: string, compression: SelectivityCompressionType) => TestDependenciesWriter) & import("lodash").MemoizedFunction;
|
|
@@ -0,0 +1,57 @@
|
|
|
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.getTestDependenciesWriter = exports.TestDependenciesWriter = void 0;
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
const json_utils_1 = require("./json-utils");
|
|
12
|
+
const areDepsSame = (browserDepsA, browserDepsB) => {
|
|
13
|
+
const props = ["js", "css", "modules"];
|
|
14
|
+
if (!browserDepsA || !browserDepsB) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
for (const prop of props) {
|
|
18
|
+
if (!browserDepsA[prop] || !browserDepsB[prop] || browserDepsA[prop].length !== browserDepsB[prop].length) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Rely on the fact both are sorted arrays
|
|
23
|
+
for (const prop of props) {
|
|
24
|
+
for (let i = 0; i < browserDepsA[prop].length; i++) {
|
|
25
|
+
if (browserDepsA[prop][i] !== browserDepsB[prop][i]) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
};
|
|
32
|
+
class TestDependenciesWriter {
|
|
33
|
+
constructor(selectivityRootPath, compression) {
|
|
34
|
+
this._directoryCreated = false;
|
|
35
|
+
this._selectivityTestsPath = node_path_1.default.join(selectivityRootPath, "tests");
|
|
36
|
+
this._compression = compression;
|
|
37
|
+
}
|
|
38
|
+
async saveFor(test, browserDependencies) {
|
|
39
|
+
if (!this._directoryCreated) {
|
|
40
|
+
await fs_extra_1.default.ensureDir(this._selectivityTestsPath);
|
|
41
|
+
this._directoryCreated = true;
|
|
42
|
+
}
|
|
43
|
+
const testDepsPath = node_path_1.default.join(this._selectivityTestsPath, `${test.id}.json`);
|
|
44
|
+
const testDeps = await (0, json_utils_1.readJsonWithCompression)(testDepsPath, this._compression, { defaultValue: {} }).catch(() => ({}));
|
|
45
|
+
if (areDepsSame(testDeps[test.browserId]?.browser, browserDependencies)) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
testDeps[test.browserId] = { browser: browserDependencies };
|
|
49
|
+
(0, utils_1.shallowSortObject)(testDeps);
|
|
50
|
+
await (0, json_utils_1.writeJsonWithCompression)(testDepsPath, testDeps, this._compression);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.TestDependenciesWriter = TestDependenciesWriter;
|
|
54
|
+
exports.getTestDependenciesWriter = (0, lodash_1.memoize)((selectivityRootPath, compression) => {
|
|
55
|
+
return new TestDependenciesWriter(selectivityRootPath, compression);
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=test-dependencies-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-dependencies-writer.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/test-dependencies-writer.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAiC;AACjC,0DAA6B;AAC7B,wDAA0B;AAC1B,mCAA4C;AAG5C,6CAAiF;AAEjF,MAAM,WAAW,GAAG,CAAC,YAAqC,EAAE,YAAqC,EAAW,EAAE;IAC1G,MAAM,KAAK,GAAwC,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;IAErF,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACxG,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAa,sBAAsB;IAK/B,YAAY,mBAA2B,EAAE,WAAuC;QAFxE,sBAAiB,GAAG,KAAK,CAAC;QAG9B,IAAI,CAAC,qBAAqB,GAAG,mBAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAU,EAAE,mBAA2C;QACjE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1B,MAAM,kBAAE,CAAC,SAAS,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC/C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAClC,CAAC;QAED,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAwD,MAAM,IAAA,oCAAuB,EAC/F,YAAY,EACZ,IAAI,CAAC,YAAY,EACjB,EAAE,YAAY,EAAE,EAAE,EAAE,CACvB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEpB,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,CAAC;YACtE,OAAO;QACX,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;QAE5D,IAAA,yBAAiB,EAAC,QAAQ,CAAC,CAAC;QAE5B,MAAM,IAAA,qCAAwB,EAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9E,CAAC;CACJ;AAjCD,wDAiCC;AAEY,QAAA,yBAAyB,GAAG,IAAA,gBAAO,EAC5C,CAAC,mBAA2B,EAAE,WAAuC,EAA0B,EAAE;IAC7F,OAAO,IAAI,sBAAsB,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC,CACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface NormalizedDependencies {
|
|
2
|
+
/** Project-wide styles */
|
|
3
|
+
css: string[];
|
|
4
|
+
/** Project-wide scripts */
|
|
5
|
+
js: string[];
|
|
6
|
+
/** Module names from node_modules (e.g. "react", "@remix-run/router") */
|
|
7
|
+
modules: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare const Compression: {
|
|
10
|
+
readonly NONE: "none";
|
|
11
|
+
readonly GZIP: "gz";
|
|
12
|
+
readonly BROTLI: "br";
|
|
13
|
+
readonly ZSTD: "zstd";
|
|
14
|
+
};
|
|
15
|
+
export type SelectivityCompressionType = (typeof Compression)[keyof typeof Compression];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/types.ts"],"names":[],"mappings":";;;AASa,QAAA,WAAW,GAAG;IACvB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,MAAM;CACN,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type RawSourceMap } from "source-map";
|
|
2
|
+
import type { CDPRuntime } from "../domains/runtime";
|
|
3
|
+
import type { CDPSessionId } from "../types";
|
|
4
|
+
import type { NormalizedDependencies } from "./types";
|
|
5
|
+
/**
|
|
6
|
+
* Tries to fetch text by url from node.js, then falls back to "fetch" from browser, if node.js fetch fails
|
|
7
|
+
* @param url text url
|
|
8
|
+
* @param runtime CDP runtime domain
|
|
9
|
+
* @param sessionId CDP session id
|
|
10
|
+
* @returns text
|
|
11
|
+
*/
|
|
12
|
+
export declare const fetchTextWithBrowserFallback: (url: string, runtime: CDPRuntime, sessionId: CDPSessionId) => Promise<string | Error>;
|
|
13
|
+
/**
|
|
14
|
+
* Replaces "webpack://" protocol with source path because "source-map" doesn't work well with protocol paths
|
|
15
|
+
* @param sourceMap Raw source maps in https://tc39.es/ecma426/ format
|
|
16
|
+
* @param sourceRoot Source root
|
|
17
|
+
*/
|
|
18
|
+
export declare const patchSourceMapSources: (sourceMap: RawSourceMap, sourceRoot?: string) => RawSourceMap;
|
|
19
|
+
/**
|
|
20
|
+
* Given compiled code, its source map, and the executed offsets
|
|
21
|
+
* It returns the original source files touched
|
|
22
|
+
* Useful for turning coverage ranges into real TS/JS module dependencies
|
|
23
|
+
* @param source Compiled source code
|
|
24
|
+
* @param sourceMaps Source maps JSON string
|
|
25
|
+
* @param startOffsets Executed start offsets (v8 format)
|
|
26
|
+
* @param sourceRoot Source root
|
|
27
|
+
*/
|
|
28
|
+
export declare const extractSourceFilesDeps: (source: string, sourceMaps: string, startOffsets: number[], sourceRoot: string) => Promise<Set<string>>;
|
|
29
|
+
/**
|
|
30
|
+
* @returns True, if fileUrlLikePath has some kind of protocol ("data://", "webpack://", "turbopack://", "file://")...
|
|
31
|
+
*/
|
|
32
|
+
export declare const hasProtocol: (fileUrlLikePath: string) => boolean;
|
|
33
|
+
/**
|
|
34
|
+
* @param cssDependencies SORTED uniq array of css dependenciy URI's
|
|
35
|
+
* @param jsDependencies SORTED uniq array of js dependenciy URI's
|
|
36
|
+
* @returns sorted uniq arrays of relative paths
|
|
37
|
+
*/
|
|
38
|
+
export declare const transformSourceDependencies: (cssDependencies: string[], jsDependencies: string[]) => NormalizedDependencies;
|
|
39
|
+
export declare const shallowSortObject: (obj: Record<string, unknown>) => void;
|
|
@@ -0,0 +1,198 @@
|
|
|
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.shallowSortObject = exports.transformSourceDependencies = exports.hasProtocol = exports.extractSourceFilesDeps = exports.patchSourceMapSources = exports.fetchTextWithBrowserFallback = void 0;
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
|
+
const source_map_1 = require("source-map");
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const url_1 = require("url");
|
|
12
|
+
const fs_2 = require("../../../utils/fs");
|
|
13
|
+
const constants_1 = require("./constants");
|
|
14
|
+
/**
|
|
15
|
+
* Tries to fetch text by url from node.js, then falls back to "fetch" from browser, if node.js fetch fails
|
|
16
|
+
* @param url text url
|
|
17
|
+
* @param runtime CDP runtime domain
|
|
18
|
+
* @param sessionId CDP session id
|
|
19
|
+
* @returns text
|
|
20
|
+
*/
|
|
21
|
+
const fetchTextWithBrowserFallback = async (url, runtime, sessionId) => {
|
|
22
|
+
const isSourceMapEmbedded = new url_1.URL(url).protocol === "data:";
|
|
23
|
+
if (isSourceMapEmbedded) {
|
|
24
|
+
// With "data" protocol it just decodes embedded source maps without actual network requests
|
|
25
|
+
// So we can do it directly from node.js
|
|
26
|
+
return fetch(url)
|
|
27
|
+
.then(r => r.text())
|
|
28
|
+
.catch((err) => err);
|
|
29
|
+
}
|
|
30
|
+
// At first, trying to fetch sourceMaps directly from the node.js
|
|
31
|
+
// Then falling back to do it via browser (if Testplane has no direct network access to it, for example)
|
|
32
|
+
try {
|
|
33
|
+
return await fetch(url).then(r => r.text());
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return runtime
|
|
37
|
+
.evaluate(sessionId, {
|
|
38
|
+
expression: `fetch("${url.replaceAll('"', '\\"')}").then(r => r.text())`,
|
|
39
|
+
awaitPromise: true,
|
|
40
|
+
returnByValue: true,
|
|
41
|
+
})
|
|
42
|
+
.then(r => r.result.value)
|
|
43
|
+
.catch((err) => err);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
exports.fetchTextWithBrowserFallback = fetchTextWithBrowserFallback;
|
|
47
|
+
const isWebpackProtocol = (posixRelativeSourceFilePath) => {
|
|
48
|
+
return posixRelativeSourceFilePath.startsWith(constants_1.WEBPACK_PROTOCOL);
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Replaces "webpack://" protocol with source path because "source-map" doesn't work well with protocol paths
|
|
52
|
+
* @param sourceMap Raw source maps in https://tc39.es/ecma426/ format
|
|
53
|
+
* @param sourceRoot Source root
|
|
54
|
+
*/
|
|
55
|
+
const patchSourceMapSources = (sourceMap, sourceRoot) => {
|
|
56
|
+
sourceMap.sourceRoot = sourceRoot || sourceMap.sourceRoot;
|
|
57
|
+
for (let i = 0; i < sourceMap.sources.length; i++) {
|
|
58
|
+
if (isWebpackProtocol(sourceMap.sources[i])) {
|
|
59
|
+
sourceMap.sources[i] = sourceMap.sources[i].slice(constants_1.WEBPACK_PROTOCOL.length);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return sourceMap;
|
|
63
|
+
};
|
|
64
|
+
exports.patchSourceMapSources = patchSourceMapSources;
|
|
65
|
+
/**
|
|
66
|
+
* Given compiled code, its source map, and the executed offsets
|
|
67
|
+
* It returns the original source files touched
|
|
68
|
+
* Useful for turning coverage ranges into real TS/JS module dependencies
|
|
69
|
+
* @param source Compiled source code
|
|
70
|
+
* @param sourceMaps Source maps JSON string
|
|
71
|
+
* @param startOffsets Executed start offsets (v8 format)
|
|
72
|
+
* @param sourceRoot Source root
|
|
73
|
+
*/
|
|
74
|
+
const extractSourceFilesDeps = async (source, sourceMaps, startOffsets, sourceRoot) => {
|
|
75
|
+
const dependantSourceFiles = new Set();
|
|
76
|
+
const sourceMapsParsed = (0, exports.patchSourceMapSources)(JSON.parse(sourceMaps), sourceRoot);
|
|
77
|
+
const consumer = (await new source_map_1.SourceMapConsumer(sourceMapsParsed));
|
|
78
|
+
let sourceOffset = source.indexOf("\n");
|
|
79
|
+
const offsetToLine = [0];
|
|
80
|
+
while (sourceOffset !== -1) {
|
|
81
|
+
offsetToLine.push(++sourceOffset);
|
|
82
|
+
sourceOffset = source.indexOf("\n", sourceOffset);
|
|
83
|
+
}
|
|
84
|
+
for (const startOffset of startOffsets) {
|
|
85
|
+
let line = (0, lodash_1.sortedIndex)(offsetToLine, startOffset);
|
|
86
|
+
if (startOffset < offsetToLine[line]) {
|
|
87
|
+
line--;
|
|
88
|
+
}
|
|
89
|
+
const column = startOffset - offsetToLine[line];
|
|
90
|
+
const position = consumer.originalPositionFor({ line: line + 1, column });
|
|
91
|
+
if (position.source) {
|
|
92
|
+
dependantSourceFiles.add(position.source);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return dependantSourceFiles;
|
|
96
|
+
};
|
|
97
|
+
exports.extractSourceFilesDeps = extractSourceFilesDeps;
|
|
98
|
+
/**
|
|
99
|
+
* @returns True, if fileUrlLikePath has some kind of protocol ("data://", "webpack://", "turbopack://", "file://")...
|
|
100
|
+
*/
|
|
101
|
+
const hasProtocol = (fileUrlLikePath) => {
|
|
102
|
+
if (!fileUrlLikePath.includes("://")) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
return Boolean(new url_1.URL(fileUrlLikePath).protocol);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
exports.hasProtocol = hasProtocol;
|
|
113
|
+
const ensurePosixRelativeDependencyPathExists = (0, lodash_1.memoize)((posixRelativePath) => {
|
|
114
|
+
const relativePath = posixRelativePath.replaceAll(path_1.default.posix.sep, path_1.default.sep);
|
|
115
|
+
if (fs_1.default.existsSync(relativePath)) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
throw new Error([
|
|
119
|
+
`Selectivity: Couldn't find "${relativePath}", which is test's dependency`,
|
|
120
|
+
"Please ensure 'sources' of generated source maps contain valid paths to existing files",
|
|
121
|
+
"Configuring 'sourceRoot' in Testplane selectivity config also might help",
|
|
122
|
+
].join("\n"));
|
|
123
|
+
});
|
|
124
|
+
/**
|
|
125
|
+
* @param cssDependencies SORTED uniq array of css dependenciy URI's
|
|
126
|
+
* @param jsDependencies SORTED uniq array of js dependenciy URI's
|
|
127
|
+
* @returns sorted uniq arrays of relative paths
|
|
128
|
+
*/
|
|
129
|
+
const transformSourceDependencies = (cssDependencies, jsDependencies) => {
|
|
130
|
+
const nodeModulesLabel = "node_modules/";
|
|
131
|
+
const css = [];
|
|
132
|
+
const js = [];
|
|
133
|
+
const modules = [];
|
|
134
|
+
const classifyDependency = (dependency, typedResultArray) => {
|
|
135
|
+
dependency = decodeURIComponent((0, fs_2.softFileURLToPath)(dependency));
|
|
136
|
+
if ((0, exports.hasProtocol)(dependency)) {
|
|
137
|
+
throw new Error(`Selectivity: Found unsupported protocol in dependencies ("${dependency}")`);
|
|
138
|
+
}
|
|
139
|
+
const dependencyRelativePath = path_1.default.posix.relative(path_1.default.posix.resolve(), path_1.default.posix.resolve(dependency));
|
|
140
|
+
const nodeModulesLabelPos = dependencyRelativePath.indexOf(nodeModulesLabel);
|
|
141
|
+
if (nodeModulesLabelPos === -1) {
|
|
142
|
+
ensurePosixRelativeDependencyPathExists(dependencyRelativePath);
|
|
143
|
+
typedResultArray.push(dependencyRelativePath);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const modulePos = nodeModulesLabelPos + nodeModulesLabel.length;
|
|
147
|
+
const isScopedDependency = dependencyRelativePath[modulePos] === "@";
|
|
148
|
+
let moduleEndPos;
|
|
149
|
+
if (isScopedDependency) {
|
|
150
|
+
const scopeEndPos = dependencyRelativePath.indexOf("/", modulePos + 1);
|
|
151
|
+
moduleEndPos = scopeEndPos === -1 ? -1 : dependencyRelativePath.indexOf("/", scopeEndPos + 1);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
moduleEndPos = dependencyRelativePath.indexOf("/", modulePos + 1);
|
|
155
|
+
}
|
|
156
|
+
if (moduleEndPos === -1) {
|
|
157
|
+
ensurePosixRelativeDependencyPathExists(dependencyRelativePath);
|
|
158
|
+
typedResultArray.push(dependencyRelativePath);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
const modulePath = dependencyRelativePath.slice(0, moduleEndPos);
|
|
162
|
+
if (modules[modules.length - 1] !== modulePath) {
|
|
163
|
+
ensurePosixRelativeDependencyPathExists(modulePath);
|
|
164
|
+
modules.push(modulePath);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
let cssIndex = 0;
|
|
169
|
+
let jsIndex = 0;
|
|
170
|
+
while (cssIndex < cssDependencies.length && jsIndex < jsDependencies.length) {
|
|
171
|
+
const compareResult = cssDependencies[cssIndex].localeCompare(jsDependencies[jsIndex]);
|
|
172
|
+
if (compareResult < 0) {
|
|
173
|
+
classifyDependency(cssDependencies[cssIndex++], css);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
classifyDependency(jsDependencies[jsIndex++], js);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
while (cssIndex < cssDependencies.length) {
|
|
180
|
+
classifyDependency(cssDependencies[cssIndex++], css);
|
|
181
|
+
}
|
|
182
|
+
while (jsIndex < jsDependencies.length) {
|
|
183
|
+
classifyDependency(jsDependencies[jsIndex++], js);
|
|
184
|
+
}
|
|
185
|
+
return { css, js, modules };
|
|
186
|
+
};
|
|
187
|
+
exports.transformSourceDependencies = transformSourceDependencies;
|
|
188
|
+
// Ensures file consistency
|
|
189
|
+
const shallowSortObject = (obj) => {
|
|
190
|
+
const testBrowsers = Object.keys(obj).sort();
|
|
191
|
+
for (const testBrowser of testBrowsers) {
|
|
192
|
+
const testBrowserDeps = obj[testBrowser];
|
|
193
|
+
delete obj[testBrowser];
|
|
194
|
+
obj[testBrowser] = testBrowserDeps;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
exports.shallowSortObject = shallowSortObject;
|
|
198
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/browser/cdp/selectivity/utils.ts"],"names":[],"mappings":"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"}
|