@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 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 (tr) => {
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 { TestopsUploaderPlugin as default } from "./plugin.js";
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 { TestopsUploaderPlugin as default } from "./plugin.js";
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 TestopsUploaderPluginOptions = TestopsUploaderOptions;
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 { TestopsUploaderPluginOptions } from "./model.js";
3
- export declare class TestopsUploaderPlugin implements Plugin {
2
+ import type { TestopsPluginOptions } from "./model.js";
3
+ export declare class TestopsPlugin implements Plugin {
4
4
  #private;
5
- readonly options: TestopsUploaderPluginOptions;
6
- constructor(options: TestopsUploaderPluginOptions);
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 _TestopsUploaderPlugin_instances, _TestopsUploaderPlugin_ci, _TestopsUploaderPlugin_client, _TestopsUploaderPlugin_launchName, _TestopsUploaderPlugin_launchTags, _TestopsUploaderPlugin_uploadedTestResultsIds, _TestopsUploaderPlugin_upload, _TestopsUploaderPlugin_startUpload, _TestopsUploaderPlugin_stopUpload;
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 { convertToSummaryTestResult, } from "@allurereport/plugin-api";
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 TestopsUploaderPlugin {
20
+ export class TestopsPlugin {
20
21
  constructor(options) {
21
- _TestopsUploaderPlugin_instances.add(this);
22
+ _TestopsPlugin_instances.add(this);
22
23
  this.options = options;
23
- _TestopsUploaderPlugin_ci.set(this, void 0);
24
- _TestopsUploaderPlugin_client.set(this, void 0);
25
- _TestopsUploaderPlugin_launchName.set(this, "");
26
- _TestopsUploaderPlugin_launchTags.set(this, []);
27
- _TestopsUploaderPlugin_uploadedTestResultsIds.set(this, []);
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, _TestopsUploaderPlugin_ci, detect(), "f");
30
+ __classPrivateFieldSet(this, _TestopsPlugin_ci, detect(), "f");
30
31
  if ([accessToken, endpoint, projectId].every(Boolean)) {
31
- __classPrivateFieldSet(this, _TestopsUploaderPlugin_client, new TestOpsClient({
32
+ __classPrivateFieldSet(this, _TestopsPlugin_client, new TestOpsClient({
32
33
  baseUrl: endpoint,
33
34
  accessToken,
34
35
  projectId,
35
36
  }), "f");
36
- __classPrivateFieldSet(this, _TestopsUploaderPlugin_launchName, launchName, "f");
37
- __classPrivateFieldSet(this, _TestopsUploaderPlugin_launchTags, launchTags, "f");
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, _TestopsUploaderPlugin_ci, "f") && __classPrivateFieldGet(this, _TestopsUploaderPlugin_ci, "f").type !== "local";
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, _TestopsUploaderPlugin_client, "f")) {
54
+ if (!__classPrivateFieldGet(this, _TestopsPlugin_client, "f")) {
54
55
  return;
55
56
  }
56
- await __classPrivateFieldGet(this, _TestopsUploaderPlugin_instances, "m", _TestopsUploaderPlugin_startUpload).call(this);
57
- await __classPrivateFieldGet(this, _TestopsUploaderPlugin_instances, "m", _TestopsUploaderPlugin_upload).call(this, store, { issueNewToken: false });
58
- console.info(`TestOps launch has been created: ${__classPrivateFieldGet(this, _TestopsUploaderPlugin_client, "f").launchUrl}`);
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, _TestopsUploaderPlugin_client, "f")) {
62
+ if (!__classPrivateFieldGet(this, _TestopsPlugin_client, "f")) {
62
63
  return;
63
64
  }
64
- await __classPrivateFieldGet(this, _TestopsUploaderPlugin_instances, "m", _TestopsUploaderPlugin_upload).call(this, store);
65
+ await __classPrivateFieldGet(this, _TestopsPlugin_instances, "m", _TestopsPlugin_upload).call(this, store);
65
66
  }
66
67
  async done(_context, store) {
67
- if (!__classPrivateFieldGet(this, _TestopsUploaderPlugin_client, "f")) {
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, _TestopsUploaderPlugin_instances, "m", _TestopsUploaderPlugin_upload).call(this, store);
73
- await __classPrivateFieldGet(this, _TestopsUploaderPlugin_instances, "m", _TestopsUploaderPlugin_stopUpload).call(this, worstStatus || "unknown");
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, _TestopsUploaderPlugin_client, "f")?.launchUrl) {
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
- name: __classPrivateFieldGet(this, _TestopsUploaderPlugin_launchName, "f"),
88
- remoteHref: __classPrivateFieldGet(this, _TestopsUploaderPlugin_client, "f").launchUrl,
89
- stats: await store.testsStatistic(this.options.filter),
90
- status: worstStatus ?? "passed",
91
- duration,
92
- createdAt,
93
- plugin: "Awesome",
94
- newTests: newTrs.map(convertToSummaryTestResult),
95
- flakyTests: flakyTrs.map(convertToSummaryTestResult),
96
- retryTests: retryTrs.map(convertToSummaryTestResult),
97
- meta: {
98
- reportId: context.reportUuid,
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
- _TestopsUploaderPlugin_ci = new WeakMap(), _TestopsUploaderPlugin_client = new WeakMap(), _TestopsUploaderPlugin_launchName = new WeakMap(), _TestopsUploaderPlugin_launchTags = new WeakMap(), _TestopsUploaderPlugin_uploadedTestResultsIds = new WeakMap(), _TestopsUploaderPlugin_instances = new WeakSet(), _TestopsUploaderPlugin_upload = async function _TestopsUploaderPlugin_upload(store, options) {
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, _TestopsUploaderPlugin_uploadedTestResultsIds, "f").includes(tr.id);
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, _TestopsUploaderPlugin_client, "f").issueOauthToken();
116
+ await __classPrivateFieldGet(this, _TestopsPlugin_client, "f").issueOauthToken();
124
117
  }
125
- await __classPrivateFieldGet(this, _TestopsUploaderPlugin_client, "f").createSession(env);
126
- await __classPrivateFieldGet(this, _TestopsUploaderPlugin_client, "f").uploadTestResults({
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, _TestopsUploaderPlugin_uploadedTestResultsIds, "f").push(...allTrsWithAttachments.map((tr) => tr.id));
149
- }, _TestopsUploaderPlugin_startUpload = async function _TestopsUploaderPlugin_startUpload() {
150
- if (!__classPrivateFieldGet(this, _TestopsUploaderPlugin_client, "f")) {
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, _TestopsUploaderPlugin_client, "f").issueOauthToken();
154
- await __classPrivateFieldGet(this, _TestopsUploaderPlugin_client, "f").createLaunch(__classPrivateFieldGet(this, _TestopsUploaderPlugin_launchName, "f"), __classPrivateFieldGet(this, _TestopsUploaderPlugin_launchTags, "f"));
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, _TestopsUploaderPlugin_client, "f").startUpload(__classPrivateFieldGet(this, _TestopsUploaderPlugin_ci, "f"));
159
- }, _TestopsUploaderPlugin_stopUpload = async function _TestopsUploaderPlugin_stopUpload(status) {
160
- if (!this.ciMode || !__classPrivateFieldGet(this, _TestopsUploaderPlugin_client, "f")) {
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, _TestopsUploaderPlugin_client, "f").stopUpload(__classPrivateFieldGet(this, _TestopsUploaderPlugin_ci, "f"), status);
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 { TestopsUploaderPluginOptions } from "./model.js";
2
+ import type { TestopsPluginOptions } from "./model.js";
3
3
  export declare const unwrapStepsAttachments: (steps: TestStepResult[]) => TestStepResult[];
4
- export declare const resolvePluginOptions: (options: TestopsUploaderPluginOptions) => Omit<TestopsUploaderPluginOptions, "filter">;
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.2.0",
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.2.0",
36
- "@allurereport/core-api": "3.2.0",
37
- "@allurereport/plugin-api": "3.2.0",
38
- "@allurereport/reader-api": "3.2.0",
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",