diff --git a/.github/workflows/CI-pipeline.yml b/.github/workflows/CI-pipeline.yml index a4a19bd..9cb6ec1 100644 --- a/.github/workflows/CI-pipeline.yml +++ b/.github/workflows/CI-pipeline.yml @@ -37,5 +37,5 @@ jobs: run: npm install - name: Run lint run: npm run lint - - name: Check coverage + - name: Run tests and check coverage run: npm run test:coverage diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9c0803c..da6cb95 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -31,9 +31,7 @@ jobs: run: npm install - name: Run lint run: npm run lint - - name: Run tests - run: npm test - - name: Check coverage + - name: Run tests and check coverage run: npm run test:coverage publish-to-npm-and-gpr: diff --git a/CHANGELOG.md b/CHANGELOG.md index e2be652..d878e09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +### Changed +- **Breaking change** Drop support of Node.js 12. The version [5.1.0](https://github.com/reportportal/agent-js-jasmine/releases/tag/v5.1.0) is the latest that supports it. +- The agent now supports reporting the time for launches, test items and logs with microsecond precision in the ISO string format. +For logs, microsecond precision is available on the UI from ReportPortal [version 24.2](https://reportportal.io/docs/releases/Version24.2/#:~:text=import%20plugin.-,Microseconds,-added%20to%20timestamps). +- `@reportportal/client-javascript` bumped to version `5.3.0`. +### Security +- Updated versions of vulnerable packages (micromatch). ## [5.1.0] - 2024-07-16 ### Added diff --git a/README.md b/README.md index 7786e6a..9d4eea0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Agent to integrate Jasmine with ReportPortal. * More about [Jasmine](https://jasmine.github.io/) -* More about [ReportPortal](http://reportportal.io/) +* More about [ReportPortal](https://reportportal.io/) ## Installation @@ -43,7 +43,7 @@ The full list of available options presented below. | project | Required | | The name of the project in which the launches will be created. | | attributes | Optional | [] | Launch attributes. | | description | Optional | '' | Launch description. | -| rerun | Optional | false | Enable [rerun](https://reportportal.io/docs/dev-guides/RerunDevelopersGuide) | +| rerun | Optional | false | Enable [rerun](https://reportportal.io/docs/developers-guides/RerunDevelopersGuide/) | | rerunOf | Optional | Not set | UUID of launch you want to rerun. If not specified, ReportPortal will update the latest launch with the same name | | mode | Optional | 'DEFAULT' | Results will be submitted to Launches page
*'DEBUG'* - Results will be submitted to Debug page. | | skippedIssue | Optional | true | ReportPortal provides feature to mark skipped tests as not 'To Investigate'.
Option could be equal boolean values:
*true* - skipped tests considered as issues and will be marked as 'To Investigate' on ReportPortal.
*false* - skipped tests will not be marked as 'To Investigate' on application. | diff --git a/VERSION b/VERSION index 831446c..99a2954 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.1.0 +5.1.1-SNAPSHOT diff --git a/__mocks__/@reportportal/client-javascript.js b/__mocks__/@reportportal/client-javascript.js new file mode 100644 index 0000000..145ed89 --- /dev/null +++ b/__mocks__/@reportportal/client-javascript.js @@ -0,0 +1,54 @@ +/* + * Copyright 2024 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +class RPClientMock { + constructor(config) { + this.config = config; + + this.startLaunch = jest.fn().mockReturnValue({ + promise: Promise.resolve('ok'), + tempId: 'tempLaunchId', + }); + + this.finishLaunch = jest.fn().mockReturnValue({ + promise: Promise.resolve('ok'), + }); + + this.startTestItem = jest.fn().mockReturnValue({ + promise: Promise.resolve('ok'), + tempId: 'testItemId', + }); + + this.finishTestItem = jest.fn().mockReturnValue({ + promise: Promise.resolve('ok'), + }); + + this.sendLog = jest.fn().mockReturnValue({ + promise: Promise.resolve('ok'), + }); + + this.getPromiseFinishAllItems = jest.fn().mockResolvedValue({ + promise: Promise.resolve('ok'), + }); + + this.checkConnect = jest.fn().mockReturnValue({ + promise: Promise.resolve('ok'), + }); + } +} + +module.exports = RPClientMock; diff --git a/__tests__/jasmine-reportportal-reporter.spec.js b/__tests__/jasmine-reportportal-reporter.spec.js index b0a1d2c..d55338a 100644 --- a/__tests__/jasmine-reportportal-reporter.spec.js +++ b/__tests__/jasmine-reportportal-reporter.spec.js @@ -13,26 +13,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +const helpers = require('@reportportal/client-javascript/lib/helpers'); +const Reporter = require('../lib/jasmine-reportportal-reporter'); +const SpecificUtils = require('../lib/specificUtils'); -describe('jasmine Report Portal reporter', () => { - const Reporter = require('../lib/jasmine-reportportal-reporter'); - const SpecificUtils = require('../lib/specificUtils'); +const mockedDate = '2024-09-23T12:20:59.392987Z'; +describe('jasmine Report Portal reporter', () => { let reporter; const tempLaunchId = 'ewrf35432r'; let promise; - let baseTime; beforeEach(() => { - jest.useFakeTimers(); + jest.spyOn(helpers, 'now').mockReturnValue(mockedDate); + // TODO: should be replaced with unregistering specific listeners only + process.removeAllListeners(); const client = { startTestItem() {}, finishTestItem() {}, sendLog() {}, }; const onSetLaunchStatus = function () {}; - baseTime = new Date(2020, 4, 8); - jest.setSystemTime(baseTime); reporter = new Reporter( { client, @@ -363,7 +364,7 @@ describe('jasmine Report Portal reporter', () => { level: 'level', file: null, message: 'message', - time: baseTime.valueOf(), + time: mockedDate, }, ], }; @@ -381,13 +382,13 @@ describe('jasmine Report Portal reporter', () => { level: 'level', file: null, message: 'message', - time: baseTime.valueOf(), + time: mockedDate, }, { level: 'level1', file: null, message: 'message1', - time: baseTime.valueOf(), + time: mockedDate, }, ], }; @@ -448,7 +449,7 @@ describe('jasmine Report Portal reporter', () => { { message: 'message', level: 'level', - time: baseTime.valueOf(), + time: mockedDate, }, null ); @@ -465,7 +466,7 @@ describe('jasmine Report Portal reporter', () => { { message: '', level: 'level', - time: baseTime.valueOf(), + time: mockedDate, }, undefined ); @@ -604,7 +605,7 @@ describe('jasmine Report Portal reporter', () => { description: 'text description', testCaseId: 'testCaseId', codeRef: 'codeRef', - startTime: baseTime.valueOf(), + startTime: mockedDate, }, tempLaunchId, null @@ -653,7 +654,7 @@ describe('jasmine Report Portal reporter', () => { description: 'test description', name: 'test description', codeRef: 'codeRef', - startTime: baseTime.valueOf(), + startTime: mockedDate, }, tempLaunchId, null @@ -674,7 +675,7 @@ describe('jasmine Report Portal reporter', () => { promise.then(() => { expect(reporter.setParentInfo).toHaveBeenCalledWith({ tempId: '3452', - startTime: baseTime.valueOf(), + startTime: mockedDate, }); done(); @@ -759,14 +760,14 @@ describe('jasmine Report Portal reporter', () => { tempId: '3452', promise: Promise.resolve(), }); - jest.spyOn(reporter, 'getHookStartTime').mockReturnValue(baseTime.valueOf()); + jest.spyOn(reporter, 'getHookStartTime').mockReturnValue(mockedDate); reporter.hookStarted('beforeAll'); expect(reporter.client.startTestItem).toHaveBeenCalledWith( { type: 'BEFORE_SUITE', - startTime: baseTime.valueOf(), + startTime: mockedDate, name: 'beforeAll', }, tempLaunchId, @@ -787,7 +788,7 @@ describe('jasmine Report Portal reporter', () => { expect(reporter.client.finishTestItem).toHaveBeenCalledWith('3452', { status: 'passed', - endTime: baseTime.valueOf(), + endTime: mockedDate, }); expect(reporter.itemStartTime).toEqual(null); }); @@ -802,7 +803,7 @@ describe('jasmine Report Portal reporter', () => { expect(reporter.client.finishTestItem).toHaveBeenCalledWith('3452', { status: 'failed', - endTime: baseTime.valueOf(), + endTime: mockedDate, }); }); @@ -879,7 +880,7 @@ describe('jasmine Report Portal reporter', () => { { message: 'message: error\nstackTrace: stack', level: 'ERROR', - time: baseTime.valueOf(), + time: mockedDate, }, null ); @@ -978,7 +979,7 @@ describe('jasmine Report Portal reporter', () => { { message: 'message: error\nstackTrace: stack', level: 'ERROR', - time: baseTime.valueOf(), + time: mockedDate, }, null ); diff --git a/__tests__/reportportal-agent.spec.js b/__tests__/reportportal-agent.spec.js index 8c45204..0f4c06d 100644 --- a/__tests__/reportportal-agent.spec.js +++ b/__tests__/reportportal-agent.spec.js @@ -20,7 +20,7 @@ const SpecificUtils = require('../lib/specificUtils'); const reporterOptions = { apiKey: 'reportportalApiKey', - endpoint: 'endpoint', + endpoint: 'http://reportportal.example.com/api/v1', project: 'projectName', launch: 'launcherName', description: 'description', @@ -44,10 +44,13 @@ describe('Report Portal agent', () => { let agent; beforeAll(() => { - jest.clearAllMocks(); // Clear mocks before initialization agent = new ReportportalAgent(options); }); + beforeEach(() => { + jest.clearAllMocks(); // Clear mocks before initialization + }); + it('should be properly initialized', () => { expect(agent.tempLaunchId).toBeDefined(); expect(agent.client).toBeDefined(); diff --git a/__tests__/specificUtils.spec.js b/__tests__/specificUtils.spec.js index a2b20a3..96b8517 100644 --- a/__tests__/specificUtils.spec.js +++ b/__tests__/specificUtils.spec.js @@ -348,5 +348,33 @@ describe('Specific Utils', () => { expect(escapeString).toBe('\\_test\\*'); }); }); + + describe('convertIsoStringToMicroseconds', () => { + it('converts ISO string with microseconds correctly', () => { + const isoString = '2024-09-20T14:32:35.304456Z'; + const expectedMicroseconds = 1726842755304456; + expect(SpecificUtils.convertIsoStringToMicroseconds(isoString)).toBe(expectedMicroseconds); + }); + + it('handles microseconds accurately', () => { + const isoString = '2021-03-15T12:00:00.000001Z'; + const expectedMicroseconds = 1615809600000001; + expect(SpecificUtils.convertIsoStringToMicroseconds(isoString)).toBe(expectedMicroseconds); + }); + + it('returns correct microseconds at epoch start', () => { + const isoString = '1970-01-01T00:00:00.000001Z'; + const expectedMicroseconds = 1; + expect(SpecificUtils.convertIsoStringToMicroseconds(isoString)).toBe(expectedMicroseconds); + }); + }); + + describe('getBeforeHookStartTime', () => { + it('should return the start time for the hook as reduced time from test item start by 1 millisecond', () => { + const itemStartTime = '2024-09-20T14:32:35.304456Z'; + const expectedHookStartTime = '2024-09-20T14:32:35.303456Z'; + expect(SpecificUtils.getBeforeHookStartTime(itemStartTime)).toBe(expectedHookStartTime); + }); + }); }); }); diff --git a/lib/jasmine-reportportal-reporter.js b/lib/jasmine-reportportal-reporter.js index 698628a..f4f92fb 100644 --- a/lib/jasmine-reportportal-reporter.js +++ b/lib/jasmine-reportportal-reporter.js @@ -16,6 +16,7 @@ const { EVENTS } = require('@reportportal/client-javascript/lib/constants/events'); const { RP_STATUSES } = require('@reportportal/client-javascript/lib/constants/statuses'); +const clientHelpers = require('@reportportal/client-javascript/lib/helpers'); const SpecificUtils = require('./specificUtils'); const { entityType, hookTypes, hookTypesMap } = require('./constants/itemTypes'); const LOG_LEVELS = require('./constants/logLevels'); @@ -84,7 +85,7 @@ class ReportportalReporter { } getTime() { - return new Date().valueOf(); + return clientHelpers.now(); } addAttributes(attr) { @@ -282,6 +283,7 @@ class ReportportalReporter { }); } + // TODO: update getHookStartTime(hookType, parent) { if (hookType === entityType.BEFORE_METHOD || hookType === entityType.BEFORE_SUITE) { return Math.max(parent && parent.startTime, this.itemStartTime - 1); diff --git a/lib/specificUtils.js b/lib/specificUtils.js index 0baf970..1cbca28 100644 --- a/lib/specificUtils.js +++ b/lib/specificUtils.js @@ -16,6 +16,7 @@ const path = require('path'); const process = require('process'); +const clientHelpers = require('@reportportal/client-javascript/lib/helpers'); const { RP_STATUSES } = require('@reportportal/client-javascript/lib/constants/statuses'); const pjson = require('./../package.json'); const LOG_LEVELS = require('./constants/logLevels'); @@ -23,167 +24,201 @@ const LOG_LEVELS = require('./constants/logLevels'); const PJSON_VERSION = pjson.version; const PJSON_NAME = pjson.name; -const SpecificUtils = { - takeScreenshot(fileName) { - let promiseResolve; - const promise = new Promise((resolve, reject) => { - promiseResolve = resolve; - }); - if (global.browser) { - global.browser.takeScreenshot().then( - (png) => { - promiseResolve({ - name: fileName, - type: 'image/png', - content: png, - }); - }, - (error) => { - console.dir(error); - promiseResolve(null); - } - ); - } else { - promiseResolve(null); - } - return promise; - }, - - escapeMarkdown(string) { - return string.replace(/_/gm, '\\_').replace(/\*/gm, '\\*'); - }, - - getAllLogs(spec, fileObject, logs) { - const failures = []; - spec.failedExpectations.forEach((failure) => { - failures.push(`message: ${this.escapeMarkdown(failure.message)}`); - failures.push(`stackTrace: ${this.escapeMarkdown(failure.stack)}`); - }); - - if (failures.length) { - const message = failures.join('\n'); - - return [{ level: LOG_LEVELS.ERROR, message, file: fileObject }, ...logs]; - } - - return logs; - }, - - getLaunchObj(conf) { - const systemAttr = this.getSystemAttributes(conf.skippedIssue); - const launchObj = Object.assign( - { - attributes: conf.attributes ? [...conf.attributes, ...systemAttr] : systemAttr, - description: conf.description, +function takeScreenshot(fileName) { + let promiseResolve; + const promise = new Promise((resolve, reject) => { + promiseResolve = resolve; + }); + if (global.browser) { + global.browser.takeScreenshot().then( + (png) => { + promiseResolve({ + name: fileName, + type: 'image/png', + content: png, + }); }, - conf.id && { id: conf.id }, - conf.rerun && { rerun: conf.rerun }, - conf.rerunOf && { rerunOf: conf.rerunOf }, - conf.mode && { mode: conf.mode } + (error) => { + console.dir(error); + promiseResolve(null); + } ); + } else { + promiseResolve(null); + } + return promise; +} + +function escapeMarkdown(string) { + return string.replace(/_/gm, '\\_').replace(/\*/gm, '\\*'); +} + +function getAllLogs(spec, fileObject, logs) { + const failures = []; + spec.failedExpectations.forEach((failure) => { + failures.push(`message: ${this.escapeMarkdown(failure.message)}`); + failures.push(`stackTrace: ${this.escapeMarkdown(failure.stack)}`); + }); + + if (failures.length) { + const message = failures.join('\n'); + + return [{ level: LOG_LEVELS.ERROR, message, file: fileObject }, ...logs]; + } + + return logs; +} + +function getLaunchObj(conf) { + const systemAttr = this.getSystemAttributes(conf.skippedIssue); + const launchObj = Object.assign( + { + attributes: conf.attributes ? [...conf.attributes, ...systemAttr] : systemAttr, + description: conf.description, + }, + conf.id && { id: conf.id }, + conf.rerun && { rerun: conf.rerun }, + conf.rerunOf && { rerunOf: conf.rerunOf }, + conf.mode && { mode: conf.mode } + ); + + return launchObj; +} + +function getSystemAttributes(skippedIssue) { + const systemAttr = [ + { + key: 'agent', + value: `${PJSON_NAME}|${PJSON_VERSION}`, + system: true, + }, + ]; + + if (skippedIssue === false) { + const skippedIssueAttribute = { + key: 'skippedIssue', + value: 'false', + system: true, + }; - return launchObj; - }, + systemAttr.push(skippedIssueAttribute); + } - getSystemAttributes(skippedIssue) { - const systemAttr = [ - { - key: 'agent', - value: `${PJSON_NAME}|${PJSON_VERSION}`, - system: true, - }, - ]; + return systemAttr; +} - if (skippedIssue === false) { - const skippedIssueAttribute = { - key: 'skippedIssue', - value: 'false', - system: true, - }; +function getAgentInfo() { + return { + version: PJSON_VERSION, + name: PJSON_NAME, + }; +} - systemAttr.push(skippedIssueAttribute); - } +function getCodeRef(currentSpecIndex, fullTestName) { + if (!global.browser) { + return Promise.resolve(null); + } - return systemAttr; - }, - - getAgentInfo() { - return { - version: PJSON_VERSION, - name: PJSON_NAME, - }; - }, - - getCodeRef(currentSpecIndex, fullTestName) { - if (!global.browser) { - return Promise.resolve(null); - } - - return global.browser.getProcessedConfig().then((config) => { - const currentTestFilePath = config.specs[currentSpecIndex].replace( - new RegExp('\\\\', 'g'), - '/' - ); - const processCwd = process.cwd().replace(/\\/g, '/'); - - const testFileDir = path.parse( - path.normalize(path.relative(processCwd, currentTestFilePath)) - ).dir; - - const separator = testFileDir ? '/' : ''; - const testFile = path.parse(currentTestFilePath); - - return `${testFileDir}${separator}${testFile.base}/${fullTestName}`; - }); - }, - - getFullTestName(test) { - if (test.description === test.fullName) { - return test.description; - } - - const parentName = test.fullName.replace(test.description, '').slice(0, -1); - - return `${parentName}/${test.description}`; - }, - - isPromise(obj) { - return ( - !!obj && - (typeof obj === 'object' || typeof obj === 'function') && - typeof obj.then === 'function' + return global.browser.getProcessedConfig().then((config) => { + const currentTestFilePath = config.specs[currentSpecIndex].replace( + new RegExp('\\\\', 'g'), + '/' ); - }, + const processCwd = process.cwd().replace(/\\/g, '/'); + + const testFileDir = path.parse( + path.normalize(path.relative(processCwd, currentTestFilePath)) + ).dir; + + const separator = testFileDir ? '/' : ''; + const testFile = path.parse(currentTestFilePath); + + return `${testFileDir}${separator}${testFile.base}/${fullTestName}`; + }); +} + +function getFullTestName(test) { + if (test.description === test.fullName) { + return test.description; + } - isHookShouldBeCalled(action) { - return !(this.isPromise(action) && action !== undefined && action.valueOf() === undefined); - }, + const parentName = test.fullName.replace(test.description, '').slice(0, -1); - makeHooksWrapper(wrapped, funcStart, funcFinish) { - return function (action, timeout) { - wrapped((done) => { - let isFuncBeCalled = true; + return `${parentName}/${test.description}`; +} - try { - isFuncBeCalled = SpecificUtils.isHookShouldBeCalled(action(done)); +function isPromise(obj) { + return ( + !!obj && + (typeof obj === 'object' || typeof obj === 'function') && + typeof obj.then === 'function' + ); +} - if (isFuncBeCalled) { - funcStart(); - funcFinish(); - } +function isHookShouldBeCalled(action) { + return !(this.isPromise(action) && action !== undefined && action.valueOf() === undefined); +} - done(); - } catch (err) { - if (isFuncBeCalled) { - funcStart(); - funcFinish(RP_STATUSES.FAILED, err); - } +function makeHooksWrapper(wrapped, funcStart, funcFinish) { + return function (action, timeout) { + wrapped((done) => { + let isFuncBeCalled = true; - done.fail(err); + try { + isFuncBeCalled = SpecificUtils.isHookShouldBeCalled(action(done)); + + if (isFuncBeCalled) { + funcStart(); + funcFinish(); } - }, timeout); - }; - }, + + done(); + } catch (err) { + if (isFuncBeCalled) { + funcStart(); + funcFinish(RP_STATUSES.FAILED, err); + } + + done.fail(err); + } + }, timeout); + }; +} + +const formatMicrosecondsToISOString = (timestampInMicroseconds) => { + const milliseconds = Math.floor(timestampInMicroseconds / 1000); + const microseconds = String(timestampInMicroseconds).slice(-3); + const isoDate = new Date(milliseconds).toISOString(); + + return isoDate.replace('Z', `${microseconds}Z`); }; -module.exports = SpecificUtils; +function convertIsoStringToMicroseconds(isoDateStringWithMicroseconds) { + const [datePart, microsecondsPart] = isoDateStringWithMicroseconds.split('.'); + const date = new Date(`${datePart}Z`); + const microseconds = parseInt(microsecondsPart.slice(0, -1), 10); + + return date.getTime() * 1000 + microseconds; +} + +function getBeforeHookStartTime(itemStartTime) { + return clientHelpers.formatMicrosecondsToISOString( + convertIsoStringToMicroseconds(itemStartTime) - 1000 + ); +} + +module.exports = { + takeScreenshot, + escapeMarkdown, + getAllLogs, + getLaunchObj, + getSystemAttributes, + getAgentInfo, + getCodeRef, + getFullTestName, + isPromise, + isHookShouldBeCalled, + makeHooksWrapper, + convertIsoStringToMicroseconds, + getBeforeHookStartTime, +}; diff --git a/package-lock.json b/package-lock.json index 45d965e..afec6e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,10 +6,10 @@ "packages": { "": { "name": "@reportportal/agent-js-jasmine", - "version": "5.0.3", + "version": "5.1.0", "license": "Apache-2.0", "dependencies": { - "@reportportal/client-javascript": "~5.1.4" + "@reportportal/client-javascript": "~5.3.0" }, "devDependencies": { "eslint": "^8.57.0", @@ -22,7 +22,7 @@ "prettier": "^2.8.8" }, "engines": { - "node": ">=12.x" + "node": ">=14.x" } }, "../examples-js/example-jasmine": { @@ -1188,19 +1188,20 @@ } }, "node_modules/@reportportal/client-javascript": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@reportportal/client-javascript/-/client-javascript-5.1.4.tgz", - "integrity": "sha512-Pk00dSYX8TANmEkg2CN06PxoSW1f83d1mew1M0kw5pDZOif+1cYrjy1E4HNrdLBoYhAH6oQIISvJSKc7K6A8fg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@reportportal/client-javascript/-/client-javascript-5.3.0.tgz", + "integrity": "sha512-328279/aC6rXe6BNEZeCXJ1/b5k05RdC5HSR8GYnr6TFWvYV5DQd4/E33ekhT0+Psenf6sMcccl24lZZdxKOvA==", "dependencies": { - "axios": "^1.6.8", + "axios": "^1.7.7", "axios-retry": "^4.1.0", "glob": "^8.1.0", "ini": "^2.0.0", + "microtime": "^3.1.1", "uniqid": "^5.4.0", "uuid": "^9.0.1" }, "engines": { - "node": ">=12.x" + "node": ">=14.x" } }, "node_modules/@reportportal/client-javascript/node_modules/brace-expansion": { @@ -1637,9 +1638,9 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -4623,18 +4624,31 @@ "dev": true }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, + "node_modules/microtime": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/microtime/-/microtime-3.1.1.tgz", + "integrity": "sha512-to1r7o24cDsud9IhN6/8wGmMx5R2kT0w2Xwm5okbYI3d1dk6Xv0m+Z+jg2vS9pt+ocgQHTCtgs/YuyJhySzxNg==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.4.0" + }, + "engines": { + "node": ">= 14.13.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -4696,6 +4710,21 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-gyp-build": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", diff --git a/package.json b/package.json index b163ad4..21e6e09 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,11 @@ "scripts": { "lint": "eslint .", "format": "npm run lint -- --fix", - "test": "jest --detectOpenHandles --config ./jest.config.js", + "test": "jest", "test:coverage": "jest --coverage" }, "dependencies": { - "@reportportal/client-javascript": "~5.1.4" + "@reportportal/client-javascript": "~5.3.0" }, "devDependencies": { "eslint": "^8.57.0", @@ -26,7 +26,7 @@ "/lib" ], "engines": { - "node": ">=12.x" + "node": ">=14.x" }, "author": "ReportPortal.io", "license": "Apache-2.0",