@allurereport/plugin-testops 3.2.0 → 3.3.1
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/client.d.ts +2 -0
- package/dist/client.js +15 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/model.d.ts +2 -1
- package/dist/plugin.d.ts +4 -4
- package/dist/plugin.js +57 -58
- package/dist/utils.d.ts +2 -2
- package/package.json +9 -6
package/dist/client.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare class TestOpsClient {
|
|
|
5
5
|
baseUrl: string;
|
|
6
6
|
projectId: string;
|
|
7
7
|
accessToken: string;
|
|
8
|
+
limit?: number;
|
|
8
9
|
});
|
|
9
10
|
get launchUrl(): string | undefined;
|
|
10
11
|
issueOauthToken(): Promise<void>;
|
|
@@ -16,5 +17,6 @@ export declare class TestOpsClient {
|
|
|
16
17
|
trs: TestResult[];
|
|
17
18
|
attachmentsResolver: (tr: TestResult) => Promise<any>;
|
|
18
19
|
fixturesResolver: (tr: TestResult) => Promise<any>;
|
|
20
|
+
onProgress?: () => void;
|
|
19
21
|
}): Promise<void>;
|
|
20
22
|
}
|
package/dist/client.js
CHANGED
|
@@ -9,10 +9,11 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _TestOpsClient_accessToken, _TestOpsClient_projectId, _TestOpsClient_oauthToken, _TestOpsClient_client, _TestOpsClient_launch, _TestOpsClient_session, _TestOpsClient_uploadInProgress;
|
|
12
|
+
var _TestOpsClient_accessToken, _TestOpsClient_projectId, _TestOpsClient_oauthToken, _TestOpsClient_client, _TestOpsClient_launch, _TestOpsClient_session, _TestOpsClient_uploadInProgress, _TestOpsClient_uploadLimit;
|
|
13
13
|
import axios from "axios";
|
|
14
14
|
import FormData from "form-data";
|
|
15
15
|
import chunk from "lodash.chunk";
|
|
16
|
+
import pLimit from "p-limit";
|
|
16
17
|
export class TestOpsClient {
|
|
17
18
|
constructor(params) {
|
|
18
19
|
_TestOpsClient_accessToken.set(this, void 0);
|
|
@@ -22,6 +23,7 @@ export class TestOpsClient {
|
|
|
22
23
|
_TestOpsClient_launch.set(this, void 0);
|
|
23
24
|
_TestOpsClient_session.set(this, void 0);
|
|
24
25
|
_TestOpsClient_uploadInProgress.set(this, false);
|
|
26
|
+
_TestOpsClient_uploadLimit.set(this, 1);
|
|
25
27
|
if (!params.accessToken) {
|
|
26
28
|
throw new Error("accessToken is required");
|
|
27
29
|
}
|
|
@@ -31,12 +33,18 @@ export class TestOpsClient {
|
|
|
31
33
|
if (!params.baseUrl) {
|
|
32
34
|
throw new Error("baseUrl is required");
|
|
33
35
|
}
|
|
36
|
+
if (params.limit && params.limit > 5) {
|
|
37
|
+
throw new Error("limit can't be greater than 5");
|
|
38
|
+
}
|
|
34
39
|
__classPrivateFieldSet(this, _TestOpsClient_accessToken, params.accessToken, "f");
|
|
35
40
|
__classPrivateFieldSet(this, _TestOpsClient_projectId, params.projectId, "f");
|
|
36
41
|
__classPrivateFieldSet(this, _TestOpsClient_client, axios.create({
|
|
37
42
|
baseURL: params.baseUrl,
|
|
38
43
|
validateStatus: (status) => status >= 200 && status < 400,
|
|
39
44
|
}), "f");
|
|
45
|
+
if (params.limit) {
|
|
46
|
+
__classPrivateFieldSet(this, _TestOpsClient_uploadLimit, params.limit, "f");
|
|
47
|
+
}
|
|
40
48
|
}
|
|
41
49
|
get launchUrl() {
|
|
42
50
|
if (!__classPrivateFieldGet(this, _TestOpsClient_launch, "f")) {
|
|
@@ -126,8 +134,9 @@ export class TestOpsClient {
|
|
|
126
134
|
if (!__classPrivateFieldGet(this, _TestOpsClient_session, "f")) {
|
|
127
135
|
throw new Error("Session isn't created! Call createSession first");
|
|
128
136
|
}
|
|
129
|
-
const { trs, attachmentsResolver, fixturesResolver } = params;
|
|
137
|
+
const { trs, attachmentsResolver, fixturesResolver, onProgress } = params;
|
|
130
138
|
const trsChunks = chunk(trs, 100);
|
|
139
|
+
const uploadLimitFn = pLimit(__classPrivateFieldGet(this, _TestOpsClient_uploadLimit, "f"));
|
|
131
140
|
await Promise.all(trsChunks.map(async (trsChunk) => {
|
|
132
141
|
const { data } = await __classPrivateFieldGet(this, _TestOpsClient_client, "f").post("/api/upload/test-result", {
|
|
133
142
|
testSessionId: __classPrivateFieldGet(this, _TestOpsClient_session, "f").id,
|
|
@@ -142,7 +151,7 @@ export class TestOpsClient {
|
|
|
142
151
|
},
|
|
143
152
|
});
|
|
144
153
|
const trsTestOpsIdsByUuid = data.results.reduce((acc, { id, uuid }) => ({ ...acc, [uuid]: id }), {});
|
|
145
|
-
await Promise.all(trsChunk.map(async (
|
|
154
|
+
await Promise.all(trsChunk.map((tr) => uploadLimitFn(async () => {
|
|
146
155
|
const trTestOpsId = trsTestOpsIdsByUuid[tr.id];
|
|
147
156
|
const attachments = await attachmentsResolver(tr);
|
|
148
157
|
const fixtures = await fixturesResolver(tr);
|
|
@@ -173,8 +182,9 @@ export class TestOpsClient {
|
|
|
173
182
|
},
|
|
174
183
|
});
|
|
175
184
|
}
|
|
176
|
-
|
|
185
|
+
onProgress?.();
|
|
186
|
+
})));
|
|
177
187
|
}));
|
|
178
188
|
}
|
|
179
189
|
}
|
|
180
|
-
_TestOpsClient_accessToken = new WeakMap(), _TestOpsClient_projectId = new WeakMap(), _TestOpsClient_oauthToken = new WeakMap(), _TestOpsClient_client = new WeakMap(), _TestOpsClient_launch = new WeakMap(), _TestOpsClient_session = new WeakMap(), _TestOpsClient_uploadInProgress = new WeakMap();
|
|
190
|
+
_TestOpsClient_accessToken = new WeakMap(), _TestOpsClient_projectId = new WeakMap(), _TestOpsClient_oauthToken = new WeakMap(), _TestOpsClient_client = new WeakMap(), _TestOpsClient_launch = new WeakMap(), _TestOpsClient_session = new WeakMap(), _TestOpsClient_uploadInProgress = new WeakMap(), _TestOpsClient_uploadLimit = new WeakMap();
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export type { TestopsUploaderPluginOptions } from "./model.js";
|
|
2
|
-
export {
|
|
1
|
+
export type { TestopsPluginOptions as TestopsUploaderPluginOptions } from "./model.js";
|
|
2
|
+
export { TestopsPlugin as default } from "./plugin.js";
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { TestopsPlugin as default } from "./plugin.js";
|
package/dist/model.d.ts
CHANGED
|
@@ -6,9 +6,10 @@ export type TestopsUploaderOptions = {
|
|
|
6
6
|
launchName: string;
|
|
7
7
|
launchTags: string[];
|
|
8
8
|
filter?: (testResult: TestResult) => boolean;
|
|
9
|
+
limit?: number;
|
|
9
10
|
};
|
|
10
11
|
export type TemplateManifest = Record<string, string>;
|
|
11
|
-
export type
|
|
12
|
+
export type TestopsPluginOptions = TestopsUploaderOptions;
|
|
12
13
|
export type TestOpsSession = {
|
|
13
14
|
id: number;
|
|
14
15
|
jobId: number;
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type AllureStore, type Plugin, type PluginContext, type PluginSummary } from "@allurereport/plugin-api";
|
|
2
|
-
import type {
|
|
3
|
-
export declare class
|
|
2
|
+
import type { TestopsPluginOptions } from "./model.js";
|
|
3
|
+
export declare class TestopsPlugin implements Plugin {
|
|
4
4
|
#private;
|
|
5
|
-
readonly options:
|
|
6
|
-
constructor(options:
|
|
5
|
+
readonly options: TestopsPluginOptions;
|
|
6
|
+
constructor(options: TestopsPluginOptions);
|
|
7
7
|
get ciMode(): boolean | undefined;
|
|
8
8
|
start(_context: PluginContext, store: AllureStore): Promise<void>;
|
|
9
9
|
update(_context: PluginContext, store: AllureStore): Promise<void>;
|
package/dist/plugin.js
CHANGED
|
@@ -9,32 +9,33 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var
|
|
12
|
+
var _TestopsPlugin_instances, _TestopsPlugin_ci, _TestopsPlugin_client, _TestopsPlugin_launchName, _TestopsPlugin_launchTags, _TestopsPlugin_uploadedTestResultsIds, _TestopsPlugin_upload, _TestopsPlugin_startUpload, _TestopsPlugin_stopUpload;
|
|
13
13
|
import { detect } from "@allurereport/ci";
|
|
14
14
|
import { getWorstStatus } from "@allurereport/core-api";
|
|
15
|
-
import {
|
|
15
|
+
import { createPluginSummary, } from "@allurereport/plugin-api";
|
|
16
16
|
import { env } from "node:process";
|
|
17
|
+
import ProgressBar from "progress";
|
|
17
18
|
import { TestOpsClient } from "./client.js";
|
|
18
19
|
import { resolvePluginOptions, unwrapStepsAttachments } from "./utils.js";
|
|
19
|
-
export class
|
|
20
|
+
export class TestopsPlugin {
|
|
20
21
|
constructor(options) {
|
|
21
|
-
|
|
22
|
+
_TestopsPlugin_instances.add(this);
|
|
22
23
|
this.options = options;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
_TestopsPlugin_ci.set(this, void 0);
|
|
25
|
+
_TestopsPlugin_client.set(this, void 0);
|
|
26
|
+
_TestopsPlugin_launchName.set(this, "");
|
|
27
|
+
_TestopsPlugin_launchTags.set(this, []);
|
|
28
|
+
_TestopsPlugin_uploadedTestResultsIds.set(this, []);
|
|
28
29
|
const { accessToken, endpoint, projectId, launchName, launchTags } = resolvePluginOptions(options);
|
|
29
|
-
__classPrivateFieldSet(this,
|
|
30
|
+
__classPrivateFieldSet(this, _TestopsPlugin_ci, detect(), "f");
|
|
30
31
|
if ([accessToken, endpoint, projectId].every(Boolean)) {
|
|
31
|
-
__classPrivateFieldSet(this,
|
|
32
|
+
__classPrivateFieldSet(this, _TestopsPlugin_client, new TestOpsClient({
|
|
32
33
|
baseUrl: endpoint,
|
|
33
34
|
accessToken,
|
|
34
35
|
projectId,
|
|
35
36
|
}), "f");
|
|
36
|
-
__classPrivateFieldSet(this,
|
|
37
|
-
__classPrivateFieldSet(this,
|
|
37
|
+
__classPrivateFieldSet(this, _TestopsPlugin_launchName, launchName, "f");
|
|
38
|
+
__classPrivateFieldSet(this, _TestopsPlugin_launchTags, launchTags, "f");
|
|
38
39
|
}
|
|
39
40
|
if (!accessToken) {
|
|
40
41
|
console.warn("TestOps access token is missing. Please provide a valid access token in the plugin options.");
|
|
@@ -47,64 +48,56 @@ export class TestopsUploaderPlugin {
|
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
get ciMode() {
|
|
50
|
-
return __classPrivateFieldGet(this,
|
|
51
|
+
return __classPrivateFieldGet(this, _TestopsPlugin_ci, "f") && __classPrivateFieldGet(this, _TestopsPlugin_ci, "f").type !== "local";
|
|
51
52
|
}
|
|
52
53
|
async start(_context, store) {
|
|
53
|
-
if (!__classPrivateFieldGet(this,
|
|
54
|
+
if (!__classPrivateFieldGet(this, _TestopsPlugin_client, "f")) {
|
|
54
55
|
return;
|
|
55
56
|
}
|
|
56
|
-
await __classPrivateFieldGet(this,
|
|
57
|
-
await __classPrivateFieldGet(this,
|
|
58
|
-
console.info(`TestOps launch has been created: ${__classPrivateFieldGet(this,
|
|
57
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_instances, "m", _TestopsPlugin_startUpload).call(this);
|
|
58
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_instances, "m", _TestopsPlugin_upload).call(this, store, { issueNewToken: false });
|
|
59
|
+
console.info(`TestOps launch has been created: ${__classPrivateFieldGet(this, _TestopsPlugin_client, "f").launchUrl}`);
|
|
59
60
|
}
|
|
60
61
|
async update(_context, store) {
|
|
61
|
-
if (!__classPrivateFieldGet(this,
|
|
62
|
+
if (!__classPrivateFieldGet(this, _TestopsPlugin_client, "f")) {
|
|
62
63
|
return;
|
|
63
64
|
}
|
|
64
|
-
await __classPrivateFieldGet(this,
|
|
65
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_instances, "m", _TestopsPlugin_upload).call(this, store);
|
|
65
66
|
}
|
|
66
67
|
async done(_context, store) {
|
|
67
|
-
if (!__classPrivateFieldGet(this,
|
|
68
|
+
if (!__classPrivateFieldGet(this, _TestopsPlugin_client, "f")) {
|
|
68
69
|
return;
|
|
69
70
|
}
|
|
70
71
|
const allTrs = (await store.allTestResults()).filter((tr) => this.options.filter ? this.options.filter(tr) : true);
|
|
71
72
|
const worstStatus = getWorstStatus(allTrs.map(({ status }) => status));
|
|
72
|
-
await __classPrivateFieldGet(this,
|
|
73
|
-
await __classPrivateFieldGet(this,
|
|
73
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_instances, "m", _TestopsPlugin_upload).call(this, store);
|
|
74
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_instances, "m", _TestopsPlugin_stopUpload).call(this, worstStatus || "unknown");
|
|
74
75
|
}
|
|
75
76
|
async info(context, store) {
|
|
76
|
-
if (!__classPrivateFieldGet(this,
|
|
77
|
+
if (!__classPrivateFieldGet(this, _TestopsPlugin_client, "f")?.launchUrl) {
|
|
77
78
|
return undefined;
|
|
78
79
|
}
|
|
79
|
-
const allTrs = (await store.allTestResults()).filter((tr) => this.options.filter ? this.options.filter(tr) : true);
|
|
80
|
-
const newTrs = await store.allNewTestResults();
|
|
81
|
-
const retryTrs = allTrs.filter((tr) => !!tr?.retries?.length);
|
|
82
|
-
const flakyTrs = allTrs.filter((tr) => !!tr?.flaky);
|
|
83
|
-
const duration = allTrs.reduce((acc, { duration: trDuration = 0 }) => acc + trDuration, 0);
|
|
84
|
-
const worstStatus = getWorstStatus(allTrs.map(({ status }) => status));
|
|
85
|
-
const createdAt = allTrs.reduce((acc, { stop }) => Math.max(acc, stop || 0), 0);
|
|
86
80
|
return {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
},
|
|
81
|
+
...(await createPluginSummary({
|
|
82
|
+
name: __classPrivateFieldGet(this, _TestopsPlugin_launchName, "f"),
|
|
83
|
+
plugin: "TestOps",
|
|
84
|
+
meta: {
|
|
85
|
+
reportId: context.reportUuid,
|
|
86
|
+
},
|
|
87
|
+
filter: this.options.filter,
|
|
88
|
+
history: context.history,
|
|
89
|
+
ci: context.ci,
|
|
90
|
+
store,
|
|
91
|
+
})),
|
|
92
|
+
remoteHref: __classPrivateFieldGet(this, _TestopsPlugin_client, "f").launchUrl,
|
|
100
93
|
};
|
|
101
94
|
}
|
|
102
95
|
}
|
|
103
|
-
|
|
96
|
+
_TestopsPlugin_ci = new WeakMap(), _TestopsPlugin_client = new WeakMap(), _TestopsPlugin_launchName = new WeakMap(), _TestopsPlugin_launchTags = new WeakMap(), _TestopsPlugin_uploadedTestResultsIds = new WeakMap(), _TestopsPlugin_instances = new WeakSet(), _TestopsPlugin_upload = async function _TestopsPlugin_upload(store, options) {
|
|
104
97
|
const { issueNewToken = true } = options ?? {};
|
|
105
98
|
const allTrs = await store.allTestResults();
|
|
106
99
|
const trsToUpload = allTrs.filter((tr) => {
|
|
107
|
-
const uploaded = __classPrivateFieldGet(this,
|
|
100
|
+
const uploaded = __classPrivateFieldGet(this, _TestopsPlugin_uploadedTestResultsIds, "f").includes(tr.id);
|
|
108
101
|
if (this.options.filter) {
|
|
109
102
|
return this.options.filter(tr) && !uploaded;
|
|
110
103
|
}
|
|
@@ -120,11 +113,17 @@ _TestopsUploaderPlugin_ci = new WeakMap(), _TestopsUploaderPlugin_client = new W
|
|
|
120
113
|
};
|
|
121
114
|
});
|
|
122
115
|
if (issueNewToken) {
|
|
123
|
-
await __classPrivateFieldGet(this,
|
|
116
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_client, "f").issueOauthToken();
|
|
124
117
|
}
|
|
125
|
-
|
|
126
|
-
|
|
118
|
+
const progressBar = new ProgressBar("Uploading test results [:bar] :current/:total", {
|
|
119
|
+
total: allTrsWithAttachments.length,
|
|
120
|
+
width: 20,
|
|
121
|
+
});
|
|
122
|
+
progressBar.render();
|
|
123
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_client, "f").createSession(env);
|
|
124
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_client, "f").uploadTestResults({
|
|
127
125
|
trs: allTrsWithAttachments,
|
|
126
|
+
onProgress: () => progressBar.tick(),
|
|
128
127
|
attachmentsResolver: async (tr) => {
|
|
129
128
|
const attachments = await store.attachmentsByTrId(tr.id);
|
|
130
129
|
return await Promise.all(attachments.map(async (attachment) => {
|
|
@@ -145,20 +144,20 @@ _TestopsUploaderPlugin_ci = new WeakMap(), _TestopsUploaderPlugin_client = new W
|
|
|
145
144
|
}));
|
|
146
145
|
},
|
|
147
146
|
});
|
|
148
|
-
__classPrivateFieldGet(this,
|
|
149
|
-
},
|
|
150
|
-
if (!__classPrivateFieldGet(this,
|
|
147
|
+
__classPrivateFieldGet(this, _TestopsPlugin_uploadedTestResultsIds, "f").push(...allTrsWithAttachments.map((tr) => tr.id));
|
|
148
|
+
}, _TestopsPlugin_startUpload = async function _TestopsPlugin_startUpload() {
|
|
149
|
+
if (!__classPrivateFieldGet(this, _TestopsPlugin_client, "f")) {
|
|
151
150
|
return;
|
|
152
151
|
}
|
|
153
|
-
await __classPrivateFieldGet(this,
|
|
154
|
-
await __classPrivateFieldGet(this,
|
|
152
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_client, "f").issueOauthToken();
|
|
153
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_client, "f").createLaunch(__classPrivateFieldGet(this, _TestopsPlugin_launchName, "f"), __classPrivateFieldGet(this, _TestopsPlugin_launchTags, "f"));
|
|
155
154
|
if (!this.ciMode) {
|
|
156
155
|
return;
|
|
157
156
|
}
|
|
158
|
-
await __classPrivateFieldGet(this,
|
|
159
|
-
},
|
|
160
|
-
if (!this.ciMode || !__classPrivateFieldGet(this,
|
|
157
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_client, "f").startUpload(__classPrivateFieldGet(this, _TestopsPlugin_ci, "f"));
|
|
158
|
+
}, _TestopsPlugin_stopUpload = async function _TestopsPlugin_stopUpload(status) {
|
|
159
|
+
if (!this.ciMode || !__classPrivateFieldGet(this, _TestopsPlugin_client, "f")) {
|
|
161
160
|
return;
|
|
162
161
|
}
|
|
163
|
-
await __classPrivateFieldGet(this,
|
|
162
|
+
await __classPrivateFieldGet(this, _TestopsPlugin_client, "f").stopUpload(__classPrivateFieldGet(this, _TestopsPlugin_ci, "f"), status);
|
|
164
163
|
};
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { TestStepResult } from "@allurereport/core-api";
|
|
2
|
-
import type {
|
|
2
|
+
import type { TestopsPluginOptions } from "./model.js";
|
|
3
3
|
export declare const unwrapStepsAttachments: (steps: TestStepResult[]) => TestStepResult[];
|
|
4
|
-
export declare const resolvePluginOptions: (options:
|
|
4
|
+
export declare const resolvePluginOptions: (options: TestopsPluginOptions) => Omit<TestopsPluginOptions, "filter">;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@allurereport/plugin-testops",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.1",
|
|
4
4
|
"description": "Allure Plugin TestOps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"allure",
|
|
@@ -32,13 +32,15 @@
|
|
|
32
32
|
"test": "rimraf ./out && vitest run"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@allurereport/ci": "3.
|
|
36
|
-
"@allurereport/core-api": "3.
|
|
37
|
-
"@allurereport/plugin-api": "3.
|
|
38
|
-
"@allurereport/reader-api": "3.
|
|
35
|
+
"@allurereport/ci": "3.3.1",
|
|
36
|
+
"@allurereport/core-api": "3.3.1",
|
|
37
|
+
"@allurereport/plugin-api": "3.3.1",
|
|
38
|
+
"@allurereport/reader-api": "3.3.1",
|
|
39
39
|
"axios": "^1.13.5",
|
|
40
40
|
"form-data": "^4.0.5",
|
|
41
|
-
"lodash.chunk": "^4.2.0"
|
|
41
|
+
"lodash.chunk": "^4.2.0",
|
|
42
|
+
"p-limit": "^7.3.0",
|
|
43
|
+
"progress": "^2.0.3"
|
|
42
44
|
},
|
|
43
45
|
"devDependencies": {
|
|
44
46
|
"@stylistic/eslint-plugin": "^2.6.1",
|
|
@@ -47,6 +49,7 @@
|
|
|
47
49
|
"@types/form-data": "^2.5.2",
|
|
48
50
|
"@types/lodash.chunk": "^4",
|
|
49
51
|
"@types/node": "^20.17.9",
|
|
52
|
+
"@types/progress": "^2",
|
|
50
53
|
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
51
54
|
"@typescript-eslint/parser": "^8.0.0",
|
|
52
55
|
"@vitest/runner": "^2.1.9",
|