@teamscale/coverage-collector 0.1.0-beta.8 → 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +23 -25
- package/dist/src/config/RemoteProfilerConfig.d.ts +24 -0
- package/dist/src/config/RemoteProfilerConfig.js +76 -0
- package/dist/src/control/App.d.ts +31 -0
- package/dist/src/control/App.js +202 -0
- package/dist/src/control/ControlServer.d.ts +24 -0
- package/dist/src/control/ControlServer.js +100 -0
- package/dist/src/control/CoverageDumper.d.ts +27 -0
- package/dist/src/control/CoverageDumper.js +166 -0
- package/dist/src/main.js +29 -2
- package/dist/src/receiver/CollectingServer.d.ts +2 -2
- package/dist/src/receiver/CollectingServer.js +70 -20
- package/dist/src/receiver/Session.d.ts +15 -25
- package/dist/src/receiver/Session.js +34 -7
- package/dist/src/storage/DataStorage.d.ts +154 -81
- package/dist/src/storage/DataStorage.js +361 -81
- package/dist/src/upload/ArtifactoryUpload.d.ts +2 -2
- package/dist/src/upload/ArtifactoryUpload.js +25 -28
- package/dist/src/upload/TeamscaleUpload.d.ts +8 -2
- package/dist/src/upload/TeamscaleUpload.js +67 -31
- package/dist/src/utils/PrettyFileLogger.d.ts +0 -1
- package/dist/src/utils/PrettyFileLogger.js +1 -0
- package/dist/src/utils/RestApis.d.ts +37 -0
- package/dist/src/utils/RestApis.js +141 -0
- package/dist/src/utils/StdConsoleLogger.js +11 -1
- package/package.json +23 -25
- package/dist/src/App.d.ts +0 -44
- package/dist/src/App.js +0 -267
- package/dist/src/upload/CommonUpload.d.ts +0 -16
- package/dist/src/upload/CommonUpload.js +0 -63
- package/dist/src/upload/ProxyUpload.d.ts +0 -6
- package/dist/src/upload/ProxyUpload.js +0 -30
- package/dist/src/utils/ConfigParameters.d.ts +0 -36
- package/dist/src/utils/ConfigParameters.js +0 -107
|
@@ -3,52 +3,88 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.checkTeamscaleCredentials = checkTeamscaleCredentials;
|
|
7
|
+
exports.uploadToTeamscale = uploadToTeamscale;
|
|
8
|
+
exports.isTimestampArgument = isTimestampArgument;
|
|
7
9
|
const QueryParameters_1 = __importDefault(require("../utils/QueryParameters"));
|
|
8
|
-
const
|
|
10
|
+
const RestApis_1 = require("../utils/RestApis");
|
|
9
11
|
const axios_1 = __importDefault(require("axios"));
|
|
10
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Check Teamscale credentials for validity via the `/api/auth/login/access-key` endpoint.
|
|
14
|
+
*/
|
|
15
|
+
async function checkTeamscaleCredentials(config, logger) {
|
|
16
|
+
if (config.teamscaleAccessToken === undefined) {
|
|
17
|
+
logger.error("No valid access token provided for accessing the Teamscale server.");
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (config.teamscaleUser === undefined) {
|
|
21
|
+
logger.error("No valid user name provided for accessing the Teamscale server.");
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const checkUrl = `${(0, RestApis_1.removeTrailingUrlSlash)(config.teamscaleServerUrl)}/api/${RestApis_1.TEAMSCALE_API_VERSION}/auth/login/access-key`;
|
|
25
|
+
try {
|
|
26
|
+
await (0, RestApis_1.performRequest)(checkUrl, JSON.stringify({
|
|
27
|
+
username: config.teamscaleUser,
|
|
28
|
+
password: config.teamscaleAccessToken,
|
|
29
|
+
stayLoggedIn: false,
|
|
30
|
+
}), (0, RestApis_1.prepareTeamscaleApiRequestConfig)(config, { 'Content-Type': `application/json` }), axios_1.default.post, logger);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
logger.error('Teamscale authentication failed.', e);
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
11
38
|
/**
|
|
12
39
|
* Uploads a coverage file to Teamscale with the provided configuration.
|
|
13
40
|
*/
|
|
14
|
-
async function uploadToTeamscale(config, logger, coverageFile, lines) {
|
|
15
|
-
if (!(config.
|
|
16
|
-
throw new
|
|
41
|
+
async function uploadToTeamscale(config, logger, coverageFile, lines, commit) {
|
|
42
|
+
if (!(config.teamscaleAccessToken && config.teamscaleUser && config.teamscaleServerUrl)) {
|
|
43
|
+
throw new RestApis_1.UploadError('API key and user name must be configured!');
|
|
44
|
+
}
|
|
45
|
+
if (!config.teamscaleProject && !config.teamscalePartition) {
|
|
46
|
+
throw new RestApis_1.UploadError('Teamscale project and partition must be configured!');
|
|
17
47
|
}
|
|
18
48
|
if (lines === 0) {
|
|
19
|
-
return;
|
|
49
|
+
return false;
|
|
20
50
|
}
|
|
21
51
|
logger.debug('Preparing upload to Teamscale');
|
|
22
|
-
const form = (0,
|
|
23
|
-
const queryParameters = prepareQueryParameters(config);
|
|
52
|
+
const form = (0, RestApis_1.prepareReportFileUploadFormData)(coverageFile);
|
|
53
|
+
const queryParameters = prepareQueryParameters(config, commit);
|
|
24
54
|
await performTeamscaleUpload(config, queryParameters, form, logger);
|
|
55
|
+
return true;
|
|
25
56
|
}
|
|
26
|
-
exports.uploadToTeamscale = uploadToTeamscale;
|
|
27
57
|
async function performTeamscaleUpload(config, parameters, form, logger) {
|
|
28
|
-
|
|
29
|
-
await (0,
|
|
58
|
+
const uploadUrl = `${(0, RestApis_1.removeTrailingUrlSlash)(config.teamscaleServerUrl)}/api/${RestApis_1.TEAMSCALE_API_VERSION}/projects/${config.teamscaleProject}/external-analysis/session/auto-create/report?${parameters.toString()}`;
|
|
59
|
+
await (0, RestApis_1.performFormDataRequest)(uploadUrl, form, (0, RestApis_1.prepareTeamscaleApiFormRequestConfig)(config, form), axios_1.default.post, logger);
|
|
30
60
|
}
|
|
31
|
-
function prepareQueryParameters(config) {
|
|
61
|
+
function prepareQueryParameters(config, commitOrRevision) {
|
|
32
62
|
const parameters = new QueryParameters_1.default();
|
|
33
63
|
parameters.addIfDefined('format', 'SIMPLE');
|
|
34
|
-
parameters.addIfDefined('message', config.
|
|
35
|
-
parameters.addIfDefined('repository', config.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
64
|
+
parameters.addIfDefined('message', config.teamscaleMessage);
|
|
65
|
+
parameters.addIfDefined('repository', config.teamscaleRepository);
|
|
66
|
+
if (isTimestampArgument(commitOrRevision)) {
|
|
67
|
+
parameters.addIfDefined('t', commitOrRevision);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
parameters.addIfDefined('revision', commitOrRevision);
|
|
71
|
+
}
|
|
72
|
+
parameters.addIfDefined('partition', config.teamscalePartition);
|
|
39
73
|
return parameters;
|
|
40
74
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
75
|
+
/** Checks if the given string is a commit timestamp (possibly along with a branch name). */
|
|
76
|
+
function isTimestampArgument(commitOrRevision) {
|
|
77
|
+
const parts = commitOrRevision.split(":");
|
|
78
|
+
if (parts.length === 2) {
|
|
79
|
+
if (parts[1].toUpperCase() === "HEAD") {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
return /^\d+$/.test(parts[1]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (parts.length === 1) {
|
|
87
|
+
return /^\d+$/.test(commitOrRevision);
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
54
90
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CollectorOptions } from '@cqse/commons';
|
|
2
|
+
import FormData from 'form-data';
|
|
3
|
+
import Logger from 'bunyan';
|
|
4
|
+
import axios, { AxiosProxyConfig, AxiosRequestConfig, AxiosResponse } from 'axios';
|
|
5
|
+
/**
|
|
6
|
+
* The API version of Teamcale to perform calls against.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TEAMSCALE_API_VERSION = "v2025.2";
|
|
9
|
+
/**
|
|
10
|
+
* Error that is thrown when the upload failed
|
|
11
|
+
*/
|
|
12
|
+
export declare class UploadError extends Error {
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Prepares the form data from a given report file to upload.
|
|
16
|
+
*/
|
|
17
|
+
export declare function prepareReportFileUploadFormData(reportFileToUpload: string): FormData;
|
|
18
|
+
/**
|
|
19
|
+
* Sends the form data, for example, for uploading a file, based on the given parameters.
|
|
20
|
+
*/
|
|
21
|
+
export declare function performFormDataRequest(url: string, form: FormData, config: AxiosRequestConfig<FormData>, uploadFunction: <T = unknown, R = AxiosResponse<T>, D = FormData>(url: string, data?: D, config?: AxiosRequestConfig<D>) => Promise<R>, logger: Logger): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* A generic REST API request with extensive error handling.
|
|
24
|
+
*/
|
|
25
|
+
export declare function performRequest<B, R>(url: string, bodyData: B | undefined, config: AxiosRequestConfig<unknown>, requestFunction: typeof axios.get | typeof axios.post | typeof axios.put, logger: Logger): Promise<R>;
|
|
26
|
+
/** Some of the REST endpoints expect form data; prepare such a request here. */
|
|
27
|
+
export declare function prepareTeamscaleApiFormRequestConfig(config: CollectorOptions, form: FormData): AxiosRequestConfig<FormData>;
|
|
28
|
+
/** Configure the AXIOS request with all relevant parameters, such as HTTP proxy and authentication. */
|
|
29
|
+
export declare function prepareTeamscaleApiRequestConfig(config: CollectorOptions, headers: Record<string, string>): AxiosRequestConfig<FormData>;
|
|
30
|
+
/**
|
|
31
|
+
* Creates an `AxiosProxyConfig` object if proxy variables are provided.
|
|
32
|
+
*/
|
|
33
|
+
export declare function extractProxyOptions(config: CollectorOptions): AxiosProxyConfig | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Removes a trailing slash from a given URL.
|
|
36
|
+
*/
|
|
37
|
+
export declare function removeTrailingUrlSlash(url: string | undefined): string | undefined;
|
|
@@ -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.UploadError = exports.TEAMSCALE_API_VERSION = void 0;
|
|
7
|
+
exports.prepareReportFileUploadFormData = prepareReportFileUploadFormData;
|
|
8
|
+
exports.performFormDataRequest = performFormDataRequest;
|
|
9
|
+
exports.performRequest = performRequest;
|
|
10
|
+
exports.prepareTeamscaleApiFormRequestConfig = prepareTeamscaleApiFormRequestConfig;
|
|
11
|
+
exports.prepareTeamscaleApiRequestConfig = prepareTeamscaleApiRequestConfig;
|
|
12
|
+
exports.extractProxyOptions = extractProxyOptions;
|
|
13
|
+
exports.removeTrailingUrlSlash = removeTrailingUrlSlash;
|
|
14
|
+
const form_data_1 = __importDefault(require("form-data"));
|
|
15
|
+
const fs_1 = __importDefault(require("fs"));
|
|
16
|
+
const axios_1 = __importDefault(require("axios"));
|
|
17
|
+
const util_1 = require("util");
|
|
18
|
+
const url_1 = __importDefault(require("url"));
|
|
19
|
+
/**
|
|
20
|
+
* The API version of Teamcale to perform calls against.
|
|
21
|
+
*/
|
|
22
|
+
exports.TEAMSCALE_API_VERSION = 'v2025.2';
|
|
23
|
+
/**
|
|
24
|
+
* Error that is thrown when the upload failed
|
|
25
|
+
*/
|
|
26
|
+
class UploadError extends Error {
|
|
27
|
+
}
|
|
28
|
+
exports.UploadError = UploadError;
|
|
29
|
+
/**
|
|
30
|
+
* Prepares the form data from a given report file to upload.
|
|
31
|
+
*/
|
|
32
|
+
function prepareReportFileUploadFormData(reportFileToUpload) {
|
|
33
|
+
const form = new form_data_1.default();
|
|
34
|
+
form.append('report', fs_1.default.readFileSync(reportFileToUpload), 'coverage.simple');
|
|
35
|
+
return form;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Sends the form data, for example, for uploading a file, based on the given parameters.
|
|
39
|
+
*/
|
|
40
|
+
async function performFormDataRequest(url, form, config, uploadFunction, logger) {
|
|
41
|
+
return performRequest(url, form, config, uploadFunction, logger);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A generic REST API request with extensive error handling.
|
|
45
|
+
*/
|
|
46
|
+
async function performRequest(url, bodyData, config, requestFunction, logger) {
|
|
47
|
+
try {
|
|
48
|
+
logger.debug("Requesting via URL: " + url);
|
|
49
|
+
let response;
|
|
50
|
+
if (requestFunction === axios_1.default.get) {
|
|
51
|
+
response = await axios_1.default.get(url, config);
|
|
52
|
+
}
|
|
53
|
+
else if (requestFunction === axios_1.default.put) {
|
|
54
|
+
response = await axios_1.default.put(url, bodyData, config);
|
|
55
|
+
}
|
|
56
|
+
else if (requestFunction === axios_1.default.post) {
|
|
57
|
+
response = await axios_1.default.post(url, bodyData, config);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
throw new Error(`Unsupported request function: ${requestFunction}`);
|
|
61
|
+
}
|
|
62
|
+
logger.debug(`Request finished with code ${response.status}.`);
|
|
63
|
+
return response.data;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
67
|
+
let userMessage;
|
|
68
|
+
if (error.message) {
|
|
69
|
+
logger.error(`Request error ${error.status ?? 'UNDEFINED'}: ${error.message}\n\tRequested URL: ${url}`);
|
|
70
|
+
}
|
|
71
|
+
if (error.response) {
|
|
72
|
+
// The request was made and the server responded with a status code
|
|
73
|
+
// that falls out of the range of 2xx
|
|
74
|
+
logger.error('Request error response data:', error.response.data);
|
|
75
|
+
logger.error('Request error response status:', error.response.status);
|
|
76
|
+
logger.debug('Request error response headers:', JSON.stringify(error.response.headers));
|
|
77
|
+
userMessage = `Request failed with status ${error.response.status}: ${error.response.data ?? ''}`;
|
|
78
|
+
}
|
|
79
|
+
else if (error.request) {
|
|
80
|
+
// The request was made but no response was received
|
|
81
|
+
userMessage = 'No response received for the request. ' + (error.message ?? error.code);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Something happened in setting up the request that triggered an Error
|
|
85
|
+
userMessage = 'Request setup failed.';
|
|
86
|
+
}
|
|
87
|
+
// Provide a more specific message if possible
|
|
88
|
+
throw new UploadError(`Something went wrong when interacting with the API: ${userMessage}`);
|
|
89
|
+
}
|
|
90
|
+
throw new UploadError(`Something went wrong: ${(0, util_1.inspect)(error)}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Some of the REST endpoints expect form data; prepare such a request here. */
|
|
94
|
+
function prepareTeamscaleApiFormRequestConfig(config, form) {
|
|
95
|
+
return prepareTeamscaleApiRequestConfig(config, { 'Content-Type': `multipart/form-data; boundary=${form.getBoundary()}` });
|
|
96
|
+
}
|
|
97
|
+
/** Configure the AXIOS request with all relevant parameters, such as HTTP proxy and authentication. */
|
|
98
|
+
function prepareTeamscaleApiRequestConfig(config, headers) {
|
|
99
|
+
return {
|
|
100
|
+
auth: {
|
|
101
|
+
username: config.teamscaleUser ?? 'no username provided',
|
|
102
|
+
password: config.teamscaleAccessToken ?? 'no password provided'
|
|
103
|
+
},
|
|
104
|
+
headers: {
|
|
105
|
+
Accept: '*/*',
|
|
106
|
+
...headers
|
|
107
|
+
},
|
|
108
|
+
timeout: 15000,
|
|
109
|
+
proxy: extractProxyOptions(config)
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Creates an `AxiosProxyConfig` object if proxy variables are provided.
|
|
114
|
+
*/
|
|
115
|
+
function extractProxyOptions(config) {
|
|
116
|
+
const proxy = config.httpProxy;
|
|
117
|
+
if (!proxy) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
// Expected format: http://username:password@host:port/
|
|
121
|
+
// See https://nodejs.org/api/url.html#url-strings-and-url-objects for URL parsing
|
|
122
|
+
const proxyAddress = new url_1.default.URL(proxy);
|
|
123
|
+
const proxyConfig = {
|
|
124
|
+
protocol: proxyAddress.protocol.replace(':', ''),
|
|
125
|
+
host: proxyAddress.hostname,
|
|
126
|
+
port: +proxyAddress.port,
|
|
127
|
+
};
|
|
128
|
+
if (proxyAddress.username && proxyAddress.password) {
|
|
129
|
+
proxyConfig.auth = {
|
|
130
|
+
username: proxyAddress.username,
|
|
131
|
+
password: proxyAddress.password
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return proxyConfig;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Removes a trailing slash from a given URL.
|
|
138
|
+
*/
|
|
139
|
+
function removeTrailingUrlSlash(url) {
|
|
140
|
+
return url?.replace(/\/$/, '');
|
|
141
|
+
}
|
|
@@ -10,7 +10,17 @@ require("dotenv/config");
|
|
|
10
10
|
class StdConsoleLogger {
|
|
11
11
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
12
|
write(rec) {
|
|
13
|
-
|
|
13
|
+
let logFunction;
|
|
14
|
+
if (rec.level === bunyan_1.default.ERROR) {
|
|
15
|
+
logFunction = console.error;
|
|
16
|
+
}
|
|
17
|
+
else if (rec.level === bunyan_1.default.WARN) {
|
|
18
|
+
logFunction = console.warn;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
logFunction = console.log;
|
|
22
|
+
}
|
|
23
|
+
logFunction.apply(this, [`[${rec.time.toISOString()}] ${bunyan_1.default.nameFromLevel[rec.level].toUpperCase()}: ${rec.msg}`]);
|
|
14
24
|
}
|
|
15
25
|
}
|
|
16
26
|
exports.StdConsoleLogger = StdConsoleLogger;
|
package/package.json
CHANGED
|
@@ -1,55 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teamscale/coverage-collector",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0-beta.2",
|
|
4
4
|
"description": "Collector for JavaScript code coverage information",
|
|
5
5
|
"main": "dist/src/main.js",
|
|
6
6
|
"bin": "dist/src/main.js",
|
|
7
7
|
"types": "dist/src/main.d.ts",
|
|
8
8
|
"author": "CQSE GmbH",
|
|
9
9
|
"license": "Apache-2.0",
|
|
10
|
-
"
|
|
11
|
-
"type": "git",
|
|
12
|
-
"url": "https://github.com/cqse/teamscale-javascript-profiler.git"
|
|
13
|
-
},
|
|
10
|
+
"homepage": "https://docs.teamscale.com/howto/setting-up-profiler-tga/javascript/",
|
|
14
11
|
"files": [
|
|
15
12
|
"dist/**/*"
|
|
16
13
|
],
|
|
17
14
|
"dependencies": {
|
|
18
|
-
"@cqse/commons": "0.1.0-beta.7",
|
|
19
15
|
"argparse": "^2.0.1",
|
|
20
|
-
"async": "^3.2.
|
|
21
|
-
"axios": "^1.
|
|
16
|
+
"async": "^3.2.6",
|
|
17
|
+
"axios": "^1.7.9",
|
|
22
18
|
"bunyan": "^1.8.15",
|
|
23
|
-
"date-and-time": "^3.
|
|
24
|
-
"dotenv": "^16.4.
|
|
25
|
-
"express": "^
|
|
26
|
-
"form-data": "^4.0.
|
|
19
|
+
"date-and-time": "^3.6.0",
|
|
20
|
+
"dotenv": "^16.4.7",
|
|
21
|
+
"express": "^5.0.1",
|
|
22
|
+
"form-data": "^4.0.2",
|
|
27
23
|
"mkdirp": "^3.0.1",
|
|
24
|
+
"node-cache": "^5.1.2",
|
|
28
25
|
"rxjs": "^7.8.1",
|
|
29
26
|
"source-map": "^0.7.4",
|
|
30
27
|
"tmp": "^0.2.3",
|
|
31
28
|
"typescript-optional": "^2.0.1",
|
|
32
|
-
"ws": "^8.
|
|
29
|
+
"ws": "^8.18.0",
|
|
30
|
+
"@cqse/commons": "1.0.0-beta.2"
|
|
33
31
|
},
|
|
34
32
|
"devDependencies": {
|
|
35
|
-
"@babel/core": "^7.
|
|
36
|
-
"@babel/preset-env": "^7.
|
|
37
|
-
"@types/argparse": "^2.0.
|
|
33
|
+
"@babel/core": "^7.26.8",
|
|
34
|
+
"@babel/preset-env": "^7.26.8",
|
|
35
|
+
"@types/argparse": "^2.0.17",
|
|
38
36
|
"@types/async": "^3.2.24",
|
|
39
37
|
"@types/bunyan": "^1.8.11",
|
|
40
|
-
"@types/express": "^
|
|
41
|
-
"@types/jest": "^29.5.
|
|
42
|
-
"@types/node": "^
|
|
38
|
+
"@types/express": "^5.0.0",
|
|
39
|
+
"@types/jest": "^29.5.14",
|
|
40
|
+
"@types/node": "^22.13.4",
|
|
43
41
|
"@types/tmp": "^0.2.6",
|
|
44
|
-
"@types/ws": "^8.5.
|
|
42
|
+
"@types/ws": "^8.5.14",
|
|
45
43
|
"babel-jest": "^29.7.0",
|
|
46
|
-
"esbuild": "^0.
|
|
44
|
+
"esbuild": "^0.25.0",
|
|
47
45
|
"jest": "^29.7.0",
|
|
48
|
-
"mockttp": "
|
|
49
|
-
"rimraf": "^
|
|
50
|
-
"ts-jest": "^29.
|
|
46
|
+
"mockttp": "3.15.5",
|
|
47
|
+
"rimraf": "^6.0.1",
|
|
48
|
+
"ts-jest": "^29.2.5",
|
|
51
49
|
"ts-node": "^10.9.2",
|
|
52
|
-
"typescript": "^5.
|
|
50
|
+
"typescript": "^5.7.3"
|
|
53
51
|
},
|
|
54
52
|
"publishConfig": {
|
|
55
53
|
"access": "public"
|
package/dist/src/App.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import 'dotenv/config';
|
|
2
|
-
import { ConfigParameters } from './utils/ConfigParameters';
|
|
3
|
-
/**
|
|
4
|
-
* The main class of the Teamscale JavaScript Collector.
|
|
5
|
-
* Used to start the collector with a given configuration.
|
|
6
|
-
*/
|
|
7
|
-
export declare class App {
|
|
8
|
-
/**
|
|
9
|
-
* Parse the given command line arguments into a corresponding options object.
|
|
10
|
-
*/
|
|
11
|
-
private static parseArguments;
|
|
12
|
-
/**
|
|
13
|
-
* Construct the logger.
|
|
14
|
-
*/
|
|
15
|
-
private static buildLogger;
|
|
16
|
-
/**
|
|
17
|
-
* Entry point of the Teamscale JavaScript Profiler.
|
|
18
|
-
*/
|
|
19
|
-
static run(): void;
|
|
20
|
-
/**
|
|
21
|
-
* Run the collector with the given configuration options.
|
|
22
|
-
*
|
|
23
|
-
* @param config - The configuration options to run the collector with.
|
|
24
|
-
*/
|
|
25
|
-
static runWithConfig(config: ConfigParameters): {
|
|
26
|
-
stop: () => Promise<void>;
|
|
27
|
-
};
|
|
28
|
-
/**
|
|
29
|
-
* Starts a timer that shows a message every min that no coverage
|
|
30
|
-
* was received until the opposite is the case.
|
|
31
|
-
*/
|
|
32
|
-
private static startNoMessageTimer;
|
|
33
|
-
/**
|
|
34
|
-
* Start a timer for dumping the data, depending on the configuration.
|
|
35
|
-
*
|
|
36
|
-
* @param config - The config that determines whether to do the timed dump or not.
|
|
37
|
-
* @param storage - The storage with the information to dump.
|
|
38
|
-
* @param logger - The logger to use.
|
|
39
|
-
*/
|
|
40
|
-
private static maybeStartDumpTimer;
|
|
41
|
-
private static dumpCoverage;
|
|
42
|
-
private static uploadCoverage;
|
|
43
|
-
private static startControlServer;
|
|
44
|
-
}
|